Vladimir
-
Публикации
4 -
Зарегистрирован
-
Посещение
-
Дней в лидерах
3
Сообщения, опубликованные пользователем Vladimir
-
-
В 25.04.2018 в 15:35, pasha413 сказал:залил последнюю прошивку с изменениями (отправка на MD), с раскомментированными строками:
sensors.add(new knob_t(-100, 0, "1", "RSSI", "dbm"), device::in, "rssi",[&](){ return wifi.isConnected() ? WiFi.RSSI() : 0; }); sensors.add(new knob_t(0, 5, ".01", "Питание", "V"), device::in, "vcc", [&](){ return ESP.getVcc() * 0.001; }); sensors.add(new knob_t(0, 81920, "1", "RAM", "Byte"), device::in, "ram", [&](){ return 81920 - ESP.getFreeHeap(); });
вот так выдает:
странно получается..что-то передает что-то нет.
несколько раз прошивал, картина не меняется, прошил другую плату все стало норм показывать (пару раз прошил все ок!).
походу все дело в платах
Сталкивался с подобной ситуацией при заливке прошивки через WEB интерфейс.
Причины до конца не выяснил НО!:
Если сначала сделать без подключенного контроллера:
1) Надавить кнопку "Проверить"
2) Кнопка "Загрузка" при этом происходит компиляция но выдается ошибка т.к. ESP не подключено
3) "Скетч"далее "Экспорт бинарного файла" и загрузится через WEB то если загрузка пройдет (у меня не всегда проходит) то русский язык появляется.
Конечно это странно. У меня NODEMCU стоит далеко и поэтому загрузка только через WEB возможна.
Но сейчас уже не актуально т.к. все данные у меня передаются через MQTT на домашнюю СКАДА.
-
12 часов назад, Dark FeniX сказал:Спасибо за помощь! Если я всё правильно понял, то предлагается ввести задержку после отправки данных через MQTT, перед отключением от брокера. Возможно, действительно, разрыв связи происходит быстрее, чем происходит передача.
Я попробовал ввести этот код в свой скетч, но, увы, из-за малых познаний Ардуино, пришлось действовать методом проб и ошибок. Хотя, как я понял, это банальная задержка с помощью millis. Просьба взглянуть на мой код и подправить, где я ошибся.
По факту, у меня вообще перестала работать передача данных на брокер. Идёт разрыв по тайм-ауту.
Для введения задержки я использовал:
В servces.h Сделать так.
tMQTT = millis();
// mqttAPI.disconnect();В теле программы (первая закладка с названием прошивки) сделать так.
void loop() {
/* Обработчики */
wifi.handleEvents();
http.handleClient();
cron.handleEvents();
// Дисконект по связи с MQTT необходима задержка для передачи всех данных
if (tMQTT != 0) {
if (millis() - tMQTT > 1000 or tMQTT > millis()){
mqttAPI.disconnect();
tMQTT = 0;
}
}
// Активация счета температуры в датчиках DS за 1,5с до чтения датчиков из программы
if (millis() - TReadT > 3500 or TReadT > millis()){
Tsensors.setWaitForConversion(false); //No waiting for measurement
Tsensors.requestTemperatures(); //Initiate the temperature measurement
}
}У меня все работает.
Часть касательно датчиков DS не нужна. К стати сейчас на один шлейф повешено 11 датчиков DS - работают стабильно.
- 1
-
В 09.04.2018 в 17:46, Dark FeniX сказал:Доброго времени суток! Сперва, хочу поблагодарить автора за столь замечательный проект. На его основе я сейчас создаю свою домашнюю метеостанцию. Пока только собрана на макетке, но работоспособна уже на 80%. Распечатана будка Стивенсона, жду, как приедет OLED-дисплей, который намереваюсь прикрутить к основному блоку. Немного подправил код программы, для работы с двумя датчиками - BME280 (внутренний) и Si7021 (внешний).
users_bme280_x2.h
#ifndef USERS_H #define USERS_H #include <BME280I2C.h> // https://github.com/finitespace/BME280 #include <HTU21D.h> HTU21D myHTU21D(HTU21D_RES_RH12_TEMP14); BME280I2C::Settings settings_in( BME280::OSR_X1, BME280::OSR_X1, BME280::OSR_X1, BME280::Mode_Forced, BME280::StandbyTime_1000ms, BME280::Filter_Off, BME280::SpiEnable_False, BME280I2C::I2CAddr_0x76 ); BME280I2C BME_IN(settings_in); /* Параметры индикаторов web интерфейса для плагина Knob Мин Макс Шаг Заголовок Ед. измер. |---------------------|----|------|------|--------------|---------| */ knob_t *T = new knob_t( -40, 125, ".1", "Температура", "°C"); knob_t *P = new knob_t(-500, 9000, ".01", "Давление", "mm"); knob_t *H = new knob_t( 0, 100, ".01", "Влажность", "%"); /* Функции, описывающие инициализацию датчиков */ void out_init() { myHTU21D.begin(); } void in_init() { BME_IN.begin(); } /* Функции, описывающие как получить от внешнего датчика те или иные данные */ float out_temp() { return myHTU21D.readTemperature(SI70xx_TEMP_READ_AFTER_RH_MEASURMENT); } float out_hum() { return myHTU21D.readHumidity(); } /* Функции, описывающие как получить от внутреннего датчика те или иные данные */ float in_temp() { return BME_IN.temp(BME280::TempUnit_Celsius); } float in_hum() { return BME_IN.hum(); } float in_pres() { return BME_IN.pres(BME280::PresUnit_torr); } /* Добавление датчиков в систему */ void sensors_config() { Wire.begin(4, 5); /* Внешний датчик */ sensors.add(H, device::out, 0x40, "out_humidity", out_hum, true); sensors.add(T, device::out, 0x40, "out_temperature", out_init, out_temp, true); /* Внутренний датчик */ sensors.add(P, device::in, 0x76, "in_pressure", in_pres, true); sensors.add(H, device::in, 0x76, "in_humidity", in_hum, true); sensors.add(T, device::in, 0x76, "in_temperature", in_init, in_temp, true); } #endif
SERVICES.H (подправлена секция MQTT)
#ifndef SERVICES_H #define SERVICES_H #include <PubSubClient.h> #include <ESP8266HTTPClient.h> #include "webserver.h" WiFiClient wifiClient; PubSubClient mqttAPI(wifiClient); HTTPClient restAPI; String httpCodeStr(int code) { switch (code) { case -1: return "CONNECTION REFUSED"; case -2: return "SEND HEADER FAILED"; case -3: return "SEND PAYLOAD FAILED"; case -4: return "NOT CONNECTED"; case -5: return "CONNECTION LOST"; case -6: return "NO STREAM"; case -7: return "NO HTTP SERVER"; case -8: return "TOO LESS RAM"; case -9: return "ENCODING"; case -10: return "STREAM WRITE"; case -11: return "READ TIMEOUT"; default: return http.codeTranslate(code); } } String mqttCodeStr(int code) { switch (code) { case -4: return "CONNECTION TIMEOUT"; case -3: return "CONNECTION LOST"; case -2: return "CONNECT FAILED"; case -1: return "MQTT DISCONNECTED"; case 0: return "CONNECTED"; case 1: return "CONNECT BAD PROTOCOL"; case 2: return "CONNECT BAD CLIENT ID"; case 3: return "CONNECT UNAVAILABLE"; case 4: return "CONNECT BAD CREDENTIALS"; case 5: return "CONNECT UNAUTHORIZED"; default: return String(code); } } bool mqttPublish(String topic, float data) { if (conf.param("mqtt_path").length()) topic = conf.param("mqtt_path") + "/" + topic; return mqttAPI.publish(topic.c_str(), String(data).c_str(), true); } void restAPIsend(String host, uint16_t port, String query) { restAPI.setUserAgent("weather station (www.it4it.club) " + WiFi.hostname()); restAPI.setTimeout(5000); restAPI.begin(host, port, query); int code = restAPI.GET(); #ifdef console console.printf("answer: %s\n", httpCodeStr(code).c_str()); #endif restAPI.end(); } /* mqtt.it4it.club */ void sendDataToMQTT() { if (wifi.transferDataPossible() and conf.param("mqtt_server").length()) { #ifdef console console.println(F("services: send data to MQTT server")); #endif // баг при прямой передаче значения (c_str) из конфига в setServer (не забыть поправить!) String server = conf.param("mqtt_server"); mqttAPI.setServer(server.c_str(), 1883); mqttAPI.connect(WiFi.hostname().c_str(), (conf.param("mqtt_login").length() ? conf.param("mqtt_login").c_str() : 0), (conf.param("mqtt_pass").length() ? conf.param("mqtt_pass").c_str() : 0) ); if (mqttAPI.connected()) { //mqttPublish("light", sensors.get("out_light")); mqttPublish("out_temperature", sensors.get("out_temperature")); mqttPublish("out_humidity", sensors.get("out_humidity")); mqttPublish("in_pressure", sensors.get("in_pressure")); mqttPublish("in_temperature", sensors.get("in_temperature")); mqttPublish("in_humidity", sensors.get("in_humidity")); #ifdef console console.printf("answer: %s\n", mqttCodeStr(mqttAPI.state()).c_str()); #endif mqttAPI.disconnect(); } else { #ifdef console console.printf("answer: %s\n", mqttCodeStr(mqttAPI.state()).c_str()); #endif } } } /* https://thingspeak.com/ */ void sendDataToThingSpeak() { if (wifi.transferDataPossible() and conf.param("thingspeak_key").length()) { #ifdef console console.println(F("services: send data to ThingSpeak")); #endif String query; query += "&field1=" + String(sensors.get("out_light")); query += "&field2=" + String(sensors.get("out_temperature")); query += "&field3=" + String(sensors.get("out_humidity")); query += "&field4=" + String(sensors.get("out_pressure")); restAPIsend("api.thingspeak.com", 80, "/update?api_key=" + conf.param("thingspeak_key") + query); } } /* https://narodmon.ru/ */ void sendDataToNarodmon() { if (wifi.transferDataPossible() and conf.param("narodmon_id").length()) { #ifdef console console.println(F("services: send data to Narodmon")); #endif String query; query += "&L1=" + String(sensors.get("out_light")); query += "&T1=" + String(sensors.get("out_temperature")); query += "&H1=" + String(sensors.get("out_humidity")); query += "&P1=" + String(sensors.get("out_pressure")); restAPIsend("narodmon.ru", 80, "/get?id=" + conf.param("narodmon_id") + query); } } #endif
Вот только есть небольшая проблема, в решении которой прошу помощи. А именно: передача информации по MQTT. Для меня это важно, так как хочу добиться передачи в Мажордомо. Суть проблемы в том, что передаются только первые 3 данных. Причем эта проблема у меня была ещё даже с одним датчиком ВМЕ280, передавалось пустое значение с отсутствующего люксометра. После того, как закомментировал строку
//mqttPublish("light", sensors.get("out_light"));
в SERVICES.H, передаваться стали следующие 3 параметра, температура, влажность и давление. Сейчас же, когда должны передаваться 5 параметров с 2-х датчиков, передаются только температура и влажность с Si7021 и давление с BME280, всё в порядке, указанном в SERVICES.H.
В Mosquitto отображается следующее:
После передачи 3-х параметров идёт непонятный Socket error on client ESP_FEDA21, disconnecting.
Подскажите пожалуйста, куда копать?
У меня была подобная проблема с Mosquitto неполной передачи.
Решение
if (tMQTT != 0) {
if (millis() - tMQTT > 1000 or tMQTT > millis()){
mqttAPI.disconnect();
tMQTT = 0;
}
}Вызов функции mqttAPI.disconnect(); после окончания передачи через 1с. Все заработало. У меня передача на Mosquitto идет каждые 5s.
Далее полученная информация архивируется в СКАДА системе. (с периодичностью 5с)
У меня к ESP (Nodemcu) подключено 2хBME + 10x ds18b20 и все передается в Mosquitto реализованное на виртуальной машине как и web скада
- 2
Метеостанция на ESP8266 от it4it.club
в Espressif Systems
Опубликовано: · Жалоба на ответ
У меня работает на десяток датчиков DS и 2 BME все передается по MQTT каждые 5с на домашнюю SCADA на ней же работает и брокер. Есть иногда провалы по связи с DS в этом проекте не отрабатываются ошибки связи с DS в другом проекте (не закончил до конца) написан обработчик ошибок.
Для настройки датчиков DS создана спец страница t.htm автоматически генерируемая, которая позволяет настроить (правда в программе руками) адреса DS отслеживает отказы и т.д. страничка генерируется через файловую систему ESP (см скетч сейчас уже не помню что там рисовал).
Уже пол года все работает. давно не заглядывал - смотрите как там написано.
Еще реализованы (как всегда не до конца но работают). на основании исходника метеостанции: Счетчики воды, Меркурий 230 по 485 связи, сейчас делается email нотификатор читающий из MQTT данные и генерирующий email сообщения с предупреждениями - потом он будет расширен GSM модулем с SMS нотификатором с функцией управления.
ESP8266_WS_V2.0_BETA13.zip