Как-то давным-давно, ещё в безСтрукторные времена, собрал я простенькую метеостанцию. С выводом информации на мобильное приложение 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. Это собственно всё, можно пользоваться. Наблюдать зависимость температуры и влажности от наличия и интенсивности солнца и как всё это влияет на климат в квартире Прога получилась больше одного экрана А само домашнее устройство вот: Уличный блок остался без фото, холодно ща за ним лезть и лень. Весит за балконом в герметичном корпусе из "синей изоленты" Как вариант можно ещё добавить дачный модуль, с данными из теплицы, котельной... Уф, вроде всё, написал... Надеюсь кому нибудь пригодиться