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