Помогите поправить код (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 (mean2 < 680) { digitalWrite(Rele1, HIGH); // LCD, client lcd.setCursor(13, 1); lcd.print("Suxo"); // это выношу за if (client) client.print("Suxo"); // а как реализовать эти строчки???? client.println("<br />");То что он должен отправлять по изернету пусть там и остается, а опрос датчиков и вывод на дисплей должны быть вынесены из этого условия.
Ок, все перенес до if (client). В цикле оставил только сточку вида
if (mean2 < 680) { client.print("Suxo"); client.println("<br />"); }
Все работает) Пасибо.
А как быть с сенсорами
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(" % "); } client.println("<br />"); }как их можно объявить, чтобы можно было их подписать, т.е. не sensor 1, sensor 2..., а sensor Dom, sensor Ulica?
может вам попробовать использовать метод swich. (более опытные может используют по-другому)
char id_sensor = 0; 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 { swich (i){ case 0: id_sensor = 'home'; break; case 1: id_sensor = 'ulica'; break;} client.print(id_sensor ); client.print(" "); client.print(fTemperaturas[i], 2); client.println(" o C"); client.print(fHumedades[i], 2); client.print;}...добавляется непонятный символ и все(
попробуйте не 'home' а "home" и со вторым так же (в двойных кавычках)
Разобрался - вставляются только последние буквы слов
switch (i) { case 0: id_sensor = 'Parnik'; break; case 1: id_sensor = 'Podval'; break; case 2: id_sensor = '1 Etazh'; break; case 3: id_sensor = '2 Etazh'; break; }попробуйте не 'home' а "home" и со вторым так же (в двойных кавычках)
ошибку выдает Dom_Ethernet_DHt11_analog_id_sen:210: error: invalid conversion from 'const char*' to 'char'
тогда так
char* id_sensor = " "; switch (i) { case 0: id_sensor = "Parnik"; break; case 1: id_sensor = "Podval"; break; case 2: id_sensor = "1 Etazh"; break; case 3: id_sensor = "2 Etazh"; break; } Serial.print(id_sensor);Получилось!!! Спасибо огромное!
А можно еще воспользоваться подходом из этой ветки
http://arduino.ru/forum/programmirovanie/mnogomernyi-simvolnyi-massiv
#define MAX_NAME_LENGTH 14 // максимально допустимая длина для имени сенсора. должна быть равно длина(самое_длинное_имя)+1. Или больше (но тогда память в пустую будем расходовать). char sensorNames[][MAX_NAME_LENGTH]={ "parnik", "fignik", "severny polus" }; void setup(){ Serial.begin(57600); // выводим имена всех сенсоров for(int i=0;i<3;i++){ Serial.print("Sensor name '"); Serial.print(sensorNames[i]); // аналог switch из предыдущего примера Serial.println("'"); } } void loop(){ }Так даже лучше) Спасибо всем!
А можно Вас попросить выложить конечный работающий скетч?
Стоит аналогичная задача, а изобретать велосипед еще раз
не хотелось бы.
Спасибо
а мне подскажите переводили ли вы вывод с аналогово датчика влажности в %% относительной влажности? и если, то как?
Привожу самый стабильный вариант (описание сенсоров по memfise) . Остальные - в стадии тестирования
#include <LiquidCrystal.h> #include <SPI.h> #include <Ethernet.h> #include <dht11n.h> // более новая версия библиотеки dht11, чтоб не путаться, переименовал dht11.h в 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() { /// вставка if (mean2 > 680 && mean2 < 780) { lcd.setCursor(13, 1); lcd.print("Vlazhno"); } if (mean2 < 680) { digitalWrite(Rele1, HIGH); // LCD, client lcd.setCursor(13, 1); lcd.print("Suxo"); } if (mean2 > 780) { digitalWrite(Rele1, LOW); lcd.setCursor(13, 1); lcd.print("Vlazhno"); } if (mean4 > 680 && mean4 < 780) { lcd.setCursor(13, 3); lcd.print("Vlazhno"); } if (mean4 < 680) { digitalWrite(Rele2, HIGH); lcd.setCursor(13, 3); lcd.print("Suxo"); } if (mean4 > 780) { digitalWrite(Rele2, LOW); lcd.setCursor(13, 3); lcd.print("Vlazhno"); } /////// 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); ///температура 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); // 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 char* id_sensor = " "; 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 { switch (i) { case 0: id_sensor = " Parnik "; break; case 1: id_sensor = " Podval "; break; case 2: id_sensor = " 1 Etazh "; break; case 3: id_sensor = " 2 Etazh "; break; } client.print(id_sensor); client.print(fTemperaturas[i]); client.println(" o C"); client.print(fHumedades[i]); client.print(" % "); } client.println("<br />"); } client.print("Pole_Bolshoe "); //client.print(analogChannel); // client.print(" is "); client.print(mean2); if (mean2 > 680 && mean2 < 780) { client.print(" Vlazhno"); client.println("<br />"); } if (mean2 < 680) { client.print(" Suxo"); client.println("<br />"); } if (mean2 > 780) { client.print(" Vlazhno"); client.println("<br />"); } client.println("<br />"); client.print("Pole_Small "); client.print(mean4); if (mean4 > 680 && mean4 < 780) { client.print(" Vlazhno"); client.println("<br />"); } if (mean4 < 680) { client.print(" Suxo"); client.println("<br />"); } if (mean4 > 780) { client.print(" Vlazhno"); client.println("<br />"); } client.println("<br />"); client.print((iNVisitas++)/2); client.println(" visitas <br />"); 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); } }а мне подскажите переводили ли вы вывод с аналогово датчика влажности в %% относительной влажности? и если, то как?
датчик DHT11 цифровой. В разных примерах его подключают как к аналоговому, так и к цифровому входам (у меня - к цифровым)... По поводу % влажности, он вроде и считает относительную влажность в %