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

Отправка данных на народный мониторинг

DDD81

New member
Добрый день, возникла проблема с отправкой данных на народный мониторинг при назначении
постоянного ip, в таком виде все работает, но адрес динамический 50 строчка закоментирована.
Устанавливаю постоянный ip, перестают отправляться данные на народный мониторинг.
Подскажите решение проблемы.
Код:
// подключаем библиотеку «ESP8266WiFi»:
#include <ESP8266WiFi.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266mDNS.h>
#include <Ticker.h>
#include <WiFiUdp.h>
#include <ESP8266HTTPClient.h>
// вписываем здесь SSID и пароль для вашей WiFi-сети:
const char* ssid = "**";
const char* password = "**";
IPAddress ip(192,168,0,61);  //статический IP
IPAddress gateway(192,168,0,1);
IPAddress subnet(255,255,255,0);
// контакт для передачи данных подключен к D1 на ESP8266 12-E (GPI07):
#define ONE_WIRE_BUS D7
Ticker sender;
bool sendtonm;
// создаем экземпляр класса oneWire; с его помощью
// можно коммуницировать с любыми девайсами, работающими
// через интерфейс 1-Wire, а не только с температурными датчиками
// от компании Maxim/Dallas:
OneWire oneWire(ONE_WIRE_BUS);
// передаем объект oneWire объекту DS18B20:
DallasTemperature DS18B20(&oneWire);
char temperatureCString[6];
char temperatureFString[6];

const char* host = "narodmon.ru";
const int httpPort = 8283;


// веб-сервер на порте 80:
WiFiServer server(80);
ESP8266WiFiMulti WiFiMulti;
// блок setup() запускается только один раз – при загрузке:
void setup() {
  // инициализируем последовательный порт (для отладочных целей):
  Serial.begin(115200);
  delay(10);
   // подключаемся к WiFi-сети:
  Serial.println();
  Serial.print("Connecting to "); // "Подключаемся к "
  Serial.println(ssid);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);  
// WiFi.config(ip,gateway,subnet);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected"); // "Подключение к WiFi выполнено"
  // запускаем веб-сервер:
  server.begin();
  Serial.println("Web server running. Waiting for the ESP IP...");
              // "Веб-сервер запущен. Ожидание IP-адреса ESP..."
        
  delay(10000);
  // печатаем IP-адрес ESP:
  Serial.println(WiFi.localIP());
 
// Здесь настройки ВАШЕГО WIFI 
   while (WiFi.status() != WL_CONNECTED) {
    delay(500);
     Serial.print(".");}
     Serial.println(WiFi.localIP());
      // выводим мощность принимаемого сигнала:
  long rssi = WiFi.RSSI();
  Serial.print("RSSI:");
  Serial.println(rssi);
 
    sender.attach(305, STM); // Создаем событие отправки данных каждые 305 сек (5 мин + 5 сек, чтобы народный мониторинг не ругался если мы на секунду раньше отправили)
    DS18B20.begin(); //Запуск DS18B20
}
void STM() {sendtonm = true;} // Отправка данных разрешена
void getTemperature() {
  float tempC;
  float tempF;
  do {
    DS18B20.requestTemperatures();
    tempC = DS18B20.getTempCByIndex(0);
    dtostrf(tempC, 2, 2, temperatureCString);
    tempF = DS18B20.getTempFByIndex(0);
    dtostrf(tempF, 3, 2, temperatureFString);
    delay(100);
  } while (tempC == 85.0 || tempC == (-127.0));
}
// блок loop() будет запускаться снова и снова:
void loop() {
 
    // начинаем прослушку входящих клиентов:
  WiFiClient client = server.available();
  long rssi = WiFi.RSSI();
  if (client) {
    Serial.println("New client");  //  "Новый клиент"
   
    // создаем переменную типа «boolean»,
    // чтобы определить конец HTTP-запроса:
    boolean blank_line = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
      
        if (c == '\n' && blank_line) {
            getTemperature();
            client.println("HTTP/1.1 200 OK");
            client.println("Content-Type: text/html; charset=utf-8\r\n");
  client.println(""); //  do not forget this one
  client.println("<!DOCTYPE HTML>");
  client.println("<html>");
   client.println("<h1 style='color:#0ea6f2'>Метеостанция</h1");
            // веб-страница с данными о температуре:
            client.println("<!DOCTYPE HTML>");
            client.println("<html>");
            client.println("<head></head><body><h1>Wemos D1</h1><h3>Температура: ");
            client.println(temperatureCString);
            client.println(" *C");
            client.println("</h1>Уровень Wi-FI сигнала: ");
            client.println (rssi);
            client.println(" dB");
            break;
        }
        if (c == '\n'){                                 // Если "с" равен символу новой строки                                            
         blank_line = true;                             // Тогда начинаем новую строку
        }                                         
         else if (c != '\r'){                           // Если "с" не равен символу возврата курсора на начало строки                                       
          blank_line = false;                           // Тогда получаем символ на текущей строке
        // закрываем соединение:
          }}}}

 
       
      if (sendtonm) { // Если прошло 5 минут, и можно отправлять - работаем.
      sendtonm = false; // отключаем флаг отправки данных
      DS18B20.requestTemperatures(); // Команда на замер температуры.
      delay(1000); // Задержка для того чтобы датчик успел провести замер.
        
      DeviceAddress tempDeviceAddress; // Переменная для получения адреса датчика
      String buf; // Буфер для отправки на NarodMon
      buf="#" + WiFi.macAddress() + "#ESP" + "\r\n"; //формируем заголовок
      DS18B20.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(DS18B20.getTempCByIndex(0))+ "\r\n"; //и температура
      buf = buf + "##\r\n"; // закрываем пакет
      Serial.println("Sending...");
      Serial.println("buf");
        if (!client.connect("narodmon.ru", 8283)) {
        Serial.println("Connection to host failed");
        delay(1000);
        return;}
       
        client.connect("narodmon.ru", 8283); //Подключаемся
        Serial.println("Connect narodmon...");
        client.print(buf); // И отправляем данные
      }
     
     }
 

CodeNameHawk

Moderator
Команда форума
Строчки 50 и 49 поменять местами.
Устанавливаю постоянный ip, перестают отправляться данные на народный мониторинг.
Вы, что нормально описать не можете.
Если делаю так то работает, если сделал так то это стало так, это так, а это так.
 

DDD81

New member
Код:
// подключаем библиотеку «ESP8266WiFi»:
#include <ESP8266WiFi.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266mDNS.h>
#include <Ticker.h>
#include <WiFiUdp.h>
#include <ESP8266HTTPClient.h>
// вписываем здесь SSID и пароль для вашей WiFi-сети:
const char* ssid = "**";
const char* password = "**";
IPAddress ip(192,168,0,61);  //статический IP
IPAddress gateway(192,168,0,1);
IPAddress subnet(255,255,255,0);
// контакт для передачи данных подключен к D1 на ESP8266 12-E (GPI07):
#define ONE_WIRE_BUS D7
Ticker sender;
bool sendtonm;
// создаем экземпляр класса oneWire; с его помощью
// можно коммуницировать с любыми девайсами, работающими
// через интерфейс 1-Wire, а не только с температурными датчиками
// от компании Maxim/Dallas:
OneWire oneWire(ONE_WIRE_BUS);
// передаем объект oneWire объекту DS18B20:
DallasTemperature DS18B20(&oneWire);
char temperatureCString[6];
char temperatureFString[6];

const char* host = "narodmon.ru";
const int httpPort = 8283;


// веб-сервер на порте 80:
WiFiServer server(80);
ESP8266WiFiMulti WiFiMulti;
// блок setup() запускается только один раз – при загрузке:
void setup() {
  // инициализируем последовательный порт (для отладочных целей):
  Serial.begin(115200);
  delay(10);
   // подключаемся к WiFi-сети:
  Serial.println();
  Serial.print("Connecting to "); // "Подключаемся к "
  Serial.println(ssid);
  WiFi.mode(WIFI_STA);
  WiFi.config(ip,gateway,subnet);
  WiFi.begin(ssid, password);  

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected"); // "Подключение к WiFi выполнено"
  // запускаем веб-сервер:
  server.begin();
  Serial.println("Web server running. Waiting for the ESP IP...");
              // "Веб-сервер запущен. Ожидание IP-адреса ESP..."
        
  delay(10000);
  // печатаем IP-адрес ESP:
  Serial.println(WiFi.localIP());
 
// Здесь настройки ВАШЕГО WIFI 
   while (WiFi.status() != WL_CONNECTED) {
    delay(500);
     Serial.print(".");}
     Serial.println(WiFi.localIP());
      // выводим мощность принимаемого сигнала:
  long rssi = WiFi.RSSI();
  Serial.print("RSSI:");
  Serial.println(rssi);
 
    sender.attach(305, STM); // Создаем событие отправки данных каждые 305 сек (5 мин + 5 сек, чтобы народный мониторинг не ругался если мы на секунду раньше отправили)
    DS18B20.begin(); //Запуск DS18B20
}
void STM() {sendtonm = true;} // Отправка данных разрешена
void getTemperature() {
  float tempC;
  float tempF;
  do {
    DS18B20.requestTemperatures();
    tempC = DS18B20.getTempCByIndex(0);
    dtostrf(tempC, 2, 2, temperatureCString);
    tempF = DS18B20.getTempFByIndex(0);
    dtostrf(tempF, 3, 2, temperatureFString);
    delay(100);
  } while (tempC == 85.0 || tempC == (-127.0));
}
// блок loop() будет запускаться снова и снова:
void loop() {
 
    // начинаем прослушку входящих клиентов:
  WiFiClient client = server.available();
  long rssi = WiFi.RSSI();
  if (client) {
    Serial.println("New client");  //  "Новый клиент"
   
    // создаем переменную типа «boolean»,
    // чтобы определить конец HTTP-запроса:
    boolean blank_line = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
      
        if (c == '\n' && blank_line) {
            getTemperature();
            client.println("HTTP/1.1 200 OK");
            client.println("Content-Type: text/html; charset=utf-8\r\n");
  client.println(""); //  do not forget this one
  client.println("<!DOCTYPE HTML>");
  client.println("<html>");
   client.println("<h1 style='color:#0ea6f2'>Метеостанция</h1");
            // веб-страница с данными о температуре:
            client.println("<!DOCTYPE HTML>");
            client.println("<html>");
            client.println("<head></head><body><h1>Wemos D1</h1><h3>Температура: ");
            client.println(temperatureCString);
            client.println(" *C");
            client.println("</h1>Уровень Wi-FI сигнала: ");
            client.println (rssi);
            client.println(" dB");
            break;
        }
        if (c == '\n'){                                 // Если "с" равен символу новой строки                                            
         blank_line = true;                             // Тогда начинаем новую строку
        }                                         
         else if (c != '\r'){                           // Если "с" не равен символу возврата курсора на начало строки                                       
          blank_line = false;                           // Тогда получаем символ на текущей строке
        // закрываем соединение:
          }}}}

 
       
      if (sendtonm) { // Если прошло 5 минут, и можно отправлять - работаем.
      sendtonm = false; // отключаем флаг отправки данных
      DS18B20.requestTemperatures(); // Команда на замер температуры.
      delay(1000); // Задержка для того чтобы датчик успел провести замер.
        
      DeviceAddress tempDeviceAddress; // Переменная для получения адреса датчика
      String buf; // Буфер для отправки на NarodMon
      buf="#" + WiFi.macAddress() + "#ESP" + "\r\n"; //формируем заголовок
      DS18B20.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(DS18B20.getTempCByIndex(0))+ "\r\n"; //и температура
      buf = buf + "##\r\n"; // закрываем пакет
      Serial.println("Sending...");
      Serial.println("buf");
        if (!client.connect("narodmon.ru", 8283)) {
        Serial.println("Connection to host failed");
        delay(1000);
        return;}
       
        client.connect("narodmon.ru", 8283); //Подключаемся
        Serial.println("Connect narodmon...");
        client.print(buf); // И отправляем данные
      }
     
     }
Строчки 50 и 49 поменять местами.

Вы, что нормально описать не можете.
Если делаю так то работает, если сделал так то это стало так, это так, а это так.
Спасибо за ответ. Это пробовал раньше.
В этом и есть суть проблемы. На сервер по ip 192.168.0.61 захожу, но данные не отправляются
на народный мониторинг.
 

DDD81

New member
Если убираю строку(49)
WiFi.config(ip,gateway,subnet);
все прекрасно работает, но адрес устройства в сети динамический
добавляю
WiFi.config(ip,gateway,subnet);
адрес становится статическим, на сервер в сети захожу, а данные на народный мониторинг не отправляются
не понимаю в каком направлении искать ошибку


данные из порта

11:59:19.103 -> WiFi connected
11:59:19.103 -> Web server running. Waiting for the ESP IP...
11:59:29.105 -> 192.168.0.61
11:59:29.105 -> 192.168.0.61
11:59:29.105 -> RSSI:-50
11:59:29.172 -> New client
12:04:35.332 -> Sending...
12:04:35.332 -> buf
12:04:35.332 -> Connection to host failed
12:09:40.323 -> Sending...
12:09:40.323 -> buf
12:09:40.323 -> Connection to host failed
 

CodeNameHawk

Moderator
Команда форума
Какаю версию плат есп используете? если 2.5.0, то попробуйте 2.4.2
 

CodeNameHawk

Moderator
Команда форума
Посмотрите в AduinoIDE в Board Manager, там же ее и поменяйте.
esp.png
Выберите 2.4.2 и нажмите инстал.
 
Последнее редактирование:

DDD81

New member
Сделал как рекомендовали, пришлось почистить часть библиотек установленных вручную.
Пока все аналогично
с постоянным ip
15:24:39.328 -> Connecting to DP
15:24:39.804 -> .
15:24:39.804 -> WiFi connected
15:24:39.804 -> Web server running. Waiting for the ESP IP...
15:24:49.826 -> 192.168.0.61
15:24:49.826 -> 192.168.0.61
15:24:49.826 -> RSSI:-52
15:24:49.826 -> New client
15:25:02.933 -> New client
15:25:16.160 -> New client
15:25:21.729 -> New client
15:25:23.592 -> New client
15:25:25.631 -> New client
15:25:26.922 -> New client
15:25:27.908 -> New client
15:25:29.469 -> New client
15:25:31.203 -> New client
15:29:55.959 -> Sending...
15:29:55.959 -> buf
15:29:55.959 -> Connection to host failed
15:30:37.699 -> New client
15:30:47.337 -> New client
15:31:42.358 -> New client
15:31:44.597 -> New client
15:31:54.823 -> New client
15:32:01.581 -> New client
15:35:00.983 -> Sending...
15:35:00.983 -> buf
15:35:00.983 -> Connection to host failed

Если убираю строку
//WiFi.config(ip,gateway,subnet);
15:40:42.135 -> Connecting to DP
15:40:42.644 -> ..
15:40:43.153 -> WiFi connected
15:40:43.153 -> Web server running. Waiting for the ESP IP...
15:40:53.133 -> 192.168.0.3
15:40:53.133 -> 192.168.0.3
15:40:53.133 -> RSSI:-49
15:40:56.733 -> New client
15:45:59.391 -> Sending...
15:45:59.391 -> buf
15:45:59.424 -> Connect narodmon...

все работает, но адрес ip динамический


12.gif
 

CodeNameHawk

Moderator
Команда форума
Вызывает похоже, что правильно Station Class — ESP8266 Arduino Core 2.5.0-42-g82da5c7 documentation
вопрос в том, готов ли роутер выдать этот адрес.
Покажите скриншоты настройки роутера.

Я свой проект пере собрал с 2.4.2 на 2.5.0 и получилось похоже как у ТС.
Если включить полную отладку - работает.
Тут есть вопрос по 2.5.0 WiFi.config(fixedIP, fixedGateway, fixedNetmask) disconnects ESP on 2.5.0 (regression from 2.4.2) · Issue #5839 · esp8266/Arduino
 

Сергей_Ф

Moderator
Команда форума
@CodeNameHawk как правильно? три параметра - это WiFi.config(ip, dns, gateway);
А ТС подставляет WiFi.config(ip, gateway, subnet);
Я не помню, когда это поменялось. Надо смотреть исходники, как вызывать.
 

CodeNameHawk

Moderator
Команда форума
Сергей_Ф, по ссылке выше
WiFi.config(staticIP, gateway, subnet);
Есть расширенная версия WiFi.config(ip, ip_gate, ip_subnet, ip_dns1, ip_dns2); и у меня так работает.
Ваш вариант для Arduino, а вот для какой платы не знаю.
 

DDD81

New member
Спасибо ОГРОМНОЕ всем за решение и помощь.
Проблема решена. Все дело было именно в DNS.
Роутер автоматом их выдавал, я же их не указывал, поэтому и не отправлялись данные.
Можно было сразу догадаться. :oops:
Еще раз спасибо.
 

Bekar

New member
Я скомпилировал твою программу залил в NodeMcu V3 и у меня в монитор приходят следующие данные

Connecting to Telnet_home
....
WiFi connected
Web server running. Waiting for the ESP IP...
192.168.1.15
192.168.1.15
RSSI:-51
Sending...
buf
Connect narodmon...
Sending...
buf
Connect narodmon...

проблема в том что на народный мониторинг приходят нули вместо температуры от DS1820
 

Bekar

New member
Программа отлично работает проблем нет. Подскажите пожалуйста как сделать опрос двух датчиков DS18B20, серийные номера известны. Функция ds18b20.getTempCBylndex(0) не подходит нужно использовать ds18b20.getTempC(sensor1) и ds18b20.getTempC(sensor2). Но как это все грамотно в имеющуюся программу вживить я не знаю.
Буду рад любой помощи. За ранее спасибо!
 
Сверху Снизу