Контакты

Метеостанция на arduino с графиком давления пример. Комнатная метеостанция на Arduino

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

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

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

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

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

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

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

Погода в Twitter

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

Tempescope

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

Погода в кубе

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

Загружать прошивку желательно до подключения компонентов, чтобы убедиться в том, что плата рабочая. После сборки можно прошить ещё раз, плата должна спокойно прошиться. В проектах с мощными потребителями в цепи питания платы 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 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 В блокнот
Резистор

Однажды, исследуя просторы интернета наткнулся я на интересную плату Arduino. Меня очень заинтересовала эта плата. С ее помощью можно сделать самому робота, метеостанцию, сигнализацию и даже что-то посерьезней, например - «Умный Дом».

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

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

Вот так метеостанция будет выглядеть в сборе:

Наверно, вам захотелось собрать такое же устройство, ну что же, не будем тянуть.

Возможности

Но для начала посмотрим, что наша метеостанция может делать:

1) Показывать текущую дату и время;
2) Показывать текущую температуру;
3) Показывать текущую влажность;
4) Показывать текущее атмосферное давление.

Состав

Что нам понадобится для реализации этой метеостанции:

1) Сам микроконтроллер Arduino (я использовал Arduino nano v3);
2) Датчик температуры и влажности Dht22 (маленькие погрешности в показаниях);
3) Барометр BMP085, он много чего может, например, измерение атмосферного давления, температуры, уровень над уровнем моря;
4) Часы реального времени DS3231 (он очень точный и легко настраивается);
5) Нам надо еще это выводить куда-то, мной был выбрал всем известный экран от Nokia 5110;
6) Прямые руки, без этого никак.

По необходимости:

7) Блок для батареек, для питания всей конструкции. Я питаю от Usb. От батареек не живет пару дней;
8) Переключатель, он тут для того, чтобы включать подсветку у экрана по мере необходимости;
9) Кусок фанеры и ножки.
10) Разъем для подключения блока питания.

Подключение

Теперь давайте рассмотрим, куда и как что подключать.

1) Первым будет наш экран:
pin 3 - Serial clock out (SCLK)
pin 4 - Serial data out (DIN)
pin 5 - Data/Command select (D/C)
pin 7 - LCD chip select (CS)
pin 6 - LCD reset (RST)
Питание 3.3V

3) Третьим будет барометр:
pin 4 - SDA
pin 5 - SCL
Питание 5V

Не забываем подключать питание и землю.

Код

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

Код

#include #include "DHT.h" #include #include #include "RTClib.h" #define DHTPIN 10 // 10 pin для датчика DHT22 #define DHTTYPE DHT22 RTC_DS1307 RTC; BMP085 dps = BMP085(); DHT dht(DHTPIN, DHTTYPE); long temp3 = 0, Pressure = 0, Altitude = 0; // pin 3 - Serial clock out (SCLK) // pin 4 - Serial data out (DIN) // pin 5 - Data/Command select (D/C) // pin 7 - LCD chip select (CS) // pin 6 - LCD reset (RST) LCD5110 myGLCD(3, 4, 5, 6, 7); extern unsigned char SmallFont; void setup() { myGLCD.InitLCD(); myGLCD.setFont(SmallFont); Wire.begin(); RTC.begin(); dht.begin(); delay(2000); dps.init(MODE_ULTRA_HIGHRES, 3200, true); // 3200 это 32 метра над уровнем моря (Питер на такой высоте располагается+ надо добавить несколько метров в зависимости от этажа на котором живете) } void loop() { dps.getPressure(&Pressure); dps.getAltitude(&Altitude); dps.getTemperature(&temp3); DateTime now = RTC.now(); // Sensor readings may also be up to 2 seconds "old" (its a very slow sensor) float h = dht.readHumidity(); // Read temperature as Celsius float t = dht.readTemperature(); myGLCD.setFont(SmallFont); // задаем маленький размер шрифта на экране myGLCD.clrScr(); // Очистка экрана myGLCD.print("Time=", LEFT, 0); //задаем время myGLCD.printNumI(int(now.hour()), 32, 0); // 32,0 означет 32=номер пропуска в строке, те откуда будем печатать. 0=номер строки myGLCD.print(":", 45, 0); myGLCD.printNumI(int(now.minute()), 50, 0); myGLCD.print(":", 62, 0); myGLCD.printNumI(int(now.second()), 67, 0); myGLCD.print("Date=", LEFT, 10); //задаем дату myGLCD.printNumI(int(now.day()), 32, 10); myGLCD.print("/", 44, 10); myGLCD.printNumI(int(now.month()), 50, 10); myGLCD.print("/", 62, 10); myGLCD.printNumI(int(now.year() - 2000), 68, 10); myGLCD.print("T=", LEFT, 20); //задаем температуру myGLCD.printNumF(t, 2, 13, 20); //Это температура с DHT22 myGLCD.print("/", 45, 20); myGLCD.printNumF(temp3 * 0.1, 2, 53, 20); //Это температура с барометра myGLCD.print("Hum=", LEFT, 30); // задаем влажность с DHT22 myGLCD.printNumF(h, 2, 28, 30); myGLCD.print("%", 63, 30); myGLCD.print("Pres=", LEFT, 40); // задаем атмосферное давление myGLCD.printNumF(Pressure / 133.3, 2, 31, 40); //рассчет атмосферного давления myGLCD.print("mm", 68, 40); // Serial.print(" Alt(m):"); кому надо, это текущая высота над уровнем моря // Serial.print(Altitude / 100); myGLCD.update(); // Вывод вместимого буфера на дисплей delay (1000); // Задержка 1 с }



Понравилась статья? Поделитесь ей