Вывод температуры и влажности с датчика DHT21 на LCD + народный мониторинг
- Войдите на сайт для отправки комментариев
Добрый день форумчане.
Я в Arduino новичек после того как поморгал светодиодом вторым надо сделать метеостанцию. Но пока едут остальные датчики, решил сделать вывод только с DHT21 ну и чтобы каждый раз не лезть в инет,решил подключить экран. За чем собственно обращаюсь, код позаимствовал с проекта Гладышева тыц оставив только интересующий себя датчики,плюс добавил вывод на экран.
Проблема заключается,что компиляция происходит без ошибок, когда загружаю ошибок нет, но на экран никакой информации не выводится,включал дебаг опять же в монитор последовательного порта тоже ничего не сыпется, куда копать уже незнаю.
Ethernet пока не подключал, чтобы перед тем чтобы что то отправлять быть абсолютно уверенным, что инфа уходит корректно. Помогите пожалуйста код ниже.
#include <dht.h> #include <SPI.h> #include <Ethernet.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> bool Debug = true; //режим отладки //******************************************************************************************** byte mac[] = { 0xDE, 0xAD, 0xBE, 0x3С, 0x12, 0xAB }; //MAC-адрес Arduino #define DHTPIN 2 // пин подключения датчика влажности DHT21 #define DHTTYPE DHT21 // тип датчика влажности DHT21 #define postingInterval 600000 // интервал между отправками данных в миллисекундах (10 минут) //******************************************************************************************** IPAddress server(94,19,113,221); // IP сервера народного мониторинга char macbuf[13]; EthernetClient client; LiquidCrystal_I2C lcd(0x27, 16, 2); DHT dht(DHTPIN, DHTTYPE); byte degree[8] = // кодируем символ градуса { B00111, B00101, B00111, B00000, B00000, B00000, B00000, }; unsigned long lastConnectionTime = 0; // время последней передачи данных boolean lastConnected = false; // состояние подключения int HighByte, LowByte, TReading, SignBit, Tc_100, Whole, Fract; char replyBuffer[160]; // буфер для отправки int CountSensors; // количество найденных датчиков температуры long Temperature = 0; long Pressure = 0; // давление float Humidity = 0; // влажность void setup() { lcd.begin(); lcd.backlight(); lcd.createChar(1, degree); // Создаем символ под номером 1 if (Debug) { Serial.begin(9600); lcd.print("System load"); delay (1000); lcd.print("."); delay (1000); lcd.print("."); delay (1000); lcd.print("."); delay (1000); lcd.clear(); } // Пробуем подключиться по Ethernet до тех пор пока это не удастся do { delay(1000); } while (Ethernet.begin(mac) == 0); lastConnectionTime = millis()-postingInterval+15000; //первое соединение через 15 секунд после запуска } void loop() { //Если вдруг нам случайно приходят откуда-то какие-то данные, //то просто читаем их и игнорируем, чтобы очистить буфер if (client.available()) { client.read(); } if (!client.connected() && lastConnected) { if (Debug) { Serial.println(); Serial.println("disconnecting."); } client.stop(); } //если не подключены и прошло определённое время, то делаем замер, //переподключаемся и отправляем данные if (!client.connected() && (millis() - lastConnectionTime > postingInterval)) { //формирование HTTP-запроса memset(replyBuffer, 0, sizeof(replyBuffer)); strcpy(replyBuffer,"ID="); memset(macbuf, 0, sizeof(macbuf)); //Конвертируем MAC-адрес for (int k=0; k<6; k++) { int b1=mac[k]/16; int b2=mac[k]%16; char c1[2],c2[2]; if (b1>9) c1[0]=(char)(b1-10)+'A'; else c1[0] = (char)(b1) + '0'; if (b2>9) c2[0]=(char)(b2-10)+'A'; else c2[0] = (char)(b2) + '0'; c1[1]='\0'; c2[1]='\0'; strcat(macbuf,c1); strcat(macbuf,c2); } strcat(replyBuffer, macbuf); char temp[8]; long p_100, h_100; //получаем значение влажности Humidity = dht.readHumidity(); strcat(replyBuffer, "&"); strcat(replyBuffer, macbuf); strcat(replyBuffer, "02="); h_100 = Humidity*100; Whole = h_100 / 100; Fract = h_100 % 100; itoa(Whole, temp); strcat(replyBuffer, temp); strcat(replyBuffer, "."); if (Fract<10) { strcat(replyBuffer,"0"); } itoa(Fract, temp); strcat(replyBuffer, temp); //получаем значение температуры с датчика влажности strcat(replyBuffer, "&dhtt="); Temperature = dht.readTemperature()*100; if (Temperature < 0) { SignBit = 1; Temperature = -Temperature; } else { SignBit = 0; } Whole = Temperature / 100; Fract = Temperature % 100; itoa(Whole, temp); if (SignBit) { strcat(replyBuffer, "-"); } strcat(replyBuffer, temp); strcat(replyBuffer, "."); if (Fract<10) { strcat(replyBuffer,"0"); } itoa(Fract, temp); strcat(replyBuffer, temp); strcat(replyBuffer,'\0'); if (Debug) { Serial.println(replyBuffer); Serial.print("Content-Length: "); Serial.println(len(replyBuffer)); } // вывод данных на экран { lcd.setCursor(0, 0); lcd.print("Temp: "); lcd.print(Temperature/100); lcd.print(" \1C"); lcd.setCursor(0, 1); lcd.print("Hum: "); lcd.print(Humidity/100); lcd.print(" %"); } //отправляем запрос httpRequest(); } //храним последнее состояние подключения lastConnected = client.connected(); } //Функция отправки данных void httpRequest() { if (client.connect(server, 80)) { if (Debug) { Serial.println("connecting..."); } // отправляем HTTP POST запрос: client.println("POST http://narodmon.ru/post.php HTTP/1.0"); client.println("Host: narodmon.ru"); client.println("Content-Type: application/x-www-form-urlencoded"); client.print("Content-Length: "); client.println(len(replyBuffer)); client.println(); client.println(replyBuffer); client.println(); lastConnectionTime = millis(); } else { if (Debug) { Serial.println("connection failed"); Serial.println("disconnecting."); } client.stop(); } } //Функция определения длины строки int len(char *buf) { int i=0; do { i++; } while (buf[i]!='\0'); return i; } //Функция переворота строки void reverse(char s[]) { int i, j; char c; for (i = 0, j = strlen(s)-1; i<j; i++, j--) { c = s[i]; s[i] = s[j]; s[j] = c; } } //Функция конвертирования числа в символьный массив void itoa(int n, char s[]) { int i, sign; if ((sign = n) < 0) /* записываем знак */ n = -n; /* делаем n положительным числом */ i = 0; do { /* генерируем цифры в обратном порядке */ s[i++] = n % 10 + '0'; /* берем следующую цифру */ } while ((n /= 10) > 0); /* удаляем */ if (sign < 0) s[i++] = '-'; s[i] = '\0'; reverse(s); }
а дисплей у тебя точно с i2c?
Helllo Word то работает.
закоментируй в коде все про эзернет и попробуй снова
Все закоментировал кроме того, что касается LSD, заработало. Что то залазит в память другого процесса?
а может просто оперативной памяти не хватает?
значит хватает
Не найду, что изменили,дебаг ругается.
Кстати временно избавился от кода значка градуса,заработало вывод на экран "System Load"
понятно
Но остальное то не работает.