ارور داخل کدنویسی دستگاه تشخیص کیفیت هوا

سلام، من یک کدی نوشتم که میتونه چند تا سنسور از جمله dht11 , mq131,mq135,dsm501 رو به اردوینو وصل کنه تا روی ال سی دی نمایش بده اما من به یک مشکلی برخوردم، کد dsm501 رو از لینک زیر کپی کردم و همه  کد ال ای دی هاش رو پاک کردم تا با دستگاهم سازگار بشه ، بعدش وقتی اومدم این کد را داخل loop قرار بدم ، دیگه اپدیت نشد روی ال سی دی و کل دیتا سنسور ها طول میکشید تا دوباره اپدیت شده رو نشون بده ، من کدی میخواستم اینجوری ، اول دیتا سنسور ها رو نشون بده (که نشون میده) بعد برای 20 ثانیه dsm501 دیتاش اپدیت شه (که نمیشه) لطفا کمک کنید.
کد dsm501:

https://www.hackster.io/mircemk/arduino-air-quality-monitor-with-dsm501a-sensor-b4f8fc

کد اولیه من:

/*
  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:
MQSensorsLib_Docs/static/img/MQ_Arduino.PNG at master · miguel5612/MQSensorsLib_Docs · GitHub
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,4);

//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
//#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
MQ131.setRegressionMethod(1); //_PPM = aratio^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: Gas Sensor Technology Unveiled: What You Need to Know
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: Problems with MQ135 · Issue #29 · miguel5612/MQSensorsLib · GitHub
/*
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.
El gas del cambio climático marca un récord nunca visto en la historia humana
/
/

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”);
Serial.print(“Temperature: “);
Serial.print(t);
Serial.print(” *C “);
Serial.print(” | “);
Serial.print(“Heat index: “);
Serial.print(hic);
Serial.print(” *C “);
Serial.print(” | “);
Serial.print(“CO2:”);
Serial.print(CO2+400);
Serial.print(” PPM”);
Serial.print(” | “);
Serial.print(“CO:”);
Serial.print(CO);
Serial.print(” | “);
Serial.print(“Alcohol: “);
Serial.print(Alcohol);
Serial.print(” PPM”);
Serial.print(” | “);
Serial.print(“Toluen: “);
Serial.print(Toluen);
Serial.print(” PPM”);
Serial.print(” | “);
Serial.print(“NH4: “);
Serial.print(NH4);
Serial.print(” PPM”);
Serial.print(” | “);
Serial.print(“Aceton: “);
Serial.print(Aceton);
Serial.print(” PPM”);
Serial.print(” | “);
Serial.print(“Ozone: “);
Serial.print(O3);
Serial.print(” PPM”);
Serial.print(” | “);
Serial.print(“CL2: “);
Serial.print(CL2);
Serial.print(” PPM”);
Serial.print(” | “);
Serial.print(“NOx: “);
Serial.print(NOx);
Serial.print(” PPM”);
Serial.print(”\n”);
delay(5000); //Sampling frequency
}

با سلام

کد شما را بررسی کردم و بخشی که مربوط به سنسور DSM501 می شود را پیدا نکردم.

این لینک آموزشی هم که قرار دادید یک مقدار گنگ توضیح داده است.

با توجه به این لینک این ماژول دارای 2 عدد خروجی و یک پین جهت کنترل یکی از خروجی ها می باشد.

خروجی این ماژول نیز به صورت پالس می باشد که مجموع پالس های LOW در مدت 30 ثانیه می شود میزان کیفیت هوا.

از این رو شما یک دیلی 30 ثانیه ای برای این سنسور خواهید داشت.

با توجه به لوپی که دارید که هر سنسور را به صورت دوره ای نمایش بدهید پیشنهاد میکنم از Tread استفاده کنید (البته آردوینو همچنین چیزی را ندارد)

این امکان در STM و ESP وجود دارد ولی در آردوینو نیز به صورت قاچاقی ایجاد میکنیم

اما به صورت کلی پیشنهاد میکنم از ESP32 برای این موضوع استفاده کنید چون 2 هسته ای می باشد و میتوانید یکی از هسته هارا مسئول نمایش اطلاعات و دیگری را برای جمع‌آوری قرار بدهید.

 اگر برای آردوینو میخواهید می توانید به این آموزش مراجعه کنید. فقط توجه داشته باشید در این سیستم اگر نمایش را بر روی Tread انداخته اید از یک شمارنده به همراه شرط استفاده کنید که هر بار اجرا می شود یکی از حالت های نمایش را اجرا کند و با دیلی بین حالت های نمایش پیش نرود. چون به مشکل خواهید خورد.