• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Делюсь опытом По многочисленным просьбам - narodmon ОЧЕНЬ ПРОСТО.

В связи с кучей вопросов и порой очень глупых выдаю упрощенный скетч для отправки данных на народный мониторинг.

Схема подключения.



Собственно сам скетч. Вам надо поменять параметры WIFI на свои. И все. Отправка показаний с 1 датчика DS18B20.

Код:
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Ticker.h>

ESP8266WiFiMulti WiFiMulti;
Ticker sender;
bool sendtonm;
OneWire oneWire(2); // DS18B20 подключен по схеме https://goo.gl/HJ9TB9 Зеленый проводок подключен к GPIO2
DallasTemperature sensors(&oneWire);

void setup() {
    WiFi.mode(WIFI_STA); // Режим станции
// Здесь настройки ВАШЕГО WIFI  
    WiFiMulti.addAP("SSID", "PASSWORD"); // Данные вашего WiFi <<<<< ---------------  ОБРАТИТЕ ВНИМАНИЕ.
// Здесь настройки ВАШЕГО WIFI  
    sender.attach(305, STM); // Создаем событие отправки данных каждые 305 сек (5 мин + 5 сек, чтобы народный мониторинг не ругался если мы на секунду раньше отправили)
    sensors.begin(); //Запуск DS18B20
}

void STM() {sendtonm = true;} // Отправка данных разрешена

void loop() {
    if((WiFiMulti.run() == WL_CONNECTED)) {
     if (sendtonm) { // Если прошло 5 минут, и можно отправлять - работаем.
      sendtonm = false; // отключаем флаг отправки данных
      sensors.requestTemperatures(); // Команда на замер температуры.
      delay(1000); // Задержка для того чтобы датчик успел провести замер.
      DeviceAddress tempDeviceAddress; // Переменная для получения адреса датчика
      String buf; // Буфер для отправки на NarodMon
      buf="#ESP" + WiFi.macAddress()+ "\r\n";buf.replace(":", ""); //формируем заголовок
      sensors.getAddress(tempDeviceAddress, 0); // Получаем уникальный адрес датчика
      buf = buf + "#";
      for (uint8_t i = 0; i < 8; i++) {if (tempDeviceAddress[i] < 16) buf = buf + "0"; buf = buf + String(tempDeviceAddress[i], HEX);} // адрес датчика в буфер
      buf = buf + "#" + String(sensors.getTempCByIndex(0))+ "\r\n"; //и температура
      buf = buf + "##\r\n"; // закрываем пакет
      WiFiClient client;
      client.connect("narodmon.ru", 8283); //Подключаемся
      client.print(buf); // И отправляем данные
      }
    }
}
PS. Код комментирован чуть ли не до запятых. Читаем, разбираемся самостоятельно.
 
Последнее редактирование:

Ers

New member
по даташиту при 12-битном разрешении время измерения до 750 мс.
в библиотеке DallasTemperature есть примеры асинхронного измерения температуры без использования delay
 
Скетч писался ПРОСТОЙ. Поэтому кому надо больше - пусть дописывает. Строчку, которая вас насторожила - поправил. Так пойдет ? Успеет замерить ?
 

Bozhuk

New member
Прошу прощение. С одним датчиком температуры все понятно, а как реализовать 2 датчика ?
 

Sergey12345

New member
не мог бы кто нибудь скинуть ссылки на упомянутые в скетче библиотеки ? Никак не могу найти...
 

p-a-h-a

Member
Здравствуйте. Отличный проект, все работает. Переделал его под датчик BME280(давление, температура, влажность) или BMP280(то же, но без влажности). Код автоматически определяет тип датчика и отправляет на сервер только те данные, которые предоставляет датчик. Добавил ESP.deepSleep(330e6), что умертвляет ESP и включает очень низкое энергопотребление. Для корректной работы этой функции на NodeMCU необходимо соединить (GPIO16) т.е D0 и RST резистором (взял 200Ом) Перемычкой нельзя(не работает с перемычкой).
Схема.jpg
Есть пара вопросов по коду (код рабочий, данные отправляет но один момент подбешивает):
Код:
#include <ESP8266WiFi.h>
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h>          //https://github.com/tzapu/WiFiManager

#include <Wire.h>
#include <BMx280I2C.h>
BMx280I2C bmx280(0x76);


#define debug true// вывод отладочных сообщений
#define postingInterval  300000 // интервал между отправками данных в миллисекундах (5 минут)

unsigned long lastConnectionTime = 0;           // время последней передачи данных
String Hostname; //имя железки - выглядит как ESPAABBCCDDEEFF т.е. ESP+mac адрес.
int i;
void wifimanstart() { // Волшебная процедура начального подключения к Wifi.
  // Если не знает к чему подцепить - создает точку доступа ESP8266 и настроечную таблицу http://192.168.4.1
  // Подробнее: https://github.com/tzapu/WiFiManager
  WiFiManager wifiManager;
  wifiManager.setDebugOutput(debug);
  wifiManager.setMinimumSignalQuality();
  if (!wifiManager.autoConnect("ESP8266")) {
    if (debug) Serial.println("failed to connect and hit timeout");
    //  delay(3000);
    //reset and try again, or maybe put it to deep sleep
    ESP.deepSleep(330e6);//СПИМ 5 МИНУТ
   // ESP.reset();
  }
  //    delay(5000); }
  if (debug) Serial.println("connected...");
}

void setup() {
  Serial.begin(115200);
  Wire.begin();
  if (!bmx280.begin()) {
    Serial.println("begin() failed. check your BMx280 Interface and I2C Address.");
    while (1);
  }
  if (bmx280.isBME280())Serial.println("sensor is a BME280"); else Serial.println("sensor is a BMP280");
  bmx280.resetToDefaults();  //reset sensor to default parameters.
  bmx280.writeOversamplingPressure(BMx280MI::OSRS_P_x16);
  bmx280.writeOversamplingTemperature(BMx280MI::OSRS_T_x16);
  if (bmx280.isBME280()) bmx280.writeOversamplingHumidity(BMx280MI::OSRS_H_x16);//Для BME
  while (!bmx280.measure()) {
    delay(1000); // Ждем измерение
  }
  while (!bmx280.hasValue()) {
    delay (100);
  }
  Hostname = "ESP" + WiFi.macAddress();
  Hostname.replace(":", "");

  WiFi.hostname(Hostname);
  wifimanstart();
  Serial.println(WiFi.localIP()); Serial.println(WiFi.macAddress()); Serial.print("Narodmon ID: "); Serial.println(Hostname);
  lastConnectionTime = millis() - postingInterval + 15000; //первая передача на народный мониторинг через 15 сек.
}

bool SendToNarodmon() { // Собственно формирование пакета и отправка.
  bmx280.measure();
  WiFiClient client;
  String buf;
  buf = "#" + Hostname + "\r\n"; //mac адрес для авторизации датчика
  while (!bmx280.hasValue()) {
    delay (5);
  }
  buf = buf + "#TEMPC#" + String(bmx280.getTemperature()) + "#Датчик температуры\r\n"; //показания температуры
  if (bmx280.isBME280()) buf = buf + "#HUMID#" + String(bmx280.getHumidity()) + "#Датчик влажности\r\n"; //показания влажности
  buf = buf + "#PRESS#" + String(bmx280.getPressure64()) + "#Датчик давления\r\n"; //показания давления
  buf = buf + "##\r\n"; //окончание передачи


  // попытка подключения
  if (!client.connect("narodmon.ru", 8283)) {
    Serial.println("connection failed"); return false; // не удалось;
  }
  else  {
    client.print(buf); // и отправляем данные
    if (debug) Serial.print(buf);

    while (client.available()) {
      String line = client.readStringUntil('\r'); // если что-то в ответ будет - все в Serial
      Serial.print(line);
    }
  }
  return true; //ушло
}

void loop() {
  yield();
  if (i == 2) {Serial.print (millis()); ESP.deepSleep(330e6);}//уходим в мертвый сон на 330 секунд (+- 30 сек) как раз получается чуть больше 5 минут. 
  if (WiFi.status() == WL_CONNECTED) { // ну конечно если подключены
    if (SendToNarodmon()) i++;
  }
  yield();
}
Подбешивает конструкция loop, а именно то что if SendToNarodmon()) i++ должна выполнится два раза, иначе данные на сервер не приходят.
далее при выполнении этой подпрограммы два раза (i==2) идем в мертвый сон. Как этого избежать?
Также подскажите как оптимизировать код для более быстрого его выполнения? Работаем ведь от батареек. На данный момент при #define debug false смотрю в мониторе порта перед выключением Serial.print (millis()). Засыпает устройство через 3,3 - 3,5 секунд после включения. Может как-то можно сначала произвести измерения а потом включать wifi. В общем посоветуйте варианты оптимизации кода для энергоэффективности. По скромным расчетам двух пальчиковых батареек типа дюрасел должно хватить примерно на год при отправке данных каждые 20 минут ESP.deepSleep(1230e6).
 
В дебри лезть можете самостоятельно. Тут код чисто ознакомительный. Для легкого старта. Ну и кто же на ардуине такие вещи программирует ? Собрались оптимизировать код - вам в нормальный IDE
 

CodeNameHawk

Moderator
Команда форума
Подбешивает конструкция loop, а именно то что if SendToNarodmon()) i++ должна выполнится два раза, иначе данные на сервер не приходят.
далее при выполнении этой подпрограммы два раза (i==2) идем в мертвый сон. Как этого избежать?
Ну так не делайте так, а вы не поняли почему с первого раза не работает.
Могу предположить, что вы не ждете, пока вам ответит сервер.
 
Последнее редактирование:

CodeNameHawk

Moderator
Команда форума

vicious

New member
Доброго всем времени суток, 2 дня боролся с ошибкой "connection failed", хотя в части сети всё хорошо. Набрёл на этот баг [BUG] ESP8266 Cannot open certain TCP connections, решение:
Инструменты/lwIP Variant/ изменить v2 Lower Memory на v2 Higher Bandwidth. Хотя мне помогло v1.4 Higher Bandwidth.
Плата - поделка с алика похожая на Wemos D1 mini
 

Danila Paromonov

New member
зд
В связи с кучей вопросов и порой очень глупых выдаю упрощенный скетч для отправки данных на народный мониторинг.

Схема подключения.



Собственно сам скетч. Вам надо поменять параметры WIFI на свои. И все. Отправка показаний с 1 датчика DS18B20.

Код:
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Ticker.h>

ESP8266WiFiMulti WiFiMulti;
Ticker sender;
bool sendtonm;
OneWire oneWire(2); // DS18B20 подключен по схеме https://goo.gl/HJ9TB9 Зеленый проводок подключен к GPIO2
DallasTemperature sensors(&oneWire);

void setup() {
    WiFi.mode(WIFI_STA); // Режим станции
// Здесь настройки ВАШЕГО WIFI
    WiFiMulti.addAP("SSID", "PASSWORD"); // Данные вашего WiFi <<<<< ---------------  ОБРАТИТЕ ВНИМАНИЕ.
// Здесь настройки ВАШЕГО WIFI
    sender.attach(305, STM); // Создаем событие отправки данных каждые 305 сек (5 мин + 5 сек, чтобы народный мониторинг не ругался если мы на секунду раньше отправили)
    sensors.begin(); //Запуск DS18B20
}

void STM() {sendtonm = true;} // Отправка данных разрешена

void loop() {
    if((WiFiMulti.run() == WL_CONNECTED)) {
     if (sendtonm) { // Если прошло 5 минут, и можно отправлять - работаем.
      sendtonm = false; // отключаем флаг отправки данных
      sensors.requestTemperatures(); // Команда на замер температуры.
      delay(1000); // Задержка для того чтобы датчик успел провести замер.
      DeviceAddress tempDeviceAddress; // Переменная для получения адреса датчика
      String buf; // Буфер для отправки на NarodMon
      buf="#ESP" + WiFi.macAddress()+ "\r\n";buf.replace(":", ""); //формируем заголовок
      sensors.getAddress(tempDeviceAddress, 0); // Получаем уникальный адрес датчика
      buf = buf + "#";
      for (uint8_t i = 0; i < 8; i++) {if (tempDeviceAddress[i] < 16) buf = buf + "0"; buf = buf + String(tempDeviceAddress[i], HEX);} // адрес датчика в буфер
      buf = buf + "#" + String(sensors.getTempCByIndex(0))+ "\r\n"; //и температура
      buf = buf + "##\r\n"; // закрываем пакет
      WiFiClient client;
      client.connect("narodmon.ru", 8283); //Подключаемся
      client.print(buf); // И отправляем данные
      }
    }
}
PS. Код комментирован чуть ли не до запятых. Читаем, разбираемся самостоятельно.
здравствуйте, простите меня юродивого .Не подскажете как сформировать ссылку для получение данных с чужих датчиков . Я пошёл немного другим путём решив организовать php сервер , дабы разгрузить еспешку . Но я не понимаю как сформировать ссылку для получение данных с чужих датчиков . Помогите мне , прошу
 

p-a-h-a

Member
зд


здравствуйте, простите меня юродивого .Не подскажете как сформировать ссылку для получение данных с чужих датчиков . Я пошёл немного другим путём решив организовать php сервер , дабы разгрузить еспешку . Но я не понимаю как сформировать ссылку для получение данных с чужих датчиков . Помогите мне , прошу
POST запрос в коде "Narodmon".
Раз в 3 месяца прийдется получать и менять токен.
Так же есть код для авторизации для получения инфы со своих приватных датчиков, инфы с openweather, приватбанка и еще кое-чего.
 

Алекс2

New member
Непоянял вообще.Как этот текст залить?Вставил в эту железку шнур от телефона там на ней есть порт для шнура под USB не определяется.Пробовал и программу ставить
Arduino IDE 1.8.2

и ссылку которую в настройки залить пробовал обновила компоненты и выбрал я этот ESP8266 потом пробовал залить текст жму загрузка грузит и ошибку выдает ошибка компиляции платы модуля.И по вайфай цеплялся и результата не дало и драйвера ставил
****************************************************************************
Здесь настройки ВАШЕГО WIFI
WiFiMulti.addAP("SSID", "PASSWORD"); // Данные вашего WiFi <<<<< А ЭТО ЧТО?????--------------- ОБРАТИТЕ ВНИМАНИЕ.
// Здесь настройки ВАШЕГО WIFI
ЭТО ЧТО?ВВел пароль и какие настройки??ВВел название сети и ничего не работает.IP адресс что ли добавлять?Куда что тыкать?Я первый раз имею дело с такими датчиками, кстати может подключить температурный датчик чтоб заработало или что?По Wifi подключаюсь пишет без доступа к интернету.Я же незнаю что ей надо, лампа горит синяя на схеме ESP 8266.Хочу подключить к народ мон, там в телеграмме даже контактов нет админов и как подключить скачал даже LOt какой-то прошивку в файле вот только куда ее вставлять, в Arduino IDE 1.8.2 не вставляется файл.
 

Алекс2

New member
Сейчас пробовал другую прошивку указывать все работает только сверху файл BIN указал путь в диске где лежит файл и имя и пароль все прошивка минуты 2 идет и завершается удачно, эта писанина которая выше указана выдает ошибку.
 

aZholtikov

Active member
Сейчас пробовал другую прошивку указывать все работает только сверху файл BIN указал путь в диске где лежит файл и имя и пароль все прошивка минуты 2 идет и завершается удачно, эта писанина которая выше указана выдает ошибку.
 

Алекс2

New member
Старее версии не нашли?
Начните с примеров в ардуино иде.
Причина была в проводе другой старый нашел от телефона подошел.Сразу в COM порте определился и сам нашел драйвера которые я ставил.Прошил через программатор, а прошивка от wifi-iot.com/, но теперь провился и перестал по wi-fi находить эту плату и лампочка синяя теперь не горит и погасла, жму ресет на плате лампочка моргнет на секунду и тухнет.Ужас!Одна проблема на другую накладывается.Видео на ютубе смотрел мужик говорит 192.168.4.1 открывать, но этот адрес не открывается, даже с отключенным фаерволом и антивирусной защиты, просто ошибку выкидывает.Я уже незнаю что делать, либо в мусорное ведро выбросить эту схему или еще пытаться что-то шить на нее, но мне нужен НародМон датчик тепературы и все, а если не настрою, то и проблемы нет, у нас тут таких датчиков хватает и есть у кого тепературу посмотреть онлайн.
 

Алекс2

New member
Старее версии не нашли?
Начните с примеров в ардуино иде.
Так же пароль и сеть правильно?Какие еще данные wifi второй раз вводить?От wifi?Так у меня ip адрес постоянно меняется как я его поймаю, на 1 день будет работать, а потом меняются ip автоматом по тарифу.Пароль и номер сети ввел вроде ничего не надо былоше или неправльно ввел что-то?
 

Вложения

Сверху Снизу