Помогите поправить код (Mega+Ethernet+LCD+DHT11+аналоговые датчики)

DrLOR
Offline
Зарегистрирован: 14.04.2012

 Доброго времени суток!

Помогите разобраться (поставить все на свои места) в коде... Есть 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);
  }
}

 

maksim
Offline
Зарегистрирован: 12.02.2012

 Информация не выводится на дисплей из-за того что у вас весь код находится в теле условия if (client), выносите весь код за пределы этого условия.

DrLOR
Offline
Зарегистрирован: 14.04.2012

Я тоже грешил на это... но куда тогда вставлять то, что должен напсать client

 if (mean2 < 680) {
       digitalWrite(Rele1, HIGH); // LCD, client
       lcd.setCursor(13, 1); 
       lcd.print("Suxo"); // это выношу за if (client)

        client.print("Suxo"); // а как реализовать эти     строчки????
        client.println("<br />");

 

 
maksim
Offline
Зарегистрирован: 12.02.2012

 То что он должен отправлять по изернету пусть там и остается, а опрос датчиков и вывод на дисплей должны быть вынесены из этого условия.

DrLOR
Offline
Зарегистрирован: 14.04.2012

Ок, все перенес до 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?

memfise
Offline
Зарегистрирован: 30.06.2012

может вам попробовать использовать метод 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;}

 

DrLOR
Offline
Зарегистрирован: 14.04.2012

...добавляется непонятный символ и все(  

memfise
Offline
Зарегистрирован: 30.06.2012

попробуйте не 'home' а "home" и со вторым так же (в двойных кавычках)

 

DrLOR
Offline
Зарегистрирован: 14.04.2012

 Разобрался - вставляются только последние буквы слов

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;
                                }

 

DrLOR
Offline
Зарегистрирован: 14.04.2012

memfise пишет:

попробуйте не 'home' а "home" и со вторым так же (в двойных кавычках)

 

ошибку выдает Dom_Ethernet_DHt11_analog_id_sen:210: error: invalid conversion from 'const char*' to 'char'

memfise
Offline
Зарегистрирован: 30.06.2012

 тогда так

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);

 

DrLOR
Offline
Зарегистрирован: 14.04.2012

 Получилось!!! Спасибо огромное!

leshak
Offline
Зарегистрирован: 29.09.2011

 А можно еще воспользоваться подходом из этой ветки

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(){
}

 

DrLOR
Offline
Зарегистрирован: 14.04.2012

Так даже лучше) Спасибо всем!

Alex1503
Offline
Зарегистрирован: 16.06.2012

 А можно Вас попросить выложить конечный работающий скетч?

Стоит аналогичная задача, а изобретать велосипед еще раз 

не хотелось бы.

Спасибо

vworld
vworld аватар
Offline
Зарегистрирован: 26.09.2011

а мне подскажите переводили ли вы вывод с аналогово датчика влажности в %% относительной влажности? и если, то как?

DrLOR
Offline
Зарегистрирован: 14.04.2012

Привожу самый стабильный вариант (описание сенсоров по 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);
  }
} 

 

DrLOR
Offline
Зарегистрирован: 14.04.2012

vworld пишет:

а мне подскажите переводили ли вы вывод с аналогово датчика влажности в %% относительной влажности? и если, то как?

датчик DHT11 цифровой. В разных примерах его подключают как к аналоговому, так и к цифровому входам (у меня - к цифровым)... По поводу % влажности, он вроде и считает относительную влажность в %