передача показаний на народный мониторнг

Anton_Kos87
Offline
Зарегистрирован: 07.03.2014

помогите передать показания на народный мониторинг, не пойму как передать! у меня два устройства "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'е на народный мониторинг???

Anton_Kos87
Offline
Зарегистрирован: 07.03.2014

получилось передать показания на сайт 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("-----------------");
    }
  
  }

}

 

Araris
Offline
Зарегистрирован: 09.11.2012

Anton_Kos87 пишет:

но вольтаж почему то передается целым числом например 5 а не 4.85

и немного надо переработать отправку данных а то при старте отправляет все показания 0

1. Batt описана как целочисленная (int), вряд ли в ней когда-либо будет 4.85

2. Строку 83 замените на if (millis() > timer + REQUEST_RATE && Batt > 0)

Anton_Kos87
Offline
Зарегистрирован: 07.03.2014

в сериале :

My IP: 192.168.1.55
GW IP: 192.168.1.1
DNS IP: 8.8.8.8
Server: 94.19.113.221
Gateway found
ID:1
Temperature: 30
Humidity: 31
Voltage: 4.85
-----------------
Posting...
 
021E101F1ED9
30
31
4
*****************
Done
ID:1
Temperature: 30
Humidity: 31
Voltage: 4.85
-----------------
 
пробывал вместо int использовать float и long но все равно передается на сервер народного монитринга целое число
скорее всего ошибка где то в передаче так как я с устройства получаю 4,85 как пишет сериал??
Anton_Kos87
Offline
Зарегистрирован: 07.03.2014

и кстати с помощю библиотеки VirtualWire не получается передать сотые то есть если уличный датчик считает волтаж 4,85 и отправляет на сервер то на сервере приходит 5

поможет ли мне  использование NRF24L01 ?

Araris
Offline
Зарегистрирован: 09.11.2012

 

struct SEND_DATA_STRUCTURE{
009   //put your variable definitions here for the data you want to send
010   //THIS MUST BE EXACTLY THE SAME ON THE OTHER ARDUINO
011   //Struct can'e be bigger then 26 bytes for VirtualWire version
012   byte ID;
013   int temperature;
014   int humidity;
015   long voltage;

Тип данных long используется для хранения целых чисел.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Повторяю:

Тип данных long используется для хранения целых чисел.

Araris, вы не против, надеюсь ;) Повторение, как известно...

Anton_Kos87
Offline
Зарегистрирован: 07.03.2014

Когда переменная типа int в следствие арифметической операции достигает своего максимального значения, она "перескакивает" на самое минимальное значение и наоборот:

int x
x = -32,768;
x = x - 1;       // x теперь равно 32,767 - перескакивает на минимальное значение
 
x = 32,767;
x = x + 1;       // x теперь равно -32,768

http://arduino.ru/Reference/Int

сдесь написано что с тысячной?? ошибка?

Araris
Offline
Зарегистрирован: 09.11.2012

Запятая здесь отделяет тысячи, а не целую часть от дробной (в данной записи для этого использовалась бы точка).

__Alexander
Offline
Зарегистрирован: 24.10.2012

Anton_Kos87 пишет:

код

сдесь написано что с тысячной?? ошибка?

Здесь бред написан. x будет равен -32 и 32 и всё. 

Anton_Kos87
Offline
Зарегистрирован: 07.03.2014

помогите сделать подсчет, пересмотрел отправку по 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

почему то у меня никак не получается

soznik
Offline
Зарегистрирован: 20.09.2015

При компиляции ругается на 138 строку

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Anton_Kos87 пишет:
почему то у меня никак не получается
Набери в поисковике "How to Convert Float to String"