передача показаний на народный мониторнг
- Войдите на сайт для отправки комментариев
Ср, 30/03/2016 - 09:11
помогите передать показания на народный мониторинг, не пойму как передать! у меня два устройства "Resiver" подключен к хабу и должен принимать показания по 433мГц от устройства расположенного на улице "Transiver"
Resiver:
#include <VirtualWire.h>
#include <EasyTransferVirtualWire.h>
//create object
EasyTransferVirtualWire ET;
struct SEND_DATA_STRUCTURE{
//put your variable definitions here for the data you want to send
//THIS MUST BE EXACTLY THE SAME ON THE OTHER ARDUINO
//Struct can'e be bigger then 26 bytes for VirtualWire version
byte ID;
int temperature;
int humidity;
int voltage;
};
// вычисление напряжения
float vout = 0;
float vin = 0;
float R1 = 10000.0; // сопротивление R1 (10K)
float R2 = 680.0; // сопротивление R2 (680)
int value = 0;
//give a name to the group of data
SEND_DATA_STRUCTURE mydata;
void setup(){
//start the library, pass in the data details
ET.begin(details(mydata));
Serial.begin(9600);
// Initialise the IO and ISR
vw_set_ptt_inverted(true); // Required for DR3100
vw_setup(2000); // Bits per sec
vw_set_tx_pin(11);
vw_rx_start(); // Start the receiver PLL running
pinMode(13, OUTPUT);
}
void loop(){
//check and see if a data packet has come in.
if(ET.receiveData()){
//this is how you access the variables. [name of the group].[variable name]
//since we have data, we will blink it out.
value = mydata.voltage;
vout = (value * 5.0) / 1024;
vin = vout / (R2/(R1+R2));
if (mydata.ID == 1) {
Serial.print("ID:");
Serial.println(mydata.ID);
Serial.print("Temperature: ");
Serial.println(mydata.temperature);
Serial.print("Humidity: ");
Serial.println(mydata.humidity);
Serial.print("Voltage: ");
Serial.println(vin);
Serial.println("-----------------");
}
}
}
Transiver:
#include <VirtualWire.h>
#include <EasyTransferVirtualWire.h>
#include <DHT11.h>
#define DHT11PIN 5
// для замера напряжения
int analogInput = 1;
float vout = 0;
float vin = 0;
float R1 = 10000.0; // сопротивление R1 (10K)
float R2 = 680.0; // сопротивление R2 (680)
int value = 0;
dht11 sensor;
EasyTransferVirtualWire ET;
struct SEND_DATA_STRUCTURE{
//put your variable definitions here for the data you want to send
//THIS MUST BE EXACTLY THE SAME ON THE OTHER ARDUINO
//Struct can'e be bigger then 26 bytes for VirtualWire version
byte ID;
int temperature;
int humidity;
int voltage;
};
//give a name to the group of data
SEND_DATA_STRUCTURE mydata;
void setup(){
Serial.begin(9600);
pinMode(analogInput, INPUT);
//start the library, pass in the data details
ET.begin(details(mydata));
mydata.ID = 1;
// Initialise the IO and ISR
vw_set_ptt_inverted(true); // Required for DR3100
vw_set_tx_pin(3);
vw_setup(2000); // Bits per sec
pinMode(13, OUTPUT);
randomSeed(analogRead(0));
}
void loop(){
// считывание аналогового значения
value = analogRead(analogInput);
vout = (value * 5.0) ;
vin = vout / (R2/(R1+R2));
if (vin<0.09) {
vin=0.0; // обнуляем нежелательное значение
}
sensor.read(DHT11PIN); // читаем покзания DHT11
//this is how you access the variables. [name of the group].[variable name]
mydata.temperature = sensor.temperature;
mydata.humidity = sensor.humidity;
mydata.voltage = value;
Serial.print("Temp: ");
Serial.println(sensor.temperature);
Serial.print("Hum: ");
Serial.println(sensor.humidity);
Serial.print("Voltage: ");
Serial.println(vin);
//send the data
digitalWrite(13, HIGH);
ET.sendData();
digitalWrite(13, LOW);
delay(random(5000, 10000));
}
как передать показания полученные в Resiver'е на народный мониторинг???
получилось передать показания на сайт Narodmon
но вольтаж почему то передается целым числом например 5 а не 4.85
и немного надо переработать отправку данных а то при старте отправляет все показания 0
#include <EtherCard.h> #define REQUEST_RATE 300000 // milliseconds #include <VirtualWire.h> #include <EasyTransferVirtualWire.h> EasyTransferVirtualWire ET; //Создаем объект ET struct SEND_DATA_STRUCTURE{ //put your variable definitions here for the data you want to send //THIS MUST BE EXACTLY THE SAME ON THE OTHER ARDUINO //Struct can'e be bigger then 26 bytes for VirtualWire version byte ID; int temperature; int humidity; long voltage; }; // вычесление напряжения float vout = 0; float vin = 0; float R1 = 9930.0; // сопротивление R1 (10K) float R2 = 673.0; // сопротивление R2 (680) int value = 0; //give a name to the group of data SEND_DATA_STRUCTURE txData; int Temperature = 0, Humidity = 0, Batt = 0.00, dav = 0; static byte mac[] = { 0x06, 0x2E, 0x10, 0x1F, 0x1E, 0xD9 }; //В этой строке задайте свой MAC адрес char mak[]="062E101F1ED9"; static byte hisip[] = { 94,19,113,221 };//Здесь надо указать IP адрес сайта narodmon.ru String macstring; byte Ethernet::buffer[700]; static long timer; Stash stash; unsigned long time1=0; void setup() { Serial.begin(9600); ET.begin(details(txData)); // Initialise the IO and ISR vw_set_ptt_inverted(true); // Required for DR3100 vw_setup(2000); // Bits per sec vw_set_rx_pin(3); vw_rx_start(); // Start the receiver PLL running delay(1000); // note: use zeroCal only after initialization. // dps.zeroCal(101800, 0); // set zero point if (ether.begin(sizeof Ethernet::buffer, mac, SS) == 0) Serial.println( "Failed to access Ethernet controller"); if (!ether.dhcpSetup()) Serial.println("DHCP failed"); //пишем в серале что адрес нам не присвоили ошибка DHCP static byte dnsip[] = {8,8,8,8}; ether.copyIp(ether.dnsip, dnsip); ether.printIp("My IP: ", ether.myip); //пишем в сериале IP адрес DHCP ether.printIp("GW IP: ", ether.gwip); //пишем в сериале IP адрес GW ether.printIp("DNS IP: ", ether.dnsip); //пишем в сериале IP адрес DNS ether.copyIp(ether.hisip, hisip); ether.printIp("Server: ", ether.hisip); //пишем в сериале IP адрес Сервера Народный Мониторинг while (ether.clientWaitingGw()) ether.packetLoop(ether.packetReceive()); Serial.println("Gateway found"); macstring=""; for(int k=0;k<sizeof(mac)/sizeof(byte);k++) { char msg[3]; sprintf(msg,"%02X",mac[k]); //if (macstring!="#") macstring+="-"; macstring+=msg; } timer = - REQUEST_RATE; // Начать осчет всремени } void loop() { ether.packetLoop(ether.packetReceive()); if (millis() > timer + REQUEST_RATE) //Если время прошло больше чем "#define REQUEST_RATE 300000 " то передаем показания на сервер Narodmon { timer = millis(); byte sd = stash.create(); stash.print("ID="); stash.print(mak); //Назавние устройства на сайте Narodmon Serial.println("\n\n\nPosting...\n"); Serial.println(mak); String result; char msg[50]; result=macstring+"\n"; String temp; stash.print("&"); stash.print(mak); stash.print("Temp"); stash.print("="); stash.print(Temperature); stash.print("&"); stash.print(mak); stash.print("Hum"); stash.print("="); stash.print(Humidity); stash.print("&"); stash.print(mak); //Мак адрес stash.print("Bat"); //Название датчика в Narodmon stash.print("="); stash.print(Batt); //Показания датчика в Narodmon Serial.println(Temperature); Serial.println(Humidity); Serial.println(Batt); Serial.println("*****************"); stash.save(); // generate the header with payload - note that the stash size is used, // and that a "stash descriptor" is passed in as argument using "$H" Stash::prepare(PSTR("POST http://narodmon.ru/post.php HTTP/1.0" "\r\n" "Host: narodmon.ru" "\r\n" "Content-Length: $D" "\r\n" "\r\n" "$H"), stash.size(), sd); // send the packet - this also releases all stash buffers once done ether.tcpSend(); Serial.println("Done"); } if(ET.receiveData()){ value = txData.voltage; vout = (value * 5.0) / 1024; vin = vout / (R2/(R1+R2)); if (txData.ID == 1) { Serial.print("ID:"); Serial.println(txData.ID); Serial.print("Temperature: "); Serial.println(txData.temperature); Temperature = (txData.temperature); Serial.print("Humidity: "); Serial.println(txData.humidity); Humidity = (txData.humidity); Serial.print("Voltage: "); Serial.println(vin); Batt = (vin); //Serial.println(mydata.voltage); Serial.println("-----------------"); } } }но вольтаж почему то передается целым числом например 5 а не 4.85
и немного надо переработать отправку данных а то при старте отправляет все показания 0
1. Batt описана как целочисленная (int), вряд ли в ней когда-либо будет 4.85
2. Строку 83 замените на
if(millis() > timer + REQUEST_RATE && Batt > 0)в сериале :
и кстати с помощю библиотеки VirtualWire не получается передать сотые то есть если уличный датчик считает волтаж 4,85 и отправляет на сервер то на сервере приходит 5
поможет ли мне использование NRF24L01 ?
structSEND_DATA_STRUCTURE{009//put your variable definitions here for the data you want to send010//THIS MUST BE EXACTLY THE SAME ON THE OTHER ARDUINO011//Struct can'e be bigger then 26 bytes for VirtualWire version012byteID;013inttemperature;014inthumidity;015longvoltage;Тип данных long используется для хранения целых чисел.
Повторяю:
Тип данных long используется для хранения целых чисел.
Araris, вы не против, надеюсь ;) Повторение, как известно...
Когда переменная типа int в следствие арифметической операции достигает своего максимального значения, она "перескакивает" на самое минимальное значение и наоборот:
расечатать?
intxx = -32,768;x = x - 1;// x теперь равно 32,767 - перескакивает на минимальное значениеx = 32,767;x = x + 1;// x теперь равно -32,768http://arduino.ru/Reference/Int
сдесь написано что с тысячной?? ошибка?
Запятая здесь отделяет тысячи, а не целую часть от дробной (в данной записи для этого использовалась бы точка).
код
сдесь написано что с тысячной?? ошибка?
Здесь бред написан. x будет равен -32 и 32 и всё.
помогите сделать подсчет, пересмотрел отправку по 433mhz отказался от EasyTransferVirtualWire
Сервер:
#include <VirtualWire.h> #include <EtherCard.h> #define REQUEST_RATE 300000 // время отправки милисек const int RX_pin = 3; char data[100]; char Adress[4]; char Temp[14]; char Hum[14]; char Press[14]; char Alt[14]; char Batt[14]; char Name[14]; int i; static byte mac[] = { 0x02, 0x1E, 0x10, 0x1F, 0x1E, 0xD9 }; //В этой строке задайте свой MAC адрес char mak[]="021E101F1ED9"; static byte hisip[] = { 94,19,113,221 };//Здесь надо указать IP адрес сайта narodmon.ru static long timer; String macstring; byte Ethernet::buffer[700]; Stash stash; void setup() { Serial.begin(9600); // Initialise the IO and ISR vw_set_rx_pin(RX_pin); vw_set_ptt_inverted(true); // Required for DR3100 vw_setup(2000); // Bits per sec vw_rx_start(); // Начинаем мониторинг эфира if (ether.begin(sizeof Ethernet::buffer, mac, SS) == 0) Serial.println( "Failed controller"); if (!ether.dhcpSetup()) Serial.println("DHCP failed"); static byte dnsip[] = {8,8,8,8}; ether.copyIp(ether.dnsip, dnsip); ether.printIp("My IP: ", ether.myip); ether.printIp("GW IP: ", ether.gwip); ether.printIp("DNS IP: ", ether.dnsip); ether.copyIp(ether.hisip, hisip); ether.printIp("Server: ", ether.hisip); while (ether.clientWaitingGw()) ether.packetLoop(ether.packetReceive()); Serial.println("Gateway found"); macstring=""; for(int k=0;k<sizeof(mac)/sizeof(byte);k++) { char msg[3]; sprintf(msg,"%02X",mac[k]); //if (macstring!="#") macstring+="-"; macstring+=msg; } timer = - REQUEST_RATE; // Начать осчет всремени } void loop() { uint8_t buf[VW_MAX_MESSAGE_LEN]; // Буфер для сообщения uint8_t buflen = VW_MAX_MESSAGE_LEN; // Длина буфера if (vw_get_message(buf, &buflen)) // Если принято сообщение { for (i = 0; i < buflen; i++) { data[i]=buf[i]; } sscanf(data, "%[^','],%[^','],%[^','],%[^','],%[^','],%[^','],%s", &Adress, &Temp, &Hum, &Press, &Alt, &Batt, &Name); Serial.print("Adress="); Serial.println(Adress); Serial.print("Temp="); Serial.println(Temp); Serial.print("Hum="); Serial.println(Hum); Serial.print("Pressure="); Serial.println(Press); Serial.print("Alt="); Serial.println(Alt); Serial.print("Batt="); Serial.println(Batt); Serial.print("Name="); Serial.println(Name); Serial.println("*_______________*"); ether.packetLoop(ether.packetReceive()); if (millis() > timer + REQUEST_RATE && Batt > 0) //Если время прошло больше чем "#define REQUEST_RATE 300000 " то передаем показания на сервер Narodmon { timer = millis(); byte sd = stash.create(); stash.print("ID="); stash.print(mak); Serial.println("\n\n\nPosting...\n"); // Serial.println(mak); String result; char msg[50]; result=macstring+"\n"; String temp; stash.print("&"); stash.print(mak); stash.print("01"); stash.print("="); stash.print(Temp); stash.print("&"); stash.print(mak); stash.print("02"); stash.print("="); stash.print(Hum); stash.print("&"); stash.print(mak); stash.print("03"); stash.print("="); stash.print(Press); stash.print("04"); stash.print("="); stash.print(Alt); stash.print("05"); stash.print("="); stash.print(Batt); stash.save(); // generate the header with payload - note that the stash size is used, // and that a "stash descriptor" is passed in as argument using "$H" Stash::prepare(PSTR("POST http://narodmon.ru/post.php HTTP/1.0" "\r\n" "Host: narodmon.ru" "\r\n" "Content-Length: $D" "\r\n" "\r\n" "$H"), stash.size(), sd); // send the packet - this also releases all stash buffers once done ether.tcpSend(); Serial.print("Sended"); } } }клиент:
#include <BMP085.h> #include <VirtualWire.h> #include <DHT11.h> dht11 DHT; #define DHT11_PIN 5 const int transmit_pin = 3; BMP085 bmp180 = BMP085(); long Temperature = 0, Pressure = 0, Altitude = 0; void setup(void) { vw_set_tx_pin(transmit_pin); vw_set_ptt_inverted(true); // Необходимо для DR3100 vw_setup(2000); // Устанавливаем скорость передачи (бит/с) bmp180.init(MODE_STANDARD, 3200, true); analogReference(INTERNAL); Serial.begin(9600); } int getWeather(String type) { DHT.read(DHT11_PIN); // READ DATA bmp180.getTemperature(&Temperature); bmp180.getPressure(&Pressure); bmp180.getAltitude(&Altitude); if (type == "Temp") { return (int)Temperature; } if (type == "Hum") { return (int)DHT.humidity; } if (type == "Press") { return (int)Pressure+50000; } if (type == "Alt") { return (int)Altitude; } if (type == "Volt") { return (int)analogRead(A0); } } void loop(void) { char msg[255]; String strMsg; String Temp = (String)getWeather("Temp"); String Hum = (String)getWeather("Hum"); String Press = (String)getWeather("Press"); String Alt = (String)getWeather("Alt"); String Batt = (String)getWeather("Volt"); strMsg = "5,"+Temp+","+Hum+","+Press+","+Alt+","+Batt+",Outdoor"; // собираем показания в строку strMsg.toCharArray(msg, 100); vw_send((uint8_t *)msg, strlen(msg)); // Отсылаем собранную строку vw_wait_tx(); // Ждем пока передача будет окончена Serial.print("SendServer= "); Serial.println(strMsg); // выводим в сериал какие показания отослали Serial.print("Pokazaniya: "); Serial.print(" Temperature= "); Serial.print(Temperature*0.1); // выводим в сериал посчитанные показания Температуры Serial.print("C"); Serial.print(" Humidity= "); Serial.print(DHT.humidity); // выводим в сериал показания Влажности Serial.print("%"); Serial.print(" Pressure= "); Serial.print(Pressure/133.3); // выводим в сериал посчитанные показания Давления Serial.print("mmHg"); Serial.print(" Alt= "); Serial.print(Altitude/100.0, 2); // выводим в сериал посчитанные показания Высота Serial.print("m"); Serial.print(" Batt= "); Serial.print(analogRead(A0)/4/ 256. * 1.2 * 10 * 1.1); // выводим в сериал посчитанные показания Напряжения Батарейки Serial.println("V"); delay(2000); //Задержка }так вот немогу сделать хранение полученных данных в переменной
Надо что бы на сервере полученные данные Temp * 0.1
сохранить в переменную а потом перед отправкой на сайт народного мониторинга взять данные с переменной то есть xx.x
аналогично для Press / 133.3
для Alt /100.0, 2
для Batt /4/ 256. * 1.2 * 10 * 1.1
почему то у меня никак не получается
При компиляции ругается на 138 строку