nRF24L01+ : побеждаем модуль.

Тема в разделе "Проводная и беспроводная связь", создана пользователем ИгорьК, 19 июн 2014.

  1. b707

    b707 Гуру

    наличие отдельного МК - это, конечно. классно, но уверены ли вы. что сможете писать для него программы? Если что - я просто чтобы предупредить - этот МК с ардуинами не совсместим. для него надо качать отдельный софт, покупать программатор и ... немного учиться :)
     
  2. parovoZZ

    parovoZZ Гуру

    Там 8051 стоит со всеми вытекающими.
    SDK есть на сайте производителя.
    Программатор USBasp или родной за 30 бачей.
    Тиня + классика по деньгам даже дешевле.
    Не для слабонервных, короче.

    И я ещё подозреваю, что у писькоглазых влёгкую можно купить OTP версию.
     
    Последнее редактирование: 8 авг 2018 в 23:28
  3. Gokry

    Gokry Нуб

    Ребят все в принципе работает, мб просто подскажите что лучше изменить-подправить ?
    Так важно включать сначала приемник а потом передатчик?
    "Передатчик" NANO+NRF24
    Код (C++):

    #include <SPI.h>
    #include "nRF24L01.h"
    #include "RF24.h"
    RF24 radio(9, 10); // (CE,SCN)
    const uint64_t direccion[4] = {0x7878787878LL, 0xB3B4B5B6F1LL, 0xB3B4B5B6CDLL, 0xB3B4B5B6A3LL };
    int ID = 0;// Задаем номер трубы для опроса
    int temp = 100;
    unsigned long prevTiempo = 0;
    static char GET[32]; // Сюда принимаем запрос
    char otvet[32]; // Сюда сохраняем ответ на запрос
    void setup() {
      delay(500); // Заряжаем кондей
      Serial.begin (9600);
      radio.begin();
      radio.setPALevel(RF24_PA_HIGH);
      radio.setChannel(100);
      radio.openReadingPipe(0, direccion[0]);
      radio.openReadingPipe(1, direccion[1]);
      radio.openReadingPipe(2, direccion[2]);
      radio.openReadingPipe(3, direccion[3]);
      Serial.print ("START SERVER");
    }

    void loop() {

      radio.stopListening();
      radio.openWritingPipe(direccion[ID]);
      radio.write( &ID, sizeof (ID) );
      Serial.print ("Send:");
      Serial.println (ID);
      radio.startListening();
      unsigned long started_waiting_at = millis();
      bool timeout = false;
      while ( ! radio.available() && ! timeout ) // 200мс для чтения данных

        if (millis() - started_waiting_at > 200 )
          timeout = true;
      memset(GET, 0, sizeof GET);  // Ну по идее очищаем массив
      if ( timeout ) {
        if (ID == 0)memset(GET, 0, sizeof GET);;
        if (ID == 1)memset(GET, 0, sizeof GET);;
        if (ID == 2)memset(GET, 0, sizeof GET);;  // Ну или лучше тут(что бы на верняка)
        if (ID == 3)memset(GET, 0, sizeof GET);;
      } else {

        radio.read( GET, sizeof(GET) ); //Читаем запрос
        Serial.println ("Read");
      }
      Serial.print ("Recived:"); // Пишем от кого приняли
      Serial.println (GET[0]);
      if ( GET[0] == '2' && GET[1] == 'G') { // Если пришло от 2 трубы и ключ G
        Serial.println ("ID-2 Key-G");
        Serial.println (GET);
        Serial.println ("Wait serial");
        Serial.println (GET[0]);
        while (Serial.available() == 0) {
        }
        GET[1] = '0';
        memset(GET, 0, sizeof GET);
        String Data = Serial.readString();
        Serial.println ("Serial OK");

        Data.getBytes(otvet, 32);
        radio.stopListening();
        radio.openWritingPipe(direccion[2]); // Тут вручну пишем куда отправлять
        radio.write( otvet, sizeof (otvet));
        Serial.println ("Write back OK");
        Serial.println (otvet);
        radio.startListening();
        Data = "";
      }
      if ( GET[0] == '2' && GET[1] == 'U') {
        Serial.println ("ID-2 Key-U");
        String UPD = ("UPDATE:""BALANCE:");
        Serial.println (UPD);
      }
      /*
        if ( ID == 1 && key == "G") {
        Serial.println ("ID-1 Key-G");
        }
        if ( ID == 1 && key == "U") {
        Serial.println ("ID-1 Key-U");
        }

        if ( ID == 2 && key == "G") {
        Serial.println ("ID-2 Key-G");
        }                                   пока не использую
        if ( ID == 2 && key == "U") {
        Serial.println ("ID-2 Key-G");
        }

        if ( ID == 3 && key == "G") {
        Serial.println ("ID-3 Key-G");
        }
        if ( ID == 3 && key == "U") {
        Serial.println ("ID-3 Key-U");
        }
      */

      memset(otvet, 0, sizeof otvet);
      ID++; // Увеличиваем номер трубы
      if (ID >= 4) ID = 0;
      delay (500);
    }
     
    "Приемник" NANO+RC522+NRF24+Nextion (без кода Nextion)
    Код (C++):

    #include <SPI.h>
    #include "nRF24L01.h"
    #include "RF24.h"
    #define SS_NRF 8
    #define RST_NRF 7

    RF24 radio(RST_NRF, SS_NRF); //Пины радио CE CSN
    const uint64_t direccion[4] = {0x7878787878LL, 0xB3B4B5B6F1LL, 0xB3B4B5B6CDLL, 0xB3B4B5B6A3LL };
    int NUMB = 2; // Номер нашей трубы
    int ID;
    char GET[32]; // Массив для запроса информации о UID
    static char key[32]; // Массив для ответа на запрос о UID
    int terminal = 0;
    #include <MFRC522.h>
    #define SS_RFI 10
    #define RST_RFI 9

    MFRC522 rfid(SS_RFI, RST_RFI); // Пины RFID CE CSN
    MFRC522::MIFARE_Key keyy;
    byte UID[5];// Храним UID
    void setup(void) {
      delay(500); // Для заряда кондера
      Serial.begin(9600);
      radio.begin();
      radio.setRetries(15, 15);
      radio.setPALevel(RF24_PA_HIGH);
      radio.setChannel(100);
      radio.openReadingPipe(0, direccion[NUMB] );
      radio.startListening();
      rfid.PCD_Init();

      for (byte i = 0; i < 6; i++) {
        keyy.keyByte[i] = 0xFF;
      }
      Serial.println ("START TERMINAL");
    }

    void printDec(byte *buffer, byte bufferSize) {
      for (byte i = 0; i < bufferSize; i++) {
        Serial.print(buffer[i] < 0x10 ? " 0" : " ");
        Serial.print(buffer[i], DEC);
      }
    }
    void loop() {
      if (terminal == 0) {

        digitalWrite (SS_RFI, LOW);
        digitalWrite (SS_NRF, HIGH);  // Устанавливаем сигнал на пинах SPI

        Serial.println ("Wait CARD");
        if ( ! rfid.PICC_IsNewCardPresent())
          return;
        if ( ! rfid.PICC_ReadCardSerial())
          return;
        if (rfid.uid.uidByte[0] != UID[0] ||
            rfid.uid.uidByte[1] != UID[1] ||
            rfid.uid.uidByte[2] != UID[2] ||
            rfid.uid.uidByte[3] != UID[3] ) {
          Serial.println("A new card has been detected."); // Новая карта найдена

          for (byte i = 0; i < 4; i++) {
            UID[i] = rfid.uid.uidByte[i];
          }
          Serial.print("In dec: ");
          printDec(rfid.uid.uidByte, rfid.uid.size);
          Serial.println();
          terminal = 1; // Карта считана переходим в terminal 1

        }
        else Serial.println("Card read previously."); // Если приложенна таже карта.

        rfid.PICC_HaltA();
        rfid.PCD_StopCrypto1();
      }

      if (terminal == 1) { // Если считан UID
        digitalWrite (SS_RFI, HIGH);
        digitalWrite (SS_NRF, LOW);    // Меняем сигнал на пинах SPI

        radio.startListening();
        radio.read( &ID, sizeof (ID) );
        Serial.print ("Prin: ");  // Выводи какой ID приняли
        Serial.println (ID);
        if (ID == NUMB)  { // Сравниваем полученный ID с номером трубы
          radio.stopListening();
          char GET[32];
          String get = (String(NUMB) + "GET: " + String (UID[0]) + String (UID[1]) + String (UID[2]) + String (UID[3])); //формируем строчку с ключем "G"
          get.getBytes(GET, 31);
          radio.openWritingPipe(direccion[NUMB] ); //Открываем трубу для отправки
          radio.write(GET, strlen (GET)); // Отправляем строчку с ключем и UID
          Serial.print ("Otpravil: ");
          Serial.println ();
          terminal = 2; // Идем в terminal 2
        }
      }
      if (terminal == 2) {
        radio.startListening();              
        while (radio.available() ) {          

          radio.read( key, sizeof(key) ); // Принимаем ответ на запрос
          Serial.println("Read");
        }
        Serial.println("Received");
        Serial.println(key[0]);

        if ( key[0] == 'N') { // Проверяем ответ какой ключ
          memset(GET, 0, sizeof GET);
          Serial.println (key);   // Отправляем в сериал
          Serial.println ("Key-N");
          while (Serial.available() == 0) { // Ждем измененных данных
            Serial.println ("Waite Serial");
          }
          String Data = Serial.readString();
          Serial.println (Data);
          Serial.println ("Serial OK");
          radio.stopListening();
          radio.openWritingPipe(direccion[ID]);
          radio.write( &Data, sizeof (Data));
          Serial.println ("Write back OK");
          radio.startListening();
          Data = "";
          terminal = 0; // Идем считывать карту
        }

      }
    }
     
    Последнее редактирование: 8 авг 2018 в 23:38
  4. parovoZZ

    parovoZZ Гуру

    Ты про режимы nrf24? Без разницы. Главное сразу после подачи питания выждать 100 мс, чтобы нрфка очухалась, а потом уже работай как хочешь. И в режиме передачи дольше 4 мс передатчик включённым не держать.
     
  5. Gokry

    Gokry Нуб

    Если я включаю сначала ардуинку с первым кодом, а потом со вторым то работает через раз, а если я включаю сначала вторую а потом первую то все сразу работает
     
  6. parovoZZ

    parovoZZ Гуру

    Такого быть не должно. Ищи ошибку с адресацией труб.