I tried to make an air quality measurement station. It contains an oled display, sensors for temperature, humidity, brightness, co2 and dust. It is based on a D1 mini (ESP 8266).
If I run this sketch here:
#include <PMS.h>
#include <SoftwareSerial.h>
SoftwareSerial pmsSerial(D3, D4);
PMS pms(pmsSerial);
PMS::DATA data;
void setup()
{
Serial.begin(115200);
pmsSerial.begin(9600);
}
void loop()
{
if (pms.read(data))
{
Serial.print("PM 1.0 (ug/m3): ");
Serial.println(data.PM_AE_UG_1_0);
Serial.print("PM 2.5 (ug/m3): ");
Serial.println(data.PM_AE_UG_2_5);
Serial.print("PM 10.0 (ug/m3): ");
Serial.println(data.PM_AE_UG_10_0);
Serial.println();
delay(500);
}
// Do other stuff...
}
I got all the measurements so everything works.
But as soon as I place the code inside the whole project, everything works except the dust sensor (PMS9103M).
#include <DFRobot_DHT20.h>
#include <U8g2lib.h>
#include <BH1750.h>
#include <SPI.h>
#include <Wire.h>
#include <PMS.h>
#include <SoftwareSerial.h>
SoftwareSerial pmsSerial(D3, D4);
PMS pms(pmsSerial);
PMS::DATA data;
U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
DFRobot_DHT20 dht20;
BH1750 lightMeter;
int LED_ROT = D8;
int SensorPin = D7; // 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.
int Messbereich = 5000; // Der voreingestellte Messbereich (0-5000ppm). Der Sensor MH-Z19B kann auch auf einen Maximalwert von 2000ppm vorkonfiguriert sein.
float Tempr, Humd;
unsigned long ZeitMikrosekunden; // Variable für die Dauer des PWM-Signalpegels in Mikrosenkunden
unsigned long ZeitMillisekunden; // Variable für die Dauer des PWM-Signalpegels in Millisekunden
int PPM = 0; // Variable für den CO2-Messwert in ppm (parts per million - Anteile pro Million)
float Prozent = 0; // Variable für den prozentuale Länge des PWM-Signals
void setup()
{
Wire.begin();
pinMode(LED_ROT, OUTPUT);
pinMode(SensorPin, INPUT);
Serial.begin(115200);
pmsSerial.begin(9600);
u8g2.begin();
dht20.begin();
lightMeter.begin();
}
void loop()
{
Tempr = dht20.getTemperature();
Humd = dht20.getHumidity() * 100;
Serial.print("Temperature:");
Serial.print(dht20.getTemperature());
Serial.print("C");
Serial.print(" Humidity:");
Serial.print(dht20.getHumidity() * 100);
Serial.println(" %RH");
float lux = lightMeter.readLightLevel();
Serial.print("Light: ");
Serial.print(lux);
Serial.println(" lx");
ZeitMikrosekunden = pulseIn(SensorPin, HIGH, 2000000); // Der pulseIn Befehl misst die Zeit, ab der ein Signal am angegebenen Pin auf HIGH wechselt und in diesem Zustand verbleibt. Standartmäßig endet diese Messung nach maximal 1.000.000 Mikrosekunden (1000ms). Durch das Ahängen des letzten Wertes kann man diesen sogenannten "Timeout" verlängern. Da das Signal des CO2 Sensors bis zu 1004ms lang sein kann, müssen wir den Wert entsprechend hoch ansetzen.
ZeitMillisekunden = ZeitMikrosekunden / 1000; // Umwandeln der Zeiteinheit von Mikrosekunden in Millisekunden.
float Prozent = ZeitMillisekunden / 1004.0; // Die maximale Länge des PWM-Signals ist laut Datenblatt des MH-Z19B 1004ms (Millisekunden) lang. Daher berechnen wir hier die gemessene PWM-Signaldauer durch die maximal mögliche Signaldauer und erhalten einen Prozentwert des aktiven (5V) Pegels im PWM-Signal. Dieser Prozentwert spiegelt einen PPM-Wert zwischen 0PPM und 5000PPM wieder.
PPM = Messbereich * Prozent; // PPM-Wert berechnen aus der prozentualen Signaldauer und dem maximalen Messbereich.
Serial.print("CO2 Anteil in der Luft in PPM: "); // Ausgabe der Werte über den Seriellen Monitor
Serial.println(PPM);
if (PPM < 1800) {
digitalWrite(LED_ROT, LOW);
} else {
digitalWrite(LED_ROT, HIGH);
}
delay(1000);
pms.read(data);
Serial.print("PM 1.0 (ug/m3): ");
Serial.println(data.PM_AE_UG_1_0);
Serial.print("PM 2.5 (ug/m3): ");
Serial.println(data.PM_AE_UG_2_5);
Serial.print("PM 10.0 (ug/m3): ");
Serial.println(data.PM_AE_UG_10_0);
delay(1000);
u8g2.firstPage();
do {
u8g2.setFont(u8g2_font_fur14_tf);
u8g2.setCursor(0, 15);
u8g2.print(Tempr, 1);
u8g2.print("C ");
u8g2.print(Humd, 1);
u8g2.print("%");
u8g2.setFont(u8g2_font_fur14_tf);
u8g2.setCursor(0, 37);
u8g2.print(lux, 1);
u8g2.print("lx ");
u8g2.print(PPM);
u8g2.print("p");
u8g2.setFont(u8g2_font_fur14_tf);
u8g2.setCursor(0, 60);
u8g2.print(data.PM_AE_UG_1_0);
u8g2.print(" / ");
u8g2.print(data.PM_AE_UG_2_5);
u8g2.print(" / ");
u8g2.print(data.PM_AE_UG_10_0);
u8g2.print("");
} while ( u8g2.nextPage() );
delay(2000);
}
any idea what I did wrong?