Комфортомер

S_Sergey_G

✩✩✩✩✩✩✩
23 Фев 2021
161
3
192.168.1.101 Это IP сервера. Скетч "собирал" из разных скетчей, может быть что то некорректно. Но с интервалом в 1 минуту отрабатывает отлично, со всеми защитами.
C++:
// https://habr.com/ru/post/393277/
// Датчик температуры ds18b20 к 2 пину

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 2 // центральная нога датчика GPIO 2
#define PIN_POWER_DS  0 // нога питания датчика GPIO 0
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
#define DHCP true
IPAddress device_ip               (192,168,1,104);  // Статический IP-адрес для устройства
IPAddress dns                     (192,168,1,1);    // IP-адрес вашего маршрутизатора
IPAddress gateway                 (192,168,1,1);    // IP-адрес вашего роутера
IPAddress subnet                  (255,255,255,0);  // Подсеть, используемая вашей сетью
//IPAddress secondaryDNS            (8, 8, 4, 4);
#define chanal 2 //канал wifi
byte macAP[6] = {0xE4, 0xC3, 0x2A, 0x6C, 0xAB, 0x5A};

const char *ssid = "***"; // Имя вайфай точки доступа
const char *pass = "***"; // Пароль от точки доступа

const char *mqtt_server = "192.168.1.101"; // Имя сервера MQTT
const int mqtt_port = 1883; // Порт для подключения к серверу MQTT
const char *mqtt_user = "***"; // Логи от сервер
const char *mqtt_pass = "***"; // Пароль от сервера

#define BUFFER_SIZE 100
// deep sleep
#define SLEEP_DELAY_IN_SECONDS  300 // время сна в секундах
float temp=0;
int VCC; //Напряжение батареи
ADC_MODE (ADC_VCC) ; // Будем измерять напряжение на VCC внутри МК
float Vbat,V_min = 2.8; // напряжение аккумулятора, и мин. порог напряжения для разрешения работы
// для батареек убрать ,V_min = 2.8

// Функция получения данных от сервера

void callback(const MQTT::Publish& pub)
{
Serial.print(pub.topic()); // выводим в сериал порт название топика
Serial.print(" => ");
Serial.print(pub.payload_string()); // выводим в сериал порт значение полученных данных

String payload = pub.payload_string();
}

WiFiClient wclient;
PubSubClient client(wclient, mqtt_server, mqtt_port);

void setup() {

sensors.begin();
Serial.begin(115200);
delay(10);
Serial.println();
Serial.println();

Vbat =  ESP.getVcc()-100; // читаем напряжение на ноге VCC модуля ESP8266, (-100)коррекция напряжения в милливольтах.
Vbat =  Vbat / 1023;     
if (Vbat < V_min ) // закоментировать для батареек
ESP.deepSleep(300*1000000);// сон (на 5 минут")если напряжение меньше заданного //(86400e6) сутки // закоментировать для батареек

pinMode (PIN_POWER_DS, OUTPUT);
digitalWrite(PIN_POWER_DS, HIGH);
}

void loop() {
// подключаемся к wi-fi
if (DHCP) WiFi.config(device_ip, dns, gateway, subnet); //
if (WiFi.status() != WL_CONNECTED) {
Serial.print("Connecting to ");
Serial.print(ssid);
Serial.println("...");
WiFi.begin(ssid, pass, chanal, macAP, true);

if (WiFi.waitForConnectResult() != WL_CONNECTED)
return;
Serial.println("WiFi connected");
}

// подключаемся к MQTT серверу
if (WiFi.status() == WL_CONNECTED) {
if (!client.connected()) {
Serial.println("Connecting to MQTT server");
if (client.connect(MQTT::Connect("arduinoClient2")
.set_auth(mqtt_user, mqtt_pass))) {
Serial.println("Connected to MQTT server");
client.set_callback(callback);
client.publish("test/vcc",String(Vbat)); // отправляем в топик напряжение батареи
} else {
Serial.println("Could not connect to MQTT server");
ESP.deepSleep(900e6); // спим 15 мин.
}
}

if (client.connected()){
client.loop();

TempSend();
}
}
} // конец основного цикла

// Функция отправки показаний с термодатчика
void TempSend(){
{
sensors.requestTemperatures(); // от датчика получаем значение температуры
delay(1000); // задержка, что бы успеть прочитать темпратуру
float temp = sensors.getTempCByIndex(0);
client.publish("test/temp",String(temp)); // отправляем в топик температуру
Serial.println(temp);
digitalWrite(PIN_POWER_DS, LOW); // отключаем питание датчика
delay(10);
}

// deep sleep
client.disconnect();
WiFi.disconnect();
delay(100);

// deep sleep
ESP.deepSleep(SLEEP_DELAY_IN_SECONDS * 1000000, WAKE_RF_DEFAULT);
ESP.deepSleep(10 * 1000, WAKE_NO_RFCAL);
delay(500);
}
Поправил
IPAddress device_ip (192,168,1,104); IP датчика
 
Изменено:

knopaleo

✩✩✩✩✩✩✩
12 Авг 2019
19
2
Посмотри, тут интересные статьи по энергосбережению. Может что найдешь для себя. Хотя датчик у тебя долгоиграющий.
После настройки я бы закомментировал Serial begin и delay после него. Будет меньше время работы в активном режиме.
 

S_Sergey_G

✩✩✩✩✩✩✩
23 Фев 2021
161
3
knopaleo
Спасибо я почитаю, я много читал про это, и добивался меньшего времени, но с другими датчиками. 3 сек. для меня с этим датчиком достаточно хорошо. Я про переподключение, сервер каждую минуту проверяет подключения, что ли. Датчик и приложение совсем не связаны. Приложение следит, что на сервере происходит. И каждую минуту переподключается к нему, так, что ли. Пока не пойму, что это. Но всё работает.
 
Изменено:

knopaleo

✩✩✩✩✩✩✩
12 Авг 2019
19
2
Если работает, не парься. У меня немного другой проект. BME280 на Thijgspeak. И не на часы отправляю. На MQTT железок не хватает.
Посмотри там ESP NOW. Интересная задумка.
 

S_Sergey_G

✩✩✩✩✩✩✩
23 Фев 2021
161
3
knopaleo
Просто хотелось понимания, что происходит. Но буду "курить" эту тему, разберусь. Про ESP NOW мне
p-a-h-a с этого сайта писал, пока времени нет изучить. Но на будущее есть чем занять себя. За ссылки спасибо большое, изучаю.

Возможно ли исключить роутер из проекта? Подсоединяться сразу к серверу? Он же создаёт точку доступа.

Возможно ли исключить роутер из проекта?
Сделал, получилось. Но стабильность плохая. Отказался.

При конфигурации сервера длинное имя роутера не принимает (обрезает). Как это исправить?

Помогите с длинным именем роутера. При конфигурации сервера длинное имя роутера не принимает (обрезает). Как это исправить? Изменить имя роутера не вариант, много устройств придётся перепрошивать.
 

S_Sergey_G

✩✩✩✩✩✩✩
23 Фев 2021
161
3
Столкнулся с такой проблемой. Есть брокер из этого проекта и батарейный датчик температуры и часы на MAX 7219, все в одной локальной сети. Всё работает прекрасно! Но когда садятся батарейки, на дисплее отображается последняя температура до отключения датчика. И я не вижу и не пойму, что сели батарейки. Есть ли в настройках брокера команды, что бы при длительном отсутствии данных, что то менялось, (нули, прочерки) или ещё, что то , чтобы видно было отсутствие данных?
 
Изменено:

ТехнарьКто

★★★★★✩✩
13 Янв 2020
273
435
Есть ли в настройках брокера команды, что бы при длительном отсутствии данных, что то менялось, (нули, прочерки) или ещё, что то , чтобы видно было отсутствие данных?
Очень простой вариант.

Поддерживается время NTP, и доступны точные временные метки, если выполняется синхронизация с сервером NTP. По умолчанию клиент NTP включен и настроен на «1.pool.ntp.org». Его можно изменить, установив параметр конфигурации «ntp_server» на имя хоста или IP-адрес. ntp_server со значением «none» отключит клиент NTP. Также вы можете установить «ntp_timezone» на смещение от GMT в часах. Системное время будет синхронизироваться с сервером NTP каждые "ntp_interval" секунд. Здесь используется НЕ полный расчет NTP и компенсация дрейфа часов. Вместо этого он просто установит местное время на последнее полученное время.

После того, как синхронизация NTP была успешно завершена один раз, местное время будет публиковаться каждую секунду в теме «$SYS/broker/time» в формате «чч:мм:сс». Вы также можете запросить время NTP, используя команду «time» из командной строки.

set ntp_server IP_or_hostname : устанавливает имя или IP-адрес NTP-сервера (по умолчанию «1.pool.ntp.org», «none» отключает NTP)
set ntp_interval interval : устанавливает интервал синхронизации NTP в секундах (по умолчанию 300)
set ntp_timezone tz : устанавливает смещение часового пояса в часах (по умолчанию 0)
time: печатает текущее время в формате ddd hh:mm:ss

Если у вас нет доступа к Интернету, но вам все еще нужна временная база, например, для вашего скрипта, вы можете установить время вручную (помните, что локальный таймер ESP имеет значительный дрейф):

set ntp_time hh:mm:ss : устанавливает время NTP вручную
set ntp_weekday ddd : устанавливает текущий день недели ("Пн"-"Вс")

0.jpg

Поскольку Вы сами делали свой проект, время опроса Вам известно. Когда время становится подозрительно большим, что то идет не так.

Другой вариант, просто измерять напряжение батарейки и при достижении разряженного состояния, выводить предупреждение о разряде батарейки.

И еще много других вариантов, которые легко можно придумать для решения озвученной проблемы.
 
  • Лойс +1
Реакции: S_Sergey_G

S_Sergey_G

✩✩✩✩✩✩✩
23 Фев 2021
161
3
Интернета нет, это чисто локальный проект. Датчик, брокер и часы-термометр, которые поднимают свою точку доступа и к ней подсоединяются и датчик и брокер.
просто измерять напряжение батарейки и при достижении разряженного состояния, выводить предупреждение о разряде батарейки.
У меня сделана подписка на напряжение с датчика. Какими командами можно сделать предупреждение, скажем <2,8 в.

И про первый вариант. Опрос датчика я задаю в брокере (какой командой)? Потому что я не прописывал таких команд, датчик посылает данные раз в 10 мин. В приложении MQTT я вижу счетчик сколько прошло с последней передачи. И значит в брокере надо прописать, если прошло, например, более 1 часа с последней передачи, то....?
 
Изменено:

ТехнарьКто

★★★★★✩✩
13 Янв 2020
273
435
@S_Sergey_G,

Для понимания. В брокере Вы никаких интервалов опроса не задаете. Если сказать очень примитивно, то брокер просто принимает информацию когда пришлют, затем дает возможность считать информацию, когда просите. Поэтому думайте сами, где у Вас будут отслеживаться значения батарейки и выдаваться предупреждение о низком заряде.

PS Видимо этот проект и есть часы на max7219, а тут скетч на github
 
  • Лойс +1
Реакции: S_Sergey_G

S_Sergey_G

✩✩✩✩✩✩✩
23 Фев 2021
161
3
Да это проект от Ивана. Только дисплей сейчас на адресной ленте от DiMaro. Спасибо про отслеживании напряжения, я понял. Но тут немного не удобно, надо ведь выводить на дисплей напряжение батареи, а это перегружен дисплей от инфы.
А вот по времени отсутствия данных тоже в часах настраивать (в коде) или можно брокеру это доверить?
 

ТехнарьКто

★★★★★✩✩
13 Янв 2020
273
435
Привез мне друг в подарок набор модулей zigbee для умного дома и Domoticz к этому хозяйству на Raspberry pi. Поэтому комфортомер теперь дополнительно интегрирован с умным домом.
прошивка была ранее здесь выложена
В этой прошивке включаю правила.
3-domotiz.jpg
Кроме Rules обязательно включить Old Engine, поскольку это правила которые используются во всех новых Esp Easy Mega прошивках, а те самые новые правила из выложенной мной прошивки Esp Easy Mega давно не используются.

Для датчиков пишем правила по которым информация будет передаваться в Domoticz.
Рисунок 1
rules.jpg

То же в текстовом виде, для желающих это использовать
.
Rules:
on co2#TVOC do
  SendToHTTP 192.168.1.21,8080,/json.htm?type=command&param=udevice&idx=22&svalue=[co2#TVOC]
endon

on co2#eCO2 do
  SendToHTTP 192.168.1.21,8080,/json.htm?type=command&param=udevice&idx=23&svalue=[co2#eCO2]
endon

on t#Temperature do
SendToHTTP 192.168.1.21,8080,/json.htm?type=command&param=udevice&idx=38&svalue=[t#Temperature]
endon

on t#Humidity do
SendToHTTP 192.168.1.21,8080,/json.htm?type=command&param=udevice&idx=39&svalue=[t#Humidity]
endon

on t#Pressure do
SendToHTTP 192.168.1.21,8080,/json.htm?type=command&param=udevice&idx=40&svalue=[t#Pressure]
endon
Соответственно IP 192.168.1.21 адрес Raspberry PI на котором стоит Domoticz. 8080 порт Domoticz. IDX поясню ниже по тексту.
между on ... do и в скобках в конце строки названия беру из ESP Easy Mega -> Devices (датчик) на рисунке ниже обвел красным.
111.jpg


Датчики в Domoticz все сделал из Sustom Censor потому, что для качества воздуха отсутствовал подходящий датчик, а для барометра мое желание было получать в миллиметрах ртутного столба, а стандартный выдавал в hPa.

Для создания датчиков в Domoticz настройка -> оборудование и в нижеприведенном окне нажать "создать виртуальные датчики".
создать датчик.jpg

Попадаете в окно создания датчика. Выбираете Custom Sensor.
custom sensor.jpg

После этого вводите в "Имя" имя датчика и в "Метки оси" единицы измерения .
барометр.jpg

Нажимаете OK, а затем в верхних меню Domoticz инструменты -> оборудование и попадаете в окно.
domoticz5.jpg
Отсюда нужны IDX устройств на которые из ESP Easy Mega комфортомера с помощью правил будете посылать данные в Domoticz.
IDX подставляем в Rules смотрите Рисунок1

Теперь получаем информацию с комфортомера и в телефон как раньше и в телефон в Domoticz и в браузере на компьютере с Windows в Domoticz в секции "Вспомогательные датчики".
ddd.jpg

Всем успехов.