Перейти к публикации
iT4iT.CLUB

Vladimir

Пользователи
  • Публикации

    4
  • Зарегистрирован

  • Посещение

  • Дней в лидерах

    3

Сообщения, опубликованные пользователем Vladimir


  1. 24.01.2019 в 15:54, olegkaras сказал:

    Добрый день.

    Поделитесь прошивкой на несколько DS18B20 ,  мне нужно что бы обращение к датчику происходило по серийному номеру (если какой нибудь датчик отсоединить то нумерация списка датчиков не менялась).  

    У меня работает на десяток датчиков 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


  2. В 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();
      });

    вот так выдает:

    5ae075b4b8734_Screenshot_2018-04-25-15-30-59-065_com.yandex.browser1.thumb.png.3425141f0099d105d94c3f8c58030b57.png

    странно получается..что-то передает что-то нет.

    несколько раз прошивал, картина не меняется, прошил другую плату все стало норм показывать (пару раз прошил все ок!).

    походу все дело в платах

    Сталкивался с подобной ситуацией при заливке прошивки через WEB интерфейс.

    Причины до конца не выяснил НО!:

    Если сначала сделать без подключенного контроллера:

    1) Надавить кнопку "Проверить"

    2) Кнопка "Загрузка" при этом происходит компиляция но выдается ошибка т.к. ESP не подключено

    3) "Скетч"далее "Экспорт бинарного файла" и загрузится через WEB то если загрузка пройдет (у меня не всегда проходит) то русский язык появляется.

    Конечно это странно. У меня NODEMCU стоит далеко и поэтому загрузка только через WEB возможна.

    Но сейчас уже не актуально т.к. все данные у меня передаются через MQTT на домашнюю СКАДА.

     


  3. 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 - работают стабильно.

     

    • Thanks 1

  4. В 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 отображается следующее:

    5acb7c3fec9aa_2.PNG.cbd5563e8f69d2c0ef967519cc243d9f.PNG

    После передачи 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 скада

    • Thanks 2
×
×
  • Создать...