Нужна помощь в проекте (передача данных на сайт Народный мониторинг)

DZent
Offline
Зарегистрирован: 25.09.2013

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

Предисловие(можно не читать):Возникла недавно непреодолимое желание создать что-нибудь своими руками. Закупил все необходимые компоненты(Arduino,шаговые двигатели,датчик температуры и влажности - DHT21,датчик давления - BMP085,датчик движения и т.п.), опробовал небольшие примеры и решил сделать что нибудь посерьезнее. Долго читал в интернете различные статьи и наткнулся на интересную для себя тему - Отправка данных на сайт "Народный мониторинг".

Суть: Взял скетч(второй) для отправки данных на сайт Народный мониторинг с этого сайта http://star-t-hinking.blogspot.ru/2013/06/diy.html для DHT22,

//
//   FILE:  dht_test.pde
// PURPOSE: DHT library test sketch for Arduino
//

#include <DHT.h>
#include <Dhcp.h>
#include <Dns.h>
#include <Ethernet.h>
#include <EthernetClient.h>
#include <EthernetServer.h>
#include <EthernetUdp.h>
#include <util.h>
#include <SPI.h>
DHT dht;

#define DHT21_PIN 7;
const unsigned long postingInterval = 600000;  // интервал между отправками данных в миллисекундах (10 минут)
unsigned long lastConnectionTime = 0;           // время последней передачи данных
boolean lastConnected = false;                  // состояние подключения
int HighByte, LowByte, TReading, SignBit, Tc_100, Whole, Fract;
char replyBuffer[106];
char CurTemp[6];

// ========================Задаем данные сети======================
byte mac[] = { 000, 000, 000, 000, 000, 000 }; //mac - адрес ethernet shielda ставим свой
// byte ip[] = { 000, 000, 000, 000 };        // ip адрес ethernet shielda
// byte subnet[] = { 255, 255, 255, 0 }; //маска подсети
// EthernetServer server(80); //порт сервера
EthernetClient client; //
int ledPin = 9; // указываем что светодиод будет управляться через 9 Pin
String readString = String(30); //string for fetching data from address
boolean LEDON = false; //изначальный статус светодиода - выключен
IPAddress server(94,19,113,221); // IP сервера
// ===============================================================

void setup()
{
   delay(4000);
    // Ethernet connection:
    if (Ethernet.begin(mac) == 0) {
 Serial.println("Failed to configure Ethernet using DHCP");
 // ничего не делаем
        for(;;)
        ;
    }
    // секунда для инициализации Ethernet
  delay(2000);
  lastConnectionTime = millis()-postingInterval+15000; //первое соединение через 15 секунд после запуска
  //устанавливаем pin 9 на выход
  pinMode(ledPin, OUTPUT); 
   
  Serial.begin(115200);
  Serial.println("DHT TEST PROGRAM ");
  Serial.print("LIBRARY VERSION: ");
  Serial.println("DHT_LIB_VERSION");
  Serial.println();
  Serial.println("Type,\tstatus,\tHumidity (%),\tTemperature (C)");
}

void loop()
{
  // READ DATA
  Serial.print("DHT21, \t");
  int chk = dht.read22(DHT21_PIN);
  switch (chk)
  {
    case DHTLIB_OK: 
  Serial.print("OK,\t");
  break;
    case DHTLIB_ERROR_CHECKSUM:
  Serial.print("Checksum error,\t");
  break;
    case DHTLIB_ERROR_TIMEOUT:
  Serial.print("Time out error,\t");
  break;
    default:
  Serial.print("Unknown error,\t");
  break;
  }
  // DISPLAY DATA
  Serial.print(DHT.humidity, 1);
  Serial.print(",\t");
  Serial.println(DHT.temperature, 1);

  delay(50000);

   if (client.available()) {
      char c = client.read();
    }

    if (!client.connected() && lastConnected)
    {
       
        client.stop();
    }
   
    if(!client.connected() && (millis() - lastConnectionTime > postingInterval))
    {
 //отправляем запрос
    int t = DHT.temperature;
    int h= DHT.humidity;
    char temp[3];
    char hum[2];
    //формирование HTTP-запроса
    memset(replyBuffer, 0, sizeof(replyBuffer));
    strcpy(replyBuffer,"ID=");
    //Конвертируем 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(replyBuffer,c1);
   strcat(replyBuffer,c2);
  }
     //конвертируем адрес термодатчика

    strcat(replyBuffer,"&");
    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(replyBuffer,c1);
   strcat(replyBuffer,c2);
  }
    strcat(replyBuffer,"01");
   
    //конвертируем адрес датчика влажности
    strcat(replyBuffer,"=");
    if (SignBit)
  {
   strcat(replyBuffer,"-");
  }
    itos(t,temp);
    strcat(replyBuffer,temp);
    strcat(replyBuffer,".");
    strcat(replyBuffer,"&");
    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(replyBuffer,c1);
   strcat(replyBuffer,c2);
  }
    strcat(replyBuffer,"02");
   
    strcat(replyBuffer,"=");
    itos(h,hum);
    strcat(replyBuffer,hum);
    strcat(replyBuffer,".");
   
    strcat(CurTemp,temp);
    httpRequest();           
    }
    lastConnected = client.connected();
}

void httpRequest() {
   if (client.connect(server, 80)) {
 
      // send the HTTP POST request:
   client.println("POST http://narodmon.ru/post.php HTTP/1.0");
      Serial.println("POST http://narodmon.ru/post.php HTTP/1.0");
      client.println("Host: narodmon.ru");
      Serial.println("Host: narodmon.ru");
      //client.println("User-Agent: arduino-ethernet");
      //client.println("Connection: close");
      client.println("Content-Type: application/x-www-form-urlencoded");
      Serial.println("Content-Type: application/x-www-form-urlencoded");
      client.println("Content-Length: 53");
      Serial.println("Content-Length: 53");
      client.println();
      Serial.println();
      client.println(replyBuffer);
      Serial.println(replyBuffer);
      client.println();
      lastConnectionTime = millis();
      delay(1000);
  }
  else {
      client.stop();
  }
}
void itos(int n, char bufp[3]) //int to string
{
  char buf[3]={'0','0','\0'};
  int i = 1;

  while (n > 0) {
    buf[i] = (n % 10)+48;
    i--;
    n /= 10;
  }

  for (i=0; i<3; i++)
    bufp[i]=buf[i];
}
//
// END OF FILE
//

дописал с горем пополам библиотеку DHT для своего датчика DHT21, начал компиляцию скетча и тут меня дуня огорчила ошибкой в строке 65 следующим текстом "'class DHT' has no member named 'read22'".

Снова полез в библиотеку DHT и действительно нет никакого read22. Пробовал различные варианты того что автор сие скетча хотел прокоментировать в этой строке но ничего не получилось. 

Уважаемые форумчане!Огромная просьба помогите кто может разобраться в этом коде. Дать подсказки, советы.Буду очень признателен.

ЗЫ: Есть большое желание довести все таки все это до ума. (Пробовал такой вариант

int chk = dht.readSensor(DHT21_PIN);

но появилась следующая ошибка "expected `)' before ';' token")

 

start
Offline
Зарегистрирован: 30.12.2013

Уважаемый DZent  - я был неправ и в скетче были ошибки. Правда компилировалось все нормально, но результаты выдавались только после включения. Дальше до перезагрузки результаты измерений не менялись. Скетч исправил и выложил обратно на https://www.blog.itdoca.com/diy-dht/

Библиотеку для нормальной работы сенсора в цифровом режиме брал с URL: http://playground.arduino.cc/Main/DHTLib

Не уверен, но для работы с DHT21 вроде и править ничего не нужно, должно подойти все от DHT22, в крайнем случае от DHT11.