Дисплей показывает неправильное значение от датчика MQ-135, и текст застревает на экране

я использую газовый датчик MQ-135 и ЖК-экран 20x4, и он показывает разные значения на последовательном мониторе, он показывает 756 PPM, а на ЖК-экране он застрял ниже 320PPM текст BAD также застрял на экране и не обновляется при снижении значения PPM CO2

это мой код

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
#define sensor A0
int gas, co2lvl;
#define updateDisplay(); 

void setup()
{
pinMode(sensor,INPUT);
Serial.begin(9600);
lcd.begin(20,4);
  lcd.clear();
}

void loop()
{
co2lvl=gas-255;
co2lvl=map(co2lvl, 0,1024,400,5000);
Serial.print(co2lvl);
Serial.print("ppm");
Serial.println();
delay(200);
if(co2lvl>=699){
updateDisplay(); 
lcd.setCursor(0,0); 
lcd.print("CO2 IN THE AIR");
lcd.setCursor(0,1);  
lcd.print(analogRead(co2lvl)); 
lcd.setCursor(6,1);
lcd.print("EXCELLENT");
}
else if(co2lvl<=700){
updateDisplay(); 
lcd.setCursor(0,0); 
lcd.print("CO2 PRESENT IN THE AIR");
lcd.setCursor(0,1);  
lcd.print(analogRead(co2lvl)); 
lcd.setCursor(4,1);
lcd.print("GOOD");}
else if(co2lvl<=900){
  updateDisplay(); 
  lcd.setCursor(0,0); 
lcd.print("CO2 PRESENT IN THE AIR");
lcd.setCursor(0,1);  
lcd.print(analogRead(co2lvl)); 
lcd.setCursor(5,1);
lcd.print("FAIR");}
else if(co2lvl<=1100){
  updateDisplay(); 
  lcd.setCursor(0,0); 
lcd.print("CO2 PRESENT IN THE AIR");
lcd.setCursor(0,1);  
lcd.print(analogRead(co2lvl)); 
lcd.setCursor(5,1);
lcd.print("MEDIOCRE");
}
else(co2lvl<=1600);{
  updateDisplay(); 
  lcd.setCursor(0,0); 
lcd.print("CO2 PRESENT IN THE AIR");
lcd.setCursor(0,1);  
lcd.print(analogRead(co2lvl)); 
lcd.setCursor(5,1);
lcd.print("BAD");}
}

, 👍1

Обсуждение

используйте Уровень CO2 в воздухе, чтобы лучше отобразить его на дисплее... Уровень CO2, вероятно, достаточен, @jsotola


1 ответ


Лучший ответ:

0

Вы допустили ошибку в строке:

else(co2lvl<=1600);

Из-за точки с запятой (;) он ничего не сделает для этого условия. Но вместо этого следующие строки будут выполняться всегда.

Ниже приведен небольшой рефакторинг, делающий ваш код более понятным, а также удаляющий дублированный код:

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
#define sensor A0
int gas, co2lvl;

void setup()
{
  pinMode(sensor,INPUT);
  Serial.begin(9600);
  lcd.begin(20,4);
  lcd.clear();
}

void loop()
{
  co2lvl=gas-255;
  co2lvl=map(co2lvl, 0,1024,400,5000);
  Serial.print(co2lvl);
  Serial.print("ppm");
  Serial.println();
  delay(200);
 
  lcd.setCursor(0,0); 
  lcd.print("CO2 PRESENT IN THE AIR");
  lcd.setCursor(0,1);  
  lcd.print(analogRead(co2lvl)); 

  if      (co2lvl <=  300) { show(6, "EXCELLENT"); }
  else if (co2lvl <=  700) { show(4, "GOOD"     ); }
  else if (co2lvl <=  900) { show(5, "FAIR"     ); }
  else if (co2lvl <= 1100) { show(5, "MEDIOCRE" ); }
  else if (co2lvl <= 1600) { show(5, "BAD"      ); }
}

void show(int position, char* text)
{
  lcd.setCursor(position, 1);
  lcd.print(text);
}
,

большое вам спасибо, @NEXE

Добро пожаловать ... если это помогло вам, пожалуйста, проголосуйте за ответ, и если ответ правильный для решения вашего решения, примите ответ (нажав на галочку рядом с ответом). Удачи вам в вашем проекте., @Michel Keijzers