Передача данных от esp8266 к arduino по lora

Тема в разделе "ESP8266, ESP32", создана пользователем GeoShu, 22 мар 2021.

Метки:
  1. GeoShu

    GeoShu Гик

    Доброго времени суток!
    Такая проблема.
    Организую обмен данными между Arduino Nano и ESP8266 с использованием Lora E32-TTL-100.
    Данные из Ардуино в ESP8266-12Е (NodeMCU) идут нормально. Меняю местами приемник и передатчик - ничего не приходит. В чем может быть проблема? Сначала хотел передавать структуры, потом строку. Результат одинаковый.
    Код передатчика:
    Код (C++):
    #include <SoftwareSerial.h>

    #define pinM0  15   // на пин M0 Lora
    #define pinM1  13   // на пин M1 Lora
    #define pinRx  12   // пин Rx(UNO) -> Tx(Lora)
    #define pinTx  14   // пин Tx(UNO) <- Rx(Lora)
    #define pinAUX 2   // пин AUX Lora

    SoftwareSerial LoraUART(pinRx, pinTx);  // RX, TX UART к Lora E32

    char testStr[] = "123";
    byte inConf, inVers;

    void setup() {                    // настройка модуля
      pinMode( pinM0, OUTPUT);        // пин управления режимом работы модуля
      pinMode( pinM1, OUTPUT);        // пин управления режимом работы модуля
      pinMode( pinAUX, INPUT);        // контрольный пин AUX c Lora
      Serial.begin( 9600);
      LoraUART.begin(9600);          // UART Lora 9600 bps

      digitalWrite(pinM0, HIGH);     // перевод в режим sleep для настройки
      digitalWrite(pinM1, HIGH);     // ...

      Serial.println( "Config: ");
      while (!digitalRead(pinAUX));        // ожидание готовности Lora
      LoraUART.write(byte (0xC1));           // запрос параметров
      LoraUART.write(byte (0xC1));
      LoraUART.write(byte (0xC1));
      while (!digitalRead( pinAUX));         // ожидание готовности Lora
      while (LoraUART.available()) {
        inConf = byte (LoraUART.read());
        Serial.print( inConf, HEX);          // вывод на экран конфигурации модуля
      }
      Serial.println(".");
      delay (1000);
      Serial.println("Version number: ");
      while ( !digitalRead( pinAUX));        // ожидание готовности Lora
      LoraUART.write(byte (0xC3));           // запрос параметров
      LoraUART.write(byte (0xC3));
      LoraUART.write(byte (0xC3));
      while ( !digitalRead( pinAUX));         // ожидание готовности Lora
      while ( LoraUART.available()) {
        inVers = byte (LoraUART.read());
        Serial.print( inVers, HEX);          // вывод на экран конфигурации модуля
      }
      Serial.println(".");
      delay( 2000);
    }

    void loop() {
      digitalWrite(pinM0, LOW);              // перевод в режим normal
      digitalWrite(pinM1, LOW);              // ..

      while (!digitalRead( pinAUX));         // ожидание готовности Lora
      Serial.println("Lora ready Ok");
      Serial.println("Lora send testing string");
      LoraUART.print("123");           // отправка тестовой строки

      digitalWrite( pinM0, HIGH);              // перевод в режим сна
      digitalWrite( pinM1, HIGH);              // ..
      delay(5000);
    }
    Код приемника:
    Код (C++):
    #include <SoftwareSerial.h>

    #define pinM0  6   // на пин M0 Lora
    #define pinM1  5   // на пин M1 Lora
    #define pinRx  3   // пин Rx(UNO) -> Tx(Lora)
    #define pinTx  4   // пин Tx(UNO) <- Rx(Lora)
    #define pinAUX 2   // на пин AUX Lora

    SoftwareSerial LoraUART(pinRx, pinTx);  // RX, TX UART к Lora E32

    char testStr[] = "123";
    byte inConf, inVers;
    uint16_t nPacket = 0,                  // принято пакетов
             nBroken = 0;                  // битых пакетов
    byte i;
    bool fComplete;

    void setup() {                    // настройка модуля
      pinMode( pinM0, OUTPUT);        // пин управления режимом работы модуля
      pinMode( pinM1, OUTPUT);        // пин управления режимом работы модуля
      pinMode( pinAUX, INPUT);        // контрольный пин AUX c Lora
      Serial.begin( 9600);
      LoraUART.begin(9600);          // UART Lora 9600 bps

      digitalWrite( pinM0, HIGH);     // перевод в режим sleep для настройки
      digitalWrite( pinM1, HIGH);     // ...

      Serial.println( "Config: ");
      while (!digitalRead(pinAUX));        // ожидание готовности Lora
      LoraUART.write(byte (0xC1));           // запрос параметров
      LoraUART.write(byte (0xC1));
      LoraUART.write(byte (0xC1));
      while (!digitalRead( pinAUX));         // ожидание готовности Lora
      while (LoraUART.available()) {
        inConf = byte (LoraUART.read());
        Serial.print( inConf, HEX);          // вывод на экран конфигурации модуля
      }
      Serial.println(".");
      delay (1000);
      Serial.println("Version number: ");
      while ( !digitalRead( pinAUX));        // ожидание готовности Lora
      LoraUART.write(byte (0xC3));           // запрос параметров
      LoraUART.write(byte (0xC3));
      LoraUART.write(byte (0xC3));
      while ( !digitalRead( pinAUX));         // ожидание готовности Lora
      while ( LoraUART.available()) {
        inVers = byte (LoraUART.read());
        Serial.print( inVers, HEX);          // вывод на экран конфигурации модуля
      }
      Serial.println(".");
      delay( 2000);

      digitalWrite( pinM0, LOW);         // перевод Lora в нормальный режим
      digitalWrite( pinM1, LOW);

    }

    void loop() {
      fComplete = true;
      while ( !digitalRead( pinAUX));    // ожидание готовности Lora
      if ( LoraUART.available()) {
        nPacket++;
        Serial.println();
        Serial.print("Принято пакетов: ");
        Serial.println( nPacket);
        i = 0;
      }
      while ( LoraUART.available()) {
        char inByte = char (LoraUART.read());
        Serial.print( inByte);          // вывод на экран принятого
        if ( testStr[i++] != inByte)     // проверка целостности пакета
          fComplete = false;
      }
      if ( !fComplete) {                 // битый пакет
        nBroken++;
        Serial.print("Принято сбойных пакетов: ");
        Serial.println(nBroken);
      }
    }
    Пробовал и физически менять модули местами, чтобы исключить проблему брака "железа", результат такой же - от Ардуино в ESP8266 всё идет нормально, в обратном порядке - ничего не принимается. В чем может быть проблема?