ESP32 - часы, температура, давление.

Тема в разделе "Глядите, что я сделал", создана пользователем IvanUA, 7 янв 2018.

  1. IvanUA

    IvanUA Гик

    Все это действие собрано на 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);
    Маленькое демо видео тут.

     
    ИгорьК нравится это.
  2. ИгорьК

    ИгорьК Давно здесь

    Один совет - потестируйте восстановление Wi-Fi при серьезном его выключении.
     
  3. IvanUA

    IvanUA Гик

    Тестирую...
    Тут фишка в чем. В таком варианте кода - иногда так получается прошиться, что Wi-Fi работает без отвалов, тобишь за длительное время вообще нет реконнектов... выключаю Wi-Fi - и каждую секунду пробует сконнектиться..... как только появляется сеть, то соединяется и работает дальше стабильно....
    А в случает когда устройство отваливается каждые 5 минут с копейками, то удачно переподключается и работает дальше, следующие 5 минут.

    Вот после последней заливки этого скрипта, так и происходит.... Единственное что заметил что если еще использую MQTT - то пока отвалов не заметил (экспериментирую дальше....).

    ПС. Есть одна особенность после перепрошивки, почти в 90% случаев, память трется, скрипт заливается, стартует, пробует подключиться.... но не подключается к Wi-Fi (и нет какого то таймаута - или я не дождался его). Остальные циклы понятное дело работают себе. Если сделать сброс, или переподключить питание, то дальше устройство коннектится и работает как задумано))))
     
  4. ИгорьК

    ИгорьК Давно здесь

    Ну я почему говорю - callback на потерю wifi работает нестабильно, и ему в помощь нужен костыль через таймер ИМХО.

    Как предложение - не выводите цифры времени, пока оно не захвачено через интернет.
     
  5. IvanUA

    IvanUA Гик

    Почему вы думаете что это как то зависит? Дело в том что цифры времени читаются из внутренних часов ЕСПшки. А когда идет коннект с сетью то тогда системное время обновляется.
    Вот с callback-ом проблем пока не замечал. Были проблемы только с дисконнектами...

    Взял и в отваливающийся скрипт добавил публикацию в топик температуры раз в минуту - вот уже 36 минут работает без переподключений.

    Здается мне что это сама ЕСП-шка дисконектит для экономии энергии если не пользоваться WiFi к примеру около 300 секунд....
     
  6. ИгорьК

    ИгорьК Давно здесь

    Никак. Это просто предложение.
     
  7. IvanUA

    IvanUA Гик

    ОК.
    Я вот чего подумал, завел на менеджер дома температуру с ESP и статус коннекта к брокеру.
    Потом на графиках гляну как стабильно была передача данных температуры, и как часто были обрывы связи с брокером.
     
  8. IvanUA

    IvanUA Гик

    Полностью согласен. Костыль нужен не только для WiFi но и для MQTT, наверное. Показания на умный дом с 2-х ночи как пропали, так больше и не прилетали(((

    Но в данной теме с часами думаю что это будет лишним. Этот скрипт только как вариант как работать с модулями экрана и температуры на одной шине))) Ну и собственно как на ESP-32 получать время из интернета.

    Сallback-и будем допиливать в следующем скрипте....