Help With Air Quality Sensors

:person_facepalming: i combined that code with my codeee

let me start again , the lcd works very good but i have a problem with my code which it doesnt update, i combined the code at Arduino Air Quality Monitor with DSM501A Sensor - Hackster.io with my code, so i cant get it to work now , i have the first version of the code without the dsm501 code, it might help , and for the last time , i need code helping

What kind of help are you expecting? Someone will rewrite your code and fix all the errors? - This won't teach you anything.

I'm trying to teach you to solve such problems on your own:

Solve the problem piece by piece. Remove all unnecessary things from the code, leave only the sensor. If it works, start adding other sensors. Change the code in small steps, checking each time

okay , i removed all of the codes and the sensor works

i am thinking of something like this , for 10 seconds the value from dsm501 updates , after that it switches to other value of sensors , like dht11 value then at the end , again it goes to loop

is that possible ?? @b707

Do you mean this piece of code:

If so - you don't update values in the loop, just output the same values 7 times.
And it is not 10 seconds ^)

ouch, yes i meant that code, do you any thing to fix it like that??

is this correct??

    for (int i = 1; i < 10; ++i) {

    delay(1000);
    lcd.clear();
    lcd.print("PM10: ");
    lcd.print(concentration1,3);
    lcd.setCursor(0,1);
    lcd.print("conc1 = ");
    lcd.print(concentration1);
    lcd.setCursor(0,2);
    lcd.print("conc2 = ");
    lcd.print(concentration2);
    lowpulseoccupancy1 = 0;
    lowpulseoccupancy2 = 0;
    starttime = millis();
    }

Move the reading the sensor from the beginning of the loop() to this code.

But stop... take the note that the use of millis() in this code is incompatible with your numerous delay().

no, read the above

  duration1 = pulseIn(pin1, LOW);
  duration2 = pulseIn(pin2, LOW);
  lowpulseoccupancy1 = lowpulseoccupancy1+duration1;
  lowpulseoccupancy2 = lowpulseoccupancy2+duration2;
  if ((millis()-starttime) > sampletime_ms)//if the sampel time == 30s
  {
    ratio1 = lowpulseoccupancy1/(sampletime_ms*10.0);  // Integer percentage 0=>100
    concentration1 = 1.1*pow(ratio1,3)-3.8*pow(ratio1,2)+520*ratio1+0.62; // using spec sheet curve

    ratio2 = lowpulseoccupancy2/(sampletime_ms*10.0);  // Integer percentage 0=>100
    concentration2 = 1.1*pow(ratio2,3)-3.8*pow(ratio2,2)+520*ratio2+0.62; // 

    lowpulseoccupancy1 = 0;
    lowpulseoccupancy2 = 0;
    starttime = millis();
    lcd.clear();
    lcd.print("PM10: ");
    lcd.print(concentration1,3);
    lcd.setCursor(0,1);
    lcd.print("conc1 = ");
    lcd.print(concentration1);
    lcd.setCursor(0,2);
    lcd.print("conc2 = ");
    lcd.print(concentration2);
    } 

like this??

Yes.
But to measure the values correctly you should remove any delays from the entire code.

even the delays between data values from other sensors?? i need them so they can read the values, if i dont use them then it will switch very fast

ahh still doesnt update

/*
  MQUnifiedsensor Library - reading an MQ135

  Demonstrates the use a MQ135 sensor.
  Library originally added 01 may 2019
  by Miguel A Califa, Yersson Carrillo, Ghiordy Contreras, Mario Rodriguez
 
  Added example
  modified 23 May 2019
  by Miguel Califa 

  Updated library usage
  modified 26 March 2020
  by Miguel Califa 

  Wiring:
  https://github.com/miguel5612/MQSensorsLib_Docs/blob/master/static/img/MQ_Arduino.PNG
  Please make sure arduino A0 pin represents the analog input configured on #define pin

 This example code is in the public domain.

*/

//Include the library
#include <MQUnifiedsensor.h>
#include <MQUnifiedsensor.h>
#include "DHT.h"
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,28,6); 

//Definitions
#define DHTPIN 52 // paye data sensor be 4 arduino vasl shode    
#define DHTTYPE DHT11   // DHT 11
#define placa "Arduino MEGA"
#define Voltage_Resolution 5
#define pin A0 //Analog input 0 of your arduino
#define type "MQ-135" //MQ135
#define ADC_Bit_Resolution 10 // For arduino UNO/MEGA/NANO
#define RatioMQ135CleanAir 3.6//RS / R0 = 3.6 ppm  
#define pindng A1
#define typesty "MQ-131"
#define RatioMQ131CleanAir 15

int pin2 = 3;
int pin1 = 2;
unsigned long duration1;
unsigned long duration2;

unsigned long starttime;
unsigned long sampletime_ms = 3000;//sampe 1s ;
unsigned long lowpulseoccupancy1 = 0;
unsigned long lowpulseoccupancy2 = 0;
float ratio1 = 0;
float ratio2 = 0;
float concentration1 = 0;
float concentration2 = 0;


//#define calibration_button 13 //Pin to calibrate your sensor

//Declare Sensor
MQUnifiedsensor MQ131(placa, Voltage_Resolution, ADC_Bit_Resolution, pindng, typesty);

DHT dht(DHTPIN, DHTTYPE);//sakht class
MQUnifiedsensor MQ135(placa, Voltage_Resolution, ADC_Bit_Resolution, pin, type);
void setup() {
  
  //Init the serial port communication - to debug the library
  Serial.begin(9600); //Init serial port
  pinMode(2,INPUT);
  pinMode(3,INPUT);

  starttime = millis();//get the current time;
  MQ131.setRegressionMethod(1); //_PPM =  a*ratio^b
  dht.begin();
  //Set math model to calculate the PPM concentration and the value of constants
  MQ135.setRegressionMethod(1); //_PPM =  a*ratio^b  
  /*****************************  MQ Init ********************************************/ 
  //Remarks: Configure the pin of arduino as input.
  /************************************************************************************/ 
  MQ131.init(); 
  MQ135.init(); 
  lcd.init();                      // initialize the lcd 
  lcd.init();
  lcd.backlight();
  lcd.setCursor(0,0);
  /* 
    //If the RL value is different from 10K please assign your RL value with the following method:
    MQ135.setRL(10);
  */
  /*****************************  MQ CAlibration ********************************************/ 
  // Explanation: 
  // In this routine the sensor will measure the resistance of the sensor supposedly before being pre-heated
  // and on clean air (Calibration conditions), setting up R0 value.
  // We recomend executing this routine only on setup in laboratory conditions.
  // This routine does not need to be executed on each restart, you can load your R0 value from eeprom.
  // Acknowledgements: https://jayconsystems.com/blog/understanding-a-gas-sensor
  Serial.print("Calibrating please wait.");
  float calcR0 = 0;
  float calcR01 = 0;
  for(int i = 1; i<=10; i ++)
  {
    MQ135.update(); // Update data, the arduino will read the voltage from the analog pin
    calcR0 += MQ135.calibrate(RatioMQ135CleanAir);
    MQ131.update(); // Update data, the arduino will read the voltage from the analog pin
    calcR01 += MQ131.calibrate(RatioMQ131CleanAir);
    Serial.print(".");
  }
  Serial.print("\n");
  MQ135.setR0(calcR0/10);
  MQ131.setR0(calcR01/10);
  
  if(isinf(calcR0)) {Serial.println("Warning: Conection issue, R0 is infinite (Open circuit detected) please check your wiring and supply"); while(1);}
  if(calcR0 == 0){Serial.println("Warning: Conection issue found, R0 is zero (Analog pin shorts to ground) please check your wiring and supply"); while(1);}
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
 
  // Compute heat index in Celsius (isFahreheit = false)
  float hic = dht.computeHeatIndex(t, h, false);
  /*****************************  MQ CAlibration ********************************************/
}

void loop() {

  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
 
  // Compute heat index in Celsius (isFahreheit = false)
  float hic = dht.computeHeatIndex(t, h, false);
  Serial.println("Sampling...");
  MQ135.update(); // Update data, the arduino will read the voltage from the analog pin

  MQ135.setA(605.18); MQ135.setB(-3.937); // Configure the equation to calculate CO concentration value
  float CO = MQ135.readSensor(); // Sensor will read PPM concentration using the model, a and b values set previously or from the setup
 
  MQ135.setA(77.255); MQ135.setB(-3.18); //Configure the equation to calculate Alcohol concentration value
  float Alcohol = MQ135.readSensor(); // SSensor will read PPM concentration using the model, a and b values set previously or from the setup

  MQ135.setA(110.47); MQ135.setB(-2.862); // Configure the equation to calculate CO2 concentration value
  float CO2 = MQ135.readSensor(); // Sensor will read PPM concentration using the model, a and b values set previously or from the setup

  MQ135.setA(44.947); MQ135.setB(-3.445); // Configure the equation to calculate Toluen concentration value
  float Toluen = MQ135.readSensor(); // Sensor will read PPM concentration using the model, a and b values set previously or from the setup
  
  MQ135.setA(102.2 ); MQ135.setB(-2.473); // Configure the equation to calculate NH4 concentration value
  float NH4 = MQ135.readSensor(); // Sensor will read PPM concentration using the model, a and b values set previously or from the setup

  MQ135.setA(34.668); MQ135.setB(-3.369); // Configure the equation to calculate Aceton concentration value
  float Aceton = MQ135.readSensor(); // Sensor will read PPM concentration using the model, a and b values set previously or from the setup

  MQ131.setA(23.943); MQ131.setB(-1.11); // Configure the equation to to calculate O3 concentration
  MQ131.update(); // Update data, the arduino will read the voltage from the analog pin
  MQ131.readSensorR0Rs(); // Sensor will read PPM concentration using the model, a and b values set previously or from the setup
   // Will print the table on the serial port
  float O3 = MQ131.readSensorR0Rs();
  MQ131.setA(-462.43); MQ131.setB(-2.204);
  MQ131.update();
  MQ131.readSensorR0Rs();
  float NOx = MQ131.readSensorR0Rs();
  MQ131.setA(47.209); MQ131.setB(-1.186);
  MQ131.update();
  MQ131.readSensorR0Rs();
  float CL2 = MQ131.readSensorR0Rs();
  // Note: 400 Offset for CO2 source: https://github.com/miguel5612/MQSensorsLib/issues/29
  /*
  Motivation:
  We have added 400 PPM because when the library is calibrated it assumes the current state of the
  air as 0 PPM, and it is considered today that the CO2 present in the atmosphere is around 400 PPM.
  https://www.lavanguardia.com/natural/20190514/462242832581/concentracion-dioxido-cabono-co2-atmosfera-bate-record-historia-humanidad.html
  */
  /*
    Exponential regression:
  GAS      | a      | b
  CO       | 605.18 | -3.937  
  Alcohol  | 77.255 | -3.18 
  CO2      | 110.47 | -2.862
  Toluen  | 44.947 | -3.445
  NH4      | 102.2  | -2.473
  Aceton  | 34.668 | -3.369
  */
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Sampling...");
  delay(10000);
  Serial.print("Humidity: ");
  Serial.print(h);
  Serial.print("%");
  Serial.print(" | ");
  lcd.setCursor(0,0);
  lcd.clear();
  lcd.print("Humidity: ");
  lcd.print(h);
  lcd.print("%");
  lcd.setCursor(0,1);
  lcd.print("Temp: ");
  lcd.print(t);
  lcd.print(" *C");
  delay(5000);
  lcd.clear();
  lcd.print("CO: ");
  lcd.print(CO);
  lcd.print(" PPM");
  lcd.setCursor(0,1);
  lcd.print("CO2: ");
  lcd.print(CO2+400);
  lcd.print(" PPM");
  delay(5000);
  lcd.clear();
  lcd.print("O3: ");
  lcd.print(O3);
  lcd.print(" PPM");
  lcd.setCursor(0,1);
  lcd.print("CL2: ");
  lcd.print(CL2);
  lcd.print(" PPM");
  delay(5000);
  lcd.clear();
  lcd.print("Aceton: ");
  lcd.print(Aceton);
  lcd.print(" PPM");
  lcd.setCursor(0,1);
  lcd.print("Toluen: ");
  lcd.print(Toluen);
  lcd.print(" PPM");
  delay(5000);
  lcd.clear();
  lcd.print("NH4: ");
  lcd.print(NH4);
  lcd.print(" PPM");
  lcd.setCursor(0,1);
  lcd.print("NOx: ");
  lcd.print(NOx);
  lcd.print(" PPM");
  duration1 = pulseIn(pin1, LOW);
  duration2 = pulseIn(pin2, LOW);
  lowpulseoccupancy1 = lowpulseoccupancy1+duration1;
  lowpulseoccupancy2 = lowpulseoccupancy2+duration2;
  for (int i = 1; i <= 7; ++i) {
    if ((millis()-starttime) > sampletime_ms)//if the sampel time == 30s
    {
      ratio1 = lowpulseoccupancy1/(sampletime_ms*10.0);  // Integer percentage 0=>100
      concentration1 = 1.1*pow(ratio1,3)-3.8*pow(ratio1,2)+520*ratio1+0.62; // using spec sheet curve

      ratio2 = lowpulseoccupancy2/(sampletime_ms*10.0);  // Integer percentage 0=>100
      concentration2 = 1.1*pow(ratio2,3)-3.8*pow(ratio2,2)+520*ratio2+0.62; // 

      lowpulseoccupancy1 = 0;
      lowpulseoccupancy2 = 0;
      starttime = millis();
      lcd.clear();
      lcd.print("PM10: ");
      lcd.print(concentration1,3);
      lcd.setCursor(0,1);
      lcd.print("conc1 = ");
      lcd.print(concentration1);
      lcd.setCursor(0,2);
      lcd.print("conc2 = ");
      lcd.print(concentration2);
      }
  } 

  delay(5000); //Sampling frequency
}

Yes, the correct way is to remove ALL delays and rewrite entire code as non-blocking, using the millis only. See the Blink_Without_Delay example in the IDE.

More simple, but not recommended - rewrite the reading of dms501 sensor with delays. But you will need to wait while the serie of readings will completed.

Indeed
The readings

must be inside the for loop

But hurry to fix it. You still won't have anything updated until you rewrite the entire program.

By the way
What’s the point of updating this data 7 times in a row within 10 seconds, if then you don’t show it at all for more than a minute?
Show data from one measurement, and after showing all other sensors, update these.

Once again - you won't get the correct data until you remove all delays from the code.

how to use blink delay??

i think this sensor is more important than other sensors, because of that im updating it