Помогите с передачей данных на 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/
Может буковки на дисплей лучше строчкой выводить? Или данный дисплей так не умеет?
накроить из 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 из-за пямяти не тянет.
Укорачивай безсмысленный код , например я думаю так, что ни к чему постоянно в оперативной памяти держать переменные которые единожды используются при инициализации устройств, многие из которых просто необходимо превратить в константы.