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?
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.
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.
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?
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.
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.
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
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);
}
}