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-WROVER-B OV2640 Starthilfe Falke07 14 156 Heute 11:37
Letzter Beitrag: Falke07
  ESP32 Debugger JTAG shrimps 0 55 17.01.2020 11:43
Letzter Beitrag: shrimps
  ESP32 Firmware Anfänger Frage 1971 1 76 17.01.2020 09:26
Letzter Beitrag: Fips
  ESP32 deepsleep Stromverbraucch Thomas_01 22 458 17.01.2020 08:21
Letzter Beitrag: derdemo
  ESP32 Grundlagen rdangel 5 535 14.01.2020 16:53
Letzter Beitrag: amithlon
  microSD Slot on Esp32 TechnikerHannes 29 1.545 14.01.2020 14:15
Letzter Beitrag: biologist
  Wetterstation ESP32 heli-freak66 3 264 05.01.2020 17:35
Letzter Beitrag: Tommy56
  ESP32 Uhr Cyborman 8 556 01.01.2020 22:43
Letzter Beitrag: Cyborman
  ESP32 RX2 und TX2 Gerdchen03 10 630 28.12.2019 15:04
Letzter Beitrag: Gerdchen03
  ESP32 hängt -> reset per Attiny85 hYtas 107 6.425 06.12.2019 12:48
Letzter Beitrag: amithlon

Gehe zu:


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