Метеостанция на arduino и mr3020 для народного мониторинга

Домашняя метеостанция на базе Ардуино

Метеостанция на arduino и mr3020 для народного мониторинга

Facebook

ВКонтакте

Twitter

Google+

ОК

Давненько хотелось сделать мини метеостанцию-надоело выглядывать в окно чтобы посмотреть на градусник за стеклом. Этот приборчик заменит гигрометр, барометр и термометр а также покажет текущее время. В данном посту я расскажу как быстро и просто собрать небольшую метеостанцию на базе Ардуино. Основой будет плата Arduino Nano можно применить другие платы- Arduino Uno, Arduino Pro mini). Данные атмосферного давления и температуры в помещении будем получать с датчика BMP180, а влажность и температуру на улице с датчика DHT11. Часы реального времени DS1302 будут указывать текущее время. Всю информацию выводим на двухстрочный дисплей LCD1602.

Датчик DHT11 передает информацию по одному проводу на ардуино. Питается напряжением 5 В. Он измеряет влажность в пределах от 20 до 80%. Температура измеряет в диапазоне от 0 до 50оС.

Датчик BMP180 измеряет атмосферное давление диапазоне 300-1100 hPa, температуру в диапазоне -40 +85оС. Напряжение питания составляет 3.3 В. Подключается по протоколу связи I2C.
Часы реального времени DS1302 питаются напряжением 5 В и подключается по протоколу связи I2C. При установке в соответствующее гнездо батарейки CR2032 поддерживают ход часов при отключении основного питания.Дисплей LCD1602 питается напряжением 5 Вольт и также подключается по протоколу связи I2C.
Эта самоделка сделана на базе готовых плат и датчиков, поэтому ее можно повторить любому начинающему любителю поработать с паяльником. Заодно можно получить азы программирования Ардуино. Я программировал эту метеостанцию в программе визуального программирования FLPROG за 15 минут. Не нужно вручную часами писать скетчи, данная программа помогает начинающим (и не только) быстро освоить азы программирования устройств на основании платформы Ардуино. Кому лень повозиться с программой – скетч ( только выставлять текущее время часов надо будет):#include #include “DHT_NEW.h” #include #include #include BMP085 _bmp085 = BMP085(); long _bmp085P = 0; long _bmp085T = 0; long _bmp085A = 0; LiquidCrystal_I2C _lcd1(0x3f, 16, 2); int _dispTempLength1=0; boolean _isNeedClearDisp1; DHT _dht1; iarduino_RTC _RTC1(RTC_DS1302, 7, 5, 6); unsigned long _dht1LRT = 0UL; unsigned long _dht1Tti = 0UL; int _disp1oldLength = 0; unsigned long _bmp0852Tti = 0UL; String _RTC1_GetTime2_StrOut; int _disp2oldLength = 0; void setup() { Wire.begin(); delay(10); _bmp085.init(MODE_ULTRA_HIGHRES,116, true); _RTC1.begin(); _RTC1.period(1); _lcd1.init(); _lcd1.backlight(); _dht1.setup(4); _dht1LRT = millis(); _dht1Tti = millis(); } void loop() {if (_isNeedClearDisp1) {_lcd1.clear(); _isNeedClearDisp1= 0;} if(_isTimer(_bmp0852Tti, 1000)) { _bmp0852Tti = millis(); _bmp085.getAltitude(&_bmp085A); _bmp085.getPressure(&_bmp085P); _bmp085.getTemperature(&_bmp085T); } //Плата:1 if (1) { _dispTempLength1 = ((((((String(“T:”)) + (( _floatToStringWitRaz((_bmp085T)/(10.00),1))) + (String(“*”)))) + (((String(“P:”)) + (( _floatToStringWitRaz((_bmp085P)/(133.3),0))) + (String(“*”)))) + (((String(“”)) + (( _floatToStringWitRaz(_dht1.humidity,0))) + (String(“%”))))).length(); if (_disp1oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} _disp1oldLength = _dispTempLength1; _lcd1.setCursor(int((16 — _dispTempLength1)/2), 0); _lcd1.print((((((String(“T:”)) + (( _floatToStringWitRaz((_bmp085T)/(10.00),1))) + (String(“*”)))) + (((String(“P:”)) + (( _floatToStringWitRaz((_bmp085P)/(133.3),0))) + (String(“*”)))) + (((String(“”)) + (( _floatToStringWitRaz(_dht1.humidity,0))) + (String(“%”))))); } else { if (_disp1oldLength > 0) {_isNeedClearDisp1 = 1; _disp1oldLength = 0;} } if(_isTimer(_dht1Tti, 2000)) { if(_isTimer(_dht1LRT, ( _dht1.getMinimumSamplingPeriod()))) { _dht1.readSensor(); _dht1LRT = millis(); _dht1Tti = millis(); } } if (1) { _dispTempLength1 = ((((((String(“t:”)) + (( _floatToStringWitRaz(_dht1.temperature,0))) + (String(“*”)))) + (_RTC1_GetTime2_StrOut)))).length(); if (_disp2oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} _disp2oldLength = _dispTempLength1; _lcd1.setCursor(int((16 — _dispTempLength1)/2), 1); _lcd1.print((((((String(“t:”)) + (( _floatToStringWitRaz(_dht1.temperature,0))) + (String(“*”)))) + (_RTC1_GetTime2_StrOut)))); } else { if (_disp2oldLength > 0) {_isNeedClearDisp1 = 1; _disp2oldLength = 0;} } _RTC1_GetTime2_StrOut = _RTC1.gettime(“H:i:sD”); } String _floatToStringWitRaz(float value, int raz) { return String(value, raz); } bool _isTimer(unsigned long startTime, unsigned long period ) { unsigned long currentTime; currentTime = millis(); if (currentTime>= startTime) {return (currentTime>=(startTime + period));} else {return (currentTime >=(4294967295-startTime+period));} }
Применять такой прибор можно где угодно или дома, на природе или поместить в автомобиль. Есть возможность запитать схему от аккумуляторов, применив плату заряда, в итоге будет переносная модель метеостанции. Всю информацию можно получить посмотрев в видео:Перечень материалов и инструментов -плата Arduino Nano -двухстрочный дисплей LCD1602; -часы реального времени DS1302; -датчик атмосферное давления и температуры BMP180; -датчик температуры и влажности DHT11; -блок зарядки от телефона; -любой подходящий корпус -пинцет; ножницы; -паяльник; -кембрик; -тестер; -соединительные провода;-провод четырехжильный для выносного датчика.

Шаг первый. Делаем корпус для метеостанции

Подобрал пластмассовую коробочку из магазина Fix Price (всего то 17р). Предварительно вырезал в крышке окно для дисплея.

Затем вырезал частично перегородки в коробке, сделал отверстия для USB разъема платы Arduino проем для датчика BMP180 Датчика BMP180 будет находится на наружной стороне корпуса, чтобы исключить лишний нагрев от электронной начинки находящейся внутри.

После я покрасил корпус самоделки изнутри потому что пластик прозрачный. Коробка закрывается на защелку и в ней все элементы неплохо поместились.

Шаг второй. Сборка схемы прибора.

Фото схемы

Далее надо скоммутировать по схеме все платы и датчики метеостанции. Делаем это с помощью монтажных проводов с соответствующими разъемами. Я не делал соединения на пайке ,так в перспективе при выходе какого то модуля из строя (или по другим причинам) можно легко его заменить. На винтовом разъеме подключается кабель датчика DHT11 идущий на улицу.

Питание можно осуществить с разъема USB платы Ардуино на компьютер, или подав напряжение 7-12В на контакт VIN и GND. Сначала я собрал схему вне корпуса и запрограммировал и отладил ее в программе FLPROG. Фото блок схемы в программе FLPROG.Когда первый раз запрограммировал и включил схема метеостанции заработала.

Сейчас стало возможным иметь данные о погоде за бортом и в комнате. В общем получилась интересная домашняя метеостанция с множеством различных функций. Фото в сбореНеплохая получилась самодельная конструкция собранная в выходные. Было увлекательно самому сделать интересный и полезный приборчик.

Сделать самостоятельно такой девайс, я думаю по плечу даже начинающему.Это не требует больших затрат времени и денег. Применить можно его где хочешь в доме на загородной даче. На всю работу пошло два выходных вечера всю электронику брал на Алиэкспресс. Остальные материалы нашлись у меня по сусекам.

На базе платформы Ардуино можно собирать множество разнообразных полезных устройств.

Всем спасибо за внимание, вам успехов и удачи и в вашей жизни и в творчестве!

Становитесь автором сайта, публикуйте собственные статьи, описания самоделок с оплатой за текст. Подробнее здесь.

Идея

Описание

Исполнение

Итоговая оценка: 10

Отправка данных о температуре с роутера TL-MR3020 и Raspberry Pi на «Народный мониторинг»

Метеостанция на arduino и mr3020 для народного мониторинга

В следствии возникновения вопросов, позволю себе небольшой комментарий, немного проясняющий смысл статьи.

В статье описывается два устройства, не зависящих друг от друга, и выполняющих идентичные задачи по отправке данных на сайт «Народный мониторинг»

Когда я впервые увидел статью на хабре «Народный мониторинг температуры (vs прогноз) в различных городах. Нужен ли?», посвященную мониторингу параметров среды narodmon.

ru, я как-то скептически отнесся к такой затее и забыл про нее.

Перед новым годом у меня появилась Raspberry Pi и какое-то время ушло на ее освоение и обзор возможностей, в итоге что-бы малинка не простаивала, да и так для общего развития по статье «История взаимодействия «чайника» и DS18B20 посредством Raspberry Pi» сделал тоже самое, но с учетом исходников первоисточника, в который уже внесены изменения по мотивам вышеприведенной статьи с ссылкой на хабр. Температура измерялась, графики строились, но как-то скучно стало за этим наблюдать, да и применение малинки в этих целях это как из пушки по воробьям, и в один прекрасный день я вспомнил про «Народный мониторинг», на котором вся отображаемая на сайте информация выводится только на основании сведений о текущих параметрах среды(температура, влажность, атм.давление и др.) передаваемых с клиентских устройств пользователей данного сервиса. Начал искать и нашел статью «Лучшая реализация реализация UART => 1-wire и I2C/SPI на базе роутеров». Тут я и загорелся идеей сделать такое устройство, правда в надежде на то, что кто-то уже это сделал, а я только повторю, благо роутер TL-MR3020 уже имелся в хозяйстве, и над ним уже ставились бесчеловечные опыты по привинчиванию его к «самокатной телеге» с камерой по мотивам статьи «Простой wifi бот для мониторинга помещений или «кухонное» роботостроение».

Итак, приступим

Начал я с опытов над роутером, на нем на тот момент была прошивка OR-WRT 0.70, основанная на OpenWRT. Подключается датчик температуры к роутеру через преходник USB-UART. Схема подключения предельно проста. Текст и фото с сайта http://cyber-place.

ru Подключить датчик к UART можно по ниже приведенному рисунку Соеденить RX и TX вместе и подключить к ним data линию 1-Wire датчика DS18B20 VCC к VCC GND к GND

При попытке подключения и считывания данных через родной UART роутера выяснилось, что сделать с наскока это не получится.

На одном буржуйском форуме была найдена информация о том, что ограничение это аппаратное и накладывает его сам роутеровский порт, который заточен под 8 бит данных, а в digitemp (пакет для считывания данных с датчиков 1-wire) используется только 6.

Решено – придется ставить переходник USB-COM на FT232 или PL2303, возможен еще вариант на CP2102, но его у меня в наличии нет, а посему буду использовать то что есть. После этого я решил попробовать силы в написании скрипта отправки полученных данных на «Народный мониторинг».

На данный сервис отправка данных должна осуществляться двумя методами на выбор, либо telnet TCP/UDP (рекомендуемый), либо HTTP POST. Примеры отправки данных на PHP имеются на сайте. PHP для меня темный лес, но все же это лучше чем ничего. После первой же попытки установить PHP на роутер стало ясно, что имеющихся в нем 4МБ памяти маловато, и фокус не удастся.

Тогда я начал думать об увеличении объема флеш-памяти и наткнулся на том-же cyber-place.ru на тему «Замена и восстановление Flash ROM в роутере MR3020 и WR703n». Но после некоторых раздумий пришел к выводу что это не по фэн-шую, для меня и для большинства это довольно трудоемко, плюс требуется программатор, который не у всех есть, и забил на это дело.

Решил написать на bash необходимый скрипт, но советы с гуглом не принесли результата, и пара дней прошло зря. В итоге было решено поставить USB-HUB (видел в сети благополучные опыты по вживлению оных во внутренности роутера), и к нему подключить внешний накопитель и USB-UART мост.

Сказано – сделано, но в будущем, после удачного завершения опытов с Raspberry Pi и PHP, а в тот момент я как раз перекинулся на эти опыты. Перенесемся в будущее, задуманные опыты над малинкой и ПХП благополучно закончены, о чем я напишу ниже, продолжим опыты с роутером. Для увеличения объема памяти используется ее перенос на внешнюю флешку, а это значит что тот роутер который у меня был настроен на работу с «самокатной телегой» будет окончательно и бесповоротно переведен на использование с дополнительной памятью, чего делать категорически не хотелось. На следующий день был куплен еще 1 роутер и самый маленький USB-HUB, так-как потерять достигнутые результаты было жалко, тем более что это все же должны быть разные устройства.

Для «термометра» я решил использовать чистую OpenWRT. Скачав ее при попытке установки в поле выбора имени файла поиском по первым буквам обнаружил что у меня там целых 3 прошивки с одинаковым размером и именем файла, отличался только порядковый номер закачки файла. Я решил что когда-то уже качал эту прошивку и выбрал на угад одну из трех.

После прошивки мне не удавались ни какие первичные действия из мануала на OpenWRT. Думал уже что что-то пошло не так во время прошивки и начал изучать методы извлечения роутера из кирпича через TFTP. Весь вечер на это положил, благо до практики руки не дошли, в теории было много не понятного. И под конец вечера что-то меня дернуло попробовать выполнить первоначальные настройки как для OR-WRT 0.

70. Мне повезло, оказалось что я залил именно ее. Потом при сравнивании имен скачиваемых файлов оказалось что и OpenWRT и OR-WRT имеют одинаковые названия. Далее я потратил энное количество времени на попытку расширить память на внешнюю флешку, после чего было принято решение о заливке другой прошивки OR-WRT 0.75 alpha с уже имеющейся поддержкой флешек.

Без проблем прошил и настроил по инструкции свой роутер и приступил к дальнейшим действиям.

По накатанной в /etc/opkg.conf изменил адрес репозитория на downloads.openwrt.org/snapshots/trunk/ar71xx/packages, обновил список пакетов

opkg update

установил пакеты digitemp-a

opkg install digitemp-usb

opkg install digitemp

После этого командой dmesg выяснил куда подключен адаптер FTDI, у меня оказался ttyUSB0. Выполняем поиск устройств 1-wire

digitemp_DS9097 -i -s /dev/ttyUSB0

если нашлись, то считываем показания температуры и пишем в файл

digitemp_DS9097 -a -A -l /tmp/1wire_log

что бы посмотреть результат вводим

cat /tmp/1wire_log

Все работает. Далее устанавливаем пакеты для работы PHP

opkg install php5

opkg install php5-cgi И начинаем заниматься написанием скриптов. В этом деле я не мастак, поэтому прошу сильно не пинать за кривость кода и огромные костыли, подставленные, чтобы это все заработало. Написано было два скрипта, один на bash, другой на php. Вернее тот, что на php был сделан на основе исходников с сайта «Народный мониторинг». Первый скрипт выуживает данные полученные от пакета digitemp и записанные в файл 1wire_log, и подгоняет их в удобоваримый вид. После чего передает управление второму скрипту на php для отправки данных на сервер.Первый скрипт get_send.sh#!/bin/bash rm /temperatura/1wire_log rm /temperatura/temp rm /temperatura/temper cd / digitemp_DS9097 -i -s /dev/ttyUSB0 sleep 1s digitemp_DS9097 -a -A -l /temperatura/1wire_log sleep 2s cd /temperatura cut -c29-33 1wire_log | sed 's/$//' > temp cat temp | tr -d '
' > temper php-cgi /temperatura/send.php echo «OK
»Второй скрипт берет данные из файла, подготовленного первым скриптом, и отправляет их на сервер.Второй скрипт send.php

Метеостанция на Arduino (часть 1). — DRIVE2

Метеостанция на arduino и mr3020 для народного мониторинга

Решил я как то соорудить погодную станцию. Прогноз погоды не всегда точен, да и намного оперативнее прогнозировать имея собственное устройство.Вещь практически незаменимая при выездах на природу. Надеюсь джиперы оценят ) ) ).

Я небуду рассказывать как я учился программировать и т.д., просто приложу код и ссылки на библиотеки.Всё это можно собрать практически на коленке.

ИтакСписок материалов:-Arduino NANO-Дисплей LCD NOKIA 5110-Датчик давления-резисторы 10 кОм 2 шт-Монтажная плата-провода

Прямые руки приветствуются ) ) )

Скетч.


/* SFE_BMP180 library example sketch

Hardware connections:BMP180— (GND) to GND+ (VDD) to 3.3V(WARNING: do not connect + to 5V or the sensor will be damaged!)You will also need to connect the I2C pins (SCL and SDA) to yourArduino. The pins are different on different Arduinos:Any Arduino pins labeled: SDA SCLUno, Redboard, Pro: A4 A5Mega2560, Due: 20 21

Leonardo: 2 3

LCD Nokia 5110 ARDUINO1 RST 32 CE 43 DC 54 DIN 65 CLK 76 VCC 3.3V7 LIGHT GND

8 GND GND

Button Temperature12Button Pressure

11

V1.0 masterhi, 13/01/2017

*/

#include #include #include #include #include Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);BMP180 sensor;float T = 0;float P = 0;const int ButtonP = 11;const int ButtonT = 12;int timert =0;

int timerp =0;

int t1 =0;int t2 =0;int t3 =0;int t4 =0;int t5 =0;int t6 =0;int t7 =0;int t8 =0;int t9 =0;int t10 =0;int t11 =0;int t12 =0;int t13 =0;int t14 =0;int t15 =0;int t16 =0;int t17 =0;int t18 =0;int t19 =0;int t20 =0;int t21 =0;int t22 =0;int t23 =0;int t24 =0;int t25 =0;int t26 =0;int t27 =0;int t28 =0;int t29 =0;int t30 =0;int t31 =0;int t32 =0;int t33 =0;int t34 =0;int t35 =0;int t36 =0;int t37 =0;int t38 =0;int t39 =0;int t40 =0;int t41 =0;int t42 =0;int t43 =0;int t44 =0;int t45 =0;int t46 =0;int t47 =0;int t48 =0;int t49 =0;int t50 =0;int t51 =0;int t52 =0;int t53 =0;int t54 =0;int t55 =0;int t56 =0;int t57 =0;int t58 =0;int t59 =0;int t60 =0;int t61 =0;int t62 =0;int t63 =0;int t64 =0;int t65 =0;int t66 =0;int t67 =0;int t68 =0;int t69 =0;

int t70 =0;

int p1 =0;int p2 =0;int p3 =0;int p4 =0;int p5 =0;int p6 =0;int p7 =0;int p8 =0;int p9 =0;int p10 =0;int p11 =0;int p12 =0;int p13 =0;int p14 =0;int p15 =0;int p16 =0;int p17 =0;int p18 =0;int p19 =0;int p20 =0;int p21 =0;int p22 =0;int p23 =0;int p24 =0;int p25 =0;int p26 =0;int p27 =0;int p28 =0;int p29 =0;int p30 =0;int p31 =0;int p32 =0;int p33 =0;int p34 =0;int p35 =0;int p36 =0;int p37 =0;int p38 =0;int p39 =0;int p40 =0;int p41 =0;int p42 =0;int p43 =0;int p44 =0;int p45 =0;int p46 =0;int p47 =0;int p48 =0;int p49 =0;int p50 =0;int p51 =0;int p52 =0;int p53 =0;int p54 =0;int p55 =0;int p56 =0;int p57 =0;int p58 =0;int p59 =0;

int p60 =0;

void GraphTemp(){display.clearDisplay();display.setCursor(20, 0);display.print(“T=”);display.print(T,2);display.drawFastVLine(63, 1, 2, BLACK);display.drawFastHLine(64, 0, 2, BLACK);display.drawFastVLine(66, 1, 2, BLACK);display.drawFastHLine(64, 3, 2, BLACK);display.println(” C”);display.setCursor(0, 8);display.print(“+”);display.setCursor(0, 24);display.

print(“0”);display.setCursor(79, 24);display.print(“t”);display.setCursor(0, 40);display.print(“-“);display.drawFastVLine(7, 8, 40, BLACK);display.drawFastHLine(7, 27, 71, BLACK);display.drawPixel(78, 27-t1/2, BLACK);display.drawPixel(77, 27-t2/2, BLACK);display.drawPixel(76, 27-t3/2, BLACK);display.drawPixel(75, 27-t4/2, BLACK);display.

drawPixel(74, 27-t5/2, BLACK);display.drawPixel(73, 27-t6/2, BLACK);display.drawPixel(72, 27-t7/2, BLACK);display.drawPixel(71, 27-t8/2, BLACK);display.drawPixel(70, 27-t9/2, BLACK);display.drawPixel(69, 27-t10/2, BLACK);display.drawPixel(68, 27-t11/2, BLACK);display.drawPixel(67, 27-t12/2, BLACK);display.drawPixel(66, 27-t13/2, BLACK);display.

drawPixel(65, 27-t14/2, BLACK);display.drawPixel(64, 27-t15/2, BLACK);display.drawPixel(63, 27-t16/2, BLACK);display.drawPixel(62, 27-t17/2, BLACK);display.drawPixel(61, 27-t18/2, BLACK);display.drawPixel(60, 27-t19/2, BLACK);display.drawPixel(59, 27-t20/2, BLACK);display.drawPixel(58, 27-t21/2, BLACK);display.drawPixel(57, 27-t22/2, BLACK);display.

drawPixel(56, 27-t23/2, BLACK);display.drawPixel(55, 27-t24/2, BLACK);display.drawPixel(54, 27-t25/2, BLACK);display.drawPixel(53, 27-t26/2, BLACK);display.drawPixel(52, 27-t27/2, BLACK);display.drawPixel(51, 27-t28/2, BLACK);display.drawPixel(50, 27-t29/2, BLACK);display.drawPixel(49, 27-t30/2, BLACK);display.drawPixel(48, 27-t31/2, BLACK);display.

drawPixel(47, 27-t32/2, BLACK);display.drawPixel(46, 27-t33/2, BLACK);display.drawPixel(45, 27-t34/2, BLACK);display.drawPixel(44, 27-t35/2, BLACK);display.drawPixel(43, 27-t36/2, BLACK);display.drawPixel(42, 27-t37/2, BLACK);display.drawPixel(41, 27-t38/2, BLACK);display.drawPixel(40, 27-t39/2, BLACK);display.drawPixel(39, 27-t40/2, BLACK);display.

drawPixel(38, 27-t41/2, BLACK);display.drawPixel(37, 27-t42/2, BLACK);display.drawPixel(36, 27-t43/2, BLACK);display.drawPixel(35, 27-t44/2, BLACK);display.drawPixel(34, 27-t45/2, BLACK);display.drawPixel(33, 27-t46/2, BLACK);display.drawPixel(32, 27-t47/2, BLACK);display.drawPixel(31, 27-t48/2, BLACK);display.drawPixel(30, 27-t49/2, BLACK);display.

drawPixel(29, 27-t50/2, BLACK);display.drawPixel(28, 27-t51/2, BLACK);display.drawPixel(27, 27-t52/2, BLACK);display.drawPixel(26, 27-t53/2, BLACK);display.drawPixel(25, 27-t54/2, BLACK);display.drawPixel(24, 27-t55/2, BLACK);display.drawPixel(23, 27-t56/2, BLACK);display.drawPixel(22, 27-t57/2, BLACK);display.drawPixel(21, 27-t58/2, BLACK);display.

drawPixel(20, 27-t59/2, BLACK);display.drawPixel(19, 27-t60/2, BLACK);display.drawPixel(18, 27-t61/2, BLACK);display.drawPixel(17, 27-t62/2, BLACK);display.drawPixel(16, 27-t63/2, BLACK);display.drawPixel(15, 27-t64/2, BLACK);display.drawPixel(14, 27-t65/2, BLACK);display.drawPixel(13, 27-t66/2, BLACK);display.drawPixel(12, 27-t67/2, BLACK);display.

drawPixel(11, 27-t68/2, BLACK);display.drawPixel(10, 27-t69/2, BLACK);display.drawPixel(9, 27-t70/2, BLACK);display.display();

}

void GraphPress(){display.clearDisplay();display.setCursor(5, 0);display.print(“P=”);display.print(P,2);display.println(” inHg”);display.setCursor(0, 8);display.print(“790”);display.setCursor(0, 24);display.print(“760”);display.setCursor(79, 40);display.print(“t”);display.setCursor(0, 40);display.print(“730”);display.drawFastVLine(18, 8, 40, BLACK);display.

drawFastHLine(18, 47, 60, BLACK);display.drawFastVLine(77, 27+(760-p1)/1.5,48-(27+(760-p1)/1.5), BLACK);display.drawFastVLine(76, 27+(760-p2)/1.5,48-(27+(760-p2)/1.5), BLACK);display.drawFastVLine(75, 27+(760-p3)/1.5,48-(27+(760-p3)/1.5), BLACK);display.drawFastVLine(74, 27+(760-p4)/1.5,48-(27+(760-p4)/1.5), BLACK);display.drawFastVLine(73, 27+(760-p5)/1.5,48-(27+(760-p5)/1.5), BLACK);display.

drawFastVLine(72, 27+(760-p6)/1.5,48-(27+(760-p6)/1.5), BLACK);display.drawFastVLine(71, 27+(760-p7)/1.5,48-(27+(760-p7)/1.5), BLACK);display.drawFastVLine(70, 27+(760-p8)/1.5,48-(27+(760-p8)/1.5), BLACK);display.drawFastVLine(69, 27+(760-p9)/1.5,48-(27+(760-p9)/1.5), BLACK);display.drawFastVLine(68, 27+(760-p10)/1.5,48-(27+(760-p10)/1.5), BLACK);display.drawFastVLine(67, 27+(760-p11)/1.

5,48-(27+(760-p11)/1.5), BLACK);display.drawFastVLine(66, 27+(760-p12)/1.5,48-(27+(760-p12)/1.5), BLACK);display.drawFastVLine(65, 27+(760-p13)/1.5,48-(27+(760-p13)/1.5), BLACK);display.drawFastVLine(64, 27+(760-p14)/1.5,48-(27+(760-p14)/1.5), BLACK);display.drawFastVLine(63, 27+(760-p15)/1.5,48-(27+(760-p15)/1.5), BLACK);display.drawFastVLine(62, 27+(760-p16)/1.5,48-(27+(760-p16)/1.

5), BLACK);display.drawFastVLine(61, 27+(760-p17)/1.5,48-(27+(760-p17)/1.5), BLACK);display.drawFastVLine(60, 27+(760-p18)/1.5,48-(27+(760-p18)/1.5), BLACK);display.drawFastVLine(59, 27+(760-p19)/1.5,48-(27+(760-p19)/1.5), BLACK);display.drawFastVLine(58, 27+(760-p20)/1.5,48-(27+(760-p20)/1.5), BLACK);display.drawFastVLine(57, 27+(760-p21)/1.5,48-(27+(760-p21)/1.5), BLACK);display.

drawFastVLine(56, 27+(760-p22)/1.5,48-(27+(760-p22)/1.5), BLACK);display.drawFastVLine(55, 27+(760-p23)/1.5,48-(27+(760-p23)/1.5), BLACK);display.drawFastVLine(54, 27+(760-p24)/1.5,48-(27+(760-p24)/1.5), BLACK);display.drawFastVLine(53, 27+(760-p25)/1.5,48-(27+(760-p25)/1.5), BLACK);display.drawFastVLine(52, 27+(760-p26)/1.5,48-(27+(760-p26)/1.5), BLACK);display.drawFastVLine(51, 27+(760-p27)/1.

5,48-(27+(760-p27)/1.5), BLACK);display.drawFastVLine(50, 27+(760-p28)/1.5,48-(27+(760-p28)/1.5), BLACK);display.drawFastVLine(49, 27+(760-p29)/1.5,48-(27+(760-p29)/1.5), BLACK);display.drawFastVLine(48, 27+(760-p30)/1.5,48-(27+(760-p30)/1.5), BLACK);display.drawFastVLine(47, 27+(760-p31)/1.5,48-(27+(760-p31)/1.5), BLACK);display.drawFastVLine(46, 27+(760-p32)/1.5,48-(27+(760-p32)/1.

5), BLACK);display.drawFastVLine(45, 27+(760-p33)/1.5,48-(27+(760-p33)/1.5), BLACK);display.drawFastVLine(44, 27+(760-p34)/1.5,48-(27+(760-p34)/1.5), BLACK);display.drawFastVLine(43, 27+(760-p35)/1.5,48-(27+(760-p35)/1.5), BLACK);display.drawFastVLine(42, 27+(760-p36)/1.5,48-(27+(760-p36)/1.5), BLACK);display.drawFastVLine(41, 27+(760-p37)/1.5,48-(27+(760-p37)/1.5), BLACK);display.

drawFastVLine(40, 27+(760-p38)/1.5,48-(27+(760-p38)/1.5), BLACK);display.drawFastVLine(39, 27+(760-p39)/1.5,48-(27+(760-p39)/1.5), BLACK);display.drawFastVLine(38, 27+(760-p40)/1.5,48-(27+(760-p40)/1.5), BLACK);display.drawFastVLine(37, 27+(760-p41)/1.5,48-(27+(760-p41)/1.5), BLACK);display.drawFastVLine(36, 27+(760-p42)/1.5,48-(27+(760-p42)/1.5), BLACK);display.drawFastVLine(35, 27+(760-p43)/1.

5,48-(27+(760-p43)/1.5), BLACK);display.drawFastVLine(34, 27+(760-p44)/1.5,48-(27+(760-p44)/1.5), BLACK);display.drawFastVLine(33, 27+(760-p45)/1.5,48-(27+(760-p45)/1.5), BLACK);display.drawFastVLine(32, 27+(760-p46)/1.5,48-(27+(760-p46)/1.5), BLACK);display.drawFastVLine(31, 27+(760-p47)/1.5,48-(27+(760-p47)/1.5), BLACK);display.drawFastVLine(30, 27+(760-p48)/1.5,48-(27+(760-p48)/1.

5), BLACK);display.drawFastVLine(29, 27+(760-p49)/1.5,48-(27+(760-p49)/1.5), BLACK);display.drawFastVLine(28, 27+(760-p50)/1.5,48-(27+(760-p50)/1.5), BLACK);display.drawFastVLine(27, 27+(760-p51)/1.5,48-(27+(760-p51)/1.5), BLACK);display.drawFastVLine(26, 27+(760-p52)/1.5,48-(27+(760-p52)/1.5), BLACK);display.drawFastVLine(25, 27+(760-p53)/1.5,48-(27+(760-p53)/1.5), BLACK);display.

drawFastVLine(24, 27+(760-p54)/1.5,48-(27+(760-p54)/1.5), BLACK);display.drawFastVLine(23, 27+(760-p55)/1.5,48-(27+(760-p55)/1.5), BLACK);display.drawFastVLine(22, 27+(760-p56)/1.5,48-(27+(760-p56)/1.5), BLACK);display.drawFastVLine(21, 27+(760-p57)/1.5,48-(27+(760-p57)/1.5), BLACK);display.drawFastVLine(20, 27+(760-p58)/1.5,48-(27+(760-p58)/1.5), BLACK);display.drawFastVLine(19, 27+(760-p59)/1.

5,48-(27+(760-p59)/1.5), BLACK);display.drawFastVLine(18, 27+(760-p60)/1.5,48-(27+(760-p60)/1.5), BLACK);display.display();

}

void Pokazaniya(){display.clearDisplay();display.setCursor(0, 0);display.println(” Davlenie:”);display.print(” “);display.print(P,2);display.println(” inHg”);display.print(“==============”);display.println(” Temperatura:”);display.print(” “);display.print(T,2);display.println(” C”);display.display();

}

void Temp(){t70 = t69;t69 = t68;t68 = t67;t67 = t66;t66 = t65;t65 = t64;t64 = t63;t63 = t62;t62 = t61;t61 = t60;t60 = t59;t59 = t58;t58 = t57;t57 = t56;t56 = t55;t55 = t54;t54 = t53;t53 = t52;t52 = t51;t51 = t50;t50 = t49;t49 = t48;t48 = t47;t47 = t46;t46 = t45;t45 = t44;t44 = t43;t43 = t42;t42 = t41;t41 = t40;t40 = t39;t39 = t38;t38 = t37;t37 = t36;t36 = t35;t35 = t34;t34 = t33;t33 = t32;t32 = t31;t31 = t30;t30 = t29;t29 = t28;t28 = t27;t27 = t26;t26 = t25;t25 = t24;t24 = t23;t23 = t22;t22 = t21;t21 = t20;t20 = t19;t19 = t18;t18 = t17;t17 = t16;t16 = t15;t15 = t14;t14 = t13;t13 = t12;t12 = t11;t11 = t10;t10 = t9;t9 = t8;t8 = t7;t7 = t6;t6 = t5;t5 = t4;t4 = t3;t3 = t2;t2 = t1;t1 = T;timert = 0;

}

void Pres(){p60 = p59;p59 = p58;p58 = p57;p57 = p56;p56 = p55;p55 = p54;p54 = p53;p53 = p52;p52 = p51;p51 = p50;p50 = p49;p49 = p48;p48 = p47;p47 = p46;p46 = p45;p45 = p44;p44 = p43;p43 = p42;p42 = p41;p41 = p40;p40 = p39;p39 = p38;p38 = p37;p37 = p36;p36 = p35;p35 = p34;p34 = p33;p33 = p32;p32 = p31;p31 = p30;p30 = p29;p29 = p28;p28 = p27;p27 = p26;p26 = p25;p25 = p24;p24 = p23;p23 = p22;p22 = p21;p21 = p20;p20 = p19;p19 = p18;p18 = p17;p17 = p16;p16 = p15;p15 = p14;p14 = p13;p13 = p12;p12 = p11;p11 = p10;p10 = p9;p9 = p8;p8 = p7;p7 = p6;p6 = p5;p5 = p4;p4 = p3;p3 = p2;p2 = p1;p1 = P;timerp =0;

}

void setup() {pinMode(ButtonT, INPUT);pinMode(ButtonP, INPUT);display.begin();display.clearDisplay();display.setContrast(60);display.setTextSize(1);display.setTextColor(BLACK);Serial.begin(9600);delay(1000);sensor.begin();

}

void loop() {if(sensor.read()) {Serial.println((String)”CEHCOP BMP180: P=”+sensor.pres+” MM.PT.CT — T=”+sensor.temp+” *C — B=”+sensor.alti+” M.”);}else {Serial.println( “CEHCOP BMP180: HET OTBETA”);}T = sensor.temp;P = sensor.

pres;if(timert == 20){Temp();}if(timerp == 300){Pres();}if(digitalRead(ButtonT) == LOW & digitalRead(ButtonP) == LOW){Pokazaniya();}if(digitalRead(ButtonT) == HIGH & digitalRead(ButtonP) == LOW){GraphTemp();}if(digitalRead(ButtonT) == LOW & digitalRead(ButtonP) == HIGH){GraphPress();}if(digitalRead(ButtonT) == HIGH & digitalRead(ButtonP) == HIGH){Pokazaniya();}timert = timert+1;timerp = timerp+1;delay(3000);}

Пример работы

Фото.

Библиотеки
iarduino.ru/file/227.html
github.com/adafruit/Adafruit-GFX-Library
github.com/PaulStoffregen/SPI
github.com/adafruit/Adafr…44-Nokia-5110-LCD-library
github.com/codebendercc/a…ter/libraries/Wire/Wire.hТеперь всё это нужно оформить в соответствующий корпус.

Продолжение следует.

Как сделать погодную станцию на Arduino

Метеостанция на arduino и mr3020 для народного мониторинга

Предлагается методика изготовления погодной станции для дома или дачи. За основу возьмём плату Ардуино и набор сенсоров: температуры, влажности, давления и датчик углекислого газа. Данные будут выводиться на LCD дисплей, а питание осуществляться от блока питания для мобильного телефона или батареек.

  • плата Ардуино или аналог;
  • датчик температуры и влажности DHT11;
  • датчик давления BMP085;
  • датчик углекислого газа MQ135;
  • LCD дисплей 1602;
  • потенциометр 10 кОм;
  • корпус для погодной станции;
  • кусок фольгированного стеклотекстолита;
  • винты для крепления компонентов;
  • компьютер;
  • соединительные провода;
  • разъём для подачи питания;
  • паяльник.

1Подбор корпуса

Для начала нужно подобрать подходящий корпус. Туда должны вместиться все комплектующие будущей комнатной метеостанции. Такие корпуса продаются во многих магазинах радиоэлектроники. Или воспользуйтесь любым другим корпусом, который сможете найти.

Прикиньте, как все компоненты будут размещаться внутри. Прорежьте окно для закрепления LCD дисплея, если его нет. Если будете размещать внутри датчик углекислого газа, который достаточно сильно греется, то разместите его в противоположной от других датчиков стороне или сделайте его выносным. Предусмотрите отверстие для разъёма питания.

Корпус для самодельной домашней метеостанции

2Используемые компоненты

  • LCD-дисплей 1602 использует 6 пинов Arduino + 4 на питание (подсветка и знакосинтезатор).
  • Датчик температуры и влажности DHT11 подключается к любому цифровому пину. Для чтения значений будем использовать библиотеку DHT11.
  • Датчик давления BMP085 подключается по интерфейсу I2C к двум пинам Arduino: SDA – к аналоговому пину A4 и SCL – к аналоговому пину A5. Обратим внимание, что для питания на датчик подаётся напряжение +3,3 В.
  • Датчик углекислого газа MQ135 подключается к одному из аналоговых пинов.

Компоненты домашней метеостанции

В принципе, для оценки метеообстановки достаточно иметь данные о температуре, влажности и атмосферном давлении, а датчик углекислого газа необязателен.

Используя же все 3 датчика, у нас будут задействованы 7 цифровых и 3 аналоговых пина Ардуино, не считая питания, естественно.

3Схема соединениякомпонентов метеостанции

Схема метеостанции показана на рисунке. Тут всё ясно.

Схема домашней метеостанции

4Скетч метеостанции

Напишем скетч для Ардуино. Код по возможности снабжён подробными комментариями.

/* СОЕДИНЕНИЯ Подключение датчика температуры-влажности DHT11 — – OUT > цифровой пин 9 – “+” > +3V (+5V) – “-” > GND Подключение датчика давления-температуры BMP085 — – VCC > 3.3V; (поддерживается 1.8 – 3.6 В) – GND > GND – SDA > аналоговый пин A4 – SCL > аналоговый пин A5 Детектор газа ————————————– – A0 – VCC – GND ЖКИ ———————————————— – LCD RS > к цифровым выводам 12 – 8 – LCD Enable > к выводам 11 – 9 – LCD D4 > к выводам 5 – 4 – LCD D5 > к выводам 4 – 5 – LCD D6 > к выводам 3 – 6 – LCD D7 > к выводам 2 – 7 – LCD R/W > GND – 10K резистор между +5V и землёй – сброс > к LCD VO (пин 3) */ // Подключение библиотек: #include // датчика температуры-влажности #include // LCD #include // датчика BMP085 #include // газовый детектор MQ135 LiquidCrystal lcd(12, 11, 5, 4, 3, 2); /* соединение LCD-шилда x## – для вывода кириллических символов, где ## – номера символов в таблице */ dht11 sensorTempHumid; // датчик температуры и влажности MQ135 gasSensor = MQ135(A0); // датчик газа #define RZERO 76.63 float rzero; // показания с датчика газа float ppm; int del = 5000; // задержка, мс /* Oversampling Setting (OSS) – настройки разрешения для датчика давления BMP085, см. https://www.sparkfun.com/tutorials/253 OSS может быть 0, 1, 2 или 3: 0 – ультранизкое потребление, низкое разрешение; 1 – стандартное потребление; 2 – высокое разрешение; 3 – ультравысокое разрешение и максимальное потребление. */ const unsigned char OSS = 0; // Калибровочные переменные для BMP085: int ac1; int ac2; int ac3; unsigned int ac4; unsigned int ac5; unsigned int ac6; int b1; int b2; int mb; int mc; int md; long b5; float temperature; // температура long pressure; // давление // Для прогноза: const float p0 = 101325; // давление на уровне моря, Па. const float currentAltitude = 179.5; // высота погодной станции над уровнем моря, м; const float ePressure = p0 * pow((1 – currentAltitude/44330), 5.255); // нормальное давление на данной высоте, Па. float weatherDiff; #define DHT11PIN 9 // пин 9 датчика DHT11. #define BMP085_ADDRESS 0x77 /* I2C адрес датчика BMP085; см. https://www.sparkfun.com/tutorials/253 */ void setup() { lcd.begin(16, 2); // инициализация ЖК Wire.begin(); // инициализация I2C bmp085Calibration(); // калибровка датчика BMP085 } void loop() { // Проверка датчика давления-влажности: int chk = sensorTempHumid.read(DHT11PIN); switch (chk) { case DHTLIB_OK: lcd.clear(); break; case DHTLIB_ERROR_CHECKSUM: lcd.clear(); lcd.print(“Checksum error”); delay(del); return; case DHTLIB_ERROR_TIMEOUT: lcd.clear(); lcd.print(“Time out error”); delay(del); return; default: lcd.clear(); lcd.print(“Unknown error”); delay(del); return; } // Считываем с датчика BMP085: temperature = bmp085GetTemperature(bmp085ReadUT()); temperature *= 0.1; pressure = bmp085GetPressure(bmp085ReadUP()); pressure *= 0.01; // Разница давлений для вычисления простого прогноза weatherDiff = pressure – ePressure; rzero = gasSensor.getRZero(); ppm = gasSensor.getPPM(); // ЖК: lcd.setCursor(0, 0); // курсор на строку 1, поз. 1; //lcd.print(“p = “); lcd.print(pressure*3/4); // Па -> мм рт.ст. lcd.print(“mmHg “); // мм рт.ст. // “Прогноз”: if(weatherDiff > 250) lcd.print(“Sun”); else if ((weatherDiff

Загрузим этот скетч в память контроллера платы Ардуино.

5Сборка метеостанции

Сделаем печатную плату для размещения компонентов внутри корпуса – это самое удобное решение для компоновки и подключения сенсоров.

Для изготовления печатной платы в домашних условиях я использую «лазерно-утюжную» технологию (мы её подробно описывали в прошлых статьях) и травление с помощью лимонной кислоты.

Предусмотрим на плате места для перемычек («джамперов»), чтобы иметь возможность отключать датчики. Это будет полезно, если будет нужно перепрограммировать микроконтроллер, когда возникнет желание модифицировать программу.

Печатная плата для домашней метеостанции

С помощью пайки установим датчики давления и газов.

Для установки платы Arduino Nano удобно использовать специальные адаптеры или гнёзда с шагом 2,54. Но за неимением этих деталей и из-за экономии пространства внутри корпуса, я установлю Ардуино также пайкой.

Термодатчик будет располагаться на некотором отдалении от платы и будет теплоизолирован от внутренностей метеостанции с помощью специальной изоляционной прокладки.

Предусмотрим места для подводки внешнего питания к нашей самодельной плате. Я буду использовать обычное зарядное устройство на 5 В от старого сломанного роутера. Плюс 5 вольт от зарядного устройства будут подаваться на пин Vin платы Arduino.

Сборка метеостанции на Ардуино

ЖК-экран будет крепиться винтами прямо к корпусу, к передней части. Подключаться будет проводами с разъёмами быстрого подключения типа “Dupont”.

Установим печатную плату внутри корпуса и закрепим винтами. Подключим LCD-экран к ножкам Arduino согласно схеме.

Аккуратно закрываем корпус метеостанции.

6Включение метеостанции

Ещё раз перепроверив, что всё подключили правильно, подаём питание на нашу метеостанцию. ЖК-экран должен загореться, и через несколько секунд на нём появятся данные о давлении, небольшой прогноз, основанный на показаниях давления, а также данные о температуре, влажности и концентрации углекислого газа.

Домашняя метеостанция в работе

Да, может быть сборка получилась не самая аккуратная и красивая, но зато своя. В процессе мы познакомились с основами работы с датчиками температуры-влажности, давления и газа.

Метеостанция на Arduino

Метеостанция на arduino и mr3020 для народного мониторинга

Для того, чтобы узнать температуру и влажность воздуха на улице, а также атмосферное давление, можно посмотреть прогноз в телевизоре или на погодных сайтах в сети Интернет.

Но, как известно, гидрометеоцентр частенько ошибается. Получить фактические точные данные  можно с помощью домашней метеостанции. Домашнюю метеостанцию можно купить, а можно сделать самостоятельно.

Рассмотрим создание домашней метеостанции на контроллере Arduino.

Наша домашняя метеостанция будет измерять температуру и влажность воздуха, атмосферное давление и выводить параметры на ЖК-дисплей. Список комплектующих, которые понадобятся для данного проекта:

  • контроллер Arduino;
  • плата прототипирования (без пайки)
  • модуль датчика BMP085 или BMP180
  • модуль с датчиком влажности DHT11
  • датчик температуры DS18B20
  • резистор 4,7 кОм;
  • дисплей Nokia 5110
  • провода и корпус

 В качестве платы Arduino в принципе можно использовать любую из модельного ряда Arduino, но я рекомендую Arduino Uno или Arduino Duemilanove, так как в будущем собираюсь установить на нее Ethernet shield, чтобы сделать домашнюю метеостанцию устройством IoT (“Интернета вещей”). Я буду использовать плату Arduino Duemilanove (рисунок 1).

Рис. 1. Плата Arduino Duemilanove

Теперь рассмотрим датчики, которые будем использовать в проекте.

Датчик давления BMP085 (рисунок 2) – высокоточный датчик атмосферного давления с низким энергопотреблением. используется для измерения атмосферного давления. Точность достигает минимального значения измерения давления 0.03hPa. Также выводит и данные о температуре.

Напряжение питания 1.62V – 3.6V. Интерфейс подключения I2C. В продаже встречаются готовые платы  как с стабилизатором, так и без него.

Датчик давления BMP085 мы будем использовать только для измерения атмосферного давления, для измерения температуры будем использовать более точный датчик DS18B20.

Рис.2. Модуль датчика BMP085

Датчик температуры DS18B20 (рисунок 3) –  это цифровой измеритель температуры  с  разрешением преобразования 9 – 12 разрядов и функцией тревожного сигнала контроля за температурой.

Обменивается данными с микроконтроллером по однопроводной линии связи, используя протокол интерфейса 1-Wire. Диапазон измерения температуры составляет от -55 до +125 °C. Для диапазона от -10 до +85 °C погрешность не превышает 0,5 °C.

У каждой микросхемы DS18B20 есть уникальный серийный код длиной 64 разряда, который позволяет нескольким датчикам подключаться на одну общую линию связи.

Рис. 3. Датчик температуры DS18B20

Датчик DHT11 (рисунок 4) не обладают высоким быстродействием и точностью, но зато имеет низкую стоимость. Датчик состоит из емкостного датчика влажности и термистора.

Содержит аналого-цифровой преобразователь для преобразования аналоговых значений влажности и температуры в цифровые. Диапазон измерения влажности – 20-80%, частота опроса 1 раз в секунду.

Мы будем использовать в проекте датчик DHT11 в виде готового модуля.

Рис.4. Модуль DHT11

Для отображения информации с датчиков будем использовать ЖК-дисплей Nokia 5110 (рисунок 5). Это графический монохромный дисплей с разрешением 84×48 точек. Дисплей Nokia 5110 поставляется на плате в паре с контроллером PCD8544 и штыревым разъемом. Электропотребление дисплея позволяет питать его от выхода +3.3 В платы Arduino.

Рис. 5. Дисплей Nokia 5110

Собираем схему согласно рисунка 6.

Рис. 6. Схема подключения к Arduino

Для удобства я спаял датчики на плате прототипирования, сделал контакты для подключения проводов от дисплея и оформил это в виде шилда – припаял штырьки для подключения к контактам платы Arduino (рисунок 7).

Рис. 7. Как получилось у меня. Проект метеостанции на Arduino

Теперь приступим к написанию скетча.

При написании скетча нам понадоьятся следующие Arduino-библиотеки:•    OneWire – для работы с устройствами 1-Wire (датчик DS18B20);•    BMP085 и Wire – для работы с датчиком BMP085 (или BMP180);•    DHT – для работы с датчиком DHT11;•    Adafruit_GFX и Adafruit_PCD8544 – для работы с дисплеем Nokia 5110.

С периодичностью 5 секунд получаем данные с датчиков DS18B20, DHT11, BMP085 и выводим в монитор последовательного порта и на дисплей Nokia 5110. Процедура получения данных с датчика DS18B20 – get_temp()  выполняет поиск устройств 1-Wire, подключенных к выводу Adruino  D7 (у нас один датчик), и выдает его данные.

Запустим Arduino IDE. Создадим новый скетч и внесем в него содержимое листинга 1.

// подключение библиотек
#include
#include
#include
#include “DHT.h”
#include
#include
// тип DHT сенсора
#define DHTTYPE DHT11   // DHT 11 // создание экземпляров объектов
BMP085 dps = BMP085();
DHT dht(8, DHTTYPE);  // dht11 на pin 8
OneWire  ds(9);       // ds18b20 на pin 9
// Nokia 5110
// pin 3 – Serial clock out (SCLK)
// pin 4 – Serial data out (DIN)
// pin 5 – Data/Command select (D/C)
// pin 6 – LCD chip select (CS)
// pin 7 – LCD reset (RST)
Adafruit_PCD8544 display = Adafruit_PCD8544(3, 4, 5, 6, 7);
// переменные
int Temp1;
long Temperature085 = 0, Pressure085 = 0, Altitude085 = 0; void setup() {
  // запуск последовательного порта
  Serial.begin(9600);
  Serial.println(“start”);
  // запуск I2C
  Wire.begin();
  // запуск bmp
  dps.init();   
  // инициализация дисплея
  display.begin();
  // установить контраст фона экрана
  display.setContrast(60);
  display.clearDisplay();       // очистить экран
  display.setTextSize(1);    // размер шрифта
  display.setTextColor(BLACK);   // цвет
  // заставка
  display.setCursor(15,15);   
  display.print(“Home Meteo”);   display.display();
  delay(2000);
} void loop () {
   display.clearDisplay();     
   display.setCursor(15,5);   
   display.print(“Home Meteo”);    // ds18b20
   int Temp=get_temp();
   if(Temp==999) {
     display.setCursor(15,15);   
     display.print(“t=”);      display.print(Temp1/16);      display.print(“.”);
     display.print(((Temp1%16)*100)/16);
     display.print(” C”);
    }
   else if(Temp==998) {
     Serial.println(“Temp=ERROR”);
     display.setCursor(15,15);   
     display.print(“t=ERROR”);    }
   else {
     Serial.print(“Temp=”);
     Serial.print(Temp/16);
     Serial.print(“.”);
     Serial.print(((Temp%16)*100)/16);
     Serial.println(” *C”);
     display.setCursor(15,15);   
     display.print(“t=”);      display.print(Temp/16);      display.print(“.”);
     display.print(((Temp%16)*100)/16);
     display.print(” C”);
     Temp1=Temp;
   }
   // dht11
   float h = dht.readHumidity();
   float t = dht.readTemperature();
   Serial.print(“humidity=”);    Serial.print(h);
   Serial.println(” %”);
   Serial.print(“temperatura=”);    Serial.print(t);
   Serial.println(” *C”);
   display.setCursor(15,25);   
   display.print(“h=”);    display.print(h);    display.print(” %”);
   // bmp085
   dps.getTemperature(&Temperature085);    dps.getPressure(&Pressure085);
   dps.getAltitude(&Altitude085);
   Serial.print(“pressure5=”);    Serial.print(Pressure085/133.3);
   Serial.println(” mm Hg”);
   Serial.print(“temp5=”);    Serial.print(Temperature085*0.1);
   Serial.println(” *C”);
   Serial.println();
   display.setCursor(5,35);   
   display.print(“p=”);    display.print(Pressure085/133.3);    display.print(“mmHg”);
   // обновить
   display.display();
   // пауза
   delay(5000);
}
// получение температуры датчика ds18b20
int get_temp() {
 byte i;
 byte present = 0;
 byte data[12];
 byte addr[8];
 int Temp;
    if ( !ds.search(addr)) {
        Serial.print(“No more addresses.
“);
        ds.reset_search();
        return 999;
  }
  Serial.print(“R=”);  // печать уникального 1-wire идентификатора
  for( i = 0; i < 8; i++) {     Serial.print(addr[i], HEX);     Serial.print(" ");   }   Serial.println();   if ( OneWire::crc8( addr, 7) != addr[7]) {         Serial.print("CRC is not valid! ");         return 999;   }   if ( addr[0] != 0x28) {         Serial.print("Device is not a DS18S20 family device. ");         return 999;   }     ds.reset();   ds.select(addr);   // начинаем преобразование, используя ds.write(0x44,1)   ds.write(0x44,1);   // пауза с запасом (750 мс)     delay(1000);        ds.reset();   ds.select(addr);   ds.write(0xBE);             for ( i = 0; i < 9; i++) {             data[i] = ds.read();   }   Temp=(data[1]

Миниметеостанция на Arduino в телефоне | Каталог самоделок

Метеостанция на arduino и mr3020 для народного мониторинга

Сейчас на Arduino продается множество разнообразных датчиков, и хотя точность их измерений желает желать лучшего, но для домашнего использования они вполне годятся.

В исключительном случае, если вы увлекаетесь метеорологией, вам может понадобиться более сложная и дорогостоящее оборудование.

Готовое устройство, такое как Weather Meters, напичканное анемометром, флюгером, измерителем количества осадков, которое остается лишь подключить через RJ11 интерфейс к Arduino для работы, в полной мере оценят только метеорологи, диспетчеры или агрономы.

Возможности самодельной метеостанции:

  • Измерение текущей температуры в доме, на улице.
  • Показания влажности воздуха.
  • Отслеживание атмосферного давления.
  • Вывод всех данных на экран телефона в реальном времени.
  • Перечень необходимых компонентов:

  • Плата Arduino Uno, mini, nano с процессором ATmega 168, ATmega 328.
  • Bluetooth модуль HC-05. 
  • Датчик давления BMP180 — более экономное и точное устройство своей устаревшей версии BMP085. 
  • Датчик влажности DHT22 — отличается от DHT11 большей точностью и расширенным диапазоном измерений. Температуру он меряет также неточно, с чувствительностью 0.5 °С, хотя уже от –40 до + 125 °С, а не от 0 до +50 °С. 
  • Датчик температуры DS18B20, две штуки — один замеряет температуру в комнате, другой на улице. Использовать отдельные датчики температуры понадобилось, поскольку встроенный в модуль DHT22 имеет низкую точность до 0.5 °С. 
  • Резисторы по 0,125 Вт: 4.7 кОм, 10 кОм.
  • Монтажная плата, паечная или беспаечная.
  • Сетевой адаптер 220/5 В для питания платы Arduino.
  • Дополнительно можно приобрести:

  • Плата коммутационная Sensor Shield для быстрого подключения всех датчиков, сервомоторов, интерфейсов Serial и I2C, незаменима тем, кто ни разу не держал в руках паяльник.  
  • Импульсный преобразователь DC-DC, вход 7…24 В, выход 5 В, 2.5 А.
  • Подключение датчиков и Bluetooth модуля

    Подключать датчики температуры DS18B20 следует с одним резистором 4.7 кОм между их выводами DQ и VDD.

    Два датчика температуры подсоединены к плате Arduino по одной трехпроводной шине. Каждый датчик DS18B20 имеет свой уникальный 64-битный адрес, и работает с Arduino по однолинейному протоколу 1 Wire передачи данных.

    Все два датчика будут передавать данные по одной шине на 4 цифровой вход платы Arduino.

    Подключаем датчик давления BMP180 к плате Arduino четырьмя проводами:

    • VCC — 5V (питание +5В);
    • GND — GND (земля);
    • SDA — A4 аналоговый вход на Arduino;
    • SCL — A5 аналоговый вход на Arduino;

    Подключаем датчик влажности с pul-up (подтягивающим) резистором 10 кОм между его выводами VCC и DAT. Если расстояние от датчика до контроллера более 20 метров, то рекомендуется ставить подтягивающий резистор на 5.1 кОм. При необходимости улучшить работу датчика, следует добавить конденсатор емкостью 100 нФ между его питанием VCC и землей GND.

    Наш датчик влажности будет передавать данные на 8 цифровой вход платы Arduino.

    Остается лишь подключить Bluetooth модуль HC-05 к плате Arduino:

    • VCC — 5V (питание +5 В);
    • GND — GND (земля);
    • RX — TX на Arduino;
    • TX — RX на Arduino;
    • KEY — не используется;
    • STATE — не используется.

    Программное обеспечение

    Загружаем в Arduino эскиз программы для домашней миниметеостанции.

    Скетч WSAB

    Проверяем работоспособность собранного устройства. В Монитор порта компьютерной программы Arduino IDE отправляем 1, затем поочередно 2, 3, 4.

    • При отправке 1 — показания температуры на улице.
    • При отправке 2 — показания температуры в доме.
    • При отправке 3 — данные о давлении.
    • При отправке 4 — данные о влажности.

    Загружаем на Android телефон приложение Wether station Android Arduino Bluetooth.

    Показания температуры на улице в градусах Цельсия

    Показания температуры внутри дома в градусах Цельсия

    Данные об атмосферном давлении на улице в мм.рт.ст.

    Данные о влажности на улице в процентах

    Собрать готовое устройство можно в любом корпусе: футляр от аудиокассеты, распределительная коробка.

    Напоследок следует упомянуть, что собранная даже на Arduino Uno домашняя метеостанция потребляет совсем мизерный ток, до 30 мА, поэтому её вполне можно сделать переносной, запитав от солнечной панельки и аккумулятора.

    Оцените статью
    Просто о технологиях
    Добавить комментарии

    ;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: