💥 метеостанция на ардуино с дисплеем
Содержание:
- Программа
- Код:
- Общий принцип работы
- Постановка задачи
- Android
- Печатные платы.
- Принципиальные схемы
- Архитектура
- Пояснения к коду
- Аппаратная часть
- Что это такое?
- Создание метеостанции на базе Arduino и датчика температуры и влажности DHT22
- Arduino: как сделать термометр
- Характеристики и подключение датчиков DHT11 и DHT22
- HTTP GET и JSON
- Ардуино. Метеостанция на LCD 1602 и DHT11
- Как настроить ЖК-дисплей
- Итоги и выводы
Программа
Программа передатчика
Сперва рассмотрим программу передающей части:
Для передачи влажности и температуры в одном сообщении я соединяю их вместе. Сначала данные считываются в переменную как целые числа, потом целые числа преобразовываются в массив символов, а затем они соединяются друг с другом. На приемной стороне данные будут разделены на отдельные символы. Делая это, я ограничиваю себя двумя цифрами градусов. Если датчик находится в среде с температурой менее 10°C, я буду получать на дисплее символы мусора. Например, если температура составляет 20°C, а влажность – 45%, то будет передаваться сообщение 2045, и всё хорошо. Если температура равна 9°C, а влажность – 78%, то передастся сообщение 978x, где «x» – случайный символ. Поэтому, если вы будете собирать данный беспроводной термометр, я советую вам изменить программу для передачи правильных данных, когда температура будет меньше 10°C.
Программа приемника
Интересный способ использования библиотеки LiquidCrystal – это создание пользовательских символов. С помощью я создал символ градусов. Таким же способом вы можете создать и свои собственные символы. Чтобы создать пользовательский символ или значок, вам необходимо объявить его, как массив из восьми байт, и «нарисовать», какие пиксели будут включены (1 – включен, 0 – выключен).
В функции вы создаете его с помощью . принимает два аргумента: номер позиции для хранения символа и массив байт, в котором определено, какие пиксели будут отображаться. В нашем случае это . Затем символ выводится на LCD с помощью функции .
Код:
Копируем этот код и вставляем в IDE
#include <LCD_1602_RUS.h> // подключаем библиотеку для датчика
LCD_1602_RUS lcd(0x27, 20, 4); // определяем адрес дисплея и его размер
#include <DHT.h> // подключаем библиотеку для датчика
DHT dht(2, DHT11); // сообщаем на каком порту будет датчик
void setup()
{
lcd.init(); // Инициализация дисплея
lcd.backlight(); // Подключение подсветки
lcd.clear(); // Чистим дисплей
dht.begin(); // запускаем датчик DHT11
}
void loop()
{
float h = dht.readHumidity(); // считываем температуру (t)
float t = dht.readTemperature(); // и влажность (h)
lcd.setCursor(0, 0); // Устанавливаем курср на нулевую символ и нулевой строки
lcd.print(«Влажн. :»); // выводим надпись «Влажн.:»
lcd.print(h,1); // выводим значение влажности с одним символом после запятой
lcd.print(» %»); // выволим знак процента
lcd.setCursor(0, 1); // Устанавливаем курср на нулевой символ первой строки
lcd.print(«Темпер.:»); // выводим надпись «Темпер.:»
lcd.print(t,1); // выводим значение влажности с одним символом после запятой
lcd.print(«\337C»); // выволим знак градуса (337 символ в талице) и «С»
delay(2000); // ждём 2000 микросикенд (2 секунды)
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#include <LCD_1602_RUS.h> // подключаем библиотеку для датчика LCD_1602_RUS lcd(0x27,20,4);// определяем адрес дисплея и его размер #include <DHT.h> // подключаем библиотеку для датчика DHT dht(2,DHT11);// сообщаем на каком порту будет датчик voidsetup() { lcd.init();// Инициализация дисплея lcd.backlight();// Подключение подсветки lcd.clear();// Чистим дисплей dht.begin();// запускаем датчик DHT11 } voidloop() { floath=dht.readHumidity();// считываем температуру (t) floatt=dht.readTemperature();// и влажность (h) lcd.setCursor(,);// Устанавливаем курср на нулевую символ и нулевой строки lcd.print(«Влажн. :»);// выводим надпись «Влажн.:» lcd.print(h,1);// выводим значение влажности с одним символом после запятой lcd.print(» %»);// выволим знак процента lcd.setCursor(,1);// Устанавливаем курср на нулевой символ первой строки lcd.print(«Темпер.:»);// выводим надпись «Темпер.:» lcd.print(t,1);// выводим значение влажности с одним символом после запятой lcd.print(«\337C»);// выволим знак градуса (337 символ в талице) и «С» delay(2000);// ждём 2000 микросикенд (2 секунды) } |
Копируем его в поле для кода IDE:
и жмём загрузить:
Кнопка «загрузить»
Загрузка завершена
Ждём несколько секунд и наша метеостанция работает:
Метеостанция работает
Общий принцип работы
Измеряющая данные окружающей среды метеостанция на Ардуино состоит из нескольких основных компонентов:
- собственно плата управления Arduino (например, Uno). На нее поступает информация со внешних датчиков, контроллер выполняет вычисления и выводит информацию на экран;
- электронный дисплей — служит для отображения поступивших с контроллера данных в понятной человекочитаемой форме;
- сенсор влажности температуры. В подобных схемах популярны датчики DHT11 и DHT22. Они регистрируют данные среды и отдают их контроллеру;
- макетная плата — основа для сборки всех компонентов. На ней фиксируются все элементы метеостанции, по ней же прокладываются электрические соединения;
- соединительные провода — с «оголенными» концами под пайку или оснащенные штекерами.
Кроме того, в плату понадобится залить соответствующее программное обеспечение — скетч. Его содержимое зависит от набора элементов и выполняемых задач, примеры скетчей мы также рассмотрим ниже.
Постановка задачи
Зачем вообще нужна метеостанция? Сегодня в мире хватает погодных сервисов, в том числе с локальными сводками погоды. Однако помимо контроля внешних параметров мне нужно было получить данные и с датчиков температуры и влажности внутри помещения. Помимо просто информационной составляющей, зная температуру в доме и снаружи, можно, например, управлять котлом или вентиляцией, и поддерживать комфортный микроклимат (погодозависимая автоматика). Кроме того, мне очень хотелось бы отслеживать тенденции и тренды погоды на длительных промежутках времени, например в год-два. То есть, данные нужно где-то хранить.
Из всего того делаем выводы:
-
Нужно хранилище данных (сервер)
-
Датчики будем использовать разные и в разных местах, поэтому проще сделать систему модульной (IoT)
-
Помимо локального сервера данные, хотя бы текущих показаний хорошо бы скидывать в облако
-
Так как мы будем собирать достаточно много данных, можно данными поделиться
Android
Теперь напишем простое приложение для Андроид, которое запрашивает, получает, декодирует JSON-данные и отображает информацию на экране.
Наше Android-приложение будет простым насколько это возможно, только сама суть технологии. Далее вокруг этого «скелета» уже можно будет наворачивать различные «красивости».
Вот скриншот того, что должно получиться в итоге
Как видим UI просто спартанский, основан на LinearLayout, ничего лишнего.
В верхней части TextView показывает ID датчиков и их метео-данные. Кнопка «Обновить» инициирует повторный запрос к веб-серверу. Далее в EditText расположена единственная настройка программы — это URL запроса в виде
Что необходимо отметить?
В манифест добавьте строки разрешающие интернет и проверку состояния сетевого соединения :
Работа с сетью и получение данных с веб-сайта происходит следующим образом.
Используем AsyncTask, чтобы создать фоновую задачу отдельно от главного потока пользовательского интерфейса. Эта фоновая задача берет URL запроса и использует его для создания .
После того, как соединение установлено, AsyncTask загружает содержимое веб-страницы (JSON) как InputStream. Далее InputStream преобразуется в строку, которая декодируется с помощью JSONObject и отображается в пользовательском интерфейсе методом .
В MainActivity.java измените URL на ваш :
он будет использоваться по умолчанию при первом запуске Android приложения.
Печатные платы.
Печатные платы разработаны в программе Dip Trace. Они выполнены на одностороннем фольгированном стеклотекстолите. Расположение деталей на основной печатной плате показано на рисунке (Рисунок 4). На рисунке перемычки со стороны монтажа выделены цветными ломаными линиями. Печатная плата со стороны дорожек показана на рисунке (Рисунок 5).
Рисунок 4. Печатная плата (вид со стороны радиодеталей).
Рисунок 5. Печатная плата (вид снизу, зеркальное отображение).
Кнопки и переключатели пульта управления станцией установлены на отдельной печатной плате (Рисунок 6 и Рисунок 7).
Рисунок 6. Печатная плата Пульта управления (вид сверху).
Рисунок 7. Печатная плата Пульта управления (вид со стороны дорожек).
Гнездо для подключения USB кабеля установлено на отдельной плате, купленной на AliExpress (Рисунок 8).
Рисунок 8. Плата с гнездом USB.
Принципиальные схемы
Передатчик
Передающая часть беспроводного термометра на ATMega328p
(для увеличения масштаба можно кликнуть по картинке правой кнопкой мыши и выбрать «Открыть ссылку/изображение в новой вкладке/новом окне»)
В данном примере я не буду выводить неиспользуемые выводы микроконтроллера на внешние контакты термометра, после чего их можно было бы использовать для дальнейшего усовершенствования устройства. Здесь мы рассматриваем лишь идею для устройства и соберем его только на макетной плате.
Приемник
Приемная часть беспроводного термометра на Arduino Mega
(для увеличения масштаба можно кликнуть по картинке правой кнопкой мыши и выбрать «Открыть ссылку/изображение в новой вкладке/новом окне»)
Пожалуйста, обратите внимание, что приемник построен на базе платы Arduino Mega, которая не изображена на схеме. Для подключения платы Arduino Mega соедините с ней радиочастотный модуль и LCD дисплей согласно метка на схеме
Архитектура
Самым простым и популярным решением для метеостанции является Arduino, однако подружить с его домашней сетью — это дополнительные девайсы\шилды, лишние деньги и сложность, а значит — время. Поэтому из коробки проще использовать модуль уже со встроенным Wi-Fi, например ESP8266 (NodeMCU) с подключенными сенсорами. Это достаточно удобно, что один и тот же модуль можно использовать и дома, и за окном. При желании даже можно его использовать в качестве сервера.
Но почему бы не проставить в центр системы лучше что-то помощнее? Благо у меня пылится без дела Raspberry Pi первой ревизии (но и любая другая подойдёт). Внутренние датчики можно подключить, в принципе через GPIO и к малинке напрямую, но у меня роутер с малинкой в одной комнате установлен, а мониторить нужно другую. Если у вас такой проблемы нет — то можно от одной NodeMCU избавиться. Малинка будет получать данные от датчиков, сохранять их в базе данных и при необходимости отображать. Так же к GPIO Raspberry Pi можно подцепить LoRa — приёмник и получать данные от удалённых за пределами Wi-Fi сети датчиков (и вот они Arduino). Ну, и наконец, малинка будет отправлять данные в облако.
Итого, нам понадобится:
-
Raspberry PI
-
ESP8266 (2шт. + 1шт. опционально)
-
BME280 (2 шт.)
-
Часы реального времени DS1302 (опционально)
-
OLED-дисплей 128х64 на SH1106 (опционально)
-
Датчик дождя на компараторе LM373 (опционально)
-
УФ-датчик GY-VEML6070 (опционально)
-
Raspberry Pi Camera (опционально)
-
Arduino Nano (2 шт., опционально)
-
SX1278 (3 шт., опционально)
-
Магнитный компас с чипом QMC5883L/HMC5883L (опционально)
-
Датчик освещённости (светодиодный) с компаратором LM737 (опционально)
-
Датчики напряжения до 25V (опционально)
-
Датчики тока ACS712 (опционально)
Пояснения к коду
- Очень часто бывает полезно обмениваться данными, например, с компьютером. В частности, для отладки работы устройства: можно, например, смотреть, какие значения принимают переменные.
-
В данном эксперименте мы знакомимся со стандартным объектом , который предназначен для работы с последовательным портом (UART) Arduino, и его методами (функциями, созданными для работы с данным объектом) , и , которые вызываются после точки, идущей за именем объекта:
-
чтобы обмениваться данными, нужно начать соединение, поэтому вызывается в
- отправляет содержимое . Если мы хотим отправить текст, можно просто заключить его в пару двойных кавычек: . Кириллица, скорее всего, будет отображаться некорректно.
- делает то же самое, только добавляет в конце невидимый символ новой строки.
-
- В и можно использовать второй необязательный параметр: выбор системы счисления, в которой выводить число (это может быть , , , для десятичной, двоичной, шестнадцатеричной и восьмеричной систем счисления соответственно) или количество знаков после запятой для дробных чисел.
Например,
Serial.println(18,BIN); Serial.print(3.14159,3);
в мониторе порта даст результат
10010 3.142
- Монитор порта, входящий в Arduino IDE, открывается через меню Сервис или сочетанием клавиш Ctrl+Shift+M. Следите за тем, чтобы в мониторе и в скетче была указана одинаковая скорость обмена данными, . Скорости 9600 бит в секунду обычно достаточно. Другие стандартные значения можете посмотреть в выпадающем меню справа внизу окна монитора порта.
- Вам не удастся использовать цифровые порты 0 и 1 одновременно с передачей данных по последовательному порту, потому что по ним также идет передача данных, как и через USB-порт платы.
- При запуске монитора порта скетч в микроконтроллере перезагружается и начинает работать с начала. Это удобно, если вам нельзя упустить какие-то данные, которые начинаю передаваться сразу же. Но в других ситуациях это может мешать, помните об этом нюансе!
- Если вы хотите читать какие-то данные в реальном времени, не забывайте делать хотя бы на 100 миллисекунд, иначе бегущие числа в мониторе будет невозможно разобрать. Вы можете отправлять данные и без задержки, а затем, к примеру, скопировать их для обработки в стороннем приложении.
- Последовательность выводится как символ табуляции (8 пробелов с выравниванием). Также вы можете использовать, например, последовательность для перевода строки. Если вы хотите использовать обратный слеш, его нужно экранировать вторым таким же: .
Аппаратная часть
И так, в современном мире, практически все “умные” устройства у нас общаются по Wifi, а в довесок к тому, что к месту установки тащить какие-либо сети связи мне крайне не хотелось, то выбор в пользу WiFi стал очевиден, да и использовать какие-либо другие беспроводные сети нецелесообразно, т.к. у меня весь у. Соответственно базой для нашей платформы должен стать микроконтроллер, который уже имеет на борту этот самый wifi. А что приходит на ум? Правильно, ESP8266. Можно и ESP32 использовать. Вот только смысла в более мощном микроконтроллере нет.
Самым бюджетным и безгеморойным решением в данном случае является использование модулей WEMOS D1 Mini. Необходимое количество выводов есть и отлично. Для данного проекта я использовал модуль Wemos D1 mini от продавца Greatwall (резерв). Можно было бы использовать модули от RobotDyn. Но у меня с ними что-то не срослось. Ну и ладно. Экономия – это всегда приятно 🙂
Wemos D1 Mini
Можно было заморочиться и вообще взять модуль ESP-12E, однако, сэкономить ни деньги, ни время таком извращении не получилось бы, да и вопрос компактности устройства стоит не так остро. точнее не стоит никак 🙂
Мозги есть. Теперь давайте определимся что мы будем измерять? Необходимо измерять температуру и влажность на улице. А так как мы делаем не комнатный датчик, а уличный, то пускай диапазон измеряемых температур будет лежать в пределах от – 35 градусов до +40 градусов и диапазон измерения вражности от 0 до 100. не хотелось усложнять схему и использовать несколько датчиков, поэтому хотелось использовать один датчик для измерения и температуры и влажности. Но среди всех известных мне датчиков, только один удовлетворяет нашим требованиям, это датчик DHT22
Внимание, датчик DHT11 не подойдет, т.к. не измеряет отрицательные температуры!
Датчик DHT22 я заказывал все в том же магазине Great WALL (резерв). Обязательно берите голый датчик. Дальше поймете почему.
Ну собственно по основному функционалу и все. Устройство практические примитивное. Остался только один вопрос. А как запитать это устройство? На святом духе оно работать не станет. В виду того что с местом размещения метеостанции был электрощит, то оказалось проще всего питать его от напряжения в 220 вольт через миниатюрный блок питания.
Относительно блоков питания, было два варианта
- Миниатюрный блок питания HLK-PM01 (резерв)
- Миниатюрный блок питания MeanWell IRM-05-5 (резерв)
Из этих двух блоков питания я выбрал модель от MeanWell. Да он дороже. Но диапазон температур эксплуатации у него шире. Соответственно шансов выжить в жестких условиях эксплуатации у него намного больше. Да и опять таки MeanWell это хороший качественный бренд за адекватные деньги. тем более, мы имеем дело с высоким напряжением и перестраховаться не повредит. Пожар нам точно не нужен.
Что это такое?
Наша метеостанция будет состоять из двух устройств: компактного автономного
устройства, измеряющего погодные показатели, и устройства-ретранслятора,
получающего эти показатели и отправляющего их на «народный мониторинг».
Устройства будут связываться по беспроводному каналу связи на частоте 433 МГц.
Автономная часть будет питаться от трёх пальчиковых батареек и сможет
просуществовать на одном комплекте батарей до года при периоде опроса датчиков
в 20 мин.
Такая конструкция позволяет не сверлить стены для прокладки проводов с улицы, где необходимо производить измерения, в помещение, где результатами этих
измерений надо пользоваться.
Создание метеостанции на базе Arduino и датчика температуры и влажности DHT22
Для создания метеостанции нам необходимо:
- Arduino
- Датчик температуры и влажности DHT22 (существуют модификации DHT11 или DHT21, но они имеют меньшую точность измерений)
Минимальный набор готов, но если вам не хочется использовать свой компьютер как экран для вывода показаний с датчика, то понадобится еще и устройство вывода данных, идеальным решением для этого может стать:
Двухстрочный дисплей LCD 1602А
Его подключение вы можете найти в предыдущей статье.
Начнем, пожалуй, с подключения нашего датчика температуры и влажности к Arduino. Две крайние ножки датчика это питание: крайняя левая +5V, крайняя правая — GND (земля). Ножка, отмеченная на схеме голубым проводом – сигнал (S), ее мы подключаем к порту на плате и обязательно подтягиваем резистором к питанию (10 кОм). Именно его в дальнейшем и пропишем в программе как пин, с которого мы будем считывать данные. Отлично, теперь датчик подключен, перейдем к программированию.
Так как DHT22 является конденсационным, да и в своем устройстве он не так уж прост, для работы будем использовать готовую библиотеку, с помощью которой работа с датчиками сводится к использованию готовых функций.Итак, подключаем библиотеку DHT-master.
В директивах (параметрах, определяемых до начала основных блоков программы) описываем пин, к которому подключили сигнал (S), тип датчика и создаем класс, в котором соединим эти два параметра, для дальнейшей возможности обращения этим параметрам в программе.
В функции voidsetup() подключаем монитор порта (его мы будем использовать только для тестирования, потом выведем показания на дисплей) и инициализируем начало работы с датчиком температуры и влажности
В основном блоке программы (void loop()) ставим задержку между двумя последовательными измерениями и описываем считывание данных с датчика с помощью библиотечных функций
Проверяем, получаем ли мы данные и, если все идет по плану, то выводим эти показания в монитор порта.
Загружаем программу в плату и, чтобы увидеть показания, которые нам присылает DHT22, открываем монитор порта (Ctrl+Shift+M или Инструменты — Монитор порта) следим за изменениями температуры и влажности в комнате.Итак, LevelUP: теперь давайте освоим вывод показаний на двухстрочный дисплей.Для того, чтобы компьютер (ноутбук) не использовался исключительно как монитор для вывода показаний с датчика, мы будем использовать двухстрочный дисплей LCD 1602А, как устройство внешнего вывода.Для этого обратимся к статье подключение двухстрочного дисплея.Добавим пару элементов в программе, которые позволят нам использовать для вывода именно дисплей: подключим библиотеку для работы с дисплеем, и также, как и DHT22, создадим класс LiquidCrystal, в котором в качестве параметров указаны пины, используемые, как сигнальные для дисплея.
Далее в теле функции void setup() инициализируем дисплей: lcd.begin(16, 2) т.е. определяем максимальное количество символов в строке и количество строк и выводим название нашего мини-проекта.
А теперь приступим к основному блоку программы. В функции void loop() опишем считывание показания с датчика температуры и влажности и опишем его вывод на дисплей.
Собираем наше устройство, загружаем программу и наша портативная метеостанция готова к работе. Чтобы она работала постоянно, можно использовать питание не от USB, а от батарейки, разъем для которой есть на плате.
Arduino
- 80
Arduino: как сделать термометр
- После того, как вы поработали со своим ЖК-дисплеем, вы можете самостоятельно сделать небольшой термометр. Для этого вам также будет нужен NTC и резистор 10 кОм.
- Подключите все компоненты, как показано на рисунке.
- Теперь вам нужно в самом начале вашего кода вставить команду «int tempPin = 0;», чтобы Arduino знал, после какого (аналогового) контакта вы подключили NTC.
- Затем добавьте в void loop() команду «int tempReading = analogRead(tempPin);», а затем команду «double tempK = log(10000.0 * ((1024.0 / tempReading — 1)));», и еще команду «tempK = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * tempK * tempK )) * tempK );» без кавычек. Под переменной «tempK» была задана и сохранена температура в Кельвинах.
- Изменить это вы можете с помощью команды «float tempC = tempK — 273.15;» и легко конвертировать единицы измерения в Цельсии.
- Теперь добавьте (все еще в void loop) команду «lcd.setCursor (0, 0);» чтобы поместить курсор в начало. После этого вам понадобится команда «lcd.print (tempC)»; для отображения температуры на дисплее. Поскольку курсор теперь всегда будет размещаться в начале, вам не нужно будет дополнительно вставлять команду lcd.clear ().
Фото: компании-производители
- Мини-ПК Raspberry Pi 3 Model B+ сможет стать центром «умного» дома
- Xiaomi выпустила метеостанцию с E Ink-дисплеем всего за $9
Характеристики и подключение датчиков DHT11 и DHT22
Датчик состоит из двух частей – емкостного датчика температуры и гигрометра. Первый используется для измерения температуры, второй – для влажности воздуха. Находящийся внутри чип может выполнять аналого-цифровые преобразования и выдавать цифровой сигнал, который считывается посредством микроконтроллера.
В большинстве случаев DHT11 или DHT22 доступен в двух вариантах: как отдельный датчик в виде пластикового корпуса с металлическими контактами или как готовый модуль с датчиком и припаянными элементами обвязки. Второй вариант гораздо проще использовать в реальных проектах и крайне рекомендуется для начинающих.
Датчик DHT11
- Потребляемый ток – 2,5 мА (максимальное значение при преобразовании данных);
- Измеряет влажность в диапазоне от 20% до 80%. Погрешность может составлять до 5%;
- Применяется при измерении температуры в интервале от 0 до 50 градусов (точность – 2%)
- Габаритные размеры: 15,5 мм длина; 12 мм широта; 5,5 мм высота;
- Питание – от 3 до 5 Вольт;
- Одно измерение в единицу времени (секунду). То есть, частота составляет 1 Гц;
- 4 коннектора. Между соседними расстояние в 0,1 ”.
Датчик DHT22
- Питание – от 3 до 5 Вольт;
- Максимальный ток при преобразовании – 2,5 мА;
- Способен измерять влажность в интервале от 0% до 100%. Точность измерений колеблется от 2% до 5%;
- Минимальная измеряемая температура – минус 40, максимальная – 125 градусов по Цельсию (точность измерений – 0,5);
- Устройство способно совершать одно измерение за 2 секунд. Частота – до 0,5 ГЦ;
- Габаритные размеры: 15,1 мм длина; 25 мм широта; 5,5 мм высота;
- Присутствует 4 коннектора. Расстояние между соседними – 0,1 ‘;
Очевидно, что при использовании в ардуино датчика температуры и влажности DHT11 устройство выдаст менее точные значения, чем DHT22. У аналога больший диапазон измеряемых значений, но и цена соответствующая. Датчик температуры и влажности DHT22, как и его аналог, имеет один цифровой выход, соответственно снимать показания можно не чаще, чем один раз в 1-2 секунды.
HTTP GET и JSON
Вопрос, который нужно решить в первую очередь — это каким образом будет происходить передача данных от веб-сервера к Андроид-приложению.
Придумывать тут ничего не нужно, всё уже придумано за нас — это HTTP GET и JSON.
В нашем случае простой GET запрос к веб-серверу можно составить и отладить вручную, пока Андроид приложение ещё не готово.
В Java и в Android есть готовые библиотеки для обработки данных в формате JSON. JSON текстовый формат, читается человеком, что полезно для отладки.
Для того, чтобы сформировать текущие данные от датчиков метеостанции создадим на веб-сервере новый PHP скрипт last-data-to-json.php.
Вызов скрипта :
где , как мы помним, это секретный ключ доступа к БД.
Пример ответа в формате JSON :
Необходимо напомнить, что у нас 3 датчика. Их ID и тип (DHT или BMP) жёстко закодированы по всему коду метеостанции. Такой способ хардкордного кодирования идеологически неверен, но для наколенного прототипа (где необходимо быстрое и простое решение) это разумный компромисс.
Скрипт берет из БД самые последние данные от этих разнотипных датчиков и упаковывает в формат JSON. Выборка данных из БД «с конца» просходит таким способом :
Ардуино. Метеостанция на LCD 1602 и DHT11
Ардуино. Метеостанция с дисплеем LCD 1602 и DHT22
После сборки схемы, загрузите в микроконтроллер следующий скетч (здесь ссылка на скачивание архива со скетчем для метеостанции и необходимыми библиотеками). Информация с датчика DHT22 выводиться будет на монитор порта Arduino IDE и на жидкокристаллический дисплей 1602a, для отображения информации использован русский шрифт для LCD и символы (в скетче есть подробные комментарии).
Скетч для метеостанции с DHT11 на Ардуино
#include <Wire.h> // библиотека для протокола IIC #include <LiquidCrystal_I2C.h> // подключаем библиотеку LCD IIC LiquidCrystal_I2C lcd(0x27,20,2); // присваиваем имя lcd для дисплея #include "DHT.h" // подключаем библиотеку для DHT11 DHT dht(2, DHT11); // к какому порту подключаем датчик // создаем символ градуса и присваиваем имя "gradus" byte gradus = { 0b01100,0b10010,0b10010,0b01100,0b00000,0b00000,0b00000,0b00000 }; // создаем русскую букву "П" byte P = { 0b11111,0b10001,0b10001,0b10001,0b10001,0b10001,0b10001,0b00000 }; // создаем русскую букву "У" byte Y = { 0b10001,0b10001,0b10001,0b01111,0b00001,0b00001,0b01110,0b00000 }; // создаем русскую букву "Л" byte L = { 0b00111,0b01001,0b10001,0b10001,0b10001,0b10001,0b10001,0b00000 }; // создаем русскую букву "Ж" byte ZH = { 0b10101,0b10101,0b10101,0b01110,0b10101,0b10101,0b10101,0b00000 }; // создаем русскую букву "Ь" byte znak = { 0b10000,0b10000,0b10000,0b11110,0b10001,0b10001,0b11110,0b00000 }; void setup() { Serial.begin(9600); // запуск последовательного порта lcd.init(); // инициализация LCD дисплея lcd.backlight(); // включение подсветки дисплея lcd.createChar(1, gradus); lcd.createChar(2, P); lcd.createChar(3, Y); lcd.createChar(4, L); lcd.createChar(5, ZH); lcd.createChar(6, znak); } void loop() { // если нужны точные значение, то используйте float, вместо byte byte h = dht.readHumidity(); // считываем значение температуры byte t = dht.readTemperature(); // считываем значение влажности Serial.print("Temperature: "); Serial.println(t); // отправляем значение температуры на монитор Serial.print("Humidity: "); Serial.println(h); // отправляем значение температуры на монитор Serial.println(" "); // пустая строка lcd.setCursor(0,0); // ставим курсор на 1 символ первой строки lcd.print("TEM"); // используем латинские буквы lcd.print(char(2)); // выводим русскую букву "П" lcd.print("EPAT"); // используем латинские буквы lcd.print(char(3)); // выводим русскую букву "У" lcd.print("PA: "); // используем латинские буквы lcd.print(t); // выводим значение температуры на LCD lcd.print(char(1)); // выводим знак градуса lcd.setCursor(2,1); // ставим курсор на 3 символ второй строки lcd.print("B"); // используем латинские буквы lcd.print(char(4)); // выводим русскую букву "Л" lcd.print("A"); // используем латинские буквы lcd.print(char(5)); // выводим русскую букву "Ж" lcd.print("HOCT"); // используем латинские буквы lcd.print(char(6)); // выводим русскую букву "Ь" lcd.print(": "); // используем латинские буквы lcd.print(h); // выводим значение влажности на LCD lcd.print("%"); // выводим знак процент delay(1000); }
Пояснения к коду:
- в скетче можно использовать до 8 русских букв и символов, при необходимости заменяйте буквы из кириллицы — латинскими буквами;
- скорость обновления данных замените на необходимое значение.
Заключение. Мы рассмотрели, как сделать простую домашнюю метеостанцию на Ардуино c дисплеем 1602а и датчиком температуры и влажности воздуха DHT11. Данный проект можно доработать, добавив к схеме еще больше датчиков для анализа метеоусловий. Также можно сделать беспроводную метеостанцию на Arduino Uno, используя блютуз или радио модули для передачи информации на расстояние.
Как настроить ЖК-дисплей
Если вы хотите управлять ЖК-дисплеем с помощью Arduino, вам будут нужны, помимо самого конструктора и монитора, соединительный кабель, потенциометр и макетная плата Breadboard. Однако в интернете вы найдете множество практичных и доступных наборов Arduino, в которых все эти компоненты уже есть.
Сначала соедините все компоненты — как показано на рисунке — с Arduino и запустите Arduino IDE.
Во-первых, вы должны добавить команду #include (без кавычек) в код для импорта библиотеки LiquidCrystal.
Затем вам понадобится определить ЖК-дисплей командой «LiquidCrystal lcd (7, 8, 9, 10, 11, 12)»;. При необходимости вам нужно будет отрегулировать используемые в команде контакты.
Вы должны запустить свой ЖК-дисплей в void setup (). Это можно сделать, например, с помощью команды «lcd.begin (16, 2);».
Теперь вы можете протестировать ЖК-дисплей. С помощью команды «lcd.print(«Hello, World!»);» слова «Hello, World!» — как в этом примере — будут показаны на дисплее. С помощью команды «lcd.setCursor (0, 1)»; вы можете менять курсор
Обратите внимание, однако, что компьютер всегда начинает отсчет с 0. С помощью команды «lcd.clear ();»
Вы можете удалить все записанные на ЖК-дисплее данные.
Итоги и выводы
Что же я получил в итоге? Я получил вполне годную метеостанцию, созданную с минимальными затратами как сил так и времени. Теперь я могу всегда получать актуальную информацию о температуре и влажности на улице.
Причем не только через Web интерфейс самого модуля, но и в любой момент видеть эту информацию на экране своего телефона (iphone, через встроенное приложение “дом”).
Прошла зима. По крайней мере календарная зима. И что вы думаете? Живет и работает! без всяких проблем. Мои опасения оказались напрасны.
Понимаю, найдутся критики, которые скажут что можно было сделать как-то иначе, но на это я скажу лишь одно:
Данная статья писалась с целью поделиться приобретенным опытом, а так же своим вариантом реализации проекта уличной метеостанции :). Так что, кому интересно, берите на заметку подобное устройство.
А еще не забывайте подписываться на инстаграмм сайта https://www.instagram.com/ionline.by/
И обязательно подписывайтесь на катал: https://www.youtube.com/channel/UCwdjiKLXZDJYdUFAx6fZCZA