LCD+датчик влажности, температуры и газа

flizer
Offline
Зарегистрирован: 18.09.2012

Всем привет.

Не давно начал заниматся Ардуино, так что простите.

#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

#include "DHT.h"          
const float fVerNum = 0.03;

// Data pin connected to AM2302
#define DHTPIN 2
#define DHTTYPE DHT22       // DHT 22  (AM2302)
DHT dht(DHTPIN, DHTTYPE);   // LED pins

//////////////////////////////////////////////////////


int lcd_key     = 0;
int adc_key_in  = 0;
int sensorPin = 1; // Пин, на котором у нас висит сенсор газа
int gas = 0; // Переменная для хранения значения газового сенсора
int read_LCD_buttons()
{
 adc_key_in = analogRead(0);      // прочитать значение от датчика 
 
}
 
void setup()
{
 lcd.begin(16, 2);              // начало библиотеки
 Serial.begin(9600); // Инициализируем серийный порт
}
  
void loop()
{
  gas = analogRead(sensorPin); // Получаем значения из датчика газа
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  if (isnan(t) || isnan(h)) {
  Serial.println(F("Failed to read from DHT"));
    }
  else {
    Serial.print(F("Humidity: ")); 
    Serial.print(h);
    Serial.print(F(" %\t"));
    Serial.print(F("Temperature: ")); 
    Serial.print(t);
    Serial.print(F(" C\t"));
    Serial.print(F("Gaz: "));    
    Serial.println(gas); 
  }  
  // Wait 3 seconds
  delay(3000);
  
 lcd.setCursor(9,1); 
 lcd.print(gas);      
 lcd.setCursor(0,0); 
 lcd.print(t);
 lcd.setCursor(6,0); 
 lcd.print("C");   
 lcd.setCursor(9,0); 
 lcd.print(h);
 lcd.setCursor(15,0); 
 lcd.print("%");     
 
 delay(1000);  
}

Проблемма в отображении датчика газа.

При падении значения ниже 100 остаётся треий символ. Как его убрать?

На сом порте всё нормально.

Клапауций
Offline
Зарегистрирован: 10.02.2013

lcd.clear();

flizer
Offline
Зарегистрирован: 18.09.2012

Это весь экран, мерцать будет?

Удалить только последний символ можно?

vdk
Offline
Зарегистрирован: 14.04.2013

flizer пишет:

Удалить только последний символ можно?

Вывести вместо него пробел

flizer
Offline
Зарегистрирован: 18.09.2012

Толко при условии если значение меньше 100

Пример можно?

Клапауций
Offline
Зарегистрирован: 10.02.2013

flizer пишет:

Это весь экран, мерцать будет?

Удалить только последний символ можно?

можно - печатаете пробел в нужное место при условии, что разрядность цифры изменилась в меньшую сторону

вы точно уверены, что заметите мерцание при наличии delay(3000); delay(1000);

 

flizer
Offline
Зарегистрирован: 18.09.2012

Клапауций пишет:

можно - печатаете пробел в нужное место при условии, что разрядность цифры изменилась в меньшую сторону

 

Как это сделать?

Я только учусь :)

vdk
Offline
Зарегистрирован: 14.04.2013

flizer пишет:

Толко при условии если значение меньше 100

Пример можно?

Ну, типа так:

if (t<100) {
lcd.setCursor(x,0);
lcd.print(" ");  }

х можно определить визуально

flizer
Offline
Зарегистрирован: 18.09.2012

Спасибо, попробую.

vdk
Offline
Зарегистрирован: 14.04.2013

Но вообще-то лучше что-то поправить в консерватории, чтобы сразу выводилось корректно, вне зависимости от "больше 100 или меньше"

Клапауций
Offline
Зарегистрирован: 10.02.2013

flizer пишет:

Как это сделать?

мне не хочется вспоминать школьный курс математики - очистите экран и убедитесь, что мигания вы не заметите.

flizer
Offline
Зарегистрирован: 18.09.2012

" в консерватории" это где?

 

 

 

vdk
Offline
Зарегистрирован: 14.04.2013

flizer пишет:

" в консерватории" это где?

В  программе, разумеется

flizer
Offline
Зарегистрирован: 18.09.2012

Я только начал разбиратся, подсказали бы , где ошибка.

vdk
Offline
Зарегистрирован: 14.04.2013

Ошибка - она в том, что нужно решать задачу не "как мне стереть ненужное", а "как мне вывести так, чтобы ненужного не было".

Т.е. вытирание пробелом на первое время сойдет, но потом все равно встанет задача "как выводить правильно сразу"

Попробуйте это в качестве домашнего задания (а потом можно сходить в гугл и посмотреть "правильный ответ")

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Вариант 1. Использовать char buf[4]; sprintf( buf, "%3d", gas ); lcd.print( buf );

Вариант 2. Заменить sprintf на свой преобразователь, но всё равно преобразовывать в строку и выводить строку.

Вариант 3. Добавить проверки (100, 10 и тп) и добивать пробелами.