INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
ESP32 Fehler der UART Schnittstelle
09.12.2019, 12:12 (Dieser Beitrag wurde zuletzt bearbeitet: 09.12.2019 12:13 von summsumm.)
Beitrag #1
ESP32 Fehler der UART Schnittstelle
Hallo Zusammen,

ich programmiere gerade für den ESP32 einen CO2-Regelkreis und habe dazu einen CO2-Sensor den ich über UART auslese. Um mir die Daten ausgeben zu lassen, habe ich mir ein Waveshare ePaper Display geholt, welcher über die SPI Schnittstelle angesteuert wird. Soweit so gut. Beide Komponenten funktionieren jeweils einzeln aber wenn ich sie in einem Code Initialiesiere dann bekomme ich vom CO2 Sensor nur noch fehlerhafte Werte ausgegeben.
Für das ePaper benutze ich diese Library: https://github.com/ZinggJM/GxEPD2
Ich habe auch schon die Version GXEPD getestet aber die gleichen Fehler bekommen.

Ich habe in verschiedenen anderen Foren gelesen, dass es zu Problemen kommt aber bisher keine Lösung gefunden...Kann es an der Library liegen und falls ja kennt ihr eine bessere?

Grüße
Ruben
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.12.2019, 12:59
Beitrag #2
RE: ESP32 Fehler der UART Schnittstelle
Hallo,

wenn Du Deinen Sketch mir reingestellt hättest (bitte Code-TAGs benutzen!), hätte ich da soager mal rübergeschaut. Ich kann mir eigentlich keine unlösbaren Probleme in dieser Kombination vorstellen.

Gruß aus Berlin
Michael
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.12.2019, 13:41
Beitrag #3
RE: ESP32 Fehler der UART Schnittstelle
Code:
#define ENABLE_GxEPD2_GFX 0

#include <GxEPD2_BW.h>
#include <math.h>

#include <Fonts/FreeMonoBold9pt7b.h>

//Waveshare 2.7inch CLK=18 /*DC=*/ 17, /*RST=*/ 16,
GxEPD2_BW<GxEPD2_270, GxEPD2_270::HEIGHT> display(GxEPD2_270(/*CS=5*/ SS, /*DC=*/ 25, /*RST=*/ 26, /*BUSY=*/ 4));



#if defined(ESP32)
#include <StreamString.h>
#define PrintString StreamString
#else
class PrintString : public Print, public String
{
  public:
    size_t write(uint8_t data) override
    {
      return concat(char(data));
    };
};
#endif

int CO2_Sensor_read();
void CO2_Sensor_setup();
void write_value();


//Variables CO2 Sensor
long int co2 = 0;
int8_t dataReady=0;
char chArray[7];


void setup() {
  
  //Init serial communication  
  Serial.begin(115200);
  //Init Sensor
  CO2_Sensor_setup();
  delay(100);  
  //Init Display
  display.init(115200);
  display.clearScreen();
  Serial.println("Setup done");
}



void loop()
{

  write_value(CO2_Sensor_read());
  delay(1000);

}



void CO2_Sensor_setup()
{
  Serial2.begin(9600, SERIAL_8N1, 25, 26); // Start serial communications with sensor

  //K1 streaming mode
  Serial2.println("K 1\r\n");
  //set Digital Filter value 5
  Serial2.println("A 5\r\n");
  //send Mode for Z and z outputs "Z xxxxx z xxxxx" (CO2 filtered and unfiltered)
  Serial2.println("M 6");
  
  delay(50);

  
}

int CO2_Sensor_read(void)
{
  while (Serial2.available() && dataReady != 1) {

    // the values behind the Z are the digital filtered Values... CO2 ppm/10
    if (Serial2.find("Z")) {

      for (int u = 0;u < 6; u++) {
        chArray[u] = Serial2.read();
        //Serial.println(chArray[u]);
      }


      dataReady = 1;
    }

  }

  if (dataReady == 1) {

    co2 = 0;

    co2 =   (chArray[5] - 0x30) * 10;
    co2 += (chArray[4] - 0x30) * 100;
    co2 += (chArray[3] - 0x30) * 1000;
    co2 += (chArray[2] - 0x30) * 10000;
    co2 += (chArray[1] - 0x30) * 100000;

    dataReady = 0;

    
  }

  
  return co2;
}

void write_value(int _value)
{
  uint16_t box_x = 10;
  uint16_t box_y = 15;
  uint16_t box_w = 120;
  uint16_t box_h = 20;
  uint16_t cursor_y = box_y + box_h - 6;

  const char CO2[] = "CO2: ";
  
  uint16_t incr = display.epd2.hasFastPartialUpdate ? 1 : 3;
  
  display.setRotation(1);
  display.setFont(&FreeMonoBold9pt7b);
  display.setTextColor(GxEPD_BLACK);

  int16_t tbx, tby; uint16_t tbw, tbh;
  display.getTextBounds(CO2, 0, 0, &tbx, &tby, &tbw, &tbh);

  display.setPartialWindow(box_x, box_y, box_w, box_h);
  display.firstPage();
  do
      {
        display.fillRect(box_x, box_y, box_w + tbw, box_h, GxEPD_WHITE);
        display.setCursor(box_x, cursor_y);
        display.print(CO2);
        display.setCursor(box_x+tbw, cursor_y);
        display.print(_value);
      }
      while (display.nextPage());
  delay(50);
  
}

Hier mein Code. Danke dir!
Grüße aus Hannover
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.12.2019, 14:47
Beitrag #4
RE: ESP32 Fehler der UART Schnittstelle
Hallo,

(09.12.2019 13:41)summsumm schrieb:  Hier mein Code. Danke dir!

So bei flüchtigem Blick ist mir nichts aufgefallen...
Deinen Sensor habe ich natürlich nicht, aber ich spiele sowieso gerade mit einem TTGO T5 rum:
TTGO T5 bei Banggood

Werde Deinen Sketch also mal gundsätzlich testen, statt Deines Sensors werde ich einfach mal ein GPS-Modul ranhängen, das schickt ja seine NMEA-Datensätze auch schön im Stück...
Kann aber bis morgen dauern.

Gruß aus Berlin
Michael
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.12.2019, 21:13
Beitrag #5
RE: ESP32 Fehler der UART Schnittstelle
Hi,
ich sehe zwar im Code das du die Zeichen aus der Seriellen einzeln abholst und dann umrechnest (ob das so richtig ist habe ich nicht geprüft), aber was ich vermisse eine Prüfung ob das Telegramm ein Startbyte beinhaltet auf das man dann das Einlesen triggert. Zudem könnte der empfangene Wert auch weniger als 5 Stellen haben...da funzt die Umrechnung wohl nicht...deswegen würde ich den gelesenen Wert in einen String schreiben und dann in einem Stück in einen Wert umwandeln.
lgbk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.12.2019, 21:32 (Dieser Beitrag wurde zuletzt bearbeitet: 09.12.2019 21:33 von summsumm.)
Beitrag #6
RE: ESP32 Fehler der UART Schnittstelle
(09.12.2019 21:13)Bitklopfer schrieb:  Hi,
ich sehe zwar im Code das du die Zeichen aus der Seriellen einzeln abholst und dann umrechnest (ob das so richtig ist habe ich nicht geprüft), aber was ich vermisse eine Prüfung ob das Telegramm ein Startbyte beinhaltet auf das man dann das Einlesen triggert. Zudem könnte der empfangene Wert auch weniger als 5 Stellen haben...da funzt die Umrechnung wohl nicht...deswegen würde ich den gelesenen Wert in einen String schreiben und dann in einem Stück in einen Wert umwandeln.
lgbk

Der Sensor gibt die Messwerte mit der Syntax "Z xxxxx z xxxxx" über die UART Schnittstelle aus. der erste Wert ist digital gefilter und der zweite der reine Messwert. Der Programmabschnitt funktioniert auch einwandfrei solange ich das Display nicht über den Befehl display.init(115200); starte. Deshalb ist auch meine Vermutung, dass es an der Library vom Display liegt.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.12.2019, 21:54
Beitrag #7
RE: ESP32 Fehler der UART Schnittstelle
(09.12.2019 21:32)summsumm schrieb:  ...
Der Sensor gibt die Messwerte mit der Syntax "Z xxxxx z xxxxx" über die UART Schnittstelle aus. der erste Wert ist digital gefilter und der zweite der reine Messwert. Der Programmabschnitt funktioniert auch einwandfrei solange ich das Display nicht über den Befehl display.init(115200); starte. Deshalb ist auch meine Vermutung, dass es an der Library vom Display liegt.

okay. Und wo suchst du nach dem "Z" bzw. dem "z" beim einlesen der Daten.... das war das Ziel meiner Frage...

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.12.2019, 22:05
Beitrag #8
RE: ESP32 Fehler der UART Schnittstelle
(09.12.2019 21:54)Bitklopfer schrieb:  okay. Und wo suchst du nach dem "Z" bzw. dem "z" beim einlesen der Daten.... das war das Ziel meiner Frage...

Code:
if (Serial2.find("Z")) {

      for (int u = 0;u < 6; u++) {
        chArray[u] = Serial2.read();      
      }
      dataReady = 1;
    }

Es gibt bestimmt eine elegantere Methode aber die Funktion hat ohne das Display die richtigen Werte ausgegeben.
Die komplette Regelung habe ich schon erfolgreich auf einem PsoC implementiert aber jetzt würde ich es gerne auf einem handlichen ESP32 mit ePaper umsetzen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  ESP32+SIM808 GPS Daten auslesen und auf LCD reinhard-adam 2 107 21.09.2020 18:25
Letzter Beitrag: georg01
  Fehler bei Board AI Thinker ESP32-CAM Manny 4 414 30.08.2020 16:37
Letzter Beitrag: Manny
  ESP32 Ethernet shrimps 33 22.513 27.08.2020 15:05
Letzter Beitrag: biologist
  ESP32 Dev Kit 4711engel 12 1.024 26.08.2020 08:41
Letzter Beitrag: 4711engel
  Esp32 FIFO-Problem miq19 7 628 22.08.2020 14:33
Letzter Beitrag: miq19
  ESP32 CAM Programmierung nicht möglich Manny 3 672 31.07.2020 16:04
Letzter Beitrag: Manny
  ESP32 T-Watch 2020 Lilygo AnFi 8 1.642 31.07.2020 15:35
Letzter Beitrag: amithlon
  Warum stürtzt der ESP32 manchmal ab...ein Gedankenaustausch Pertho 6 976 28.07.2020 17:38
Letzter Beitrag: hotsystems
  ESP32 Watchdog Funktion KlaRa 16 2.231 22.07.2020 09:38
Letzter Beitrag: KlaRa
  ESP32 überträgt nicht alle Datein aus dem SPIFFS Pertho 11 1.511 21.07.2020 21:46
Letzter Beitrag: Bitklopfer

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste