Дисплей показывает неправильное значение от датчика 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");}
}
@NEXE, 👍1
Обсуждение1 ответ
Лучший ответ:
Вы допустили ошибку в строке:
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
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
используйте
Уровень CO2 в воздухе
, чтобы лучше отобразить его на дисплее...Уровень CO2
, вероятно, достаточен, @jsotola