Ошибка в коде. Вывод символов на дисплей.
- Войдите на сайт для отправки комментариев
Пнд, 22/05/2017 - 16:26
Доброе время суток заглянувшим. Есть до банальности простой код, а конкретно чать, которая не работает. Хотел сделать стрелочки на дисплее при изменении температуры, которые почему-то статически висят на повышении, хотя должны менять направление при уменьшении температуры например. В общем в коде определенно есть ошибка, которую не вижу. Буду благодарен за подсказки. Нужный кусок кода в самом конце, и да, это франкинштейн)
#include <OneWire.h>
#include <LCD_1602_RUS.h>
#include <Wire.h>
//#include <LiquidCrystal_I2C.h>
#include <DHT.h>
OneWire ds(10); // подключен к 10 пину (резистор на 4.7к обязателен)
DHT dht22(2, DHT22); // Указать датчик DHT11, DHT21, DHT22
LCD_1602_RUS lcd(0x27, 16, 2); // Задаем адрес и размерность дисплея
void setup(void) {
Serial.begin(9600);
pinMode(2, INPUT);
digitalWrite(2, HIGH);
// byte degree[8] = // Битовая маска символа градуса
//{
// B00111,
// B00101,
// B00111,
// B00000,
// B00000,
// B00000,
// B00000,
//};
byte arrow_down[8] = {
0b00100,
0b00100,
0b00100,
0b00100,
0b00100,
0b11111,
0b01110,
0b00100
};
byte arrow_up[8] = {
0b00100,
0b01110,
0b11111,
0b00100,
0b00100,
0b00100,
0b00100,
0b00100
};
byte X[8] = {
0b00100,
0b00100,
0b00100,
0b11111,
0b00100,
0b00100,
0b00100,
0b00100
};
lcd.init(); // Инициализация lcd
lcd.backlight(); // Включаем подсветку
// lcd.createChar(1, degree); // Создаем символ под номером 1
lcd.createChar(2, arrow_up);
lcd.createChar(3, arrow_down);
lcd.createChar(4, X);
}
void loop(void) {
float dht22_t = dht22.readTemperature(); // чтение датчика на пине 2
float dht22_h = dht22.readHumidity(); // чтение датчика на пине 2
float celsius;
int dht22_past;
int ds18b20_past = celsius;
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
if ( !ds.search(addr)) {
ds.reset_search();
delay(250);
return;
}
ds.reset();
ds.select(addr);
ds.write(0x44, 1); // начало коммуникации
delay(1000);
present = ds.reset();
ds.select(addr);
ds.write(0xBE); // читаем значение
for ( i = 0; i < 9; i++) { // смотрим 9 байтов
data[i] = ds.read();
}
// Преобразуем получненный данные в температуру
// Используем int16_t тип, т.к. он равен 16 битам
// даже при компиляции под 32-х битный процессор
int16_t raw = (data[1] << 8) | data[0];
if (type_s) {
raw = raw << 3;
if (data[7] == 0x10) {
raw = (raw & 0xFFF0) + 12 - data[6];
}
} else {
byte cfg = (data[4] & 0x60);
if (cfg == 0x00) raw = raw & ~7;
else if (cfg == 0x20) raw = raw & ~3;
else if (cfg == 0x40) raw = raw & ~1;
}
celsius = (float)raw / 16.0;
// Выводим показания влажности и температуры
lcd.setCursor(0, 0); // Устанавливаем курсор в начало 1 строки
lcd.print("Inside"); // Выводим текст
lcd.setCursor(12, 0);
lcd.print(dht22_t,1);
lcd.setCursor(0, 1); // Устанавливаем курсор в начало 2 строки
lcd.print("Outside"); // Выводим текст, \1 - значок градуса
lcd.setCursor(12, 1);
lcd.print(celsius,1);
if (dht22_t > dht22_past) {
lcd.setCursor(10,0);
lcd.write(2);
}
else if (dht22_t < dht22_past) {
lcd.setCursor(10,0);
lcd.write(3);
}
else {
lcd.setCursor(10,0);
lcd.write(4);
}
if (celsius > ds18b20_past) {
lcd.setCursor(10,1);
lcd.write(2);
}
else if (celsius < ds18b20_past) {
lcd.setCursor(10,1);
lcd.write(3);
}
else {
lcd.setCursor(10,1);
lcd.write(4);
}
dht22_past = dht22_t;
ds18b20_past = celsius;
delay(1000);
}
Для начала вопрос-подсказка : в начале выполнения loop (каждого выполнения), какое значение имеют:dht22_past, ds18b20_past?
T.Rook, если позволите, подсказка к подсказке : http://arduino.ru/Reference/Static
T.Rook, если позволите, подсказка к подсказке : http://arduino.ru/Reference/Static
Не, ну так сразу ответ можно было написать. ТС же просил подсказки! Но, ага, принято. :)
T.Rook, Araris, спасибо большое за ответы! :) Завтра поковыряю ещё :)
Спасибо большое, ребят, при изменении типа переменной на статик все заработало. :)