Вывод температуры и влажности с датчика DHT21 на LCD + народный мониторинг

K@KTyC
Offline
Зарегистрирован: 03.05.2015

Добрый день форумчане.

Я в 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);
}

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а дисплей у тебя точно с i2c?

K@KTyC
Offline
Зарегистрирован: 03.05.2015

Helllo Word то работает.

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

// Set the LCD address to 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup()
{
	// initialize the LCD
	lcd.begin();

	// Turn on the blacklight and print a message.
	lcd.backlight();
	lcd.print("Hello, world!");
}

void loop()
{
	// Do nothing here...
}

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

закоментируй в коде все про эзернет и попробуй снова

K@KTyC
Offline
Зарегистрирован: 03.05.2015

Все закоментировал кроме того, что касается LSD, заработало. Что то залазит в память другого процесса?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а может просто оперативной памяти не хватает?

K@KTyC
Offline
Зарегистрирован: 03.05.2015
Из окна дебага:
Sketch uses 20 002 bytes (62%) of program storage space. Maximum is 32 256 bytes.
Global variables use 1 179 bytes (57%) of dynamic memory, leaving 869 bytes for local variables. Maximum is 2 048 bytes.
 
Может есть какой-то вариант этопроверить?
jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

значит хватает

#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 <a href="http://narodmon.ru/post.php" title="http://narodmon.ru/post.php" rel="nofollow">http://narodmon.ru/post.php</a> 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);
}

 

K@KTyC
Offline
Зарегистрирован: 03.05.2015

Не найду, что изменили,дебаг ругается.


sketch_may04b.ino:10:1: error: stray '\' in program
sketch_may04b.ino:10:37: error: expected '}' before 'u0421'
sketch_may04b.ino:10:37: error: expected ',' or ';' before 'u0421'
sketch_may04b.ino:10:54: error: expected declaration before '}' token

Кстати временно избавился от кода значка градуса,заработало вывод на экран "System Load"

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

понятно

K@KTyC
Offline
Зарегистрирован: 03.05.2015

Но остальное то не работает.