Ошибка в коде. Вывод символов на дисплей.
- Войдите на сайт для отправки комментариев
Пнд, 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, спасибо большое за ответы! :) Завтра поковыряю ещё :)
Спасибо большое, ребят, при изменении типа переменной на статик все заработало. :)