ARDUINO + W5100 + DHT11 + 433Mhz + Blynk

Пришло время экспериментов!)
Снять температуру и влажность с датчика DHT11 и получить результаты на экране телефона, также как и управлять модулем реле с помощью Blynk не составило никакого труда. А вот с управлением радиорозетками пришлось повозится и сдвинулся с места только благодаря Владимиру и его Майстер-классу Smartify Things! все стало на свои места. И так по порядку.

Подключение ARDUINO + W5100 и Blynk описаны в предыдущей записи блога.
Как подключить 433Мгц передатчик и откуда взялись коды сигналов для радиорозеток можно узнать с записи ARDUINO + радиомодуль 433Мгц, а о том как работать с датчиком температуры и влажности - читаем здесь ARDUINO + 16х2 LCD keypad shield (двухрядный дисплей с кнопками) + DHT11 (датчика температуры и влажности). Объединив знания предыдущих экспериментов, задача стоит заставить Blynk через 433Мгц передатчик управлять радиорозетками.
Для этого понадобятся следующие библиотеки (добавляем в библиотеки ARDUINO IDE):
RemoteSwitch.hdht11.h, а также ряд библиотек которые идут в наборе с Blynk.
Подключаю датчик DHT11 на 7 пин, а на 8 пин 433Мгц передатчик, подключаем к ноуту и заливаем скетч:

#define BLYNK_PRINT Serial    // Comment this out to disable prints and save space
#include <RemoteSwitch.h> // это скачанная библиотека
#include <SPI.h>
#include <Ethernet.h>
#include <BlynkSimpleEthernet.h>
#include <dht11.h>      // Добавляем библиотеку DHT11
dht11 DHT;               // Объявление переменной класса dht11
#define DHT11_PIN 7     // Датчик DHT11 подключен к цифровому пину номер 7
int chk;

#define A1ON 358833   //(352833) код кнопки от радиопульта
#define A1OFF 352729
#define B1ON 356805
#define B1OFF 353301
#define C1ON 334129
#define C1OFF 351125
#define D1ON 354937
#define D1OFF 314233
#define E1ON 354243
#define E1OFF 334269
#define PERIOD 193;  //(193) period duration: - полученные из (монитор порта)
#define PERIOD 192;

// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "key";

// Use Virtual pin 5 for uptime display
#define PIN_TEMP V5
#define PIN_HUM V6

void setup()
{
  Serial.begin(9600);   //установка порта на скорость 9600 бит/сек
  Blynk.begin(auth);
}

// This function tells Arduino what to do if there is a Widget
// which is requesting data for Virtual Pin (5)
BLYNK_READ(PIN_TEMP)
{
  // This command writes Arduino's uptime in seconds to Virtual Pin (5)
    // Мониторинг ошибок
  chk = DHT.read(DHT11_PIN);    // Чтение данных
  // Выводим показания влажности и температуры
  Blynk.virtualWrite(PIN_TEMP, DHT.temperature);
  Blynk.virtualWrite(PIN_HUM, DHT.humidity);
}


BLYNK_WRITE(V1) {
  if (param.asInt()) {
    transmit(A1ON);
  } else {
    transmit(A1OFF);
  }
}

BLYNK_WRITE(V2) {
  if (param.asInt()) {
    transmit(B1ON);
  } else {
    transmit(B1OFF);
  }
}

BLYNK_WRITE(V3) {
  if (param.asInt()) {
    transmit(C1ON);
  } else {
    transmit(C1OFF);
  }
}

BLYNK_WRITE(V4) {
  if (param.asInt()) {
    transmit(D1ON);
  } else {
    transmit(D1OFF);
  }
}
void loop()
{
  Blynk.run();  

  
void transmit(unsigned long rcode)
{
  unsigned long code = rcode;
  unsigned long period = PERIOD;
  code |= (unsigned long)period << 23;
  code |= 4L << 20; //(|= 4L) цифра перед (L), это (условное число), количества повторов посылаемого сигнала. (соответственно и паузы)
  RemoteSwitch::sendTelegram(code, 8); // RF transmitter pin - пин радио передатчика
 }  

В мобильном приложении Blynk создаем новое подключение и переносим в скетч "YourAuthToken". Добавляем в приложение пару "кнопок" и "дисплеев".
Дисплей который будет отображать температуру вешаем на виртуальный пин 5, влажность - 6. Кнопки - на виртуальные пины 1-4. Запускаем приложение и подключаемся к устройству. Если все подключилось правильно - на дисплеях будет отображаться текущая температура и влажность получаемая с датчика DHT11, а при нажатии на кнопки - будет выполняться процедура (макрос) BLYNK_WRITE которая в зависимости от состояния кнопки (кстати она должна быть настроена в формате "switch") передает в процедуру "transmit" соответствующую переменную которая уже отвечает коду сигнала передаваемого через 433Мгц передатчик на радиорозетки.



ВНИМАНИЕ!!! В скетч необходимо внести свои код авторизации Blynk, а также коды соответствующие сигналам вкл./выкл. розеток (откуда и как их получить описано в записи блога ARDUINO + радиомодуль 433Мгц.)

Дальнейшие варианты использования данной связки ограничивает только фантазия! Удачи!

4 коментарі:

  1. Доброго времени, собрал схему как у вас, за вычетом радиорозетки, соответственно часть кода, отвечающую за её работу, выкинул. Использую датчик DHT 11, при использовании билиотеки dht11.h (как у вас) всё работает отлично, но вот при использовании библиотеки под датчики DHT11/22 (хочу использовать DHT22 вместо DHT 11), объявляю переменную DHT22, при этом в строках
    Blynk.virtualWrite(PIN_TEMP, DHT.temperature);
    Blynk.virtualWrite(PIN_HUM, DHT.humidity);
    получаю ошибку "exit status 1
    expected primary-expression before '.' token"
    Код:



    #include
    #include
    #include
    //#include // Добавляем библиотеку DHT11
    #include
    DHT22 DHT; // Объявление переменной
    #define DHT22_PIN 7
    #define DHTTYPE DHT22
    int chk;


    char auth[] = "2***d";


    // Use Virtual pin 5 for uptime display
    #define PIN_TEMP V5
    #define PIN_HUM V6

    void setup()
    {
    Serial.begin(9600);
    Blynk.begin(auth);
    }

    BLYNK_READ(PIN_TEMP)
    {

    chk = DHT.read(DHT22_PIN);
    Blynk.virtualWrite(PIN_TEMP, DHT.temperature);
    Blynk.virtualWrite(PIN_HUM, DHT.humidity);

    }


    void loop()
    {
    Blynk.run();
    }

    Подскажите - где копать ?

    ВідповістиВидалити
    Відповіді
    1. Доброго времени суток, Дмитрий. Комментарий почему-то папл в премодерацию и не пришло никакого уведомления(
      Относительно вопроса, удалось ли решить проблему? Ранее смотрел библиотеки для 11 и 22, они существенно отличались из-за ӕьлшл скорее и возникла проблема. Если актуально - можно попытаться разобраться.

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

    ВідповістиВидалити
    Відповіді
    1. Проблема связанна с библиотекой для DHT. Для работы только с DHT в Blynk есть отличный пример в папке Blynk->More->DHT11 там работа как с DHT11 так и DHT22

      * This example shows how value can be pushed from Arduino to
      * the Blynk App.
      *
      * WARNING :
      * For this example you'll need SimpleTimer library:
      * https://github.com/jfturcot/SimpleTimer
      * and Adafruit DHT sensor library:
      * https://github.com/adafruit/DHT-sensor-library
      *
      * App project setup:
      * Value Display widget attached to V5
      * Value Display widget attached to V6
      *
      **************************************************************/

      #define BLYNK_PRINT Serial // Comment this out to disable prints and save space
      #include
      #include
      #include
      #include
      #include

      // You should get Auth Token in the Blynk App.
      // Go to the Project Settings (nut icon).
      char auth[] = "YourAuthToken";

      #define DHTPIN 2 // What digital pin we're connected to

      // Uncomment whatever type you're using!
      #define DHTTYPE DHT11 // DHT 11
      //#define DHTTYPE DHT22 // DHT 22, AM2302, AM2321
      //#define DHTTYPE DHT21 // DHT 21, AM2301

      DHT dht(DHTPIN, DHTTYPE);
      SimpleTimer timer;

      // This function sends Arduino's up time every second to Virtual Pin (5).
      // In the app, Widget's reading frequency should be set to PUSH. This means
      // that you define how often to send data to Blynk App.
      void sendSensor()
      {
      float h = dht.readHumidity();
      float t = dht.readTemperature(); // or dht.readTemperature(true) for Fahrenheit

      if (isnan(h) || isnan(t)) {
      Serial.println("Failed to read from DHT sensor!");
      return;
      }
      // You can send any value at any time.
      // Please don't send more that 10 values per second.
      Blynk.virtualWrite(V5, h);
      Blynk.virtualWrite(V6, t);
      }

      void setup()
      {
      Serial.begin(9600); // See the connection status in Serial Monitor
      Blynk.begin(auth);

      dht.begin();

      // Setup a function to be called every second
      timer.setInterval(1000L, sendSensor);
      }

      void loop()
      {
      Blynk.run(); // Initiates Blynk
      timer.run(); // Initiates SimpleTimer
      }

      Видалити