ESP32 und SDS011

Hi,

ich bemühe mich gerade, an ein ESP32-Board den Feinstaubsensor SDS011 anzuschliessen. Dabei habe ich Probleme.

Vorbemerkung: ich komme nicht von der Hardware-Seite, habe aber den SDS011 erfolgreich an einen Arduino UNO, Arduino ATMega2560 und einen ESP8266 angeschlossen.

Aber nun zu meinem Problem:
Das hier ist mein Board: LILYGO®TTGO ESP32 Paxcounter LoRa32 V2.1 1,6 Version 433/868/915MHZ LoRa ESP 32 OLED 0,96 Inch SD Karte Bluetooth WIFI modul|Circuits| - AliExpress

Hier gibt es das Pinout des Boards:

In der Arduino IDE habe ich als Board TTGO LoRa32-OLED V1 ausgewählt.

Und das hier ist mein Programm:

/*
 * testing my ESP32-board for serial connections
 */

#include "SDS011.h"

#define debugSerial Serial

#define    DEBUG_PRINT( ... )   { debugSerial.print(__VA_ARGS__); }
#define    DEBUG_PRINTLN( ... ) { debugSerial.println(__VA_ARGS__); }

#define sdsSerial   Serial1     // <== richtig so?

SDS011 sdsSensor;               // fine dust sensor

// the results of the sensors
// SDS011
float pm25;              
float pm10;

void setup() {
  Serial.begin(115200);
  Serial.println("starting:");
  sdsSensor.begin (&sdsSerial);
}

void loop() {
  char buffer[10+1];

  DEBUG_PRINTLN("in loop");
        int sdsErrorCode = sdsSensor.read(&pm25, &pm10);

        if (!sdsErrorCode) 
        {
            DIGITAL_WRITE(LED_ERROR_SDS, LOW);
            DEBUG_PRINT("PM2.5: ");
            dtostrf( pm25, 6, 2, buffer);
            DEBUG_PRINTLN( buffer );
            DEBUG_PRINT("PM10:  ");
            dtostrf( pm10, 6, 2, buffer);
            DEBUG_PRINTLN( buffer );
        } 
        else
        {
            pm25 = pm10 = 0;
            DEBUG_PRINT("SDS Error Code: ");
            DEBUG_PRINTLN(sdsErrorCode);
        }
        delay (1000);
        return;
}

Für die Anschlüsse des Sensors hatte ich an die Pins TXD and RXD gedacht, aber vielleicht ist das Serial1 ja falsch.

Auf jeden Fall erhalte ich vom Sensor eine 1 zurück, was Fehler heißt.

Was mache ich hier falsch?

Schönen Gruß
AugustQ

In dem Bild ist kein "Serial1" zu erkennen. Das Breakout hat dann wohl auch kein Pin-Paar für Serial1.

Sie müssen auf "SoftwareSerial" umsteigen. Das ist in der Bibliothek SDS011 beschrieben.

Leider "schluckt" der Compiler das Objekt "Serial1". Was er damit macht ...

Der ESP32 hat 3 HardwareSerial, denen man bei begin die Pins mitgeben kann.
Einfach Doku / Code lesen.

Gruß Tommy

Hi,

Danke für die Hinweise.

Über das Wochenende will ich mir das näher ansehen, vorher komme ich nicht dazu.

Schönen Gruß
AugustQ

Hi,

Kurzfassung: es läuft.

Etwas ausführlicher: das ist mein aktuelles Programm:

/*
 * testing my ESP32-board for serial connections
 */

#include "SDS011.h"

#define debugSerial Serial
#define DEBUG

#ifdef DEBUG
#define    DEBUG_PRINT( ... )   { debugSerial.print(__VA_ARGS__); }
#define    DEBUG_PRINTLN( ... ) { debugSerial.println(__VA_ARGS__); }
#else
#define    DEBUG_PRINT(...)
#define    DEBUG_PRINTLN(...)
#endif

HardwareSerial sdsSerial(2);
SDS011 sdsSensor;               // fine dust sensor
#define SDS_PIN_TX 22
#define SDS_PIN_RX 23

// the results of the sensor SDS011
float pm25;              
float pm10;

void setup() {
  Serial.begin(115200);
  sdsSerial.begin(9600, SERIAL_8N1, SDS_PIN_RX, SDS_PIN_TX);
  sdsSensor.begin (&sdsSerial);
}

void loop() {
  char buffer[10+1];

  DEBUG_PRINTLN("in loop");
        int sdsErrorCode = sdsSensor.read(&pm25, &pm10);
        if (!sdsErrorCode) 
        {
            DEBUG_PRINT("PM2.5: ");
            dtostrf( pm25, 6, 2, buffer);
            DEBUG_PRINTLN( buffer );
            DEBUG_PRINT("PM10:  ");
            dtostrf( pm10, 6, 2, buffer);
            DEBUG_PRINTLN( buffer );
        } 
        else
        {
            pm25 = pm10 = 0;
            DEBUG_PRINT("SDS Error Code: ");
            DEBUG_PRINTLN(sdsErrorCode);
        }
        delay (10000);
        return;
}

Und das erhalte ich als Output:

in loop
PM2.5: 1.20
PM10: 2.00
in loop
......

Verbunden habe ich 5V und GND mit den entsprechenden Pins auf dem Board sowie RTS (SDS011) mit Pin 23 und RTX (SDS011) mit Pin 22.

Weitere Anmerkungen:
Natürlich ging es nicht so einfach. Ich erhielt folgende Fehlermeldung:

Guru Meditation Error: Core 1 panic'ed (LoadProhibited). Exception was unhandled.

Es stellte sich heraus, daß diese Fehlermeldung vom Aufruf sdsSensor.begin (&sdsSerial); stammte. Ein Blick in den Sourcecode zeigte dann:

SDS011.cpp:
void SDS011::begin(HardwareSerial* serial) {
  serial->begin(9600);
  sds_data = serial;
}

Also gut, habe ich die Zeile mit dem begin() auskommentiert, dann die Initialisierung auf 9600 baud hatte ich ja bereits gemacht. Danach ging es.

Schönen Gruß
AugustQ