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

Пример отправки на narodmon.ru

gerkimuyda

New member
Добрый день! Подскажите, как сделать чтобы когда esp подключен к wifi, моргал светодиод встроенный?
Моргал или горел? И то и другое вам надо делать самому: в основном цикле проверяете подключенность к вайфай и включаете светодиод (или переключаете).
Иначе (если к вайфаю не подключены) - тушим светодиод путем подачи единицы на нужный порт [inline]digitalWrite(2/*D4-GPIO2*/, HIGH);[/inline]
 

selan61

Member
Пока нет, я скетч собрал, но не попробовал. Не знаю правильно или нет скетч собран, может глянете
Код:
// Простой пример снятия температуры с ds18b20 и отправка его на сайт народного мониторинга. http://narodmon.ru

// Wifi ESP8266
#include <ESP8266WiFi.h>           //https://github.com/esp8266/Arduino
   
// Wifi Manager
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h>          //https://github.com/tzapu/WiFiManager

#include <OneWire.h>

// Humidity/Temperature SI7021
#include <Adafruit_Si7021.h>

Adafruit_Si7021 sensor = Adafruit_Si7021();

// Pressure and Temperature
#include <DallasTemperature.h>
#include <Adafruit_BMP280.h>

#define debug true // вывод отладочных сообщений
#define ONE_WIRE_BUS 2 // GPIO к которому подключен DS18B20
#define TEMPERATURE_PRECISION 12 // точность бит. Если глючит или врет, уменьшить до 9
#define postingInterval  900000 // интервал между отправками данных в миллисекундах (15 минут)

Adafruit_BMP280 bmp; // I2C
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
unsigned long lastConnectionTime = 0;           // время последней передачи данных
float Pressure = 0;
float Humidity = 0;
float Temperature = 0;
int NumberOfDevices; //сколько датчиков найдем.
String Hostname; //имя железки - выглядит как ESPAABBCCDDEEFF т.е. ESP+mac адрес.

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.reset();
    delay(5000); }
if (debug) Serial.println("connected...");
}

void setup() {
  if (!bmp.begin(0x76)) {
    Serial.println(F("Could not find a valid BMP280 sensor, check wiring!"));
    while (1);
  }
  sensor.begin(); // Humidity/Temperature SI7021
  DeviceAddress tempDeviceAddress;
  Hostname = "ESP"+WiFi.macAddress();
  Hostname.replace(":","");
  Serial.begin(115200);
  sensors.begin(); //ds18b20
  NumberOfDevices = sensors.getDeviceCount(); //поищем.
  Serial.print("Found ");
  Serial.print(sensors.getDeviceCount(), DEC);
  Serial.print(" devices. ");
  Serial.print("Parasite power is: ");
  if (sensors.isParasitePowerMode()) Serial.println("ON"); else Serial.println("OFF");
  for (int i = 0; i < NumberOfDevices; i++) { if (sensors.getAddress(tempDeviceAddress, i)) sensors.setResolution(tempDeviceAddress, TEMPERATURE_PRECISION); }//настроим.
  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() { // Собственно формирование пакета и отправка.
    WiFiClient client;
    DeviceAddress tempDeviceAddress;
    String buf;
    buf = "#" + Hostname + "\r\n"; // заголовок
    NumberOfDevices = sensors.getDeviceCount(); //количество датчиков ds18b20?
    sensors.requestTemperatures(); //Начали измерение
    delay(20);
    for (int i = 0; i < NumberOfDevices; i++)  { //перечисляем датчики ds18b20 и их показания
      sensors.getAddress(tempDeviceAddress, i);
        buf = buf + "#";
        for (uint8_t i = 0; i < 8; i++) { if (tempDeviceAddress[i] < 16) buf = buf + "0"; buf = buf + String(tempDeviceAddress[i], HEX); } // адрес датчика ds18b20
        buf = buf + "#" + String(sensors.getTempCByIndex(i)) + "\r\n"; //и его температура
       }
    buf = buf + "#BMP280T#" + String(bmp.readTemperature()) + "\r\n";  // Temperature BMP280
    buf = buf + "#BPE280P#" + String(bmp.readPressure()) + "\r\n";  // Pressure BMP280
    buf = buf + "Si7021H#" + String(sensor.readHumidity()) + "\r\n"; // Humidity SI7021
    buf = buf + "Si7021T#" + String(sensor.readTemperature()) + "\r\n";   // Temperature SI7021
    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() {
    if (millis() - lastConnectionTime > postingInterval) { // ждем 5 минут и отправляем
      if (WiFi.status() == WL_CONNECTED) { // ну конечно если подключены
      if (SendToNarodmon()) {
      lastConnectionTime = millis();
      }else{  lastConnectionTime = millis() - postingInterval + 15000; }//следующая попытка через 15 сек
      }else{  lastConnectionTime = millis() - postingInterval + 15000; Serial.println("Not connected to WiFi");}//следующая попытка через 15 сек
    }  yield(); // что за команда - фиг знает, но ESP работает с ней стабильно и не глючит.
  }
У меня уличные датчики будут в такой конструкции и в ней будет стоять вентилятор, пытаюсь добавить подсчет его оборотов. Сейчас такая конструкция с вентилятором работает на ардуине и считает обороты и вместе с показаниями датчиков отправляет на narodmon. Но на ESP не хочет, еспишка крахуется, не могу понять почему.IMG_20171120_140949.jpg
 
Последнее редактирование:

selan61

Member
Уважаемый Алекс. Прошу вашей помощи. Нашел на arduinoLab скетч подсчета оборотов кулера. Скетч рабочий и использует прерывания.
Код:
/ volatile int val;
int rpmcount = 0;
void rpm(){
val++;
}
void setup() {
Serial.begin(9600);
attachInterrupt(2, rpm, CHANGE);
}
void loop() {
val = 0; // сбрасываем счетчик и ждем.
delay(500); // так как прерывание CHANGE, срабатывает два раза
// то и считываем каждые пол секунды.
rpmcount =(val*60)/2;

Serial.print(rpmcount); // количество импульсов на 60 секунд
// и делим на количество импульсов на оборот
Serial.print(" rpm ");
Serial.print(val);
Serial.println(" val");
}
Вставил этот скетч в проект Виталия Коробова с GitHub, залил в ардуину и она прекрасно работает.
Вывод.png
ESP с этим скетчем тоже работает, но когда я вставляю его в Ваш скетч или другие подобные для отправки на narodmon, то ESP крахуется. Поставил на IDE в инструменты EspExceptionDecoder и по данным стека определил, что ESP крахуется именно по прерываниям. Видимо ESP более капризна при работе с прерываниями, чем ардуина. Помогите, если можно, грамотно вставить этот скетч в Ваш. Я ни разу не программист и у меня не получается, хотя до этого собирал из разных кусков различные скетчи и всё прекрасно работало.
Хочу использовать такую конструкцию корпуса метеодатчиков и для ESP.
IMG_20171114_155946.jpg
Заранее большое спасибо.
 

serv2

New member
Хорошй скетч, поставил и сразу все заработало.
Вопрос, кто нибудь отправку данных делал на emoncms (Emoncms - site home), не знаю как подправить, что бы туда отправлять.
 

us6iql

New member
UPD: https://esp8266.ru/forum/threads/po-mnogochislennym-prosbam-narodmon-ochen-prosto.3060/

Код:
// Простой пример снятия температуры с ds18b20 и отправка его на сайт народного мониторинга. http://narodmon.ru

#include <ESP8266WiFi.h>      
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h>          //https://github.com/tzapu/WiFiManager
#include <OneWire.h>
#include <DallasTemperature.h>


#define debug true // вывод отладочных сообщений
#define ONE_WIRE_BUS 2 // GPIO к которому подключен DS18B20
#define TEMPERATURE_PRECISION 12 // точность бит. Если глючит или врет, уменьшить до 9
#define postingInterval  300000 // интервал между отправками данных в миллисекундах (5 минут)

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
unsigned long lastConnectionTime = 0;           // время последней передачи данных
int NumberOfDevices; //сколько датчиков найдем.
String Hostname; //имя железки - выглядит как ESPAABBCCDDEEFF т.е. ESP+mac адрес.

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.reset();
    delay(5000); }
if (debug) Serial.println("connected...");
}

void setup() {
  DeviceAddress tempDeviceAddress;
  Hostname = "ESP"+WiFi.macAddress();
  Hostname.replace(":","");
  Serial.begin(115200);
  sensors.begin(); //ds18b20
  NumberOfDevices = sensors.getDeviceCount(); //поищем.
  Serial.print("Found ");
  Serial.print(sensors.getDeviceCount(), DEC);
  Serial.print(" devices. ");
  Serial.print("Parasite power is: ");
  if (sensors.isParasitePowerMode()) Serial.println("ON"); else Serial.println("OFF");
  for (int i = 0; i < NumberOfDevices; i++) { if (sensors.getAddress(tempDeviceAddress, i)) sensors.setResolution(tempDeviceAddress, TEMPERATURE_PRECISION); }//настроим.
  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() { // Собственно формирование пакета и отправка.
    WiFiClient client;
    DeviceAddress tempDeviceAddress;
    String buf;
    buf = "#" + Hostname + "\r\n"; // заголовок
    NumberOfDevices = sensors.getDeviceCount(); //количество датчиков ?
    sensors.requestTemperatures(); //Начали измерение
    delay(20);
    for (int i = 0; i < NumberOfDevices; i++)  { //перечисляем датчики и их показания
      sensors.getAddress(tempDeviceAddress, i);
        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(i)) + "\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() {
    if (millis() - lastConnectionTime > postingInterval) { // ждем 5 минут и отправляем
      if (WiFi.status() == WL_CONNECTED) { // ну конечно если подключены
      if (SendToNarodmon()) {
      lastConnectionTime = millis();
      }else{  lastConnectionTime = millis() - postingInterval + 15000; }//следующая попытка через 15 сек  
      }else{  lastConnectionTime = millis() - postingInterval + 15000; Serial.println("Not connected to WiFi");}//следующая попытка через 15 сек
    }  yield(); // что за команда - фиг знает, но ESP работает с ней стабильно и не глючит.
  }
Не удается скомпилировать Ваш скетч. Выскакивает вот такая ошибка:
Arduino: 1.8.5 (Windows 10), Плата:"Generic ESP8266 Module, 80 MHz, ck, 26 MHz, 40MHz, QIO, 512K (no SPIFFS), v2 Prebuilt (MSS=536), Disabled, None, 115200"

In file included from C:\Users\Serg56\Documents\Arduino\esp01_ds18b20_narodmon\esp01_ds18b20_narodmon.ino:7:0:

C:\Users\Serg56\Documents\Arduino\libraries\OneWire/OneWire.h:108:2: error: #error "Please define I/O register types here"

#error "Please define I/O register types here"

^

exit status 1
Ошибка компиляции для платы Generic ESP8266 Module.

Этот отчёт будет иметь больше информации с
включенной опцией Файл -> Настройки ->
"Показать подробный вывод во время компиляции"
 
Последнее редактирование:

srv

New member
Доброго времени суток, товарищи подскажите пожалуйста где в скетче поправить количество попыток подключений. Все работает стабильно месяцами до того момента пока не пропадает электричество, так понимаю esp загружается быстрее роутера пытается подключиться к знакомой сети wi-fi не находя её сама создает точку доступа для настройки. Надо где то количество попыток подключения поменять или интервал между ними, сам не очень разбираюсь. Помогите разобраться.
 

Bekar

New member
Не не получилось для nodmcu01 нужно ставить
#define ONE_WIRE_BUS D1 // [DATA] контакт от датчика DS18B20 подключать на GPIo1(на моём устройстве)
// инициализация oneWire и DS18B20
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature DS18B20(&oneWire);
и только в этом случае данные пойдут только с одного датчика, второго программа не видит. Как это исправить я не понимаю.
 

Bekar

New member
Не не получилось для nodmcu01 нужно ставить
#define ONE_WIRE_BUS D1 // [DATA] контакт от датчика DS18B20 подключать на GPIo1(на моём устройстве)
// инициализация oneWire и DS18B20
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature DS18B20(&oneWire);
и только в этом случае данные пойдут только с одного датчика, второго программа не видит. Как это исправить я не понимаю.
 
Привет всем! Скетч огонь, все работает. Единственно добавил в setup() delay(30000)- при пропадании в квартире напряжения 220В шустрый nodemcu грузится быстрее роутера, ищет сеть, не находит и создает точку доступа, соответственно помогает только перезагрузка nodemcu. Немного балуюсь с HomeAssistant - есть возможность отправлять данные паралельно на разные сервера - на narodmon.ru и на свой сайт xxxx.hldns.ru (ubunty server с mosquitto)? Гугл про это если и знает, то держит от меня в секрете.
 

serovec

New member
Добрый день! Спасибо за проект, все работает, пока с 2 датчиками. Вопрос такой - а на сколько сложно реализовать передачу таких данных с устройства, как Напряжение на esp, уровень WIFI? Если не очень сложно, подскажите пожалуйста что нужно в коде дописать? Спасибо.
 

enjoynering

Well-known member
《Единственно добавил в setup() delay(30000)》

30 секунд! Жесть. Ардуино головного мозга в действии. Функция WiFiEvents? Не не слышал.
 
Сверху Снизу