Как сделать метеостанцию на arduino. Метеостанция на Arduino с беспроводным датчиком температуры



«Так, давайте сразу договоримся: вы не собираетесь снимать кино для Голливуда. Даже в Стране чудес утверждается не более пяти процентов от всех сценариев, и только один процент идет затем в производство… Таким образом, вместо всего этого вы собираетесь создать свой собственный Голливуд.»
Эд Гаскель «Снимаем цифровое кино, или Голливуд на дому»

Предисловие

Что, ещё одна погодная станция на Arduino?! Да, ещё одна и, что-то мне подсказывает, не последняя в интернете вещей.


Точно также, как каждый программист обязан написать программу «Hello World!», так и каждый ардуинщик обязан иметь за плечами опыт построения простой или не очень метеостанции.
Уже созданных проектов метеостанций в интернете описано немалое количество, читатель может выбрать любой из них для реализации. Не скрою, я внимательно изучил около десятка подобных проектов и ещё кучу смежных. Поэтому нельзя сказать, что я создал всё с нуля, конечно же я «стоял на плечах гигантов».


Сразу скажу, что в мои планы не входило использование сторонних сервисов для хранения и отображения данных. Хотелось лично пощупать и понять как всё это работает изнутри от начала до конца, от А до Я.


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



Этот проект был реализован в далеком уже 2016 году, но надеюсь еще актуален.

Набор технологий

Мы изучим и будем работать с простыми и сложными вещами:

  • датчиками температуры и влажности типа DHT22, DHT11
  • датчиком барометрического давления типа BMP180
  • WiFi модулем ESP8266
  • радиомодулем типа nRF24 2,4 Ггц
  • семейством Arduino Pro Mini, Arduino Mega
  • солнечной батареей и аккумуляторами
  • языком программирования C/C++
  • языком программирования PHP
  • системой управления базами данных MySQL
  • языком программирования Java и фреймворком Android (создание приложения для Adnroid для отображения погодных данных на смартфоне).

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


Но начнем мы с самого начала правильно. А именно с описания и проектирования будущего устройства «на бумаге» , чтобы в конце концов каждый кирпичик лёг на своё место.

Прототипирование

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


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


Каждый, кто клепает по вечерам свои поделки pet-project для «internet of things», должен отдавать себе отчёт в том, что он создаёт именно прототип, полуфабрикат. До уровня нормального промышленного изделия ему очень далеко. Поэтому не следует поручать нашим любительским поделкам какие-либо ответственные участки жизнеобеспечения и надеяться, что они нас не подведут.


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


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


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

Требования

Обычно этот этап пропускают. Решая сделать что-нибудь эдакое прямо сейчас, а потом выясняются мелкие детали, которые ставят весь проект в тупик или вовсе делают его неподъемным. Все наши хотелки необходимо записывать, я использую для этого гугл диск, он доступен с ПК и с мобильного устройства.


Итак, наша метеостанция должна:

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

Датчики используются самые простые и дешевые. Например, забегая наперед скажу, что температуру DHT22 измеряет достаточно точно, а вот с влажностью немного неточен. Но, опять таки повторюсь, это не имеет значения, поскольку перед нами - прототип, и разброс в 5% влажности ни на что важное в нашей жизни не повлияет.


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

Железо. Выбор компонентов

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


Вот тут-то и есть один ньюанс. Чтобы выбрать компоненты нужно хорошо знать их возможности, нужно знать сами технологии. То есть другими словами, здесь требуется быть далеко не начинающим электронщиком и программистом. Так что же теперь пару лет потратить на изучение всего спектра возможных устройств?


Замкнутый круг? Но замкнутые круги для того и существуют, чтобы их разрывать.


Выход есть. Можно просто взять и повторить чей-то проект. Я же изучил уже существующие проекты метеостанций и надеюсь сделал шаг вперед.


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


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


Центральный, основной блок будет расположен внутри помещения. Это важно определить на начальном этапе, от этого «пляшут» такие важные характеристики как температурный режим работы и питание.


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


Для сношений с внешним миром интернет был однозначно выбран WiFi модуль ESP8266 практически без альтернативы (прим. возможно сейчас такие альтернативы появились). К Arduino выпускаются Ethernet платы расширения, но совсем не хотелось привязываться к кабелю.



Интересный вопрос состоял в том, чем обеспечивать связь между заоконным датчиком (или датчиками, про требование расширяемости системы помним?) и центром. Радиомаячки на 433 Мгц однозначно не подходят (они не подходят ни для чего вообще).


Воспользоваться опять ESP8266 ?


Минусы такого решения:

    необходим устойчивый WiFi за пределами дома

    дальность связи не будет большой

    пострадает надежность, при пропадании интернета мы не увидим свои удаленные датчики

    большее энергопотребление.

    Энергопотребление ESP8266:

    при передаче 120-170 mA

    при приеме 50-56 mA

    в режиме Deep Sleep 10 µA (мкА)

    в выключенном состоянии 5 µA (мкА).

В конце концов для связи удаленных датчиков с основным домашним блоком был выбран чип nRF24L01+ с 2,4 Ггц передатчиком и приемником в одном флаконе, с дополнительной внешней антенной, чтоб уж наверняка «пробить» стены.



Энергопотребление nRF24L01+ 2,4 GHz:

  • при приеме 11 mA
  • при передаче на скорости 2Mbps - 13 mA
  • в режиме standby-I - 26 μA (мкА)
  • в выключенном состоянии 900 nA (нА).

Что у ESP8266, что у nRF24L01+ диапазон рабочих температур подходящий: от -40℃ до +80℃.


Купить nRF24L01+ можно примерно за $1, или сразу с внешней антенной за $3. Купить ESP8266-01 можно примерно за $4. Читайте внимательно описание товара! Иначе купите одну антенну.


Ядро системы вырисовалось. Переходим к самим датчикам.


На улице, как известно, температура может достигать отрицательных значений, поэтому датчик DHT11 не подходит, а вот DHT22 в самый раз.



Характеристики DHT22 / AM2302:

  • питание от 3,3 В до 5 В, рекомендуется 5 В
  • потребление 2.5mA максимум, в момент измерения и передачи данных
  • диапазон измерения влажности 0-100% с погрешностью 2-5%
  • диапазон измерения температуры от -40 до +125°C с погрешностью ±0.5°C
  • запрос на измерение не чаще 0,5 Гц - одного раза в 2 секунды.

Внутри дома, я надеюсь, отрицательных температур не будет, поэтому можно использовать DHT11, тем более, что он у меня уже был.


Характеристики DHT11:

  • питание от 3,3 В до 5 В
  • потребление 2,5 mA максимум, в момент измерения и передачи данных
  • диапазон измерения влажности 20-80% с погрешностью 5%
  • диапазон измерения температуры от 0 до +50°C с погрешностью ±2°C
  • запрос на измерение не чаще 1 Гц - одного раза в секунду.

Купить DHT22 можно примерно за $3. DHT11 стоит дешевле - $1, но он и менее точен.


Теперь возвращаемся опять к Arduino. Какую плату выбрать?


Я тестировал отдельные части системы на Arduino UNO. Т.е. подключал к уно ESP модуль и изучал его, отключал, затем подключал nRF24 и т.д. Для финальной реализации заоконного датчика выбрал Arduino Pro Mini как наиболее близкую к Uno из миниатюрных.



По энергопотреблению Arduino Pro Mini также выглядит неплохо:

  • нет преобразователя USB-TTL, который сам по себе «кушает» много,
  • светодиод подключен через 10к резистор.

Для продвинутого сбережения энергии планировалось:

  • удалить светодиод - индикатор питания на Arduino Pro Mini (я пожалел, не стал портить плату)
  • либо использовать «голую» сборку на микропроцессоре Atmel ATmega328 (не использовал)
  • использовать библиотеку Low Power Library или JeeLib .

Из библиотек выбрал Low Power Library , она проста и содержит только то, что нужно.


Для центрального блока, поскольку к нему планировалось подключить многочисленную периферию, была выбрана плата Arduino Mega. К тому же она полностью совместима с UNO и имеет больше памяти. Забегая наперед скажу, что этот выбор полностью оправдался.


Купить Arduino Mega можно примерно за $8.

Питание и энергопотребление

Теперь про питание и энергопотребление.


Arduino Pro Mini бывают двух видов:

  • на напряжение питания 5В и частоту 16МГц
  • на напряжение питания 3,3В и частоту 8МГц.

Поскольку радио-модуль nRF24L01+ требует для питания 3,3 В, а быстродействие здесь не важно, то покупайте Arduino Pro Mini на 8MHz и 3,3В.


При этом диапазон питающего напряжения Arduino Pro Mini составляет:

  • 3,35-12 В для модели 3,3 В
  • 5-12 В для модели 5 В.

У меня уже была Arduino Pro Mini на 5В, только поэтому я её и использовал. Купить Arduino Pro Mini можно примерно за $4.


Питание центрального блока будет от сети 220 В через небольшой блок питания, дающий на выходе 12В, 450mA, 5W. Типа такого за $5. Там еще есть отдельный вывод на 5В.



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


Поэтому Arduino Pro Mini и радиомодуль nRF24 будут запитываться от связки 4-х Ni-Mh аккумуляторов.


И помните, максимальная емкость современного аккумулятора примерно 2500-2700mAh, всё что больше это либо маркетинговые уловки (Ansmann 2850) либо обман (UltraFire 3500).


Li-Ion аккумуляторы я не использую по нескольким причинам:

  • очень дорогие
  • при снижении температуры окружающего воздуха ниже 0°C происходит снижение мощности литий-ионного аккумулятора до 40-50%
  • те которые дешёвые производятся без защиты и небезопасны (при КЗ или разряде могут взрываться и гореть, см. кучу роликов на ютюбе)
  • стареют, даже если не используются (впрочем это можно сказать обо всех химических элементах), через 2 года Li-Ion батарея теряет около 20% ёмкости.

Для прототипа вполне можно обойтись качественными Ni-MH AA или AAA аккумуляторами. Тем более, что нам не нужны большие токи. Единственный минус Ni-MH аккумуляторов - это их долгая зарядка.

Общая схема метеостанции

Подведем итоги. Вот общая схема как всё работает.



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

Как-то прогуливаясь по городу увидел новый открывшийся магазин радиоэлектроники. Зайдя в него обнаружил большое количество шилдов для Ардуины т.к. у меня дома была Arduino Uno и Arduino Nano сразу пришла мысль поиграться с передатчиками сигнала на расстоянии. Решил купить самый дешевый передатчик и приемник на 433 МГц:

Передатчик сигнала.


Приемник сигнала.

Записав простейший скетч передачи данных (пример взят от сюда), выяснилось, что передающие устройства могут вполне подойти для передачи простейших данных, таких как температура, влажность.

Передатчик имеет следующие характеристики:
1. Модель: MX -FS - 03V
2. Радиус действия (зависит от наличия преграждающих предметов): 20-200 метров
3. Рабочее напряжение: 3.5 -12В
4. Размеры модуля: 19 * 19 мм
5. Модуляция сигнала: AM
6. Мощность передатчика: 10 мВт
7. Частота: 433 МГц
8. Необходимая длина внешней антенны: 25см
9. Простота подключения (всего три провода): DATA ; VCC ; земля.

Характеристики приемного модуля:
1. Рабочее напряжение: DC 5В
2. Ток: 4мA
3. Рабочая частота: 433,92 МГц
4. Чувствительность: - 105дБ
5. Размеры модуля: 30 * 14 * 7 мм
6. Небходима внешняя антенна: 32 см.

В просторах интернета сказано, что дальность передачи информации на 2Кб/сек может доходить до 150м. Сам не проверял, но в двухкомнатной квартире принимает везде.

Аппаратная часть домашней метеостанции

После нескольких экспериментов решил подключить к Arduino Nano датчик температуры, влажности и передатчик.


Датчик температуры DS18D20 подключается к ардуино следующим образом:

1) GND к минусу микроконтроллера.
2) DQ через подтягивающий резистор к земле и к выводу D2 Ардуины
3) Vdd к +5В.

Модуль передатчика MX -FS - 03V питается от 5 Вольт, вывод данных (ADATA) подключен к выводу D13.

К Ардуино Уно подключил LCD дисплей и барометр BMP085.


Схема подключение к ардуино уно

Приемник сигнала подключен к выводу D10.

Модуль BMP085 - цифровой датчик атмосферного давления. Датчик позволяет измерять температуру,давление и высоту над уровнем моря. Интерфейс подключения: I2C. Напряжение питания датчика 1.8-3.6 В

Подключается модуль к Arduino также, как и другие I2C устройства:

  • VCC - VCC (3,3 В);
  • GND - GND;
  • SCL - к аналоговому выводу 5;
  • SDA - к аналоговому выводу 4.
  • Очень низкая стоимость
  • Питание и I/O 3-5 В
  • Определение влажности 20-80% с 5% точностью
  • Определение температуры 0-50 град. с 2% точностью
  • Частота опроса не более 1 Гц (не более раза в 1 сек.)
  • Размеры 15.5мм x 12мм x 5.5мм
  • 4 вывода с расстоянием между ножками 0.1"

DHT имеет 4 вывода:

  1. Vcc (3-5V питание)
  2. Data out - Вывод данных
  3. Не используется
  4. Общий

Подключается к D8 Ардуины.

Программная часть домашней метеостанции

Передающий модуль измеряет и передает температуру раз в 10 минут.

Ниже привожу программу:

/* Версия скетча 1.0 Отсылаем температуру каждые 10мин. */ #include #include #include #define ONE_WIRE_BUS 2 //Пин подключения датчика Даллас OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); DeviceAddress insideThermometer; void setup(void) { //Serial.begin(9600); vw_set_ptt_inverted(true); // Необходимо для DR3100 vw_setup(2000); // Устанавливаем скорость передачи (бит/с) sensors.begin(); if (!sensors.getAddress(insideThermometer, 0)); printAddress(insideThermometer); sensors.setResolution(insideThermometer, 9); } void printTemperature(DeviceAddress deviceAddress) { float tempC = sensors.getTempC(deviceAddress); //Serial.print("Temp C: "); //Serial.println(tempC); //Формирование данных для для отправки int number = tempC; char symbol = "c"; //Служебный символ определения что это датчик String strMsg = "z "; strMsg += symbol; strMsg += " "; strMsg += number; strMsg += " "; char msg; strMsg.toCharArray(msg, 255); vw_send((uint8_t *)msg, strlen(msg)); vw_wait_tx(); // Ждем пока передача будет окончена delay(200); } void loop(void) { for (int j=0; j <= 6; j++) { sensors.requestTemperatures(); printTemperature(insideThermometer); delay(600000); } } //Определение адреса void printAddress(DeviceAddress deviceAddress) { for (uint8_t i = 0; i < 8; i++) { if (deviceAddress[i] < 16); //Serial.print("0"); //Serial.print(deviceAddress[i], HEX); } }

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

#include #include LiquidCrystal lcd(12, 10, 5, 4, 3, 2); #include dht11 sensor; #define DHT11PIN 8 #include #include BMP085 dps = BMP085(); long Temperature = 0, Pressure = 0, Altitude = 0; void setup() { Serial.begin(9600); vw_set_ptt_inverted(true); // Необходимо для DR3100 vw_setup(2000); // Задаем скорость приема vw_rx_start(); // Начинаем мониторинг эфира lcd.begin(16, 2); Wire.begin(); delay(1000); dps.init(); //lcd.setCursor(14,0); //lcd.write(byte(0)); //lcd.home(); } void loop() { uint8_t buf; // Буфер для сообщения uint8_t buflen = VW_MAX_MESSAGE_LEN; // Длина буфера if (vw_get_message(buf, &buflen)) // Если принято сообщение { // Начинаем разбор int i; // Если сообщение адресовано не нам, выходим if (buf != "z") { return; } char command = buf; // Команда находится на индексе 2 // Числовой параметр начинается с индекса 4 i = 4; int number = 0; // Поскольку передача идет посимвольно, то нужно преобразовать набор символов в число while (buf[i] != " ") { number *= 10; number += buf[i] - "0"; i++; } dps.getPressure(&Pressure); dps.getAltitude(&Altitude); dps.getTemperature(&Temperature); //Serial.print(command); Serial.print(" "); Serial.println(number); lcd.print("T="); lcd.setCursor(2,0); lcd.print(number); lcd.setCursor(5,0); lcd.print("P="); lcd.print(Pressure/133.3); lcd.print("mmH"); lcd.setCursor(0,1); lcd.print("T="); lcd.print(Temperature*0.1); lcd.print(" H="); lcd.print(sensor.humidity); lcd.home(); //delay(2000); int chk = sensor.read(DHT11PIN); switch (chk) { case DHTLIB_OK: //Serial.println("OK"); break; case DHTLIB_ERROR_CHECKSUM: //Serial.println("Checksum error"); break; case DHTLIB_ERROR_TIMEOUT: //Serial.println("Time out error"); break; default: //Serial.println("Unknown error"); break; } } }

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

Ниже прилагаю фото того что получилось:

Список радиоэлементов

Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
Передающая часть.
Плата Arduino

Arduino Nano 3.0

1 В блокнот
Датчик температуры

DS18B20

1 В блокнот
Резистор

220 Ом

1 В блокнот
Модуль передатчика MX-FS-03V (433 МГц) 1 В блокнот
Радиоприемная часть.
Плата Arduino

Arduino Uno

1 В блокнот
Подстроечный резистор 1 В блокнот
Резистор

Недавно мой коллега устраивал небольшую научную выставку.
Мой учитель попросил меня представить какой-нибудь проект по электронике студентам в колледже. У меня было два дня, чтобы придумать что-то интересное и достаточно простое.



Так как погодные условия здесь достаточно переменчивы, а температура колеблется в диапазоне 30-40°С, я решил сделать домашнюю метеостанцию.

В чем заключаются функции погодной станции для дома?
Метеостанция на Ардуино с дисплеем – устройство, собирающее данные о погоде и условиях окружающей среды с помощью множества датчиков.

Обычно это следующие датчики:

  • ветра
  • влажности
  • дождя
  • температуры
  • давления
  • высоты

Моя цель – сделать портативную настольную метеостанцию своими руками.

Она должна уметь определять следующие параметры:

  • температуру
  • влажность
  • давление
  • высоту

Шаг 1: Покупаем нужные компоненты







  • DHT22 , датчик температуры и влажности.
  • BMP180 , датчик давления.
  • Припой
  • Однорядный разъем на 40 выходов

Из оборудования вам понадобятся:

  • Паяльник
  • Плоскогубцы для носоупоров
  • Провода

Шаг 2: Датчик температуры и влажности DHT22







Для измерения температуры используются разные датчики. Популярностью пользуются DHT22, DHT11, SHT1x

Я объясню, чем они отличаются друг от друга, и почему я использовал именно DHT22.

Датчик AM2302 использует цифровой сигнал. Этот датчик работает на уникальной системе кодировки и сенсорной технологии, поэтому его данные надежны. Его сенсорный элемент соединен с 8-битным однокристальным компьютером.

Каждый сенсор этой модели термокомпенсированный и точно откалиброванный, коэффициент калибровки находится в однократно программируемой памяти (ОТР-память). При чтении показаний сенсор будет вызывать коэффициент из памяти.

Маленький размер, низкое потребление энергии, большое расстояние передачи (100 м) позволяют AM2302 подходить почти ко всем приложениям, а 4 выхода в один ряд делают монтаж очень простым.

Давайте рассмотрим плюсы и минусы трех моделей датчиков.

DHT11

Плюсы: не требует пайки, самый дешевый из трех моделей, быстрый стабильный сигнал, дальность свыше 20 м, сильная интерференция.
Минусы: Библиотека! Нет вариантов разрешения, погрешность измерений температуры +/- 2°С, погрешность измерений уровня относительной влажности +/- 5%, неадекватный диапазон измеряемых температур (0-50°С).
Области применения: садоводство, сельское хозяйство.

DHT22

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

SHT1x

Плюсы: не требует пайки, сглаженные кривые, малые погрешности измерений, быстрое срабатывание, низкое потребление энергии, автоматический режим сна, высокая стабильность и согласованность данных.
Минусы: два цифровых интерфейса, погрешность в измерении уровня влажности, диапазон измеряемых температур 0-50°С, нужна библиотека.
Области применения: эксплуатация в суровых условиях и в долгосрочных установках. Все три датчика относительно недорогие.

Соединение

  • Vcc – 5В или 3,3В
  • Gnd – с Gnd
  • Data – на второй вывод Arduino

Шаг 3: Датчик давления BMP180



BMP180 – барометрический датчик атмосферного давления с I2C-интерфейсом.
Барометрические датчики атмосферного давления измеряют абсолютное значение окружающего воздуха. Этот показатель зависит от конкретных погодных условий и от высоты над уровнем моря.

У модуля BMP180 имелся 3,3В стабилизатор на 662кОм, который я, по собственной глупости, случайно взорвал. Пришлось делать обводку питания напрямую к чипу.

Из-за отсутствия стабилизатора, я ограничен в выборе источника питания – напряжение выше 3,3В разрушит датчик.
У других моделей может не быть стабилизатора, обязательно проверяйте его наличие.

Схема соединения датчика и шины I2C с Arduino (nano или uno)

  • SDA — A4
  • SCL — A5
  • VCC — 3.3V
  • GND – GND

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

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

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

Атмосферное давление также изменяется с высотой. Абсолютное давление в базовом лагере на Эвересте (5400 м над уровнем моря) ниже, чем абсолютное давление в Дели (216 м над уровнем моря).

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

Измерение высоты

Среднее давление на уровне моря 1013,25 ГПа (или миллибар). Если подняться над атмосферой, это значение упадет до нуля. Кривая этого падения вполне понятна, поэтому вы можете сами вычислить высоту над уровнем моря, используя следующее уравнение: alti=44330*

Если вы примите давление на уровне моря 1013,25 Гпа как р0, решением уравнения будет ваша текущая высота над уровнем моря.

Меры предосторожности

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

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

Защитите от влаги. Датчик BMP180 чувствителен к уровню влажности, постарайтесь предотвратить возможное попадание воды на датчик.

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

Шаг 4: Собираем прибор







Устанавливаем однорядные разъемы для Arduino Nano. Вообще, мы обрезали их до нужного размера и немного зашкурили, так что они смотрятся, словно такими и были. Потом припаиваем их. После, устанавливаем однорядные разъемы для датчика DHT22.

Устанавливаем 10кОМ резистор от вывода данных к земле (Gnd). Все паяем.
Потом точно также устанавливаем однорядный разъем для датчика BMP180, питание делаем 3,3В. Соединяем все с шиной I2C.

В последнюю очередь подключаем LCD-дисплей, на ту же I2C шину, что и датчик BMP180.
(в четвертый разъем я планирую позже подключить RTC-модуль (часы реального времени), чтобы прибор еще и время показывал).

Шаг 5: Кодирование




Загрузите библиотеки

Чтобы установить библиотеки на Arduino, перейдите по ссылке

#include
#include #include #include "DHT.h" #include

SFE_BMP180 pressure;

#define ALTITUDE 20.56 #define I2C_ADDR 0x27 // <<- Add your address here. #define Rs_pin 0 #define Rw_pin 1 #define En_pin 2 #define BACKLIGHT_PIN 3 #define D4_pin 4 #define D5_pin 5 #define D6_pin 6 #define D7_pin 7

#define DHTPIN 2 // what digital pin we"re connected to

// Uncomment whatever type you"re using! //#define DHTTYPE DHT11 // DHT 11 #define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321 DHT dht(DHTPIN, DHTTYPE); LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin); float t1,t2;

void setup() { Serial.begin(9600); lcd.begin (16,2); // <<-- our LCD is a 20x4, change for your LCD if needed // LCD Backlight ON lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE); lcd.setBacklight(HIGH); lcd.home (); // go home on LCD lcd.print("Weather Station"); delay(5000); dht.begin(); pressure.begin(); } void loop() { char status; double T,P,p0,a; status = pressure.startTemperature(); if (status != 0) { delay(status);

status = pressure.getTemperature(T); if (status != 0) { Serial.print("1"); lcd.clear(); lcd.setCursor(0,0); lcd.print("Baro Temperature: "); lcd.setCursor(0,1); lcd.print(T,2); lcd.print(" deg C "); t1=T; delay(3000);

status = pressure.startPressure(3); if (status != 0) { // Wait for the measurement to complete: delay(status);

status = pressure.getPressure(P,T); if (status != 0) {lcd.clear(); lcd.setCursor(0,0); lcd.print("abslt pressure: "); lcd.setCursor(0,1); lcd.print(P,2); lcd.print(" mb "); delay(3000);

p0 = pressure.sealevel(P,ALTITUDE); // we"re at 1655 meters (Boulder, CO)

a = pressure.altitude(P,p0); lcd.clear(); lcd.setCursor(0,0); lcd.print("Altitude: "); lcd.setCursor(0,1); lcd.print(a,0); lcd.print(" meters"); delay(3000); } } } } float h = dht.readHumidity(); // Read temperature as Celsius (the default) float t = dht.readTemperature(); t2=t; lcd.clear(); lcd.setCursor (0,0); // go to start of 2nd line lcd.print("Humidity: "); lcd.setCursor(0,1);lcd.print(h); lcd.print(" %"); delay(3000); lcd.clear(); lcd.setCursor (0,0); // go to start of 2nd line lcd.print("DHT Tempurature: "); lcd.setCursor(0,1); lcd.print(t); lcd.print(" deg C "); delay(3000); lcd.clear(); lcd.setCursor (0,0); // go to start of 2nd line lcd.print("Mean Tempurature: "); lcd.setCursor(0,1); lcd.print((t1+t2)/2); lcd.print(" deg C "); delay(3000); }

Я использовал версию Arduino 1.6.5, код точно к ней подходит, к более поздним так же может подойти. Если код по каким-либо причинам не подходит, используйте версию 1.6.5 как базовую.

Загружать прошивку желательно до подключения компонентов, чтобы убедиться в том, что плата рабочая. После сборки можно прошить ещё раз, плата должна спокойно прошиться. В проектах с мощными потребителями в цепи питания платы 5V (адресная светодиодная лента, сервоприводы, моторы и проч.) необходимо подать на схему внешнее питание 5V перед подключением Arduino к компьютеру, потому что USB не обеспечит нужный ток, если например лента его потребует. Это может привести к выгоранию защитного диода на плате Arduino. Гайд по скачиванию и загрузке прошивки можно найти под спойлером на следующей строчке.

Содержимое папок в архиве

  • libraries – библиотеки проекта. Заменить имеющиеся версии
  • firmware – прошивки для Arduino
  • schemes – схемы подключения компонентов

Дополнительно

  • Как показал эксперимент, снаружи корпуса датчик температуры показывает на 0.5 градуса меньше, чем внутри! Нужно более удачно компоновать электронику, отводить и экранировать тепло от греющихся элементов…

  • Если дисплей показывает слишком тускло/на белом фоне
    На плате драйвера дисплея (к которой подключаются провода) есть крутилка контрастности, с её помощью можно подстроить контраст на нужный. Также контрастность зависит от угла взгляда на дисплей (это же LCD) и можно настроить дисплей на чёткое отображение даже под углом “дисплей на уровне пупка, смотрим сверху”. А ещё контрастность сильно зависит от питания: от 5V дисплей показывает максимально чётко и ярко, тогда как при питании от USB через Arduino напряжение будет около 4.5V (часть падает на защитном диоде по линии USB), и дисплей показывает уже не так ярко. Вывод настраивайте крутилкой при внешнем питании от 5V!

  • Если датчик CO2 работает некорректно (инфа от Евгения Иванова)
    Ну там в папке библиотеки сенсора в examples есть скетчи для калибровки. также ее можно запустить втупую замкнув на землю разъем “HD” на 7+ секунд.
    Само собой вот прямо на улице на морозе этим заниматься не обязательно… можно просто в бутылку набрать свежего воздуха с датчиком внутри и запечатать. калибровка проводится минимум 20 минут..
    По-умолчанию датчик поставляется с включенной автокалибровкой, которая происходит каждый день, и если датчик используется в невентелируемом помещении, то эта калибровка быстро уводит значения от нормы за горизонт, потому ее нужно обязательно отключать.
    Документация .

  • Автокалибровка датчика CO2 отключена в скетче!

  • Если у вас не работает датчик BME280 , скорее всего у него отличается адрес. В проекте используется библиотека Adafruit_BME280, у которой нет отдельной функции смены адреса, поэтому адрес задаётся вручную в файле библиотеки Adafruit_BME280.h почти в самом начале файла (лежит в папке Adafruit_BME280 в вашей папке библиотек, вы должны были её туда установить ), у моего модуля был адрес 0x76. Как узнать адрес своего модуля BME280? Есть специальный скетч, называется i2c scanner. Его можно нагуглить, можно . Прошиваете данный скетч, открываете порт и получаете список адресов подключенных к шине i2c устройств. Чтобы остальные модули вам не мешали – можно их отключить и оставить только BME280. Полученный адрес указываем в библиотеке, сохраняем файл и загружаем прошивку метео-часов. Всё!

  • Если отстают часы , проблема скорее всего в питании схемы. Если при смене блока питания на более качественный проблема не уходит, повесьте конденсатор по питанию RTC модуля (прям на плату на VCC и GND паять): обязательно керамический, 0.1-1 мкФ (маркировка 103 или 104, смотрите таблицу маркировок). Также можно поставить электролит (6.3V, 47-100 мкФ)

Настройки в прошивке

#define RESET_CLOCK 0 // сброс часов на время загрузки прошивки (для модуля с несъёмной батарейкой). Не забудь поставить 0 и прошить ещё раз! #define SENS_TIME 30000 // время обновления показаний сенсоров на экране, миллисекунд #define LED_MODE 0 // тип RGB светодиода: 0 - главный катод, 1 - главный анод #define LED_BRIGHT 255 // яркость светодиода СО2 (0 - 255) #define BLUE_YELLOW 1 // жёлтый цвет вместо синего (1 да, 0 нет) но из за особенностей подключения жёлтый не такой яркий #define DISP_MODE 1 // в правом верхнем углу отображать: 0 - год, 1 - день недели, 2 - секунды #define WEEK_LANG 1 // язык дня недели: 0 - английский, 1 - русский (транслит) #define DEBUG 0 // вывод на дисплей лог инициализации датчиков при запуске #define PRESSURE 1 // 0 - график давления, 1 - график прогноза дождя (вместо давления). Не забудь поправить пределы гроафика // пределы отображения для графиков #define TEMP_MIN 15 #define TEMP_MAX 35 #define HUM_MIN 0 #define HUM_MAX 100 #define PRESS_MIN -100 #define PRESS_MAX 100 #define CO2_MIN 300 #define CO2_MAX 2000

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

Bluetooth погодная лампа

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

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

Для тех, кто любит тучи побольше есть ещё вот такой вариант

Винтажная погодная станция

Любители винтажных вещиц и стимпанкеры со стажем смогут по достоинству оценить погодную станцию в виде старинных часов .

Погода в Twitter

Эта невзрачная на первый взгляд деревянная пирамидка на самом деле высокотехнологичная метеостанция, способная измерять температуру, влажность воздуха, давление, уровень освещённости, уровень CO и отправлять все данные вам в Twitter.

Tempescope

Tempescope - это такая штука, в которой можно принести домой дождь. Или туман. Или даже грозу. И они будут там жить. Теперь даже в окно смотреть не обязательно, чтобы знать, что приготовила вам на сегодня матушка природа.

Погода в кубе

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