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
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
/*
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.
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.