• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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 автоматом по тарифу.Пароль и номер сети ввел вроде ничего не надо былоше или неправльно ввел что-то?
 

Вложения

Сверху Снизу