Air Quality: Single sketch works, whole project doesnt

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?

You forgot the schematic.

So when I tested the single sketch and the whole project, I had all the sensors connected in both cases. So i dont really understand why it is not working with the big sketch but with the small.

It is connected like this:
l2c devices (oled, temp/humidity and luxmeter): D1 and D2
PMS9103: D3 and D4
LED: D8
CO2 Meter PWM: D7

I guess you cannot tell us what works right, so may I suggest you disable the code for each of your devices, one at a time and determine if that fixes the problem.

so I built up the script again and it works fine until the beginning of void loop.
as soon as I add anything except the following, it doesnt work anymore:

    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);

    delay(500);
  }

edit:
okay, interesting. If I put everything inside

 if (pms.read(data))
  { }

it works perfectly fine. but if there is one thing after the if section (still in the loop section!), everything works except the PMS. how is this possible?

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.