Esp32 и troyka модуль температуры и влажности

Тема в разделе "ESP8266, ESP32", создана пользователем bonny, 25 окт 2022.

Метки:
  1. bonny

    bonny Нерд

    Добрый день, делал код для Rainmaker с модулем температуры и влажности, но сенсор мне пишет, что он не подключен. Время между считывания 2 секунды, от VIN также питание давал (Sensor not connected). Что может быть не так?
    Код (C++):
    #include <RMaker.h>
    #include <WiFi.h>
    #include <WiFiProv.h>
    #include <TroykaDHT.h> // Библиотека для работы с датчиками серии DHT
    #include "GyverTimer.h" // Подключаем библиотеку работы с временем

    #define SERVICE_NAME "PROV_3" // Имя устройства при подключении по bluetooth, нужно для настройки, когда плата ещё не настроена на WI-FI точку
    #define POP "abcd3" // ? Пароль для устройства при подключении по bluetooth

    #define BOOT_BTN_PIN 0 // GPIO пин кнопки BOOT
    #define LED_BUILTIN 2 // Определить GPIO пин встроенного светодиода
    #define DHT_PIN 16 // GPIO пин для модуля DHT

    #define DEFAULT_SERIAL_DEBUG false // Вывод данных в монитор порта
    #define BOARD_LED_DEFAULT_STATE DEFAULT_SERIAL_DEBUG // Состояние встроенного светодиода при старте
    #define DEFAULT_TIME_UPDATE 2 // Стандартное время обновления данных в сек, чистота обновления DHT от 2 сек

    #define RMAKER_HUMIDITY_NAME "Humidity" // Имя параметра влажности
    #define RMAKER_TIME_UPDATE_NAME "Time update" // Имя параметра времени обновления

    int data_time_update = DEFAULT_TIME_UPDATE; // Переменная для хранения времени обновления данных
    static int serial_debug_state = DEFAULT_SERIAL_DEBUG; // Переменная для хранения состояния вывода в Serial данных с датчика
    static int dht_gpio = DHT_PIN; // Переменная вашего светодиода

    DHT dht(DHT_PIN, DHT11); // Создаём объект класса DHT, передаём номер пина и тип датчика (типы сенсоров: DHT11, DHT21, DHT22)
    GTimer myTimer(MS); // Создаём миллисекундный таймер (ms) (по умолч. в режиме интервала)

    // Фреймворк предоставляет некоторые стандартные типы устройств, такие как выключатель, лампочка, вентилятор, датчик температуры.
    // Но вы также можете определить пользовательские устройства, используя объект базового класса 'Device', как показано здесь
    static Device my_device("WeatherStation", ESP_RMAKER_DEVICE_TEMP_SENSOR, &dht_gpio);

    void sysProvEvent(arduino_event_t *sys_event)
    {
        switch (sys_event->event_id) {    
            case ARDUINO_EVENT_PROV_START:
              // Для ESP32
              Serial.printf("\nProvisioning Started with name \"%s\" and PoP \"%s\" on BLE\n", SERVICE_NAME, POP);
              printQR(SERVICE_NAME, POP, "ble");  
              // Для ESP32S2
              //Serial.printf("\nProvisioning Started with name \"%s\" and PoP \"%s\" on SoftAP\n", service_name, pop);
              //printQR(service_name, pop, "softap");  
              break;
        }
    }

    // Функция обработки изменений
    void write_callback(Device *device, Param *param, const param_val_t val, void *priv_data, write_ctx_t *ctx)
    {
      const char *device_name = device->getDeviceName();
      const char *param_name = param->getParamName();
     
      if (strcmp(param_name, RMAKER_TIME_UPDATE_NAME) == 0) { // Если параметр с именем Time update
        data_time_update = val.val.i; // Записываем значение яркости вашей лампы в переменную, i - это тип int
        myTimer.setInterval(data_time_update * 1000); // Установить новое время таймера
        myTimer.reset(); // Cбросить период таймера
        Serial.printf("Received param %s = %d for %s\n", param_name, data_time_update, device_name);
        param->updateAndReport(val);
      }
    }

    void setup()
    {
      Serial.begin(115200); // Инициализируем скорость Serial
      pinMode(BOOT_BTN_PIN, INPUT); // Настраиваем пин кнопки BOOT на INPUT
      pinMode(LED_BUILTIN, OUTPUT); // Настраиваем пин встроенного светодиода в плате
      digitalWrite(LED_BUILTIN, BOARD_LED_DEFAULT_STATE); // Светодиод при запуске примет значение BOARD_LED_DEFAULT_STATE

      myTimer.setInterval(DEFAULT_TIME_UPDATE * 1000); // Запуск в режиме интервала на необходимое количество мс
      dht.begin(); // Запускаем dht
     
      Node my_node; // Объявляем Node
      my_node = RMaker.initNode("ESP RainMaker Node"); // Инициализируем Node

      // Создаём устройство для управления светодиодом
      my_device.addNameParam(); // Устнаваливаем имя устройства

      // Создаём и добавляем слайдер времени обновления
      Param time_update_param(RMAKER_TIME_UPDATE_NAME, ESP_RMAKER_PARAM_SPEED, value(DEFAULT_TIME_UPDATE), PROP_FLAG_READ | PROP_FLAG_WRITE); // Указываем название создаваемого параметра, тип параметра, стандартное значение и задаём права
      time_update_param.addBounds(value(2), value(60), value(1)); // Значение от 0 до 60, если удалить этот параметр, тогда можно будет вводить ЧИСЛО вручную
      time_update_param.addUIType(ESP_RMAKER_UI_SLIDER); // Устанавливаем тип отображения как слайдер
      my_device.addParam(time_update_param); // Добавляем параметр устройству

      // Создаём плашку с текстом о температуре в цельсиях
      Param temp_c_param(ESP_RMAKER_DEF_TEMPERATURE_NAME, ESP_RMAKER_PARAM_TEMPERATURE, value("Undefined"), PROP_FLAG_READ); // Указываем название создаваемого параметра, тип параметра, стандартное значение и задаём права
      temp_c_param.addUIType(ESP_RMAKER_UI_TEXT); // Устанавливаем тип отображения как слайдер
      my_device.addParam(temp_c_param); // Добавляем параметр устройству
     
      my_device.addCb(write_callback); // Устанавливаем функцию на обработчик
      my_node.addDevice(my_device); // Добавить девайс на ноду

      // Опционально
      RMaker.enableOTA(OTA_USING_PARAMS); // Включить беспроводное обновление
      RMaker.setTimeZone("Europe/Moscow"); // Установить часовой пояс https://rainmaker.espressif.com/docs/time-service.html
      RMaker.enableTZService(); // Кроме того, включите службу часового пояса и позвольте приложениям телефона установить соответствующий часовой пояс

      RMaker.enableSchedule(); // Включить расписание для нашего устройства
     
      RMaker.start(); // Запуск сервиса на устройстве

      WiFi.onEvent(sysProvEvent);
      WiFiProv.beginProvision(WIFI_PROV_SCHEME_BLE, WIFI_PROV_SCHEME_HANDLER_FREE_BTDM, WIFI_PROV_SECURITY_1, POP, SERVICE_NAME);
    }

    void loop()
    {
      if (myTimer.isReady()) { // Интервал таймера выполнился
        dht.read(); // Считывание данных с датчика
        if (serial_debug_state) { // Выводим в консоль, если необходимо
          if (dht.getState() == DHT_OK) { // Проверяем состояние данных
            Serial.printf("Temperature = %d C\n", dht.getTemperatureC());
            Serial.printf("Humidity = %d %\n", dht.getHumidity());
            my_device.updateAndReportParam(ESP_RMAKER_DEF_TEMPERATURE_NAME, dht.getTemperatureC()); // Изменяем состояние тумпературы в RainMaker
            my_device.updateAndReportParam(RMAKER_HUMIDITY_NAME, dht.getHumidity()); // Изменяем состояние влажности в RainMaker
          } else if (dht.getState() == DHT_ERROR_CHECKSUM) {
            Serial.println("Checksum error");
          } else if (dht.getState() == DHT_ERROR_TIMEOUT) {
            Serial.println("Time out error");
          } else if (dht.getState() == DHT_ERROR_NO_REPLY) {
            Serial.println("Sensor not connected");
          }
        }
      }
     
      // Обрабатываем нажатие на кнопка BOOT
      if(digitalRead(BOOT_BTN_PIN) == LOW) {
          delay(100); // Для исключения дребезка на тактовой кнопке
          int startTime = millis(); // Время на номент нажатия кнопки
          while(digitalRead(BOOT_BTN_PIN) == LOW) delay(50); // Цикл, который создаёт паузу для ожидания отжатия кнопки
          int endTime = millis(); // Время на момент отжатия кнопки
          int pressTime = endTime - startTime; // Время, на которое кнопка была нажата
          // Условия по времени нажатия
          if (pressTime > 10000) { // Если кнопка была зажата на более 10 секунд, тогда сбросить всё
            Serial.printf("Reset to factory.\n");
            RMakerFactoryReset(2);
          } else if (pressTime > 3000) { // Иначе если кнопка была зажата больше чем на 3 секунды, но меньше 10, тогда сбросить настройки WI-FI
            Serial.printf("Reset Wi-Fi.\n");
            RMakerWiFiReset(2);
          } else { // В остальных случаях
            serial_debug_state = !serial_debug_state; // Меняем запись в переменной состояния вывода в монитор порта
            Serial.printf("Toggle Debug State to %s.\n", (serial_debug_state ? "true" : "false"));
            if (!serial_debug_state) digitalWrite(LED_BUILTIN, LOW); // Включаем или выключаем встроенный светодиод
            else digitalWrite(LED_BUILTIN, HIGH);
         }
      }
      delay(10);
    }
     
  2. ИгорьК

    ИгорьК Гуру

    Многое.
    - неисправность сенсора;
    - неправильное подключение;
    - проблемы кода в целом;
    - неверная библиотека сенсора;
    - конфликт библиотек.

    Начните с простого: подсоедините сенсор и организуйте только его опрос и вывод в порт значений. Примените в коде лишь одну библиотеку. Это вам даст информацию о исправности, правильном подключении и работе библиотеки.
     
    issaom нравится это.
  3. bonny

    bonny Нерд

    Библиоткека от амперки не работает с esp32.
     
  4. ИгорьК

    ИгорьК Гуру

    Значит ее придется переписывать или найти другую. Этот модуль - наверняка дорогая версия какого-то обычного датчика.
     
  5. bonny

    bonny Нерд

    Использовал другую DHT sensor library от Adafruit. С ней работает.
     
    ИгорьК нравится это.