Все это действие собрано на ESP-32. Экран - SSD1306. Датчик температуры и давления - BMP-280. В ESP залита Espruino. Внутренние часики синхронизируются с через интернет во время подключения к WiFi. Время, температура и давление на экран выводятся раз в секунду. В ком порт - раз в 30 сек. Код (Javascript): var ssid = 'HUAWEI_ALE-L21_5921'; var password = '20202020'; var wifi = require('Wifi'); var wifiStat = false; var http = require("http"); var hour, minute, second, timestr="Hello!!!", temp_act, press_act; I2C1.setup({scl:D22,sda:D21}); var bme = require("BMP280").connect(I2C1); var g = require("SSD1306").connect(I2C1); function ledPrint(){ g.clear(); g.setFontVector(24); if(wifiStat) timestr += "."; g.drawString(timestr,0,0); g.setFontVector(16); g.drawString("temp=" + temp_act + "C",8,28); g.setFontVector(12); g.drawString("press=" + press_act + "mmHg",0,48); g.flip(); } function tempPrintConsol() { bme.readRawData(); temp_act = (bme.calibration_T(bme.temp_raw)/100.0).toFixed(1); press_act = (bme.calibration_P(bme.pres_raw)/100.0*0.75006375541921).toFixed(1); console.log (" Temperature: " + temp_act + "°C. Pressure: " + press_act + " mmHg"); } function timePrint() { var date = new Date(); hour = date.getHours(); timestr = (hour < 10 ? "0" : "") + hour + ":"; minute = date.getMinutes(); timestr += (minute < 10 ? "0" : "") + minute + ":"; second = date.getSeconds(); timestr += (second < 10 ? "0" : "") + second; ledPrint(); } //-----ПОДКЛЮЧЕНИЕ К WIFI function getwifi(){ console.log("Start connect WiFi!"); wifi.connect(ssid, {password: password}); wifi.on("connected", function(details) { console.log("Connected with IP " + details.ip); wifiStat = true; http.get("http://www.espruino.com", function(res) { setTime(Date.parse(res.headers.Date)/1000+3600*2); d= new Date(); console.log(d,d.toString()); res.on('data', function(data) { }); }); }); wifi.on("disconnected", function(details) { wifiStat = false; console.log("Disconnected from WLAN " + ssid); wifi.connect(ssid, {password: password}); }); wifi.on("dhcp_timeout", function() { console.log("DHCP timeout!"); }); } getwifi(); tempPrintConsol(); setInterval(tempPrintConsol, 30000); setInterval(timePrint, 1000); Маленькое демо видео тут.
Тестирую... Тут фишка в чем. В таком варианте кода - иногда так получается прошиться, что Wi-Fi работает без отвалов, тобишь за длительное время вообще нет реконнектов... выключаю Wi-Fi - и каждую секунду пробует сконнектиться..... как только появляется сеть, то соединяется и работает дальше стабильно.... А в случает когда устройство отваливается каждые 5 минут с копейками, то удачно переподключается и работает дальше, следующие 5 минут. Вот после последней заливки этого скрипта, так и происходит.... Единственное что заметил что если еще использую MQTT - то пока отвалов не заметил (экспериментирую дальше....). ПС. Есть одна особенность после перепрошивки, почти в 90% случаев, память трется, скрипт заливается, стартует, пробует подключиться.... но не подключается к Wi-Fi (и нет какого то таймаута - или я не дождался его). Остальные циклы понятное дело работают себе. Если сделать сброс, или переподключить питание, то дальше устройство коннектится и работает как задумано))))
Ну я почему говорю - callback на потерю wifi работает нестабильно, и ему в помощь нужен костыль через таймер ИМХО. Как предложение - не выводите цифры времени, пока оно не захвачено через интернет.
Почему вы думаете что это как то зависит? Дело в том что цифры времени читаются из внутренних часов ЕСПшки. А когда идет коннект с сетью то тогда системное время обновляется. Вот с callback-ом проблем пока не замечал. Были проблемы только с дисконнектами... Взял и в отваливающийся скрипт добавил публикацию в топик температуры раз в минуту - вот уже 36 минут работает без переподключений. Здается мне что это сама ЕСП-шка дисконектит для экономии энергии если не пользоваться WiFi к примеру около 300 секунд....
ОК. Я вот чего подумал, завел на менеджер дома температуру с ESP и статус коннекта к брокеру. Потом на графиках гляну как стабильно была передача данных температуры, и как часто были обрывы связи с брокером.
Полностью согласен. Костыль нужен не только для WiFi но и для MQTT, наверное. Показания на умный дом с 2-х ночи как пропали, так больше и не прилетали((( Но в данной теме с часами думаю что это будет лишним. Этот скрипт только как вариант как работать с модулями экрана и температуры на одной шине))) Ну и собственно как на ESP-32 получать время из интернета. Сallback-и будем допиливать в следующем скрипте....
Дело в том что я делаю датчик температуры на si7021 с одновременным выводом данных на олед и отправкой на мажордомо. Вот с железом разобрался, а теперь ищу код. Примеров куча, но где нету блока передачи данных в сеть, а где есть передача и олед, там другой датчик. Я в этом деле пока не волоку. Вот нашел этот пример. Но я так понял, что МК работает на повышенной частоте крутя Ява-машину. Мне кажется для простого датчика это сильно круто)) 160 мгц всё-таки. Чтож придется долбаться с wiring и слепливать куски кода из разных примеров.