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

8 ماه قبل
146 بازدید

0

سلام، من یک کدی نوشتم که میتونه چند تا سنسور از جمله 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:
  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,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 =  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");
  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
}
05 اردیبهشت 03 در 06:35
iliasoli
3

افزودن دیدگاه

1 پاسخ ثبت شده است
0

با سلام

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

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

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

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

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

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

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

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

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

 

08 اردیبهشت 03 در 05:45
محمد دمیرچی
4240

افزودن دیدگاه


انجمن کافه‌ربات © 1400