Помогите с передачей данных на narodmon.ru

RZ3AMJ
Offline
Зарегистрирован: 13.09.2015

Прошу помощи у знающих людей. Хочу сказать сразу, что мой уровень "общения" с Arduino только на начальной стадии и как правило базируется на поиске решений как кто-то это уже сделал и попыткой правки под себя.

У меня задача такая:

1. Arduino UNO собирает информацию с датчиков температуры ds18b20(3 шт), с датчиков DHT (2 шт), барометра BMP085.

2. Выводит всё это на экран LCD2004, попеременно переключая экраны с информацией.

3. Также предусмотрена возможность управления внешним нагревателем по одной из температур.

4. Используется шилд W5100 на котором в режиме сервера выводися вся эта информация

5. Скетч используемый мной собран по кусочкам из разных примеров и настроен под мои нужды, повторюсь я в этом деле новичок и вас может конкретно корёжить при виде моего кривого скетча, я только учусь...

6. Осталась последняя задача для меня, это передать всё это дела на narodmon.ru. В текущий момент мой скетч "съел" практически всю свободную память и при добавлении готовых примеров скетчей для отсылки на народный мониторинг, заканчивается нехваткой памяти. Конечно можно и нужно из готового скетча выдернуть только протокол передачи данных, т.к. процедуры по считыванию показаний с датчиков у меня уже есть.

В связи с этим прошу или ткнуть в ссылки по подробному описанию как передавать данные на narodmon.ru или подсказать какой код нужно дописать для передачи готовых показаний.

Нижи привожу мой корявый скетч

/*
барометр BMP - давление и температура в контроллере
DHT11 (pin A2) - температура и влажность в подсобке
DHT11 (pin A3) - температура и влажность в подвале
датчики ds18b20 (pin 2)- температура на улице, на кухне, на втором этаже
          - на 2 пине

Подключенные пины:
пины 10,11,12,13,4 использовать НЕЛЬЗЯ,они зарезервированы для EthernetShield
А4 - SDA
A5 - SCL
2 - шина данных для датчиков ds18b20 - температура на улице, на кухне, на втором этаже, в подвале
A2 - пин для датчика DHT11 температура и влажность в туалете
A3 - пин для датчика DHT11 температура и влажность в подвале
9 - пин управления нагревом кухни
8 - вход контроля обогрева туалета
7 - вход контроля обогрева труб

*/



// ========================Задаем необходимые библиотеки==========
#include <SPI.h>
#include <OneWire.h>
#include <String.h>
#include <Ethernet.h>
#include <Wire.h>
#include <DHT.h>
#include <Adafruit_BMP085.h>
#include <LiquidCrystal_I2C.h>
#include <DallasTemperature.h>

// ===============================================================
// ========================Задаем данные сети======================
byte mac[] = { 0xCA, 0xAF, 0x78, 0x1C, 0x11, 0x70 };           //mac - адрес ethernet shielda
byte ip[] = { 192, 168, 5, 20 };                               // ip адрес ethernet shielda
byte subnet[] = { 255, 255, 255, 0 };                          //маска подсети
byte gateway[] = { 192, 168, 5, 1 };
float kuhnya_temp = 28;  //начальная установка нужной температуры на кухне
EthernetServer server(80); //порт сервера
String readString = String(30); //string for fetching data from address
const unsigned char OSS = 0;  // Oversampling Setting
int kuhnya_pin = 9;        //пин управления обогревом кухни
int screen = 1;            //какой номер экрана выводить
int kuhnya = 0;            //обгрев кухни
uint8_t bukva_U[8] = { B10001, B10001, B10001, B01111, B00001, B10001, B01110, B00000 };//У 0
uint8_t bukva_D[8] = { B01111, B01001, B01001, B01001, B01001, B11111, B10001, B00000 };//Д 1
uint8_t bukva_ZH[8] = { B10101, B10101, B10101, B01110, B10101, B10101, B10101, B00000 };//Ж 2
uint8_t bukva_I[8] = { B10001, B10001, B10011, B10101, B11001, B10001, B10001, B00000 };//И 3
uint8_t bukva_L[8] = { B00111, B01001, B10001, B10001, B10001, B10001, B10001, B00000 };//Л 4
uint8_t bukva_P[8] = { B11111, B10001, B10001, B10001, B10001, B10001, B10001, B00000 };//П 5
uint8_t bukva_C[8] = { B10001, B10001, B10001, B10001, B10001, B10001, B11111, B00001 };//Ц 6
uint8_t bukva_JE[8] = { B11110, B00001, B00001, B01111, B00001, B00001, B11110, B00000 };//Э 7

#define ONE_WIRE_BUS 2          //шина датчиков ds18b20
#define DHTPIN A2                ///шина датчика DTH11 в подсобке
#define DHTPIN1 A3                ///шина датчика DTH11 в подвале
#define DHTTYPE DHT11
Adafruit_BMP085 bmp;
LiquidCrystal_I2C lcd(0x27, 20, 4);                  // установка IIC-адреса дисплея 2004
DHT dht(DHTPIN, DHTTYPE);
DHT dht1(DHTPIN1, DHTTYPE);
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress t0 = { 0x28, 0xFF, 0x15, 0x64, 0xA1, 0x15, 0x03, 0xD4 };
DeviceAddress t1 = { 0x28, 0xFF, 0xE7, 0x31, 0xA1, 0x15, 0x03, 0xA8 };
DeviceAddress t2 = { 0x28, 0xFF, 0x9F, 0x07, 0xA1, 0x15, 0x03, 0xBA };


void setup(){
  Serial.begin(9600); 
  pinMode(kuhnya_pin, OUTPUT);      //устанавливаем пин управления обогревом кухни на вывод
  //запускаем Ethernet
  Ethernet.begin(mac, ip, subnet);
  server.begin();
  sensors.begin();
  bmp.begin();
  dht.begin();
  dht1.begin();
  lcd.begin();
  //lcd.init();                                                  // Инициализация lcd
  lcd.backlight();
  //lcd.begin(20, 4);
  //lcd.clear();
  //lcd.begin();
  sensors.setResolution(t0, 10);
  sensors.setResolution(t1, 10); 
  sensors.setResolution(t2, 10);
  lcd.createChar(0, bukva_U);
  lcd.createChar(1, bukva_D);
  lcd.createChar(2, bukva_ZH);
  lcd.createChar(3, bukva_I);
  lcd.createChar(4, bukva_L);
  lcd.createChar(5, bukva_P);
  lcd.createChar(6, bukva_C);
  lcd.createChar(7, bukva_JE);
}


void loop()
{
  float dht_hum = dht.readHumidity();            // запись в переменную dht_hum значения влажности с датчика dht11 (туалет)
  float dht_temp = dht.readTemperature();        // запись в переменную dht_temp значения температуры с датчика dht11 (туалет)
  float dht1_hum = dht1.readHumidity();            // запись в переменную dht_hum значения влажности с датчика dht11 (подвал)
  float dht1_temp = dht1.readTemperature();        // запись в переменную dht_temp значения температуры с датчика dht11 (подвал)
  float ds0 = sensors.getTempC(t0);              // запись в переменную ds0 значения температуры с датчика ds18b20 №0 (на улице)
  float ds1 = sensors.getTempC(t1);              // запись в переменную ds1 значения температуры с датчика ds18b20 №1 (1-й этаж на кухне)
  float ds2 = sensors.getTempC(t2);              // запись в переменную ds2 значения температуры с датчика ds18b20 №2 (на 2-м этаже)
  float bmp_temp = bmp.readTemperature();        // запись в переменную bmp_temp значения температуры с датчика BMP085 (контроллер)
  float bmp_press = bmp.readPressure()/100;      // запись в переменную bmp_press значения давления с датчика BMP085 (контроллер)
  
  sensors.requestTemperatures();
  
  if (ds1 < kuhnya_temp)                         //если температура на кухне ниже установленной в kuhnya_pin, то включаем обогрев кухни
  {
    digitalWrite(kuhnya_pin, HIGH);      
    Serial.println("kuhnyua ON");
    kuhnya = 1;
  }
    else 
      {
        digitalWrite(kuhnya_pin, LOW);
        Serial.println("kuhnyua OFF");
        kuhnya = 0;
      }
  
  switch (screen)
  {
    case 1:                        //1-й экран
      lcd.clear();
      lcd.home();
      lcd.print("KOHTPO");      
      lcd.setCursor(6, 0);
      lcd.print('\4');
      lcd.setCursor(7, 0);
      lcd.print('\4');
      lcd.setCursor(8, 0);
      lcd.print("EP");
      lcd.setCursor(15, 0);
      lcd.print(bmp_temp,1);
      lcd.setCursor(0, 1);
      lcd.print('\0');
      lcd.setCursor(1, 1);
      lcd.print('\4');
      lcd.setCursor(2, 1);
      lcd.print('\3');  
      lcd.setCursor(3, 1);
      lcd.print('\6');
      lcd.setCursor(4, 1);
      lcd.print("A");
      lcd.setCursor(15, 1);
      lcd.print(ds0,1);
      lcd.setCursor(0, 2);
      lcd.print("1 ");
      lcd.setCursor(2, 2);
      lcd.print('\7');
      lcd.setCursor(3, 2);
      lcd.print("TA");
      lcd.setCursor(5, 2);
      lcd.print('\2');
      lcd.setCursor(15, 2);
      lcd.print(ds1,1);
      lcd.setCursor(0, 3);
      lcd.print("2 ");
      lcd.setCursor(2, 3);
      lcd.print('\7');
      lcd.setCursor(3, 3);
      lcd.print("TA");
      lcd.setCursor(5, 3);
      lcd.print('\2');
      lcd.setCursor(15, 3);
      lcd.print(ds2,1);
      screen = 2;
      break;
    
    case 2:
      lcd.clear();
      lcd.home();
      lcd.print("T");      //2-й экран
      lcd.setCursor(1, 0);
      lcd.print('\0');
      lcd.setCursor(2, 0);
      lcd.print("A");
      lcd.setCursor(3, 0);
      lcd.print('\4');
      lcd.setCursor(4, 0);
      lcd.print("ET");
      lcd.setCursor(9, 0);
      lcd.print(dht_temp,1);
      lcd.setCursor(17, 0);
      lcd.print(dht_hum,0);
      lcd.setCursor(19, 0);
      lcd.print("%");
      lcd.setCursor(0, 1);
      lcd.print('\5');
      lcd.setCursor(1, 1);
      lcd.print("O");
      lcd.setCursor(2, 1);
      lcd.print('\1');
      lcd.setCursor(3, 1);
      lcd.print("B");
      lcd.setCursor(4, 1);
      lcd.print("A");
      lcd.setCursor(5, 1);
      lcd.print('\4');
      lcd.setCursor(9, 1);
      lcd.print(dht1_temp,1);
      lcd.setCursor(17, 1);
      lcd.print(dht1_hum,0);
      lcd.setCursor(19, 1);
      lcd.print("%");
      lcd.setCursor(0, 2);
      lcd.print('\1');
      lcd.setCursor(1, 2);
      lcd.print("AB");
      lcd.setCursor(3, 2);
      lcd.print('\4');
      lcd.setCursor(4, 2);
      lcd.print("EH");
      lcd.setCursor(6, 2);
      lcd.print('\3');
      lcd.setCursor(7, 2);
      lcd.print("E");
      lcd.setCursor(9, 2);
      lcd.print(bmp_press,0);
      lcd.setCursor(13, 2);
      lcd.print("hPa");
      screen = 1;
  }
    
  
  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        if (c == '\n' && currentLineIsBlank) {
          
          
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connnection: close");
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          client.println("<meta http-equiv=\"refresh\" content=\"5\">");
          client.println("<meta http-equiv='content-type' content='text/html; charset=UTF-8'>");
          
          client.println("<body>");
         
         //==============Вывод значений на web-страницу======================
            client.println("<hr />");//линия=====================================
            client.println("Tемпература на улице = ");
            client.println(ds0);
            client.println(" *C");
            client.println("<br> "); //перенос на след. строчку
              
            client.println("Tемпература на кухне = ");    
            client.println(ds1);
            client.println(" *C");
            client.println("<br> "); //перенос на след. строчку
            
            client.println("Tемпература в пособке = ");    
            client.println(dht_temp);
            client.println(" *C");
            client.println("<br> "); //перенос на след. строчку
            
            client.println("Влажность в пособке = ");    
            client.println(dht_hum);
            client.println(" %");
            client.println("<br> "); //перенос на след. строчку
            
            client.println("Tемпература в подвале = ");    
            client.println(dht1_temp);
            client.println(" *C");
            client.println("<br> "); //перенос на след. строчку
            
            
            client.println("Влажность в подвале = ");    
            client.println(dht1_hum);
            client.println(" %");
            client.println("<br> "); //перенос на след. строчку
            
            client.println("Tемпература на 2-м этаже = ");    
            client.println(ds2);
            client.println(" *C");
            client.println("<br> "); //перенос на след. строчку
            
            client.println("Tемпература в контроллере = ");    
            client.println(bmp_temp);
            client.println(" *C");
            client.println("<br> "); //перенос на след. строчку
            
            client.println("Атмосфероное давление = ");    
            client.println(bmp_press);
            client.println(" hPa");
            client.println("<br> "); //перенос на след. строчку
                        
            client.println("Нагрев кухни : ");
            if (kuhnya==1) 
            {
              client.println("ВКЛЮЧЕНО");
            }
              else 
              {
                client.println("ВЫКЛЮЧЕНО");
              }
            
            client.println("<hr />");//линия=====================================
            
            client.println("</body></html>");
          
          
          
          //client.println("</html>");
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        } 
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    Serial.println("client disonnected");
  }
 

     Serial.println("_________________________________________________");
     delay(3000);
 }

 

ESV
Offline
Зарегистрирован: 16.12.2015

накроить из https://geektimes.ru/post/257830/

 

 

arduinec
Offline
Зарегистрирован: 01.09.2015

RZ3AMJ пишет:

      lcd.setCursor(0, 1);
      lcd.print('\5');
      lcd.setCursor(1, 1);
      lcd.print("O");
      lcd.setCursor(2, 1);
      lcd.print('\1');
      lcd.setCursor(3, 1);
      lcd.print("B");
      lcd.setCursor(4, 1);
      lcd.print("A");
      lcd.setCursor(5, 1);
      lcd.print('\4');

Может буковки на дисплей лучше строчкой выводить? Или данный дисплей так не умеет?

      lcd.setCursor(0, 1);
      lcd.print("\5O\1BA\4");
      

 

RZ3AMJ
Offline
Зарегистрирован: 13.09.2015

ESV пишет:

накроить из https://geektimes.ru/post/257830/

 

 

Эту ссылку я уже ранее изучал, там нет передачи на narodmon.ru

RZ3AMJ
Offline
Зарегистрирован: 13.09.2015

arduinec пишет:

Может буковки на дисплей лучше строчкой выводить? Или данный дисплей так не умеет?

 

Конечно лучше, но как я уже писал, я только постигаю изучение Arduino, так что буду иметь ввиду.

ESV
Offline
Зарегистрирован: 16.12.2015

может это? http://student-proger.ru/2014/07/meteostanciya-2-0/ Довольно прозрачно написано.

Надо только проверить на соответствие протокола передачи. в конце 2014 года протокол модернизировали в лучшую сторону. На сайте narodmon.ru протокол оч хорошо документирован.

RZ3AMJ
Offline
Зарегистрирован: 13.09.2015

ESV пишет:

может это? http://student-proger.ru/2014/07/meteostanciya-2-0/ Довольно прозрачно написано.

Это как раз я и пытаюсь разобрать как работает и "прикрутить" себе, только пока весь мозг сломал пытаясь понять что и к чему, да и IDE уже ругается что память кончилась, когда я пытаюсь часть этого скетча перенести в свой.

Пришлось закзать Arduino Mega, как придёт буду на ней пробовать, а пока моя UNO из-за пямяти не тянет.

ESV
Offline
Зарегистрирован: 16.12.2015

Укорачивай безсмысленный код , например я думаю так, что ни к чему постоянно в оперативной памяти держать переменные которые единожды используются при инициализации устройств, многие из которых просто необходимо превратить в константы.