Нужна помощь в проекте (передача данных на сайт Народный мониторинг)
- Войдите на сайт для отправки комментариев
Всем доброго времени суток!
Предисловие(можно не читать):Возникла недавно непреодолимое желание создать что-нибудь своими руками. Закупил все необходимые компоненты(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")
Уважаемый DZent - я был неправ и в скетче были ошибки. Правда компилировалось все нормально, но результаты выдавались только после включения. Дальше до перезагрузки результаты измерений не менялись. Скетч исправил и выложил обратно на https://www.blog.itdoca.com/diy-dht/
Библиотеку для нормальной работы сенсора в цифровом режиме брал с URL: http://playground.arduino.cc/Main/DHTLib
Не уверен, но для работы с DHT21 вроде и править ничего не нужно, должно подойти все от DHT22, в крайнем случае от DHT11.