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

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

chris

New member
Привет, всем, я новичок, и я живу во Франции, простите за мой язык русский, это только Google перевод.
Я использую несколько 8266 (ESP-01, ESP-12, ESP07 ..) и NarodMon: общественный контроль. Все работает отлично, и я просмотреть все свои датчики.
Я увидел, что функция «отправить команду на устройство». Они показывают, что Narodmon отправку #OK после РАЗА расписок пакетов. И мы можем сделать то же самое, посылая gpio2 = 1, например.
Какой код следует добавить Alex эскиз, чтобы отобразить на мониторе серии: gpio2 = 1 для отладки?

Или quelqun использовал эту функцию в Narodmon?
Спасибо за ответ.

Hello, to everyone, I am new, and I live in France, Sorry for my Russian language, it just google Translation.
I use several 8266 (ESP-01, ESP-12, ESP07 ..) and NarodMon: public monitoring. Everything works perfectly and I see all my sensors.
I saw that there was a "send command to device" function. They indicate that Narodmon sends #OK after every packets received. And we can do the same thing by sending gpio2 = 1 for example.
What code should I add to the sketch of Alex to be able to display, on the monitor serie: gpio2 = 1 for debuging?

Or did anyone use this feature in Narodmon?
Thank you for the answer.

Код:
// Простой пример снятия температуры с 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 работает с ней стабильно и не глючит.
  }
 

chris

New member
строка 80, там ответ.
Спасибо Алекс за ответ. Я видел строку 80 и пытался сделать этот код:
Код:
// OnOff led sur GPIO2 si on off dans  http://narodmon.ru
// connexion MultiWifi

#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h> // pour connection multi reseaux
ESP8266WiFiMulti wifiMulti; //https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266WiFi/examples
#include <DNSServer.h>
#include <ESP8266WebServer.h>

String Hostname; //le nom des glandes - ressemble ESP AABBCCDDEEFF ie Adresse ESP + mac.


//===================================
//=              SETUP              =
//===================================
void setup() {
  Serial.begin(9600);
  // We start by connecting to a WiFi network
  wifiMulti.addAP("xxx", "xx");
  wifiMulti.addAP("xx", "xx");
  wifiMulti.addAP("xxx", "xxx");
  wifiMulti.addAP("xx", "xx");
  // Connect to WiFi
  Serial.println();
  Serial.println();
  Serial.print("Wait for WiFi... ");

  while (wifiMulti.run() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  // DeviceAddress tempDeviceAddress;
  Hostname = "ESP" + WiFi.macAddress();
  Hostname.replace(":", "");


  WiFi.hostname(Hostname);
  Serial.println(WiFi.localIP()); Serial.println(WiFi.macAddress()); Serial.print(" Narodmon ID: "); Serial.println(Hostname);
  //lastConnectionTime = millis() - postingInterval + 15000; //première diffusion sur la surveillance nationale en 15 secondes.

} // FIN DE SETUP

//===================================
//=              LOOP               =
//===================================
void loop() {
  // Multi Wifi
  if (wifiMulti.run() != WL_CONNECTED) {
    Serial.println("WiFi not connected!");
    delay(1000);
  }


  WiFiClient client;
  if (!client.connect("narodmon.ru", 8283)) { // la tentative de connexion
    Serial.println("connection echouee a NarodMon");
  } else
  {
    //Serial.println("connection a NarodMon OK");
    while (client.available()) {
      String line = client.readStringUntil('\r'); // si quoi que ce soit, en réponse à - toutes les séries
      Serial.print(line);
    }
  }

} // FIN de loop
Но на Serial Monitor ничего не происходит
 
65 строку в своем коде на delay(1000); замените. Сервер просто ответить не успевает. Ну и вы ничего не передаете. Я не знаю логику, но может вы ничего и не получите без передачи данных. Вы же мак отдаете. А вам отвечают.
Попробуйте задержку в моем коде перед опросом while (client.avail....
 

chris

New member
Благодаря вашей программе я могу отправить измерения всех моих зондов на Народмон. То, что я хотел бы проверить, это «Режим управления». Я хотел бы сделать очень простой эскиз, чтобы получить команду от Narodmon и отобразить ее на серийном мониторе ESP8266-12. Остальное, что я мог сделать ;)
Вы когда-нибудь тестировали эту функцию? Включить светодиод или реле?
send-command-Narodmon.JPG
 

ArT054

New member
Всем привет,подскажите новичку в какой строке кода нужно вводить название сети и пароль от вай фая?
 

chris

New member
Всем привет,подскажите новичку в какой строке кода нужно вводить название сети и пароль от вай фая?
Добрый день, если ты используй книжный магазин "WiffiManager" GitHub - tzapu/WiFiManager: ESP8266 WiFi Connection manager with web captive portal ты не нуждаешься в том, чтобы возвращать ssid и пароль в Скетч. Ты соедини твой smartphone, имеет ESP8266 и ты выбирает сеть и информирует пароль.
 

ArT054

New member
Добрый день, если ты используй книжный магазин "WiffiManager" GitHub - tzapu/WiFiManager: ESP8266 WiFi Connection manager with web captive portal ты не нуждаешься в том, чтобы возвращать ssid и пароль в Скетч. Ты соедини твой smartphone, имеет ESP8266 и ты выбирает сеть и информирует пароль.
Не мог ли ты более подробно об этом рассказать?
 
Если ESP8266 не подключена к wifi она создает точку доступа. Подключившись к ней заходишь браузером на 192.168.4.1 и настраиваешь что тебе надо.
 

ArT054

New member
С горем пополам получилось,но остаётся небольшая проблема с отображением показаний на сайте народмон.Прикрепляю скриншоты:
1.Вот что показывает в терминале.terminal.jpg
2.Так отображается на карте народмон. Безымянный.jpg
3.При нажатие на знак вопроса где размещен датчик показывает narod.jpg
4.Редактирование датчика невозможно 1111.jpg
Как я делал;
1.Залил скетч через ардуино ide.
2.Выключил вайфай роутер.
3.Передернул питание esp8266-01.
4.Подключился к сети вайфай esp8266,попал на стриницу с настройками,влючил вайфай роутер,просканировал эфир ,нашлась основная точка вайфая,ввел название сети и пароль,сохранил.
5.Передернул питание esp8266-01.
6.Зашел на сайт народмон,добавил устройство,ввел серийный номер мак еспэшки.(примечание,до этого , в народмон,эта esp8266-01 была зарегистрирована с другой прошивкой, после заявки на удаление устройство было удаленно)
П.С Интернет у меня через вайфай роутер yota.
Что я сделал неправильно?
еще такой момент .
B данный момент на сайт народмон шлет показания еще одна есп и работает она с одним датчиком ds18b20 по такому скетчу
Код:
#include <ESP8266WiFi.h>
#include <OneWire.h>

OneWire  ds(2);  // GPIO2 (a 4.7K resistor is necessary)

const char* ssid     = ""; // название
const char* password = ""; //  пароль точки доступа
const char* host = "narodmon.ru";
const int httpPort = 8283;

byte addr[8];
float temperature;

float getTemp(){
  byte data[12]; 

  if (!ds.search(addr)) {
    Serial.println("No more addresses.");
    while(1);
  }
   ds.reset_search();
  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      while(1);
  }

 
  ds.reset();           
  ds.select(addr);       
  ds.write(0x44);     
  delay(1000);  
 
  ds.reset();
  ds.select(addr);   
  ds.write(0xBE);         

  for (int i = 0; i < 9; i++) {          
    data[i] = ds.read(); 
  }

  int raw = (data[1] << 8) | data[0];
  if (data[7] == 0x10) raw = (raw & 0xFFF0) + 12 - data[6]; 
  return raw / 16.0;
   
}

void setup() {
  Serial.begin(115200);
  delay(10);

}

void loop() {
     // забираем температуру.
  temperature = getTemp();

     // Подключаемся к wifi
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
 
  WiFi.begin(ssid, password);
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println();
  Serial.println("WiFi connected"); 
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  Serial.print("MAC address: ");
  Serial.println(WiFi.macAddress());
  Serial.println();
 
  // подключаемся к серверу
  Serial.print("connecting to ");
  Serial.println(host);
 
  // Use WiFiClient class to create TCP connections
  WiFiClient client;
 
  if (!client.connect(host, httpPort)) {
    Serial.println("connection failed");
    //return;
  }
 
  // отправляем данные 
  Serial.println("Sending...");
      // заголовок
  client.print("#");
  client.print(WiFi.macAddress()); // отправляем МАС нашей ESP8266
  client.print("#");
  client.print("ESP8266"); // название устройства
client.print(""); // координаты местонахождения датчика
  client.println();
 
      // отправляем данные с градусника
    client.print("#");
    for(int i = 0; i < 8; i++) client.print(addr[i], HEX); // номер 18b20
    client.print("#");
    client.print(temperature);
    client.print("#ds18b20");  // название датчика
   client.println("##");
   
  delay(10);

  // читаем ответ с и отправляем его в сериал
  Serial.print("Requesting: "); 
  while(client.available()){
    String line = client.readStringUntil('\r');
    Serial.print(line); // хотя это можно убрать
  }
 
  client.stop();
  Serial.println();
  Serial.println();
  Serial.println("Closing connection");

  WiFi.disconnect(); // отключаемся от сети
  Serial.println("Disconnect WiFi.");
 
  delay(1000*60*5); // перекур 5 минут
}
можно ли как ни будь изменить этот скетч,что бы он отправлял температуру с трех датчиков?
 
Последнее редактирование:

ArT054

New member
Вообщем, не буду мучить Вас и себя,залил в еспшку скетч для одного датчика, с наскока не осилил эту тему,придется осваивать понемногу.
 

chris

New member
Вообщем, не буду мучить Вас и себя,залил в еспшку скетч для одного датчика, с наскока не осилил эту тему,придется осваивать понемногу.
вы можете попробовать этот эскиз для 1 датчика 18b20. Заменяет xxxxx вашими значениями.
Датчик 18b20 температуры, подключенный к GPIO0.
Код:
/*
Создал Zanis Dukalskis
05.06.2015
Скетч отправки данных на сайт мониторинг http://narodmon.ru
При помощи датчика температуры DS18B20.
Из скетча регистрационные данные не требуется отправлять,т.к. после регистрации сервер определяет по IP.
Подробно о передаче данных https://narodmon.ru/#
Необходимые библиотеки:
DallasTemperature.h - https://github.com/milesburton/Arduino-Temperature-Control-Library

Copyright (C) <2015> <Zanis Dukalskis>
Это программа является свободным программным обеспечением. Вы можете
распространять и/или модифицировать её согласно условиям Стандартной
Общественной Лицензии GNU, опубликованной Фондом Свободного Программного
Обеспечения, версии 2 или, по Вашему желанию, любой более поздней версии.
Эта программа распространяется в надежде, что она будет полезной, но БЕЗ
ВСЯКИХ ГАРАНТИЙ, в том числе подразумеваемых гарантий ТОВАРНОГО СОСТОЯНИЯ ПРИ
ПРОДАЖЕ и ГОДНОСТИ ДЛЯ ОПРЕДЕЛЁННОГО ПРИМЕНЕНИЯ. Смотрите Стандартную
Общественную Лицензию GNU для получения дополнительной информации.
Вы должны были получить копию Стандартной Общественной Лицензии GNU вместе
с программой. В случае её отсутствия, посмотрите <http://www.gnu.org/licenses/>.

*/
#include <ESP8266WiFi.h>
#include <OneWire.h>
#include <DallasTemperature.h>

//WIFI точка к которой подключается ESP8266  вписать свою
const char* WIFI_SSID     = "xxxxx"; // название вашего беспроводного интернета
const char* WIFI_PASSWORD = "xxxxx"; // пароль

// *** Для narodmon.ru  сокета ***
const char* IP_ADDRESS = "narodmon.ru";
const int PORT = 8283;
// *******************************
// *** Данные, необходимые для передачи на narodmon.ru
const char* ID = "xxxxxx"; // MAC - серийный номер ESP8266 (обязательно передавать)
//MAC можно узнать через WEB страницу рутера вашей WIFI сети или через Flasher NODEMCU https://github.com/nodemcu/nodemcu-flasher (в поле STA MAC)
const char* NAME = "ESP8266"; // Название устройства мониторинга (не обязательно передавать)
// *******************************
// *** Данные одного датчика ***
const char* mac1 = "T1"; // Уникальные серийные номер датчика подключенного к устройству (обязательно передавать)
// T - означает что температурный, 1 порядковый номер .Если датчиков несколько можно отсылать серийный номер в виде T1-XX-XX.. (где XX-XX.. серийный номер датчика)
const char*  name1 = "DS18B20"; // Название датчика (не обязательно передавать)
// *******************************
const int DELAY = 360000; // отправка данных через каждые 5 минут (1000 ms * 300sec = 300000ms = 5min)
// сервер блокирует данные чаше чем раз в 5-ть минут - TOO OFTEN

const int ONE_WIRE_BUS = 0;  //[DATA] контакт от датчика DS18B20 подключать на GPIO0
// инициализация oneWire и DS18B20
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature DS18B20(&oneWire);


void setup() {
  Serial.begin(9600);
  Serial.println();
  wifiConnect();
}

void loop() {// получение показаний температуры в бесконечном цикле
  float temp;
  while (true) {
    DS18B20.requestTemperatures();
    temp = DS18B20.getTempCByIndex(0);
    Serial.print("Temperature: ");Serial.println(temp);
    if (temp == 85.0 || temp == -127.0)
      Serial.println("Device disconnected");
    else
      break;
    delay(1000);
  }
  sendTemperature(temp);
  delay(DELAY);
}

void wifiConnect() //подключение к WIFI
{
  Serial.print("Connecting to WIFI");
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(".");
  }
  Serial.println();
  Serial.println("WiFi connected");
}

void sendTemperature(float temp)// отправка данных температуры
{
  WiFiClient client;
  while (!client.connect(IP_ADDRESS, PORT)) {   //подключаемся к сокету
    Serial.println("connection failed");
    wifiConnect();
  }
  client.print( // отправляем
    String("#") + ID + "#" + NAME + "\n" + //MAC и название устройства
    "#" + mac1 + "#" + temp + "#" + name1 + "\n" + //пишем в сокет сформированные данные для одного датчика
    "##" // конец передачи
  );
  Serial.print("Data send\n");
  delay(100);
  // читаем ответ,получаем OK если всё хорошо :)
  while (client.available()) {
    String line = client.readStringUntil('\r');
    Serial.print(line);
  }
  Serial.println();
  Serial.println("Connection closed");
}
Хорошее мужество для работы
 

selan61

Member
Спасибо автору за скетч, собрал несколько устройств, все заработали с первого раза. Вопрос как добавить отправку с ВМР280( давление и температура) и Si7021(влажность и температура)?
 
Ну BME280 я у себя подключил вот так Hookup | Arduino to BME280 using I2C

BME280_I2C bme(0x76);

В Setup()

if (bme.begin()) bme.readSensor();

В SendToNarodmon() у меня добавлено

while (bme.getPressure_mmHG() < 700) {
bme.readSensor();
retry++;
delay(20);
if (retry = 20) break;
}
if (bme.getPressure_mmHG()>700) {
buf = buf + "#BME280T#" + String(bme.getTemperature_C()) + "\r\n";
buf = buf + "#BME280P#" + String(bme.getPressure_mmHG()) + "\r\n";
buf = buf + "#BME280H#" + String(bme.getHumidity()) + "\r\n"; }
}

Может правил библиотеку. В смысле давление чтобы в мм.рт.ст. сразу отдавала. Но можно и в паскалях. Надеюсь принцип понятен.

Ну и по Si7021 есть библиотека с примерчиком.

GitHub - adafruit/Adafruit_Si7021: Arduino library for Adafruit Si7021

#include "Adafruit_Si7021.h"
Adafruit_Si7021 sensor = Adafruit_Si7021();
В setup() добавляем

sensor.begin();

В SendToNarodmon()

buf = buf + "Si7021H#" + String(sensor.readHumidity()) + "\r\n";
buf = buf + "Si7021T#" + String(sensor.readTemperature()) + "\r\n";
 

msigx680

New member
Добрый день! Подскажите, как сделать чтобы когда esp подключен к wifi, моргал светодиод встроенный?
 
Сверху Снизу