Помогите поправить код (Mega+Ethernet+LCD+DHT11+аналоговые датчики)
- Войдите на сайт для отправки комментариев
Доброго времени суток!
Помогите разобраться (поставить все на свои места) в коде... Есть Arduino Mega ADK, LCD экран, 4 датчика температуры, 2 датчика влажности почвы, 2 реле (включают полив на огороде). Все данные отображаются на LCD + через модуль Ehtrnet на страничке. Код скопипастил из нескольких примеров. Все вроде работает, но инфа на LCD отображается только при подключени к серверу. Без этого - замирает в одном состоянии. Некоторые надписи (относящиеся к коментарию аналоговых датчиков) отображаются некорректно (могут быть, а могут и нет). Собственно вопрос: что не так и как все это оптимизировать для нормальной работы? Как "разделить" и подписать каждый датчик отдельно, ане по порядковым номером...т.е. не sensor 1, sensor 2 и т.д., а sensor Ulica, Sensor Dom...? Вопрос может быть детский, но не силен в программировании...
P/S с меня пиво или шоколадка)
#include <LiquidCrystal.h> #include <SPI.h> #include <Ethernet.h> #include <dht11n.h> LiquidCrystal lcd(22, 23, 24, 25, 26, 27); const int Rele1 = 40; const int Rele2 = 41; // будем вычислять среднее арифметическое long mean = 0; int mean2 = 0; // long oldTime; // момент обращение к АЦП long timetoout; long mean3 = 0; int mean4 = 0; // long oldTime2; // момент обращение к АЦП long timetoout2; dht11 DHT11; #define nSensores 4 int puertos[nSensores]= {44,45,46,47}; // 0/1/2/3 парник. подвал-коричневый.1 эт.-синий 2эт -желтый float fHumedades[nSensores]; float fTemperaturas[nSensores]; int iNVisitas=0; // Enter a MAC address and IP address for your controller below. // The IP address will be dependent on your local network: byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xEE, 0xEE }; byte ip[] = { 192,168,1, 177 }; EthernetServer server(84); void setup() { lcd.begin(20, 4); pinMode(Rele1, OUTPUT); pinMode(Rele2, OUTPUT); // start the Ethernet connection and the server: Ethernet.begin(mac, ip); server.begin(); Serial.begin(115200); } void getdata(int iIndice) { int chk = DHT11.read(puertos[iIndice]); fHumedades[iIndice]=-1; fTemperaturas[iIndice]=-1; Serial.print("Sensor "); Serial.print(iIndice); Serial.print(" "); switch (chk) { case 0: fHumedades[iIndice]=(float)DHT11.humidity; Serial.print(fHumedades[iIndice], 2); Serial.print(" % "); fTemperaturas[iIndice]=(float)DHT11.temperature; Serial.print(fTemperaturas[iIndice], 2); Serial.println(" o C"); break; case -1: Serial.println(" Checksum error"); break; case -2: Serial.println(" Time out error"); break; default: Serial.println(" Unknown error"); break; } if(millis()-oldTime>200) { // инфа с аналоговых датчиков влажности почвы oldTime = millis(); mean = mean*9/10+analogRead(0); } if (millis()-timetoout>=5000) { timetoout=millis(); mean2=mean/10; } if(millis()-oldTime2>202) { oldTime2 = millis(); mean3 = mean3*9/10+analogRead(1); } if (millis()-timetoout2>=5020) { timetoout2=millis(); mean4=mean3/10; } } void loop() { // listen for incoming clients EthernetClient client = server.available(); if (client) { // an http request ends with a blank line boolean currentLineIsBlank = true; while (client.connected()) { if (client.available()) { char c = client.read(); // if you've gotten to the end of the line (received a newline // character) and the line is blank, the http request has ended, // so you can send a reply if (c == '\n' && currentLineIsBlank) { // send a standard http response header client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println("Connnection: close"); client.println(); client.println("<html>"); // add a meta refresh tag, so the browser pulls again every 5 seconds: client.println("<meta http-equiv=\"refresh\" content=\"5\">"); // output the value of each analog input pin for(int i=0;i<nSensores;i++){ client.print("sensor "); client.print(i); client.print(": "); if(fHumedades[i]==-1) client.print(" error leyendo el sensor"); else { client.print(fTemperaturas[i], 2); client.println(" o C"); client.print(fHumedades[i], 2); client.print(" % "); lcd.setCursor(0, 0);//// 1 отображаю температуру и влажность для каждого датчика lcd.print("TP:"); lcd.setCursor(3, 0); lcd.print(fTemperaturas[0], 0); lcd.setCursor(6, 0); lcd.print("H:"); lcd.setCursor(8, 0); lcd.print(fHumedades[0], 0); /// 2 lcd.setCursor(0, 1); lcd.print("T0:"); lcd.setCursor(3, 1); lcd.print(fTemperaturas[1], 0); lcd.setCursor(6, 1); lcd.print("H:"); lcd.setCursor(8, 1); lcd.print(fHumedades[1], 0); //// 3 lcd.setCursor(0, 2); lcd.print("T1:"); lcd.setCursor(3, 2); lcd.print(fTemperaturas[2], 0); lcd.setCursor(6, 2); lcd.print("H:"); lcd.setCursor(8, 2); lcd.print(fHumedades[2], 0); //// 4 lcd.setCursor(0, 3); lcd.print("T2:"); lcd.setCursor(3, 3); lcd.print(fTemperaturas[3], 0); lcd.setCursor(6, 3); lcd.print("H:"); lcd.setCursor(8, 3); lcd.print(fHumedades[3], 0); } client.println("<br />"); } if (mean2 < 680) { digitalWrite(Rele1, HIGH); // LCD, client lcd.setCursor(13, 1); lcd.print("Suxo"); client.print("Suxo"); client.println("<br />"); } if (mean2 > 780) { digitalWrite(Rele1, LOW); lcd.setCursor(13, 1); lcd.print("Vlazhno"); client.print("Vlazhno"); client.println("<br />"); } if (mean4 < 680) { digitalWrite(Rele2, HIGH); lcd.setCursor(13, 3); lcd.print("Suxo"); client.print("Suxo"); client.println("<br />"); } if (mean4 > 780) { digitalWrite(Rele2, LOW); lcd.setCursor(13, 3); lcd.print("Vlazhno"); client.print("Vlazhno"); client.println("<br />"); } client.print("Pole_Bolshoe "); //client.print(analogChannel); // client.print(" is "); client.print(mean2); client.println("<br />"); client.print("Pole_Small "); client.print(mean4); client.println("<br />"); client.print((iNVisitas++)/2); client.println(" visitas <br />"); /////// kursor LCD lcd.setCursor(11, 0); lcd.print("PB"); lcd.setCursor(14, 0); lcd.print(mean2,DEC); lcd.setCursor(11, 2); lcd.print("PS"); lcd.setCursor(14, 2); lcd.print(mean4,DEC); break; } if (c == '\n') { // you're starting a new line currentLineIsBlank = true; } else if (c != '\r') { // you've gotten a character on the current line currentLineIsBlank = false; } } } // give the web browser time to receive the data delay(1); // close the connection: client.stop(); } else { for(int i=0;i<nSensores;i++) getdata(i); delay(200); } }
Информация не выводится на дисплей из-за того что у вас весь код находится в теле условия if (client), выносите весь код за пределы этого условия.
Я тоже грешил на это... но куда тогда вставлять то, что должен напсать client
То что он должен отправлять по изернету пусть там и остается, а опрос датчиков и вывод на дисплей должны быть вынесены из этого условия.
Ок, все перенес до if (client). В цикле оставил только сточку вида
Все работает) Пасибо.
А как быть с сенсорами
как их можно объявить, чтобы можно было их подписать, т.е. не sensor 1, sensor 2..., а sensor Dom, sensor Ulica?
может вам попробовать использовать метод swich. (более опытные может используют по-другому)
...добавляется непонятный символ и все(
попробуйте не 'home' а "home" и со вторым так же (в двойных кавычках)
Разобрался - вставляются только последние буквы слов
попробуйте не 'home' а "home" и со вторым так же (в двойных кавычках)
ошибку выдает Dom_Ethernet_DHt11_analog_id_sen:210: error: invalid conversion from 'const char*' to 'char'
тогда так
Получилось!!! Спасибо огромное!
А можно еще воспользоваться подходом из этой ветки
http://arduino.ru/forum/programmirovanie/mnogomernyi-simvolnyi-massiv
Так даже лучше) Спасибо всем!
А можно Вас попросить выложить конечный работающий скетч?
Стоит аналогичная задача, а изобретать велосипед еще раз
не хотелось бы.
Спасибо
а мне подскажите переводили ли вы вывод с аналогово датчика влажности в %% относительной влажности? и если, то как?
Привожу самый стабильный вариант (описание сенсоров по memfise) . Остальные - в стадии тестирования
а мне подскажите переводили ли вы вывод с аналогово датчика влажности в %% относительной влажности? и если, то как?
датчик DHT11 цифровой. В разных примерах его подключают как к аналоговому, так и к цифровому входам (у меня - к цифровым)... По поводу % влажности, он вроде и считает относительную влажность в %