Skocz do zawartości

Problem z połączeniem Arduino UNO z ESP32 DEVKIT V1 za pomocą UART


Pabelelo

Pomocna odpowiedź

Dzień dobry,

 buduję urządzenie, którego zadaniem będzie zbieranie danych o temperaturze i  wilgotności ze środowiska reakcyjnego co powiedzmy 15 minut oraz kontrola nad tym środowiskiem. W założeniu  3 termometry DT, jeden higrometr DHT11 oraz ESP32 DEVKIT V1 podłączone są do Arduino. Obecnie pracuję nad ustanowieniem połączenia szeregowego pomiędzy Arduino a ESP w taki sposób, aby zmienne wysyłane z Arduino (float) były odbierane przez ESP w formacie float, zapisywane do zmiennych oraz wysyłane na zewnętrzny serwer DB. Do niedawna pracowałem z XIAO ESP32C3 (wersja do lutowania), gdzie połączenie udało mi się ustabilizować. Jednakże przez swój błąd spaliłem część układu i konieczne było zamówienie nowego ESP. Wybrałem inny, z gotowymi pinami pod kable połączeniowe. Od paru tygodni nie jestem w stanie poprawnie połączyć Ardu z nowym ESP. Występują takie problemy, jak nieustanne bootowanie się kontrolera (ESP), a nawet gdy uda mi się to obejść to port szeregowy ESP nie wysyła do komputera żadnych danych, które teoretycznie otrzymuje w Stringach. Sam port szeregowy ESP działa w arduino IDE bez zarzutów. Próbowałem różne rodzaje podłączenia kabli i symulowanie TX/RX za pomocą SoftwareSerial'a i HardwareSerial'a. Pomiędzy Arduino a ESP wpięty jest konwerter poziomów logicznych (3.3V/5.0V).

Kod dla ESP:

#include <HardwareSerial.h>
#include <SoftwareSerial.h>
#define TX 27
#define RX 25

// SoftwareSerial Serial3(RX, TX);  // Zdefiniowanie obiektu Serial1 jako port szeregowy na złączach TX i RX ESP
HardwareSerial Serial3(0);

float temp1;  // Zmienne przechowująca temperaturę (pobierana z Arduino)
float temp2;
float temp3;
float wilgotnosc;  


void setup() {
  Serial.begin(115200);   // Inicjalizacja portu szeregowego ESP
  Serial3.begin(115200, SERIAL_8N1, RX, TX);  // Inicjalizacja portu szeregowego ESP do komunikacji z Arduino
}

void loop() {

  // KONWERSJA BAJT NA FLOAT

  // if (Serial4.available() > 0) {
  //   delay(5);
  //   byte buf[4];
  //   byte* bp = buf;
  //   while (Serial4.available() > 0) {
  //     *bp = (Serial4.read());
  //     if (bp - buf < 3) {
  //       bp++;
  //     }
  //   }
  //   temp1 = (float)buf;
  //   Serial.println(temp1, 3);
  // }
  // delay(100);

  //PODZIAŁ STRING

  //   if (ARDU.available() > 0) {
  //     String data = ARDU.readStringUntil('\n');

  //     String dataPart1 = getValue(data, ',', 0);
  //     String dataPart2 = getValue(data, ',', 1);
  //     String dataPart3 = getValue(data, ',', 2);
  //     String dataPart4 = getValue(data, ',', 3);

  //     float temp1 = dataPart1.toFloat();
  //     float temp2 = dataPart2.toFloat();
  //     float temp3 = dataPart3.toFloat();
  //     float wilgotnosc = dataPart4.toFloat();

  //     Serial.print("Odebrane dane: ");
  //     Serial.print("Temp1: ");
  //     Serial.print(temp1);
  //     Serial.print("   Temp2: ");
  //     Serial.print(temp2);
  //     Serial.print("    Temp3: ");
  //     Serial.print(temp3);
  //     Serial.print("   Wilgotnosc: ");
  //     Serial.println(wilgotnosc);
  //   }
  // }



  // String getValue(String data, char separator, int index) {
  //   int found = 0;
  //   int strIndex[] = { 0, -1 };
  //   int maxIndex = data.length() - 1;
  //   for (int i = 0; i <= maxIndex && found <= index; i++) {
  //     if (data.charAt(i) == separator || i == maxIndex) {
  //       found++;
  //       strIndex[0] = strIndex[1] + 1;
  //       strIndex[1] = (i == maxIndex) ? i + 1 : 1;
  //     }
  //   }
  //   return found > index ? data.substring(strIndex[0], strIndex[1]) : "";
  // }

  // DZIAŁAŁO NA STARYM ESP32C3

  if (Serial3.available() > 0) {  // Sprawdzenie, czy są dostępne dane z Arduino
    String odebrane = " ";
    odebrane = Serial3.readStringUntil('\n');
    Serial.print("Received data: ");
    Serial.print(odebrane);
  }
}

//NA RAZIE NIE DZIAŁA NIE KOMPILUJE

// if (Serial4.available() > 0) {
//   char inByte = Serial4.readByte();
//   if (inByte == 'f') { //DATA F FORMAT
//     Serial4.readChar();  
//     byte[] inData = new byte[4];
//     Serial4.readBytes(inData);

//     int intbit = 0;

//     intbit = (inData[3] << 24) | ((inData[2] & 0xff) << 16) | ((inData[1] & 0xff) << 8 | (inData[0] & 0xff);

//     float temp1 = Float.intBitsToFloat(intbit);
//     Serial.println(temp1);
//   }
// }

Kod dla Arduino:

#include <SoftwareSerial.h>
#include <DallasTemperature.h>
#include <OneWire.h>
#include "DHT.h"

#define ardDHT22 2  // Pin do podłączenia czujnika DHT11
#define ardDT A0    //Termometr cyfrowy - DallasTemperature
#define RX A1       //0
#define TX A5       //1

SoftwareSerial SEND(RX, TX);

DHT dht;
OneWire oneWire(ardDT);
DallasTemperature sensors(&oneWire);

float temp1;
float temp2;
float temp3;
float wilgotnosc;

void setup() {

  pinMode(RX, INPUT);
  pinMode(TX, OUTPUT);

  Serial.begin(115200);  // Inicjalizacja portu szeregowego Arduino
  SEND.begin(115200);     //Inicjalizacja połączenia z ESP
  dht.setup(ardDHT22);
  sensors.begin();
}

void loop() {
  // Odczyt danych z czujnika DHT i DT
  temp1 = sensors.getTempCByIndex(0);
  temp2 = sensors.getTempCByIndex(1);
  temp3 = sensors.getTempCByIndex(2);
  wilgotnosc = dht.getHumidity();
  
  sensors.requestTemperatures();
  delay(100);

  //Dzielony String

  String data = String(temp1) + ',' + String(temp2) + ',' + String(temp3) + ',' + String(wilgotnosc);
  SEND.print(data);

  //??????

  // Serial.write((byte*)&temp1, 4);
  // Serial.write((byte*)&temp2, 4);
  // Serial.write((byte*)&temp3, 4);
  // Serial.write((byte*)&wilgotnosc, 4);

  // Serial - PC

  Serial.print("Temp1: ");
  Serial.print(temp1);
  Serial.print("   Temp2: ");
  Serial.print(temp2);
  Serial.print("    Temp3: ");
  Serial.print(temp3);
  Serial.print("   Wilgotnosc: ");
  Serial.println(wilgotnosc);
  
  delay(2000);  // Opóźnienie przed kolejnym wysłaniem danych
}

 

  • Lubię! 1
Link do komentarza
Share on other sites

- HardwareSerial Serial3(0) chba raczej HardwareSerial Serial3(2)

- zero to port do programowania esp32

- to jaki masz obecnie wpięty esp32 ?

- coś pomieszałeś 27/25 to chyba GPIO17/GPIO16

ESP32-Pinout.jpg

Edytowano przez 99teki
Link do komentarza
Share on other sites

Masz rację, wkradło mi się parę błędów w moim toku myślowym:

1) Obecnie udało mi się ustabilizować połączenie bez HardwareSeriala (w kodzie dla ESP). Tutaj dodatkowo napotkałem problem systemowy, ponieważ przy próbie nazwania nowego Seriala jako Serial1(x) lub Serial2(x) otrzymywałem błędy o kilkukrotnej deklaracji zmiennej w bibliotece HardwareSerial.ccp oraz w plikach temp, używanych do kompilacji schematów. Próbowałem to czyścić, ale bez powodzenia. Reinstalacja Arduino IDE oraz bibliotek również została przeprowadzona.

2) Przy eliminacji biblioteki HardwreSerial.h problem z wyborem numeru portu nie występuje, jednakże nie wiem jak będzie wyglądała sprawa ze stabilnością połączenia.

3) ESP32 DEVKIT V1 -  podałeś dobre zdjęcie.

4) Tutaj miałem problem ze zrozumieniem, których oznaczeń pinów należy użyć w #define, aby płytka zrozumiała czego od niej chcę. Finalnie piny  17(TX) i 16(RX) okazały się trafne.

 

KOD DLA ARDUINO:

#include <SoftwareSerial.h>
#include <DallasTemperature.h>
#include <OneWire.h>
#include "DHT.h"

#define ardDHT22 A5  // Pin do podłączenia czujnika DHT11
#define ardDT A0    //Termometr cyfrowy - DallasTemperature
#define RX 0       //0
#define TX 2       //1

SoftwareSerial SEND(RX, TX);

float bufor = 0.00;

DHT dht;
OneWire oneWire(ardDT);
DallasTemperature sensors(&oneWire);

float temp1;
float temp2;
float temp3;
float wilgotnosc;

void setup() {

  pinMode(RX, INPUT);
  pinMode(TX, OUTPUT);

  Serial.begin(115200);  // Inicjalizacja portu szeregowego Arduino
  SEND.begin(9600);     //Inicjalizacja połączenia z ESP
  dht.setup(ardDHT22);
  sensors.begin();
}

void loop() {
  // Odczyt danych z czujnika DHT i DT
  temp1 = sensors.getTempCByIndex(0);
  temp2 = sensors.getTempCByIndex(1);
  temp3 = sensors.getTempCByIndex(2);
  wilgotnosc = dht.getHumidity();

  sensors.requestTemperatures();
  delay(100);

  //Dzielony String

  String data = String(bufor) + ',' + String(temp1) + ',' + String(temp2) + ',' + String(temp3) + ',' + String(wilgotnosc);
  SEND.print(data); //Wysłanie danych do ESP

  delay(2000);  // Opóźnienie przed kolejnym odczytem danych

  // Serial - PC

  Serial.print("Temp1: ");
  Serial.print(temp1);
  Serial.print("   Temp2: ");
  Serial.print(temp2);
  Serial.print("    Temp3: ");
  Serial.print(temp3);
  Serial.print("   Wilgotnosc: ");
  Serial.println(wilgotnosc);
}

KOD DLA ESP32 DEVKIT V1:

// #include <HardwareSerial.h>
// #include <SoftwareSerial.h>
#define TXD2 17
#define RXD2 16

// SoftwareSerial Serial3(RX, TX);  // Zdefiniowanie obiektu Serial1 jako port szeregowy na złączach TX i RX ESP
// HardwareSerial Serial3(2);

float temp1;  // Zmienna przechowująca temperaturę (pobierana z Arduino)
float temp2;
float temp3;
float wilgotnosc;  // Zmienna przechowująca wilgotność (pobierana z Arduino)


void setup() {
  Serial.begin(115200);                         // Inicjalizacja portu szeregowego ESP
  Serial2.begin(9600, SERIAL_8N1, RXD2, TXD2);  // Inicjalizacja portu szeregowego ESP do komunikacji z Arduino
}

void loop() {

  //DZIELENIE STRINGU I KONWERSJA DO FLOATU

  if (Serial2.available()) {
    String data = Serial2.readStringUntil('\n');

    String dataPart1 = getValue(data, ',', 0);
    String dataPart2 = getValue(data, ',', 1);
    String dataPart3 = getValue(data, ',', 2);
    String dataPart4 = getValue(data, ',', 3);

    float temp1 = dataPart1.toFloat();
    float temp2 = dataPart2.toFloat();
    float temp3 = dataPart3.toFloat();
    float wilgotnosc = dataPart4.toFloat();

    Serial.print("Odebrane dane: ");
    Serial.print("Temp1: ");
    Serial.print(temp1);
    Serial.print("   Temp2: ");
    Serial.print(temp2);
    Serial.print("    Temp3: ");
    Serial.print(temp3);
    Serial.print("   Wilgotnosc: ");
    Serial.println(wilgotnosc);
  }
}

String getValue(String data, char separator, int index) {
  int found = 0;
  int startIndex = -1;
  int endIndex = -1;

  for (int i = 0; i < data.length(); i++) {
    if (data[i] == separator) {
      found++;

      if (found == index + 1) {
        startIndex = i + 1;
      } else if (found == index + 2) {
        endIndex = i;
        break;
      }
    }
  }

  if (startIndex != -1 && endIndex == -1) {
    endIndex = data.length();
  }

  if (startIndex != -1 && endIndex != -1) {
    return data.substring(startIndex, endIndex);
  } else {
    return "";
  }
}

 

  • Lubię! 1
Link do komentarza
Share on other sites

1 godzinę temu, Pabelelo napisał:

nie wiem jak będzie wyglądała sprawa ze stabilnością połączenia.

HardwareSerial to było takie przestarzałe opakowanie do uart1 i uart2, obecnie powinno się robić tak jak Ty zrobiłeś.

A dlaczego niby miałyby wystąpić problemy ze stabilnością? 

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.