Метеостанция на arduino с беспроводным датчиком температуры
Погода в доме: беспроводной метеодатчик из Arduino Pro Mini

Так что я решил попробовать, и закрыть этот вопрос раз и навсегда. Тем более, что тот самый рассказ стал призовым, и позволил мне купить практические все необходимое, чтобы решить задачу. В некотором смысле это спасибо MySKU и всем, кому понравились игрушки из Arduino.
ЖЕЛЕЗКИ
Arduino Pro Mini
Плата совершенно крошечная. Я даже не ожидал, что настолько. Но при этом на ней — взрослый чип ATmega328, так что по производительности она не уступает той же Uno. Это версия 5В, питается или от 5В стабилизированного по любому пину VCC или же от 5 — 12В по пину RAW (если верить Arduino.cc). По-моему, очень удобно.
Комплект передатчик-приемник ASK/OOK 433 МГц
Это уже проверенные (не в этом магазине, а вообще) простейшие приемники и передатчики с амплитудной модуляцией. У них нет никаких средств коррекции ошибок и контроля передачи, зато они крайне дешевы и без проблем работают с нужными мне устройствами (розетками, выключателями и с самими собой).
Живые фото можно посмотреть в предыдущем тексте про Arduino.
Преобразователь Serial — USB
Очень простой, недорогой и универсальный — есть питание 5В и 3.3В на выбор. Нужен, чтобы загружать код в Arduino Pro Mini, так как у платы нет своего USB. Шлейф, который вы видите на фото, входит в комплект. И хотя ничего необычного в нем нет — обычные четыре провода, все равно приятно.
Датчик влажности и температуры DHT21
Заказывал часы для жены, но DX ошибся с заказом, ошибку признал и вернул стоимость на счет в магазине. Так что вместо часов жене получился датчик температуры мне любимому.
Этот датчик выбран за разумную цену (вообще, а не в DX), широкий диапазон измерений и точность до десятых.
Кроме того, в отзывах на DX писали, что он полностью совместим с DHT22, для которого есть готовые библиотеки для Arduino.
Пара слов о продавце на eBay
С одной стороны, в магазине приятные цены, все выслали достаточно быстро, и почти все пришло в рабочем состоянии. Исключение — один приемник, который не включился. Возможно, он настроен на другую частоту и поэтому я не увидел сигнала на выходе.
С этим буду разбираться позже, но пока факт остается фактом — в текущем состоянии один приемник оказался бесполезен. Другой минус состоит в том, что бесплатная доставка — без номера для отслеживания. А так как я эти номера все же люблю, то заплатил за него, как и было предложено в письме-подтверждении заказа.
При этом продавец предлагает оплатить трек-номер на отдельный эккаунт PayPal. Итог: сначала мне больше недели номер вообще не давали. Потом, когда я пообещал диспут, выдали с интервалом в день сразу два трек-номера. Один был явно левым, поскольку дата приема посылки по нему была раньше даты заказа.
Другой казался нормальным ровно до импорта в России. Как только появился индекс места назначения стало понятно, что это посылка не моя, а какого-то счастливчика из Обнинска. Ну а потом уже пришла моя посылка — без каких-либо трек-номеров.
Поэтому поводу я еще немного поскандалил с продавцом, и в конечном итоге плату за трек-номер мне вернули. Впечатления двойственные: с одной стороны, в магазине очень приятные цены. С другой — получается какая-то лотерея.
ФИЗИЧЕСКИЙ УРОВЕНЬ
За громким заголовком суровая правда: дома на боевом дежурстве живет небольшая коробочка с Arduino Uno, подключенная к сети через Ethernet-шилд. В этой коробочке также есть копия упомянутого выше ASK/OOK приемника для получения сигналов с домашних датчиков (протечки, открытия дверей и т.п.). Это определило некое подобие клиент-серверной модели для подключения метеодатчика. То есть, метеодатчик на базе Arduino Pro Mini отправляет данные температуры и влажности коробке, а она, в свою очередь, отправляет их в интернет. Отвечаю на очевидные вопросы ) Q: Почему примитивные приемники, а не, скажем, рекомендованные ранее чудесные nRF24L01, которым не страшны помехи, которые легко объединяются в сеть и вообще идеальны для такого применения? A: Во-первых, кажется, я просто боюсь, что потрачу слишком много времени на усвоение методики работы с nRF24L01. Во-вторых, у меня (то есть, у Arduino Uno в коробке) заканчивается все — пины, память. А нужно подключить еще несколько устройств: пищалку, датчик движения. Между тем, в коробке уже есть все, что нужно для получения метеоданных — и приемник, и библиотека RC-Switch, которая вполне подходит не только для управления розетками, но для передачи нескольких символов. Почему бы не воспользоваться уже имеющимися ресурсами? Q: Почему тогда не Virtual Wire? A: Ответ, в общем, выше — еще одна библиотека, еще меньше памяти. С практической точки зрения такой радиоканал можно назвать слабым местом системы. Но, если задуматься, вся моя система — сплошное слабое место, так сказать, by design. Q: почему бы не подключить Arduino Pro Mini к сети напрямую? A: Дело в том, что для минимального количества проводов я планирую поставить датчик на окно, а рядом нет ни сетевых, ни электрических розеток. Это раз. И два: Wi-Fi-шилд для Arduino или комбинация из электрической розетки с Ethernet и обычного Ethernet-шилда Arduino стоят совершенно неразумных для решения этой задачи денег. Q: Почему не меряем атмосферное давление? A: Потому что датчик сразу не заказал, и в итоге он еще не приехал. А попробовать очень хотелось. Q: У тебя же есть метеостанция с беспроводным датчиком. Почему не используешь его, а городишь огород на пустом месте? A: Честно говоря, огород для меня проще, чем писать код для обработки сигнала. Потом, может быть, попробую. А сейчас так гораздо быстрее.
ЛОГИЧЕСКИЙ УРОВЕНЬ
Для логической основы радиоканала я решил воспользоваться возможностями библиотеки RC-Switch. Она предназначена для управления беспроводными розетками, но методика управления позволяет использовать ее и для передачи данных. Медленно, не очень надежно, но — позволяет. Суть в том, что команда розетки — всего лишь цифровой код.
При этом RC-Switch совершенно безразлично, какой именно код передавать. Главное — не больше 24 бит, то есть не больше 16777216.
В итоге мой протокол передачи метеоданных выглядит следующим образом: Первые три цифры — идентификатор датчика Четвертая цифра — тип данных (1 — влажность, 0 — температура) Пятая цифра — знак температуры (1 — отрицательная, 0 — положительная) Остальные цифры — величина Например, чтобы передать температуру 23.
5С нужно отправить через RC-Switch код 16100235. Плюсы примитивного «кодирования»: достаточно всего одного действия арифметики, чтобы выделить передаваемую величину. Минусы — один «пакет» для одного значения.
ПРАКТИЧЕСКАЯ РЕАЛИЗАЦИЯ
Arduino Pro Mini поставляется в комплекте с контактными планками. При желании их можно напаять на плату. А при необходимости сделать максимально компактную конструкцию провода можно паять прямо к контактным площадкам платы. Я выбрал первый вариант — мне так проще, да и плату, если что, легче использовать повторно. После беглого ознакомления с датчиком температуры и влажности DHT21 выяснилось, что напрямую подключать его к Arduino не очень правильно. Оказывается, правильная схема включает «подтягивающий» резистор 4.7 кОм между плюсом и линией данных. Мне повезло — нужный резистор выкусил из ненужного беспроводного звонка. Для питания прототипа я воспользовался ненужной «аварийной» зарядкой для мобильного телефона. Это такой цилиндрик: с одной стороны вставляем батарейку AA 1.5В, а с другой получаем 5.9В (без нагрузки). Для страховки я подключил выход зарядки к входу RAW Arduino Pro Mini, чтобы все компоненты (плата и датчик) получали стабилизированные 5В. По крайней мере, из описания платы можно заключить, что RAW принимает от 5В до 12В, при этом на контактах VCC — стабилизированные 5В. Дальше все просто. Подключаем передатчик, датчик и пишем простой код. В моем случае для кода потребовались три библиотеки: RC-Switch (передача данных), SimpleTimer (отсчет интервалов для передачи) и DHT22 (получение данных с датчика температуры и влажности). А вот и прототип:Схема работы: раз в пять минут опрашиваем датчик и попеременно отправляем температуру и влажность. За одну сессию можно передать только один параметр, поэтому «большая сестра» получает их по очереди, а потом скопом отправляет в Open Weather Map. В результате данные в интернете обновляются раз в десять минут. Почему такой интервал? Потому что, во-первых, каждая сессия — это занятый радиоканал (а у меня есть и другие радиодатчики, требующие внимания) и отнятое процессорное время. Так что это попытка минимизировать издержки. Во-вторых, я не такой уж и погодный маньяк, чтобы обновлять погоду каждую секунду. И третье. Интервал в пять минут, по-моему, более-менее рационален с точки зрения энергетики, так как я планирую питать метеодатчик от батареек. Для записи кода в плату соединяем Arduino Pro Mini с компьютером через преобразователь Serial — USB и не забываем «перекрестить» линии TX/RX, то есть: RX подключаем к TX, и наоборот — TX к RX. Для питания берем пин 5В, потому что эта версия Arduino — 5В.Секрет: если заливка программы не удается (ошибка типа avrdude: stk500_getsync(): not in sync: resp=0x00), помогает такая процедура: 1) Нажимаем кнопку загрузки программы в среде разработки Arduino 2) Ждем пока загорится красный светодиод на преобразователе Serial — USB 3) Нажимаем кнопку сброса на Arduino Pro Mini Если не получилось — ждем, пока погаснет красный светодиод на преобразователе и повторяем процедуру. Со стороны «большой сестры» нужно только добавить несколько фрагментов кода для получения метеоданных из радиоканала и отправки их в интернет. Для примера — готовый код по ссылке в конце текста, который подходит для использования с Arduino Uno как в монопольном режиме, так и в составе вашего кода (если, разумеется, разобрать исходник на нужные части). Если будете использовать — не забудьте подставить свои IP/MAC, ключ авторизации OpenWeatherMap и координаты метеодатчика. А вот так метеодатчик выглядит почти в финальной (ну или вообще финальной, если нет ничего более постоянного, чем временное) версии:
НА ДЕРЕВНЮ, ДЕДУШКЕ
Итак, метеоданные получили, передали и приняли. Ок. И что делать с этим счастьем? Мне советовали отправлять его в Openweathermap.org, поскольку дело хорошее и вообще. Я проникся и немного изучил вопрос, хотя такое ощущение, что Openweathermap это совершенно не нужно. Так что получилось, скорее, не благодаря, а вопреки.
Спасибо нашему чуваку, который сделал интернет-метеостанцию и рассказал о ней, Wiki за описание базовой аутентификации HTTP и чудесному сервису hurl.it, который имитирует HTTP-запросы и показывает их тело, что важно для кода. Ах да, еще большое спасибо онлайновым сервисам кодирования Base64.
Иными словами, документация на Openweathemap upload API говорит, что нужна аутентификация HTTP Basic и описывает имена и форматы полей данных, но не дает практических примеров, что нужно таким безмозглым, как я. Как все получилось. Сначала я зарегистрировался на Openweathermap.org.
Потом выяснил, что для HTTP Basic нужна строка авторизации, состоящая из имени и пароля, разделенных двоеточием и кодированных Base64. Так что взял логин и пароль, пошел в онлайновый кодер и на выходе получил нужную строчку.
Например, для имени test и пароля test она выглядит так: dGVzdDp0ZXN0Как результат, строка авторизации Openweathermap выглядит так: Authorization: Basic dGVzdDp0ZXN0 Берем ее и составляем тестовый запрос в Openweathermap и смотрим тело запроса:Обратите внимание, что если все правильно, то «тест» отправляет данные в Openweathermap.
Я эту проблему решил просто: подставлял актуальную информацию о погоде из своего региона. Полученный таким образом текст запроса можно запросто использовать в коде Arduino: строчки печатаются в HTTP-клиент. Плюсы: в целом все довольно просто. Минусы: у Openweathermap отсутствуют адекватные (с моей точки зрения, разумеется) методы визуализации данных. Доступны только запросы к БД с выдачей результатов для визуализации «на стороне».
КАК ЭТО РАБОТАЕТ
Все просто. Метеодатчик получает температуру и влажность от DHT21, и отправляет их Arduino Uno, подключенной к интернету. Оттуда данные уходят на Openweathermap (чего добру пропадать?), где их можно посмотреть в онлайне и где они, вероятно, используются для прогноза погоды.
Желающим понаблюдать за местной (Россия, Москва, СВАО, Лианозово) погодой: мой метеодатчик на Openweathermap.org.
А ТЕПЕРЬ О ПРОБЛЕМАХ
Так как руки у меня растут все-таки не совсем из правильного места, то я закономерно наступил на несколько художественным образом разложенных грабель. Во-первых, несмотря на то, что авторы библиотеки DHT22 заверяли, что они решили проблему с отрицательными температурами, мне это не помогло.
При минусе библиотека начала выдавать совершенно нереальные показания, что в обсуждениях обосновывали ошибкой переполнения. Т.е. вместо -4.5С мне показывали 32763,5. Я не стал переписывать библиотеку (см. выше про руки), а просто стал вычитать полученное значение из 32768 (максимальное значение для заданного типа переменной).
Во-вторых, практически сразу после первого включения метеодатчика выяснилась печальная особенность: на кухонном столе (около 2.5 метров до приемника) он еще работал, а вот на балконе (около 4 метров) — нет. После изучения кода и прочего стало понятно, что проблема, все-таки и не в нем, и не в батарейках. Подозрение пало на антенны, которые я сделал из простых кусочков провода.
Чтение этих ваших интернетов догадки подтвердило: диапазон 433 МГц — довольно коварная в плане распространения волн штука. Поэтому антенну лучше делать хотя бы минимально похожей на антенну, а не изгибать проводочки под причудливыми углами, лишь бы в корпус поместилось. В итоге я заменил все проводки на штыри из одножильного медного провода (просто купил пару метров (с запасом, да) 2х1.
5 электрического кабеля, и распотрошил его на жилы. Длина штырей как и раньше — около 17.3 см, т.е. четверть волны. Все ориентированы вертикально. Результат — теперь не только метеодатчик работает на балконе, но и другие беспроводные датчики в квартире работают гораздо более уверенно. Третья очевидная проблема — совершенно зверское потребление энергии.
Двух батареек 14500 по 1000 мАч хватает где-то на пару суток. Т.е., по грубым прикидкам метеодатчик кушает около 20 мА. Говорят, что одна из наиболее прожорливых частей — встроенный стабилизатор напряжения, но от него я избавиться как раз и не могу, потому что пока не вижу, как в батарейный отсек на две АА можно разместить автономный источник 5В. Поэтому рассматриваю две альтернативы.
Первая — эксперименты со «спящим» режимом. Вторая — бросить эти девичьи мечты об автономности и запитать уже от электрической сети. Ну а пока наслаждаюсь тем, что датчик вообще работает ?
ССЫЛКИ
Библиотека RC-Switch
Библиотека DHT22
Библиотека SimpleTimer
Сервис для тест HTTP-запросов hurl.it
Сервис кодирования Base64
Код метеодатчика
Код принимающей стороны Планирую купить +103 Добавить в избранное Обзор понравился +113 +198
Создаем беспроводной термометр на Arduino

Узнайте, как использовать RF модуль 433 МГц совместно с ATMega328P-PU. В данной статье мы соберем схему из датчика DHT11 и радиочастотного передатчика. А также соберем приемное устройство с радиоприемником 433 МГц и LCD дисплеем.
Что нам потребуется
Введение
В данной статье я покажу вам, как собрать устройство, которое измеряет температуру и относительную влажность воздуха и посылает измеренные значения с помощью стандартного радиочастотного модуля 433 МГц. Датчик температуры и влажности, используемый в устройстве, – это DHT11.
Существует множество способов передачи небольшого объема данных с помощью Arduino или контроллеров ATMega. Один из них использует уже готовую библиотеку, подобную RCSwitch, Radiohead или VirtualWire.
Кроме того, можно отправить необработанные данные с помощью встроенного в микроконтроллер модуля UART. Но использовать встроенный модуль UART не рекомендуется, так как приемник будет собирать и все помехи, и микроконтроллер будет работать не так, как предполагалось.
В данной статье для передачи и приема данных я использую библиотеку VirtualWire. Эта библиотека работает с Arduino IDE 1.6.2 и 1.6.5.
Модуль передатчика 433 МГц, когда не передает данные, всё равно излучает радиочастотные колебания и передает шум. Он также может создавать помехи другим радиочастотным устройствам. Чтобы не допустить этого, я включаю его, когда необходимо передать данные, и выключаю его, когда передача закончена.
Аппаратная часть
Нам необходимы две структурные схемы. Одна для передающего устройства, вторая для приемного.
Передатчик
Нам необходимы:
- способ прошивки микроконтроллера → ISP;
- датчик для измерения температуры и влажности → DHT11;
- микроконтроллер для обработки данных → ATMega32p;
- способ беспроводной передачи данных → радиочастотный модуль 433 МГц.
Приемник
Нам необходимы:
- способ приема радиосигнала → радиочастотный модуль 433 МГц;
- способ обработки принятых данных → Arduino Mega;
- способ отображения температуры и влажности → 16×2 LCD.
Принципиальные схемы
Передатчик
Передающая часть беспроводного термометра на ATMega328p (для увеличения масштаба можно кликнуть по картинке правой кнопкой мыши и выбрать «Открыть ссылку/изображение в новой вкладке/новом окне»)
В данном примере я не буду выводить неиспользуемые выводы микроконтроллера на внешние контакты термометра, после чего их можно было бы использовать для дальнейшего усовершенствования устройства. Здесь мы рассматриваем лишь идею для устройства и соберем его только на макетной плате.
Приемник
Приемная часть беспроводного термометра на Arduino Mega (для увеличения масштаба можно кликнуть по картинке правой кнопкой мыши и выбрать «Открыть ссылку/изображение в новой вкладке/новом окне»)
Пожалуйста, обратите внимание, что приемник построен на базе платы Arduino Mega, которая не изображена на схеме. Для подключения платы Arduino Mega соедините с ней радиочастотный модуль и LCD дисплей согласно метка на схеме.
Перечень элементов
Передатчик
Перечень элементов передающей части беспроводного термометра на ATMega328p (для увеличения масштаба можно кликнуть по картинке правой кнопкой мыши и выбрать «Открыть ссылку/изображение в новой вкладке/новом окне»)
Приемник
Перечень элементов приемной части беспроводного термометра на Arduino Mega (для увеличения масштаба можно кликнуть по картинке правой кнопкой мыши и выбрать «Открыть ссылку/изображение в новой вкладке/новом окне»)
Программа
Программа передатчика
Сперва рассмотрим программу передающей части:
// Подключаем необходимые библиотеки #include #include // Определение #define dhtPin 4 #define dhtType DHT11 #define txPowerPin 8 // Использование библиотеки DHT DHT dht(dhtPin, dhtType); // Переменные char msg0[3]; char msg1[3]; int tem = 0; int hum = 0; // Функция первоначальной настройки – выполняется только один раз при включении void setup() { pinMode(txPowerPin, OUTPUT); pinMode(txPowerPin, LOW); vw_setup(4800); // Скорость соединения VirtualWire vw_set_tx_pin(9); // Вывод передачи VirtualWire } // Функция цикла – выполняется всегда void loop() { digitalWrite(txPowerPin, HIGH); hum = dht.readHumidity(); // Переменная хранит влажность tem = dht.readTemperature(); // Переменная хранит температуру itoa(hum, msg1, 10); // Преобразование влажности в массив char itoa(tem, msg0, 10); // Преобразование температуры в массив char strcat(msg0, msg1); // Сложение/объединение двух массивов vw_send((uint8_t *)msg0, strlen(msg0)); // Передача сообщения vw_wait_tx(); // Ждем завершения передачи digitalWrite(txPowerPin, LOW); delay(5000); // Ждем 5 секунд и повторяем всё снова }
Для передачи влажности и температуры в одном сообщении я соединяю их вместе. Сначала данные считываются в переменную как целые числа, потом целые числа преобразовываются в массив символов, а затем они соединяются друг с другом.
На приемной стороне данные будут разделены на отдельные символы. Делая это, я ограничиваю себя двумя цифрами градусов. Если датчик находится в среде с температурой менее 10°C, я буду получать на дисплее символы мусора.
Например, если температура составляет 20°C, а влажность – 45%, то будет передаваться сообщение 2045, и всё хорошо. Если температура равна 9°C, а влажность – 78%, то передастся сообщение 978x, где «x» – случайный символ.
Поэтому, если вы будете собирать данный беспроводной термометр, я советую вам изменить программу для передачи правильных данных, когда температура будет меньше 10°C.
Программа приемника
// Подключаем необходимые библиотеки #include #include // Определение подключение LCD #define RS 9 #define E 10 #define D4 5 #define D5 6 #define D6 7 #define D7 8 LiquidCrystal lcd(RS, E, D4, D5, D6, D7); // Отрисовка символа градусов byte degreesymbol[8] = { B01100, B10010, B10010, B01100, B00000, B00000, B00000, B00000 }; // Переменные int tem = 0; int i; // Функция первоначальной настройки – выполняется только один раз при включении void setup() { lcd.begin(16,2); // Инициализация LCD lcd.createChar(1, degreesymbol); // Создание символа градусов в месте 1 Serial.begin(9600); // Для отладки vw_setup(4800); // Скорость соединения VirtualWire vw_rx_start(); // Готовность для приема vw_set_rx_pin(2); // Вывод приема VirtualWiore lcd.clear(); // Очистить LCD } // Функция цикла – выполняется всегда void loop() { uint8_t buf[VW_MAX_MESSAGE_LEN]; // Переменная для хранения принятых данных uint8_t buflen = VW_MAX_MESSAGE_LEN; // Переменная для хранения длины принятых данных lcd.setCursor(0,0); lcd.print(“Temp: “); if (vw_get_message(buf, &buflen)) // Если данные приняты { for (i=0;i
Погодная станция на Arduino

Данная погодная станция обеспечивает постоянное получение сведений о состоянии погодных условий. Проект основан на плате микроконтроллеров Arduino, а данные выводятся на LCD экран.
Ранее был проект вывода данных с датчиков на веб-страницу с помощью W5100.
Небольшой размер “железа” позволяет поместить устройство в маленьком пластиковом коробе, части которого изготовлены при помощи лазерной резки.
Датчик уровня воды и снега.
Индикатор уровня воды используется для вывода уровня воды в баке во избежании его переполнения.
DHT11 представляет собой комбинированный цифровой датчик температуры и влажности. Датчик обладает отличным качеством, высокой скоростью работы, противоинтерференционной способностью и самое главное – низкой стоимостью.
Фоторезисторы, также известные как светозависимые резисторы (LDR), являются светочувствительными устройствами, наиболее часто используемыми для определения наличия или отсутствия света, или для измерения интенсивности света. В темноте их сопротивление очень велико, но когда датчик LDR подвергается воздействию света, сопротивление резко падает, вплоть до нескольких Ом.
LCD1602 с шиной I2C. Синий потенциометр на ЖК-дисплее I2C 1602 используется только для подсветки.
I2C использует только две линии, Serial DataLine (SDA) и Serial Clock Line (SCL), которые подключаются к резисторам. Типичные напряжения – +5 В или +3,3 В, хотя допускаются системы с другими напряжениями.
DS1302 – часики реального времени.
Часы основаны на интегрированной микросхеме DS1302, внутри которой есть часы / календарь в реальном времени и 31 байт статической ОЗУ. Формат времени можно увидеть как hh/mm/ss, а формат даты – yyyy/mm/dd. Так же можно высчитать день недели.
LM35 – датчик температуры.
LM35 это прецизионный интегральный датчик температуры с широким диапазоном температур, высокой точностью измерения, калиброванным выходом по напряжению. Именно эти качества определяют популярность датчика.
Инфракрасный приемник и пульт дистанционного управления
Эти два компонента работают вместе: ИК-приемник позволяет получать данные с пульта дистанционного управления. Уже рассказывал как собрать контроллер вытяжки с управлением от пульта телевизора. Данные зависят от того, какую кнопку вы хотите нажать. Были выбраны следующие кнопки для назначения их определенным функциям:
Клавиша 0 – позволяет увидеть время и дату
Клавиша 1- позволяет увидеть данные с датчиков DHT11 и LM35
Клавиша 2- позволяет увидеть в процентах уровень освещенности
Клавиша 3- позволяет увидеть в миллиметрах уровень жидкости
Клавиша “Повтор”- прокручивает все окна с интервалом в 4 секунды Сборка корпуса. Рассмотрев размер устройства, мы продолжили строительство корпуса из плексигласа.
Размеры сторон с их взаимными блокирующими сиденьями и отверстиями для выхода проводов датчиков были рассчитаны с помощью программного обеспечения Autocad, после чего мы занялись вырезанием, используя машину для лазерной резки. И, наконец, мы собрали все с помощью мощного клея.
Файл исходник – Скачать.
Схема устройства была сделана в программной среде fritzing (скачать здесь).
Разрабатывали код в среде Arduino IDE, использовали все необходимые библиотеки. И вот что у нас получилось:
Это главный экран, который пользователь может видеть, когда мы включаем плату. При включении появляется надпись «Arduino Weather Station». Вы также можете увидеть эту надпись после каждого обращения к AWS.
Экран даты и времени, к которому пользователь может получить доступ, просто нажав кнопку 0 на пульте дистанционного управления. При нажатии экран имеет задержку в 10 секунд, а затем возвращается на главный экран.
Экран, который показывает данные, полученные датчиками DHT11 и LM35 относительно влажности и температуры соответственно. Он “привязан” к кнопке 1 на пульте дистанционного управления, и когда она нажимается, экран имеет задержку в 10 секунд, а затем возвращается на главный экран.
Экран уровень освещенности. Привязан к кнопке 2 на пульте ДУ.
Этот экран показывает уровень жидкости в баке. Он подключен к кнопке 3 на пульте дистанционного управления.
Сама программа станции
Код
LiquidCrystal_I2C lcd(0x27, 16, 2); dht DHT; const int DHT11_PIN = 4; const int waterSensor = 0; int waterValue = 0; int mmwaterValue = 0;
int sensorPin = A3; int luce = 0; int pluce = 0; float tem = 0; long lmVal = 0;
const int irReceiverPin = 3;
IRrecv irrecv(irReceiverPin); decode_results results;
uint8_t RST_PIN = 5; uint8_t SDA_PIN = 6; uint8_t SCL_PIN = 7;
char buf[50];
char day[10];
DS1302 rtc(RST_PIN, SDA_PIN, SCL_PIN);
void print_time()
{
Time t = rtc.time();
memset(day, 0, sizeof(day));
switch (t.day)
{
case 1:
strcpy(day, “Sun”);
break;
case 2:
strcpy(day, “Mon”);
break;
case 3:
strcpy(day, “Tue”);
break;
case 4:
strcpy(day, “Wed”);
break;
case 5:
strcpy(day, “Thu”);
break;
case 6:
strcpy(day, “Fri”);
break;
case 7:
strcpy(day, “Sat”);
break;
}
snprintf(buf, sizeof(buf), “%s %04d-%02d-%02d %02d:%02d:%02d”, day, t.yr, t.mon, t.date, t.hr, t.min, t.sec);
Serial.println(buf);
lcd.setCursor(2, 0);
lcd.print(t.yr);
lcd.print(“-“);
lcd.print(t.mon / 10);
lcd.print(t.mon % 10);
lcd.print(“-“);
lcd.print(t.date / 10);
lcd.print(t.date % 10);
lcd.print(” “);
lcd.print(day);
lcd.setCursor(4, 1);
lcd.print(t.hr);
lcd.print(“:”);
lcd.print(t.min / 10);
lcd.print(t.min % 10);
lcd.print(“:”);
lcd.print(t.sec / 10);
lcd.print(t.sec % 10);
}
void setup() {
Serial.begin(9600);
rtc.write_protect(false);
rtc.halt(false);
irrecv.enableIRIn(); lcd.init(); lcd.backlight(); pinMode(sensorPin, INPUT);
Time t(2017, 12, 03, 10, 15, 00, 1);
rtc.time(t);
}
void loop() {
lcd.setCursor(0, 0);
lcd.print(“A”);
delay(50);
lcd.setCursor(1, 0);
lcd.print(“r”);
delay(50);
lcd.setCursor(2, 0);
lcd.print(“d”);
delay(50);
lcd.setCursor(3, 0);
lcd.print(“u”);
delay(50);
lcd.setCursor(4, 0);
lcd.print(“i”);
delay(50);
lcd.setCursor(5, 0);
lcd.print(“n”);
delay(50);
lcd.setCursor(6, 0);
lcd.print(“o”);
delay(50);
lcd.setCursor(8, 0);
lcd.print(“W”);
delay(50);
lcd.setCursor(9, 0);
lcd.print(“e”);
delay(50);
lcd.setCursor(10, 0);
lcd.print(“a”);
delay(50);
lcd.setCursor(11, 0);
lcd.print(“t”);
delay(50);
lcd.setCursor(12, 0);
lcd.print(“h”);
delay(50);
lcd.setCursor(13, 0);
lcd.print(“e”);
delay(50);
lcd.setCursor(14, 0);
lcd.print(“r”);
delay(50);
lcd.setCursor(4, 1);
lcd.print(“S”);
delay(50);
lcd.setCursor(5, 1);
lcd.print(“t”);
delay(50);
lcd.setCursor(6, 1);
lcd.print(“a”);
delay(50);
lcd.setCursor(7, 1);
lcd.print(“t”);
delay(50);
lcd.setCursor(8, 1);
lcd.print(“i”);
delay(50);
lcd.setCursor(9, 1);
lcd.print(“o”);
delay(50);
lcd.setCursor(10, 1);
lcd.print(“n”);
delay(50);
if (irrecv.decode(&results)) { if (results.value == 0xFF6897) {
lcd.clear(); print_time();
delay(10000); lcd.clear(); delay (200); irrecv.resume(); }
if (results.value == 0xFF30CF) {
lcd.clear(); int chk = DHT.read11(DHT11_PIN);
lcd.setCursor(0, 0);
lcd.print(“Tem:”);
lmVal = analogRead(lmPin);
tem = (lmVal * 0.0048828125 * 100);
lcd.print(tem);
lcd.print(char(223));
lcd.print(“C “);
lcd.setCursor(0, 1);
lcd.print(“Hum:”);

