Глупая метеостанция (Blynk)

Тема в разделе "Глядите, что я сделал", создана пользователем Nitro77rus, 27 ноя 2017.

  1. Nitro77rus

    Nitro77rus Гик

    Как-то давным-давно, ещё в безСтрукторные времена, собрал я простенькую метеостанцию. С выводом информации на мобильное приложение Blynk. По началу она была всего лишь прототипом одного из блоков "умного аквариума", но так и осталась самостоятельным устройством. Правда немного доработалось в процессе. А сейчас обзавелась моя метеостанция корпусом из Структора, так как стало понятно, что жить ей долго и не гоже болтаться на проводах без корпуса :) Собственно это, завершение проекта, и послужило поводом написания сего поста. Описание разобью на два этапа. Первый - основное устройство, второй - расширение функционала.
    Поехали, для начала нужно:

    Arduino Uno
    Ethernet Shield (W5100)
    Цифровой датчик температуры и влажности (Troyka-модуль)
    Барометр (Troyka-модуль)
    Proto Shield
    Ну и какой нибудь корпус

    Собираем все компоненты согласно инструкциям производителей выбранного железа. Скачиваем на телефон программу Blynk, регистрируемся и создаём пустой проект. Далее идём по сюда, в левой панели выбираем свою плату, Шилд и вставляем Auth Token (присваивается мобильным приложением при создании проекта). Теперь доработаем полученный код в соответствии с выбранными датчиками, то есть добавляем библиотеки от производителей. Далее считанные значения посылаем на виртуальные пины Blynk'а и в итоге получаем код примерно такой:
    Код (C++):

    #define BLYNK_PRINT Serial    // Comment this out to disable prints and save space
    #include <SPI.h>
    #include <Ethernet.h>
    #include <BlynkSimpleEthernet.h>
    // библиотека для работы I²C
    #include <Wire.h>
    // библиотека для работы с модулями IMU
    #include <TroykaIMU.h>
    // библиотека для работы с датчиком DHT11
    #include <TroykaDHT11.h>
    // создаём объект класса DHT11 и пераём номер пина к которому подкючён датчик
    DHT11 dht(6);
    // создаём объект для работы с барометром
    Barometer barometer;

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

    #define W5100_CS  10
    #define SDCARD_CS 4

    void setup()
    {
      Serial.begin(9600);

      pinMode(SDCARD_CS, OUTPUT);
      digitalWrite(SDCARD_CS, HIGH); // Deselect the SD card
     
      //Blynk.begin(auth);
      // You can also specify server.
      // For more options, see BoardsAndShields/Arduino_Ethernet_Manual example
      //Blynk.begin(auth, "your_server.com", 8442);
      Blynk.begin(auth, IPAddress(10,0,1,88), 8442);
      // инициализация DHT11
      dht.begin();
      // инициализация барометра
      barometer.begin();
    }

    void loop()
    {
      Blynk.run();
      // создаём переменную и присваиваем ей значения абсолютного давления (в мм р.с.)
      float pressure = (barometer.readPressureMillibars()*0.750062);
      // создаём переменную и присваиваем ей значения высоты над уровнем море
      float altitude = barometer.pressureToAltitudeMeters(pressure);
      // создаём переменную и присваиваем ей температуру окружающей среды
      float temperature = barometer.readTemperatureC();
      // переменная состояния датчика
      int check;
      // считывание данных с датчика DHT11
      check = dht.read();
      // Назначаем виртуальные пины
      // Для температуры
      Blynk.virtualWrite(1, dht.getTemperatureC());
      // Для влажности
      Blynk.virtualWrite(2, dht.getHumidity());
      // Для давления
      Blynk.virtualWrite(0, pressure);
      // Для температуры 2
      Blynk.virtualWrite(3, temperature);
      delay(1000);
    }
     
    Данные температуры, в моём случае, получаются с двух датчиков. В программе на телефоне можно будет выбрать какой захочется или смотреть сразу оба ;)

    Собственно после загрузки скетча на плату можно переходить в приложение на телефоне. Тут уже можно подобрать виджеты отображения данных по своему вкусу. Я ещё добавлял графики, для слежением за динамикой. Добавляются все виджеты по одной схеме: выбираем подходящий тип -> указываем пин получения данных и готово. И гафики так же, только можно вывести данные сразу с нескольких пинов. Да, в настройках виджета можно обозвать его, как душе угодно, присвоить единицы измерения и округлить данные до желаемого знака после запятой. Например, если в строке параметра написать "Температура /pin/ °C", то мы увидим виджет с заголовком "Температура", полные данные с датчика и °C после значения. А если /pin./ - будет только целое число, /pin.#/ - округлённые данные до десятых и т.д. Подробнее тут. На этом первую часть можно считать завершённой, включаем устройство и наслаждаемся ;)

    Часть вторая, дополнение.

    Смотрел я на скучные графики в которых самое главное событие было проветривание (Температура падает на несколько градусов) и решил освежить устройство немного. А точнее решил смотреть температуру не только в квартире но и на улице. А заодно и зависимость климата в помещении от внешних условий :) Вообщем решил добавить уличный блок. Из железа:

    NodeMCU
    DHT22
    Датчик освещённости (Troyka-модуль)

    Тут надо сначала в arduino ide добавить саму плату. Описание этого процесса тут. Далее как и в первой части идём по ссылке, создаём скетч для этой платы, добавляем библиотеку датчика и виртуальный пин данных. Датчик освещённости просто подсоединил к единственному аналоговому пину, без каких либо манипуляций в коде. Просто мне он нужен был как индикатор светло/темно на улице, значения в люксах не принципиальны. Так как эта плата будет работать по ВиФи, необходимо в коде указать имя своей сети и пароль.
    Итого код:
    Код (C++):
    #define BLYNK_PRINT Serial


    #include <ESP8266WiFi.h>
    #include <BlynkSimpleEsp8266.h>

    #include <DHT.h>

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

    // Your WiFi credentials.
    // Set password to "" for open networks.
    char ssid[] = "Имя сети";
    char pass[] = "пароль";

    #define DHTPIN D2 // номер пина, к которому подсоединен датчик (без D не работает)
    #define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321

    DHT dht(DHTPIN, DHTTYPE);

    WidgetLED led1(V5); //LED for Blynk (Virtual pin 5)

    const int AnalogIn  = A0;
    int readingIn = 0;

    void setup() {

      Serial.begin(9600);

      Blynk.begin(auth, ssid, pass, IPAddress(10,0,1,88), 8442);

      dht.begin();
    }

    void loop() {

      Blynk.run();

      readingIn = analogRead(AnalogIn);
      // Wait a few seconds between measurements.
      delay(2000);

      // Reading temperature or humidity takes about 250 milliseconds!
      // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
      float h = dht.readHumidity();
      // Read temperature as Celsius (the default)
      float t = dht.readTemperature();

      // Check if any reads failed and exit early (to try again).
      if (isnan(h) || isnan(t)) {
        led1.on();
      return;
    }
      led1.off();
      Blynk.virtualWrite(0, t);
      Blynk.virtualWrite(1, h);
      Blynk.virtualWrite(2, readingIn);
    }
     
    Собственно получилось второе, независимое устройство, но... Мне нужна была одна метеостанция, поэтому сделал так. В настройка существующего проекта на телефоне, есть поле "DEVICES", заходим туда и просто добавляем ещё одно устройство ;) Получаем ещё один YourAuthToken и вставляем у наш код. Теперь по тойже схеме, что и в первой части добавляем витжеты для новых датчиков. Ой чуть не забыл, в этой части метеостанции добавил виртуальный светодиод для чека ошибок датчика dht22. Это собственно всё, можно пользоваться. Наблюдать зависимость температуры и влажности от наличия и интенсивности солнца и как всё это влияет на климат в квартире :)
    Прога получилась больше одного экрана :)
    IMG_1029.PNG IMG_1030.PNG
    А само домашнее устройство вот:
    1.png 2.png

    Уличный блок остался без фото, холодно ща за ним лезть и лень. Весит за балконом в герметичном корпусе из "синей изоленты" :)

    Как вариант можно ещё добавить дачный модуль, с данными из теплицы, котельной... :)

    Уф, вроде всё, написал... Надеюсь кому нибудь пригодиться ;)
     
    BlackBug Engineering и NikitOS нравится это.
  2. NikitOS

    NikitOS Король шутов Администратор

    Моему вики!
     
  3. Nitro77rus

    Nitro77rus Гик

    Да можна :)
     
    NikitOS нравится это.
  4. NikitOS

    NikitOS Король шутов Администратор

    Вы пишете или я?
     
  5. Nitro77rus

    Nitro77rus Гик

    Лучше Вы, в ближайшее время не смогу
     
  6. NikitOS

    NikitOS Король шутов Администратор

    Значит завтра, сегодня я уже писал о установке ос на малину)
     
    Nitro77rus нравится это.
  7. IvanUA

    IvanUA Гуру

    Ихде эту вику посмотреть?
     
  8. NikitOS

    NikitOS Король шутов Администратор

    Были перебои с хостингом... пришлось переехать ... теперь тут: wiki-megavolt.h1n.ru
     
    Последнее редактирование: 20 июн 2018