Помогите с передачей данных на narodmon.ru
- Войдите на сайт для отправки комментариев
Прошу помощи у знающих людей. Хочу сказать сразу, что мой уровень "общения" с 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);
}
накроить из https://geektimes.ru/post/257830/
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");накроить из https://geektimes.ru/post/257830/
Эту ссылку я уже ранее изучал, там нет передачи на narodmon.ru
Может буковки на дисплей лучше строчкой выводить? Или данный дисплей так не умеет?
Конечно лучше, но как я уже писал, я только постигаю изучение Arduino, так что буду иметь ввиду.
может это? http://student-proger.ru/2014/07/meteostanciya-2-0/ Довольно прозрачно написано.
Надо только проверить на соответствие протокола передачи. в конце 2014 года протокол модернизировали в лучшую сторону. На сайте narodmon.ru протокол оч хорошо документирован.
может это? http://student-proger.ru/2014/07/meteostanciya-2-0/ Довольно прозрачно написано.
Это как раз я и пытаюсь разобрать как работает и "прикрутить" себе, только пока весь мозг сломал пытаясь понять что и к чему, да и IDE уже ругается что память кончилась, когда я пытаюсь часть этого скетча перенести в свой.
Пришлось закзать Arduino Mega, как придёт буду на ней пробовать, а пока моя UNO из-за пямяти не тянет.
Укорачивай безсмысленный код , например я думаю так, что ни к чему постоянно в оперативной памяти держать переменные которые единожды используются при инициализации устройств, многие из которых просто необходимо превратить в константы.