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 Ethernet shrimps 31 17.455 29.06.2020 16:50
Letzter Beitrag: miq19
  ESP32-Cam, Loop Verständnisfrage Gould 5 228 26.06.2020 17:50
Letzter Beitrag: Gould
  AD9833 an ESP32 - Amplitudenanpassung möglich? Gerdchen03 1 183 23.06.2020 21:38
Letzter Beitrag: ardu_arne
  Encoder an ESP32 Gerdchen03 19 1.239 22.06.2020 09:00
Letzter Beitrag: biologist
  ESP32-CAM Fehlermeldung db91595 14 2.292 17.06.2020 11:43
Letzter Beitrag: db91595
  ESP32-CAM Accesspointproblem mit Handy vonvogel 14 893 15.06.2020 08:10
Letzter Beitrag: vonvogel
  ESP32: flankengetriggerter Interrupt - Spezifikation der "Flanke" georg1010 0 235 13.06.2020 22:47
Letzter Beitrag: georg1010
  AI Thinker ESP32 CAM, Flash LED leuchtet leicht nach DEEP SLEEP spok1 0 330 01.06.2020 14:00
Letzter Beitrag: spok1
  AD9833 an ESP32 Devkit V1 Gerdchen03 8 900 30.05.2020 22:55
Letzter Beitrag: Gerdchen03
  Von jetzt auf gleich Fehler beim Kompilieren... DO3GE 2 451 24.05.2020 09:26
Letzter Beitrag: Fips

Gehe zu:


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