Anfängerfrage zu ESP32

Hallo!

Ich stehe gerade auf dem Schlauch mit dem ESP32. Bislang habe ich nur mit Nano oder Uno gearbeitet. Da waren die Pins sehr einfach durchnummeriert.

Nun habe ich dieses Produkt:

Da gibt es auch Doku:

Aber ich verstehe nicht, welche Nummer welcher Pin hat. Konkret möchte ich ein PWM-Signal von einem CO2-Sensor (MH-Z19B) an den ESP32 senden. Die Abbildung in der Doku verwirrt micht. Bin leider unwissend. Ich möchte sinngemäß wissen "Pin 3 ist für Eingang PWM geeignet und ist auf der linken Seite der 8 Pin von unten" - oder so. Doch diese Grafik überfordert mich grad.

Auf dem Board steht z. B. G14 neben G27. Ist G14 der Input 14?

Könnte jemand helfen?

Verzweifelte Grüße
Ingo

G14 am Board ist der GPIO14 und in der IDE kannst du den mit 14 ansprechen.

Nimm eine LED, einen Vorwiderstand und probier es mit dem Blink-Sketch aus.

Ich will dich nicht zu sehr verwirren, aber ich schreibs trotzdem
GPIO14 hängt an ADC2 und daher kannst du in nur schwer (besser gar nicht) als Analog-Input in einem Sketch mit WIFI gemeinsam verwenden. Als Output kein Problem. Also derartige Sachen musst du am ESP32 auch berücksichtigen.

Die Seite ESP32 Pinout Reference: Which GPIO pins should you use? könnte Dir bei der Auswahl helfen.

Vielen Dank euch beiden!

Das hat geklappt. Ich kann die Helligkeit einer LED mittels PWM steuern.

Jetzt noch eine Anschlussfrage:
kann ich den PIn auch als Input eines PWM-Signals nutzen?

Bzw.: welchen Pin kann ich als Eingangspin für ein PWM-Signal nutzen? In der Doku steht, dass es 16 Pins gibt. Aber welche sind das?

Bitte entschuldigt meine Unwissenheit. Es steht sicherlich alles in der Doku beschrieben, aber ich kann das für mich Relevante nicht erkennen.

Viele Grüße
Ingo

Ja, aber bitte beachte meine Auslassung.

PWM einlesen geht nur per Programm, es gibt kein PWMread().

Möchtest Du dies nachbauen: CO2 Messung mit Arduino „CO2 Ampel“. Den Kommentar verstehe ich allerdings nicht:

int SensorPin = 5; // Der PWM-Pin des Sensors wird an Pin5 des Mikrocontrollers angeschlossen. Bei anderen Mikrocontrollern muss darauf geachtet werden, dass der Pin PWM-Fähig ist.

Die Verbindung von pulseIn()zu einem PWM-Pin ist mir unbekannt.

Pin 5 würde ich nehmen.

So einfach istdas natürlich nicht. Das Eingangssignal muss schon interpretiert werden. Ich möchte dieses Experiment hier nachspielen:

https://funduino.de/nr-51-co2-messung-mit-arduino-co2-ampel

Das ist wunderbar beschrieben. Das Eingangssignal wird auch entsprechend umgerechnet. So weit so gut. Allerdings bekomme ich an der frischen Luft "wilde Werte" angezeigt, im Augenblick 881ppm für den CO2-Anteil. Und ich bin nun auf der Fehlersuche.

Möglicherweise habe ich auch einen Gedankenfehler bei meiner Frage. Also in der Art, dass einfach nur "Strom an, Strom aus" an dem Pin ankommt, und die Logik danach macht dann die Umsetzung des Wertes. In diesem Sinne könnte ich dann jeden Eingangspin verwenden, dass das ein PWM-Signal ist, spielt erstmal keine Rolle. Sehe ich das richtig?

Viele Grüße
Ingo

Ach, noch ein Nachtrag - ich möchte ESP32 verwenden, da ich das mit Bluetooth an mein Iphone senden möchte. Das klappt auch.

Ja, da bin ich auch schon unterwegs. Zu dem Sensor gibt es recht viel. Das werde ich schon knacken.

Nur bei dem ESP32 stehe ich eben auf dem Schlauch, weil ich nicht weiß, mit welchen Eigenarten ich da zu kämpfen habe. Vielleicht probiere ich erstmal nur mit dem UNO.

Viele Grüße
Ingo

Ich sehe grad, ich habe einen dieser "fraglichen" Sensoren erwischt. Mein Problem kann auch sein, dass der Sensor ein teurer Nachbau ist und die Werte schwanken.

Ist auf der von noiasca verlinkten Seite beschrieben.

Lassen wir es dabei. Danke für eure Hilfe!!!

LG
Ingo

Das ist Chip Select von SPI, wenn Du das mal für ein Display benötigst.

Ich würde einen der reinen Inputs verwenden, habe es gerade mal mit Pin 34 versucht, das geht.

Wenn es ein PWM-Signal ist.
Hat das Signal konstante Frequenz und der Dutycycle gibt den CO2-Gehalt an oder wird die Freuenz verändert?

Hast du ein Digitalmultimeter das auch Frequenzen und DutyCycle messen kann?

Dann könnest du damit erst mal Meßwerte erfassen und dann mit entsprechenden Meßwerten aus Programmen vergleichen
vgs

Zitat Messung des CO2-Werts per Pulsweitenmodulation (PWM):

Zur Messung per PWM erfährt man aus der Dokumentation, dass ein Signalzyklus 1004 Millisekunden (ms) dauert – mit einer Genauigkeit von ± 5 %:

  • die ersten 2 ms ist das Signal auf HIGH gesetzt
  • in den folgenden 1000 ms wird der eigentliche Messwert übermittelt; je länger das Signal auf HIGH bleibt, desto höher ist der CO2-Wert; 1 ms entspricht dabei 1/1000 des Messbereichs des Sensors
  • die letzten 2 ms ist das Signal auf LOW gesetzt

Na das ist ja einfach :wink:
solange HIGH, mach irgendwas...
Wenn LOW,

  • warte bis HIGH wird,
  • merke millis(),
  • warte bis LOW wird,
  • merke millis(),
    Messbereich mit Anfangs und Endzeit (abzüglich der 2ms) -> Ergebnis in Klartext.

Oder hab ich irgendwas übersehen?

Im Moment kämpfe ich mit der Programmierung über die serielle Schnittstelle. Ich bin erstmal wieder auf den UNO zurück gegangen. Mit dem unten stehenden Script erhalte ich sogar Daten. Bspw.:

CO2 (ppm): 1724
Temperature (C): 52

Das sind natürlich Phantasie-Daten. Da ist wohl eine Kalibrierung notwendig.

Im Moment kämpfe ich mit der Programmierung über die serielle Schnittstelle. Ich bin erstmal wieder auf den UNO zurück gegangen. Mit dem unten stehenden Script erhalte ich sogar Daten. Bspw.:

CO2 (ppm): 1724
Temperature (C): 52

Das sind natürlich Phantasie-Daten. Da ist wohl eine Kalibrierung notwendig.

#include <Arduino.h>
#include "MHZ19.h"                                        //
#include <SoftwareSerial.h>                                // Remove if using HardwareSerial
//#include <Altsoftserial.h>

#define RX_PIN 10                                          // Rx pin which the MHZ19 Tx pin is attached to
#define TX_PIN 11                                          // Tx pin which the MHZ19 Rx pin is attached to
#define BAUDRATE 9600                                      // Device to MH-Z19 Serial baudrate (should not be changed)

MHZ19 myMHZ19;                                             // Constructor for library
SoftwareSerial mySerial(RX_PIN, TX_PIN);                   // (Uno example) create device to MH-Z19 serial

unsigned long getDataTimer = 0;

void setup()
{
    Serial.begin(9600);                                     // Device to serial monitor feedback

    mySerial.begin(BAUDRATE);                               // (Uno example) device to MH-Z19 serial start   
    myMHZ19.begin(mySerial);                                // *Serial(Stream) refence must be passed to library begin(). 

    myMHZ19.autoCalibration();                              // Turn auto calibration ON (OFF autoCalibration(false))
}

void loop()
{
    if (millis() - getDataTimer >= 2000)
    {
        int CO2; 

        /* note: getCO2() default is command "CO2 Unlimited". This returns the correct CO2 reading even 
        if below background CO2 levels or above range (useful to validate sensor). You can use the 
        usual documented command with getCO2(false) */

        CO2 = myMHZ19.getCO2();                             // Request CO2 (as ppm)
        
        Serial.print("CO2 (ppm): ");                      
        Serial.println(CO2);                                

        int8_t Temp;
        Temp = myMHZ19.getTemperature();                     // Request Temperature (as Celsius)
        Serial.print("Temperature (C): ");                  
        Serial.println(Temp);                               

        getDataTimer = millis();

        delay(5000);
    }
}