BMP085 Barometric Pressure Sensor Module for arduino (или как сделать метеостанцию своими руками). Моя самодельная домашняя метеостанция на Arduino Nano Схема электрическая работы беспроводной метеостанции

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



Так как погодные условия здесь достаточно переменчивы, а температура колеблется в диапазоне 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 как базовую.

Метеостанция своими руками.

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

(под катом много фотографий!)

Сначала пробегусь по компонентам, ссылки давать не буду, так как на eBay (в личном кабинете) товары ушли в архив. Многие компоненты покупал неспеша на аукционе eBay. Впервые опробовал аукцион, раньше всегда покупал «buy it now». Что могу сказать, если не спешить с покупками, то некоторые компоненты можно купить дешевле (разница иногда бывает в два раза).

Датчик давления ВМР085
Это основной датчик. Когда я увидел его на eBay, то понял, что хочу собрать именно домашнюю метеостанцию.
Прилетел датчик в обычном конверте, внутри обклеенном пупыркой.

Внутри конверта была визитка продавца и датчик, запакованный в антистатический пакет и завёрнутый в ещё один слой пупырки

Антистатический пакет был запаян, дабы влага во время перелёта не грозила датчику

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




Все бы хорошо, но маркировка контактов нанесена в зеркальном виде.
Подключается датчик по шине I2C и питается от 3,3 В. То есть для нормального функционирования нужно 4 провода (+, -, SDA, SCL)
Опрашивать датчик можно 2 способами: или через библиотеку, или используя функции прямо скетче.
Пример программы:

#include

#define BMP085_ADDRESS 0x77 // I2C address of BMP085

Const unsigned char OSS = 0; // Oversampling Setting

// Calibration values
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;

Short temperature;
long pressure;

Void setup()
{
Serial.begin(9600);
Wire.begin();
bmp085Calibration();
}

Void loop()
{
temperature = bmp085GetTemperature(bmp085ReadUT());
pressure = bmp085GetPressure(bmp085ReadUP());
Serial.print(«Temperature: „);
Serial.print(temperature/10.0, DEC);
Serial.println(“ C»);
Serial.print(«Pressure: „);
Serial.print(pressure/133.322, DEC);
Serial.println(“ mm Hg»);
Serial.println();
delay(1000);
}

Void bmp085Calibration()
{
ac1 = bmp085ReadInt(0xAA);
ac2 = bmp085ReadInt(0xAC);
ac3 = bmp085ReadInt(0xAE);
ac4 = bmp085ReadInt(0xB0);
ac5 = bmp085ReadInt(0xB2);
ac6 = bmp085ReadInt(0xB4);
b1 = bmp085ReadInt(0xB6);
b2 = bmp085ReadInt(0xB8);
mb = bmp085ReadInt(0xBA);
mc = bmp085ReadInt(0xBC);
md = bmp085ReadInt(0xBE);
}

Short bmp085GetTemperature(unsigned int ut)
{
long x1, x2;
x1 = (((long)ut - (long)ac6)*(long)ac5) >> 15;
x2 = ((long)mc << 11)/(x1 + md);
b5 = x1 + x2;

Return ((b5 + 8)>>4);
}

Long bmp085GetPressure(unsigned long up)
{
long x1, x2, x3, b3, b6, p;
unsigned long b4, b7;
b6 = b5 - 4000;
// Calculate B3
x1 = (b2 * (b6 * b6)>>12)>>11;
x2 = (ac2 * b6)>>11;
x3 = x1 + x2;
b3 = (((((long)ac1)*4 + x3)<>2;
// Calculate B4
x1 = (ac3 * b6)>>13;
x2 = (b1 * ((b6 * b6)>>12))>>16;
x3 = ((x1 + x2) + 2)>>2;
b4 = (ac4 * (unsigned long)(x3 + 32768))>>15;
b7 = ((unsigned long)(up - b3) * (50000>>OSS));
if (b7 < 0x80000000)
p = (b7<<1)/b4;
else
p = (b7/b4)<<1;
x1 = (p>>8) * (p>>8);
x1 = (x1 * 3038)>>16;
x2 = (-7357 * p)>>16;
p += (x1 + x2 + 3791)>>4;
return p;
}

// Read 1 byte from the BMP085 at "address"
char bmp085Read(unsigned char address)
{
unsigned char data;

Wire.write(address);
Wire.endTransmission();
Wire.requestFrom(BMP085_ADDRESS, 1);
while(!Wire.available())
;
return Wire.read();
}

Int bmp085ReadInt(unsigned char address)
{
unsigned char msb, lsb;
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(address);
Wire.endTransmission();
Wire.requestFrom(BMP085_ADDRESS, 2);
while(Wire.available()<2)
;
msb = Wire.read();
lsb = Wire.read();
return (int) msb<<8 | lsb;
}

// Read the uncompensated temperature value
unsigned int bmp085ReadUT()
{
unsigned int ut;
// Write 0x2E into Register 0xF4
// This requests a temperature reading
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(0xF4);
Wire.write(0x2E);
Wire.endTransmission();
// Wait at least 4.5ms
delay(5);
// Read two bytes from registers 0xF6 and 0xF7
ut = bmp085ReadInt(0xF6);
return ut;
}

// Read the uncompensated pressure value
unsigned long bmp085ReadUP()
{
unsigned char msb, lsb, xlsb;
unsigned long up = 0;
// Write 0x34+(OSS<<6) into register 0xF4
// Request a pressure reading w/ oversampling setting
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(0xF4);
Wire.write(0x34 + (OSS<<6));
Wire.endTransmission();
// Wait for conversion, delay time dependent on OSS
delay(2 + (3< // Read register 0xF6 (MSB), 0xF7 (LSB), and 0xF8 (XLSB)
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(0xF6);
Wire.endTransmission();
Wire.requestFrom(BMP085_ADDRESS, 3);
// Wait for data to become available
while(Wire.available() < 3)
;
msb = Wire.read();
lsb = Wire.read();
xlsb = Wire.read();
up = (((unsigned long) msb << 16) | ((unsigned long) lsb << 8) | (unsigned long) xlsb) >> (8-OSS);
return up;
}


Помимо этого в датчике есть собственный термо-сенсор для компенсации давления и альтиметр

Arduino Nano v3.0
Это сердце всей метеостанции. По простому говоря, контроллер в миниатюрном размере.
Покупал
Рассказывать подробно про контроллер не буду, так как до меня уже это сделали:


Посылка с lightake была сборная, контроллер пришел в пакете, где был USB-кабель и Arduino в запаянном антистатическом пакете.

Чтобы оценить размеры, рядом с Arduino положил монетку номиналом 1 руб.

Плата контроллера вблизи



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

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

Но после недолгой эксплуатации заметил, что мне этого экрана мало и вывести больше данных не получится, так как он имеет всего 2 строки по 16 символов в каждой. Поначалу кажется, что этих параметров хватит, но когда начинаешь программировать, то понимаешь, что максимум можно впихнуть 3-4 параметра. А если делать меню (я ведь подумывал сделать меню на этом экране), то свободного места остаётся на 1-2 параметра.
В итоге начал подыскивать себе другой экран. Сначала присматривался к графическому экрану от Nokia 3310 и даже в аукционе eBay участвовал, чтобы его купить, но не сложилось (чему я очень рад), поэтому мне пришлось отказаться от этого экрана. Сейчас я понимаю, что он был бы слишком мал для моих целей, так как есть с чем сравнивать.
Случайно просматривая шилды на Arduino, я наткнулся на графический экран 12864 на контроллере ST7920. У этого экрана и размер подходящий, и хорошее разрешение для моих нужд (128х64). То есть можно спокойно разместить 6-7 строк по 20 символов нормально читающегося шрифта. Так как экран графический, то помимо текста разными шрифтами можно разместить и графику. Короче, это именно то, что мне нужно было, все присутствовало в этом экране, поэтому я не выдержал и заказал.
Посылка пришла быстро и была упаковано стандартно: конверт-пупырка, внутри ещё слой пупырки и экран в антистатическом пакете:






Чтобы оценить размеры, рядом с LCD положил монетку номиналом 1 руб.




Чтобы быстро подключить экран к Arduino, к контактам LCD припаял линейку контактов. Подключать LCD можно по последовательной шине и по параллельной. Я выбрал первый вариант, так как свободных контактов Arduino и так мало.
Подключение (взято из сети):

- Контакт 1 (GND) подключается к общей шине
- Контакт 2 (VCC) подключается к шине питания +5V, причём потребляемый ток сравнительно небольшой и дисплей можно питать от встроенного стабилизатора Arduino.
- Контакты 4, 5 и 6 подключаются к цифровым выходам Arduino, образуя последовательный интерфейс SPI:
контакт 4 – (RS) – соответствует линии CS (например 7)
контакт 5 – (RW) – соответствует линии MOSI (например 8)
контакт 6 – (E) – соответствует линии SCK (например 3)
номера контактов Arduino могут быть любыми, главное не забыть потом правильно указать их в тексте программы при инициализации дисплея.
- Контакт 15 (PSB) соединяется с общей шиной.
- Контакты 19 (A) и 20 (K) – это питание подсветки (+5V и GND соответственно). Для регулировки яркости подсветки можно использовать переменный резистор 10кОм, включённый между шинами питания и GND. Напряжение с его движка подаётся на контакт 19 дисплея.
По этой инструкции я подключил все, кроме подсветки. В качестве питания подсветки я использовал ШИМ Arduino.
Для того, чтобы программно подключить LCD к Arduino, используется библиотека u8glib. Скачать можно . Если есть проблемы скачивания, то могу библиотеку залить на narod.ru.
Сама библиотека не сложная и позволяет выводить текст разным шрифтом, рисовать линию, рисовать простейшие геометрические фигуры (прямоугольник, круг), выводить на экран свои изображения, подготовленные специальным образом. В принципе, этого инструмента достаточно для большинства задач.
Вот результат простенькой программы:

Сама программа:

#include «U8glib.h»

U8GLIB_ST7920_128X64 u8g(3, 9, 8, U8G_PIN_NONE); // SPI E = 3, RW = 9, RS = 8

// Подпрограмма определения свободной памяти
int freeRam () {
extern int __heap_start, *__brkval;
int v;
return (int) &v - (__brkval == 0? (int) &__heap_start: (int) __brkval);
}

Void setup(void) {
u8g.setFont(u8g_font_6x10); // шрифт
u8g.setRot180(); //Перевернул экран
analogWrite(6, 115); // Устанавливаем яркость экрана (анод подсветки на 6 pin)
}

Void loop(void) {
u8g.firstPage();
do {

u8g.setPrintPos(1, 12); // позиция
u8g.print(«Hello!!!»); // вывод текста
u8g.drawBox(0,22,128,9); // Закрашиваем прямоугольник белым
u8g.setColorIndex(0); // белые чернила, черный фон
u8g.setPrintPos(1, 30); // позиция
u8g.print(«Word...»); // вывод текста

U8g.setColorIndex(1); // белые чернила, черный фон
u8g.setPrintPos(1, 50); // позиция
u8g.print(«After start =»); // вывод текста
u8g.setPrintPos(85, 50); // позиция
u8g.print(millis() / 1000); // вывод число секунд после старта
u8g.setPrintPos(1, 64); // позиция
u8g.print(freeRam ()); // вывод сколько памяти занято
} while(u8g.nextPage());

Delay(200);
}

Часы реального времени DS1307
Ещё один компонент для моей метеостанции. На данном шилде реализованы часы реального времени. Заказывал их на аукционе eBay. Продавец прислал платку часов в нереально большой коробке


Внутри коробки было два листка А4 с рекламой и платка часов, обмотанная целлофаном


Хочу заметить, что плата не превышает размером 2 руб. монету, а коробка была размером 13х15х5 см.
Плата была упакована в антистатический пакет

Платка вблизи



С данным модулем мне пришлось повозиться. Во-первых, были трудности подключения. А во-вторых, кварц на данной плате никакой. Если бы знал, что на модуль потрачу столько времени, то, скорее всего, собрал бы его сам, благо в сети полно схем. Самая простейшая схема содержит 4-5 компонентов.
По поводу подключения. Я нашёл библиотеку, в которой было сказано, что интерфейс I2C можно подключать не на привычные аналоговые входы Arduino (А4 и А5), а на любые дискретные. Как написано, так и сделал. Сначала ничего не работало, после долгого танца с бубном часы завелись. Ну, подумал, всё, проблемы закончились, но после того, как я попытался этот же модуль подключить к другой Arduino, пляски с бубном продолжились. Много времени потратил на поиски решения данной проблемы и практически везде указывалось либо на неправильное подключение, либо на отсутствие подтягивающих резисторов на контактах SCL и SDA. Я уже хотел с паяльником в плату лезть, но на одном форуме случайно наткнулся на код, где было сказано, чтобы SCL и SDA подключать к стандартным портам I2C на Arduino. После стандартного подключения, все сразу заработало.
Теперь по поводу кварца. Не знаю, что там за кварц ставят китайцы, но часы с таким кварцем убегали в сутки на 10-11 сек. В месяц данная погрешность составляет 5 минут, а в год 1 час. Нафиг такие часы не нужны. Пришлось снова лезть в сеть и искать, как исправить данный баг. Первое попавшее решение говорит о том, что нужно заземлить кварц. Сделал - результат нулевой. Ещё где-то нашёл, что нужно найти старую материнку и выпаять оттуда часовой кварц. Сделал - результат есть. Теперь часы убегают не на 10-11 секунд, а на 1,5 секунды в сутки. Скажем так, стало лучше, но до идеала далеко. Так как больше с паяльником возится неохота, то было решено подводить часы программно, то есть раз в сутки подводить часы на нужную величину. После 10 суток, часы ушли не более, чем на секунду. Метод хорош, но только тогда, когда устройство синхронизации Arduino подключено к питанию, иначе часы работают от батарейки и все равно убегают.
Небольшая тестовая программа:

#include «Wire.h»
#define DS1307_I2C_ADDRESS 0x68 // SDA A4, SCL A5

Byte decToBcd(byte val)
{
return ((val/10*16) + (val%10));
}

Byte bcdToDec(byte val)
{
return ((val/16*10) + (val%16));
}

Void setDateDs1307(byte second, // 0-59
byte minute, // 0-59
byte hour) // 0-99
{

Wire.write(0);
Wire.write(decToBcd(second));
Wire.write(decToBcd(minute));
Wire.write(decToBcd(hour));
Wire.endTransmission();
}

Void getDateDs1307(byte *second,
byte *minute,
byte *hour)
{

Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(0);
Wire.endTransmission();

Wire.requestFrom(DS1307_I2C_ADDRESS, 3);

*second = bcdToDec(Wire.read());
*minute = bcdToDec(Wire.read());
*hour = bcdToDec(Wire.read());
}

Void setup()
{
byte second, minute, hour;
Wire.begin();
Serial.begin(9600);

Second = 45;
minute = 5;
hour = 16;

SetDateDs1307(second, minute, hour);
}

Void loop()
{
byte second, minute, hour;

GetDateDs1307(&second, &minute, &hour);
Serial.print(hour, DEC);
Serial.print(":");
Serial.print(minute, DEC);
Serial.print(":");
Serial.println(second, DEC);

Delay(1000);
}


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

Датчик температуры и влажности DHT11
Про данный датчик рассказывать нечего. Я бы его даже не стал использовать, если бы не нужна была влажность. К сожалению, я его не сфотографировал, когда получил, поэтому фотографий не будет. Фотографии датчика можно будет посмотреть ниже, где я его подключил к Arduino. Подключение датчика простое (+, цифровой выход, -). Обычно датчики делают четырёх контактные. При таком форм-факторе третий контакт ни к чему не подключают.
Для подключения к Arduino можно использовать библиотеку. Скачать можно .
Небольшая тестовая программа c выводом информации на LCD дисплей 1602:

// include the library code:
#include
#include

// Declare objects
dht11 DHT11;
LiquidCrystal lcd(12, 11, 6, 5, 4, 3);

#define DHT11PIN 7
int i;

Void setup()
{
lcd.begin(16, 2);
lcd.print(«Status: „);
i=0;
}

Void loop()
{
int chk = DHT11.read(DHT11PIN);
lcd.setCursor(8, 0);
switch (chk)
{
case 0: lcd.print(“OK „); break;// lcd.setCursor(11, 0); lcd.print(millis()/2000); break;
case -1: lcd.print(“Checksum error»); mErr(); break;
case -2: lcd.print(«Time out error»); mErr(); break;
default: lcd.print(«Unknown error»); mErr(); break;
}
delay(500);
lcd.setCursor(15, 0);
switch (i)
{
case 0: lcd.print("^"); lcd.setCursor(15, 1); lcd.print(" ");break;
case 1: lcd.print(«v»); lcd.setCursor(15, 1); lcd.print(" ");break;
default: lcd.setCursor(15, 1); lcd.print(«E»); break;
}
i=i+1;
if (i>1) i=0;
lcd.setCursor(0, 1);
lcd.print(«H=»);
lcd.setCursor(2, 1);
lcd.print((float)DHT11.humidity, 0);
lcd.setCursor(4, 1);
lcd.print("%");
lcd.setCursor(8, 1);
lcd.print(«T=»);
lcd.setCursor(10, 1);
lcd.print((float)DHT11.temperature, 0);
lcd.setCursor(12, 1);
lcd.print(«C»);

Void mErr()
{
lcd.setCursor(2, 1);
lcd.print("**");
lcd.setCursor(10, 1);
lcd.print("**");
i=5;
}


Минусы у датчика есть – данные с датчика идут только в целых числах, да и диапазон слабенький.

Вроде, про все компоненты написал. Осталось собрать все в единое целое.
Упс, чуть не забыл! Для того, чтобы все собрать устройство, нужен корпус. Корпус тоже заказывал на Ebay. Продавец оказался из Англии. Посылка дошла быстро, но фотографировать её не стал. Все фотографии корпуса ниже.

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



На самом деле синий цвет подсветки гораздо ярче. Даже при минимальной яркости (Bright=5) происходит засветка кадра.

Чтобы все собрать без проводов, было решено сделать мини материнскую плату, а платка Arduino и шилды надевались на разъёмы. В случае чего, их с лёгкостью можно быстро извлечь. LCD экран и кнопки для управления я решил также цеплять на разъёмах, только датчик температуры впаять на проводах.
Вот такая вышла платка



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

Материнская плата с установленными шилдами и платой Arduino.

Вот так выглядит полное подключение к материнской плате


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

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

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

Долго думал, как приладить кнопки в корпус и, самое главное, какие использовать кнопки…
В радиоэлектронных магазинах приглянулись кнопка с длинным шпиньком и наконечники, которые надеваются на этот шпинёк. Эти кнопки используются для пайки на плату. Все бы хорошо, но у них есть минус – ход нажатия очень маленький и громкий.
Размещать кнопки пришлось в два этапа: первый - разместить кнопки на плате, второй - эту плату крепить ещё на одной плате. И все это потом засовывать в корпус на направляющие.

Вот так выглядит платка с кнопками:



Вот так выглядит плата-держатель:


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

Теперь все засовываем в корпус
Без подключения кнопок:


С подключением кнопок:

Закрываем корпус и включаем. Все прекрасно работает, кнопки отрабатывают, как нужно.

В конце размещаю небольшое видео работы устройства в разных режимах:
http://www.youtube.com/watch?v=KsiVaUWkXNA&feature=youtu.be
У кого видео здесь не отображается, вот ссылка на

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


Пришлось оптимизировать код. Многие куски кода выносил в подпрограммы. Никогда бы не подумал, что оператор switch… case в компилированном виде занимает больше места, чем несколько if… else. Ещё экономит место правильное объявление переменных. Если объявлять массив long, хотя вполне можно обойтись byte, то перерасход памяти достигает 500 байт в зависимости от размерности массива. Когда пишешь программу, то об этом не думаешь, а уже потом, когда анализируешь программу, то понимаешь, что некоторые вещи сделал неправильно, и начинаешь оптимизировать код. После того, как проблемы с размером программы были решены, я упёрся в ограничение оперативной памяти. Выражалось это в том, что программа начинала виснуть после загрузки. Пришлось вводить подпрограмму подсчёта свободной оперативной памяти. В результате, был вынужден отказаться от одного алгоритма предсказывания погоды, так как он должен выводить пиктограммы на экран. Сам алгоритм работает, а вот вывод пиктограмм пришлось заремировать. У меня есть ещё задумки, как оптимизировать код, но в ближайшем будущем оставляю работать устройство, как есть, чтобы оценить работоспособность и выявить все баги.

Теперь небольшие выводы
Минусы
1) Цена. Оправдание этому минусу – хобби никогда не бывает дешёвым.

Плюсы
1) Большой функционал устройства
2) Наращивание функций ограничивается только используемым контроллером и собственным желанием
3) Эстетическое удовольствие от созерцания и моральное удовльствие от того, что я все-таки собрал и доделал это устройство

Планирую купить +86 Добавить в избранное Обзор понравился +137 +304

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

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

Базовый набор комплектующих

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

Для соединения модулей можно использовать шлейф с BLS-разъемами ($0.9) или беспаечную макетную плату с набором соединительных проводов ($3.74).

Подключение и настройка

Несмотря на доступные 4 вывода, подключается наш датчик всего по 3 проводам: питание +5В (1 вывод), земля (4) и линия передачи данных (2). Питание для датчика берем либо с пина VUSB, либо с 3V, если первого на вашей плате не оказалось. Линию данных подключаем к порту GPIO14 (пин D5).

Напомню, что навыков программирования в нашем случае не нужно абсолютно никаких. Прошивку для модуля будем генерировать с помощью сайта WiFi-IoT.ru , автором которого является Максим Малкин, также известный по проекту домашней автоматизации homes-smart.ru . Для начала попросту регистрируемся на WIFi-IoT и подтверждаем почту.

Перед сборкой прошивки необходимо подготовить приобретенный модуль к работе и очистить его от возможного предустановленного китайского ПО. Для этого нам понадобится рабочий USB-microUSB кабель и компьютер или виртуальная машина с Windows. После регистрации на сайте вы попадете на англоязычную страницу «Getting started » с пояснениями по подготовке модуля к работе. Скачивайте файлы с ПО из первых двух пунктов инструкции.

Теоретически, после подключения модуля к компьютеру, Windows должна сама отыскать драйвера и установить их. На случай, если этого не произойдет, попробуйте идентифицировать на плате микросхему (отличается большим количеством «ножек») возле microUSB порта. Вероятнее всего это будут CP2102 или CH340 (драйвера к ним доступны по ссылкам).

После установки драйверов повторно подключаем нашу плату к компьютеру и запускаем программу NodeMCU Flasher, которую скачали ранее. В выпадающим списке выбираем присвоенный нашему устройству COM-порт. Скорее всего он будет один, в противном случае его номер можно уточнить в диспетчере устройств Windows. Во вкладке Config указываем расположение загруженного ранее blank-файла с расширением.bin.

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

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

  • «DHT22» - это наш датчик температуры и влажности;
  • «Время и NTP» - для отображения времени в веб-интерфейсе;
  • «Настройки по умолчанию». Нажимаем шестеренку возле этого пункта и вводим логин и пароль от точки доступа, к которой будет подключен модуль. Остальные пункты пока не трогаем.

Нажимаем клавишу «Скомпилировать» внизу страницы и на выходе получаем готовое к установке ПО. Скачиваем одним файлом.

Далее повторяется процесс с прошивкой blank-файла, только вместо него выбираем уже загруженную на компьютер прошивку. После завершения процесса полностью перезагружаем модуль (отключаем и подключаем заново USB-кабель) и отправляемся в админ-панель роутера в поисках модуля. Так как мы не использовали предварительное присвоение статического IP, роутер должен сам выдать ему адрес. Напомню, что админ-панель обычно находится по адресу 192.168.0.1 или 192.168.1.1. Моему модулю роутер выдал адрес 192.168.1.142. После перехода по этому IP попадаем в веб-интерфейс нашей метеостанции. Предварительно необходимо будет ввести стандартный логин «esp8266» и пароль «0000» во всплывающем окне.

Теперь нужно указать модулю к какому порту подключен датчик, чтобы первый смог считывать его показания. Делается это на странице «Hardware». Соответствующей отметкой активируем первый датчик, а в строке GPIO указываем 14-й порт. Произойдет инициализация и на главной странице интерфейса появится отображение температуры и влажности. Ура!

Напоследок не забудьте на странице «Main» изменить пароль для входа в систему и часовой пояс для отображения времени. Также необходимо перевести модуль на статический IP-адрес (кнопка внизу страницы), чтобы после перезагрузки роутера ваша метеостанция не «потерялась». Если разбираетесь в настройках своего роутера, то лучше сделать бессрочную аренду IP-адреса для модуля, вместо установки статического IP.

Прототип готов, теперь перейдя по установленному IP-адресу можно посмотреть температуру и влажность в месте, где вы установили датчик.

Подключение метеостанции к сервису метрик Thingspeak.com

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

На открывшееся странице заполняем название канала, отмечаем первых два поля field и записываем туда значения «temp» (первое поле) и «humidity / temp» (второе).

Теперь снова займемся модулем. В конструкторе прошивок в дополнение ко всем предыдущим отметкам добавляем «Thingspeak.com», компилируем прошивку и прошиваем по аналогии. К сожалению, все настройки на модуле придётся произвести заново, т.к. OTA-обновления с сохранением оных доступны только в платной версии ПО (цена вопроса всего 100 рублей на модуль).

Возвращаемся на страницу созданного нами канала в сервисе Thingspeak.com и открываем вкладку «Api Keys». Нам понадобится код из поля «Write Api Key». Его нужно скопировать и вставить в соответствующее поле на странице «Servers» в веб-интерфейсе нашей метеостанции, предварительно не забыв установить отметку на «Enable Thingspeak.com send.».

Показания будут отправляться каждые 5 минут. А выглядеть это в итоге будет следующим образом:

Внешний вид графиков поддается редактированию, так что вы вольны творить! 🙂

Итоги

Наверное кто-то спросит: «Почему итоговый результат отличается от представленного на приведенной выше и заглавной картинках?». Как минимум потому, что информации в этом материале новичкам в теме точно хватит на вечер-другой, а подключение дисплея и барометра потребуют наличия базовых навыков пайки и соответствующего оборудования. Если вы заинтересованы в дальнейшем совершенствовании метеостанции и моих заметках по этой теме, то обязательно напишите об этом в комментариях.

Из завалявшихся деталей решил сделать небольшую метеостанцию. На сборку и написание прошивки для контроллера ушло два дня выходных. Еще пара дней ушла на написание, тестирование и отладку остального программного обеспечения. Текущая версия метеостанции измеряет температуру, влажность, давление, имеется связь с компьютером через USB порт от него же и питается, резервное питание от батареи 9 В. Данные отображает на LCD. Еще есть часы. Поскольку, не нашлось подходящего кварца (а покупать принципиально не хотел), сделал синхронизацию времени с компьютером.

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

Станция собрана на макетной плате, поэтому чертеж печатной платы и не просите.

Использовались следующие основные компоненты:
ATMega8 - контроллер
MPX4115A - датчик давления
HIH-4000 - датчик влажности
DS18B20 - датчик температуры
WH1602A - дисплей

Я использовал LCD на PLED технологии, можно обыкновенные типа WH1602A. Датчики температуры и влажности вынесены на улицу в защитную коробочку.

Подключаем к компьютеру

Подключение к порту USB требует отдельного описания.

В принципе, можно было подключить и к COM порту, так проще. Но у меня он занят. Выбора нет - USB. Поскольку станция собиралась с чего было, то в ход пошел завалявшийся огрызок кабеля CA-42 для подключения мобильного телефона к компьютеру. Разъем к мобильному телефону ушел в дело, а тот конец, который подключается к компьютеру остался. В самом этом разъеме уже имеется микросхема для USB порта, а на выходе - стандартный UART, тот, который используется в мобильных телефонах и самый раз для контроллера, поэтому провода запаиваем напрямую, без каких либо преобразователей сигнала. После установки драйверов для этого кабеля, появляется виртуальный COM порт. Далее можем любой программой подключиться к нашей метеостанции, например HyperTerminal . Распайку кабеля специально не привожу, поскольку кабеля разные, могут отличатся. Использовать нужно 3 провода TX, RX, GND. Запитать устройство от кабеля, скорее всего, не получится. Я взял не нужный USB разъем и запитал с другого USB порта.

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

Метеостанция понимает только две команды:

AGOV - Возвращает текущие показания датчиков.

SETTIME [время в секундах с начала суток] - команда устанавливает время в метеостанции

Для получения данных выполняем getfromcom.exe COM6 AGOV

Для установки времени выполняем getfromcom.exe COM6 "SETTIME 72565"

COM6 - порт.
72565 - количество секунд с начала суток.

Автоматизация процесса

Теперь можно любой программой считать, обработать данные, отправить куда надо, синхронизировать время метеостанции. Я это сделал с помощью скриптового языка PHP. Во первых это быстро и всегда можно оперативно подправить скрипт и не искать куда делся исходный код. Во вторых, я постоянно работаю с PHP. Но Вы можете написать свою программу на любом удобном для Вас языке. Разумеется, для работы PHP придется его скачать (http://www.php.net/downloads.php) и установить на компьютере. Под Windows это делается элементарно. Скрипт getfromcom.php запускается из файла get_data.bat опрашивает метеостанцию, обрабатывает данные и отправляет на HTTP-сервер скрипту get_data.php. О скриптах на сервере поговорим чуть позже.

Спящий режим рабочего компьютера

Мой компьютер стоит в спящем режиме. Просыпается каждые 3 часа, опрашивает метеостанцию, отправляет данные на сервер и снова засыпает (можно и не выключать - кому как удобнее.). Делается это так: В планировщике задач указывается пакетный файл get_data.bat для выполнения и устанавливается опция "разбудить компьютер для выполнения этого задания".

Компьютер отправляется в спячку командой fShutdown.exe /hibernate
Теперь по указанному времени компьютер проснется и выполнит get_data.bat

Особенности get_data.bat

Команды:

devcon.exe enable PCIVEN_10EC
ping 127.0.0.1
RASPHONE -d Setilite

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

ping 127.0.0.1 - так я сделал необходимую паузу.

Соответственно, отключаем командами:

RASPHONE -h Setilite
devcon.exe disable PCIVEN_10EC

У Вас будет все по другому, поэтому в файле эти строки закомментированы.

После выхода из спячки компьютер начинал думать, что COM порт занят другой программой. Пришлось виртуальный COM порт перезагружать командой devcon.exe restart "USBVid_6547&PID_0232"
У Вас будет другой ID устройства.

Серверные скрипты:

Теперь о скриптах на сервере. Скрипт, который принимает данные: get_data.php
Скрипт сохраняет данные в файл pogoda.log. Вообще то, данные отправляются и в базу данных MySQL. Но для простоты, рассмотрим работу только с файлом. Принимая данные, скрипт проверяет подходит ли IP адрес отправителя. Разрешенные адреса перечислены в файле ip_allow.lst От "чужого" отправителя данные не принимаются.

– Влажность:

Диапазон измерения 20÷90%.

Погрешность ±5%.

Разрешающая способность 1%.

– Температура:

Диапазон измерения 0÷50 о С.

Погрешность ±2 о С.

Разрешающая способность 1 о С.

4. Измерение давления и температуры датчиком BMP-180 .

– Давление:

Диапазон измерения 225÷825 мм рт. ст.

Погрешность ±1 мм рт. ст.

Разрешающая способность 1 мм рт. ст.

– Температура:

Диапазон измерения -40,0÷85,0 о С.

Погрешность ±1 о С.

Разрешающая способность 0,1 о С.

5. Циклическая анимированная смена показаний.

6. Режим "кукушки". Ежечасный короткий звуковой сигнал. Если активирован и только в дневное время.

7. Озвучивание нажатия на кнопки. Короткий звуковой сигнал только в дневное время.

8. Сохранение настроек в энергонезависимой памяти микроконтроллера.

Настройка.

1. Вход в настройки и листание меню производится кнопкой MENU .

2. Переключение параметра для настройки в пределах одной страницы меню кнопкой SET .

3. Установка параметра кнопками PLUS / MINUS . Кнопки работают по одиночному нажатию, а при удержании производится ускоренная установка.

4. Устанавливаемый параметр мигает.

5. Через 10 сек от последнего нажатия на кнопки прибор перейдет в основной режим, настройки запишутся в память.

6. Страницы меню.

CLOC :

– сброс секунд.

– установка минут.

– установка часов.

– установка ежесуточной коррекции точности хода. В старшем разряде символ c . Диапазон установки ±25 сек.

ALAr :

– минуты срабатывания будильника.

– часы срабатывания будильника.

– активация будильника. В старшем разряде символ A . В младших On , если работа будильника разрешена, OF – если запрещена.

– активация режима "кукушки". В старших разрядах символы cu . В младших On , если работа "кукушки" разрешена, OF – если запрещена.

DiSP :

– продолжительность индикации времени. На индикаторе d xx . Диапазон установки

– продолжительность индикации влажности. На индикаторе H xx . Диапазон установки 0 ÷ 99 сек. Если установлен 0, то параметр отображаться не будет.

– продолжительность индикации температуры, измеренной датчиком влажности. На индикаторе tHxx . Диапазон установки 0 ÷ 99 сек. Если установлен 0, то параметр отображаться не будет.

– продолжительность индикации давления. На индикаторе P xx . Диапазон установки 0 ÷ 99 сек. Если установлен 0, то параметр отображаться не будет.

– продолжительность индикации температуры, измеренной датчиком давления. На индикаторе tPxx . Диапазон установки 0 ÷ 99 сек. Если установлен 0, то параметр отображаться не будет.

– скорость анимации. В старшем разряде символ S . Диапазон установки 0 ÷ 99. Чем меньше величина, тем выше скорость.

LiGH :

niGH - установки ночного режима.

– минуты включения ночного режима.

– часы включения ночного режима.

– яркость индикатора в ночном режиме. В старшем разряде символ n . Диапазон установки 0 ÷ 99. Яркость индикатора соответствует ночному режиму.

dAY - установки дневного режима.

– минуты включения дневного режима.

– часы включения дневного режима.

– яркость индикатора в дневном режиме. В старшем разряде символ d . Диапазон установки 0 ÷ 99. Яркость индикатора соответствует дневному режиму.

Работа прибора.

1. В основном режиме происходит циклическая смена информации на индикаторе. Установлена следующая последовательность вывода: время – влажность (в старшем разряде символ H ) – температура измеренная датчиком влажности – давление (в старшем разряде символ P ) – температура измеренная датчиком давления. Если продолжительность отображения какого-либо параметра установлена в 0, то на индикатор он выводиться не будет.

2. Из основного режима можно переключить индикацию кнопками PLUS /MINUS .

3. В случае ошибки считывания данных с датчика DHT11 при индикации температуры и влажности на индикатор выводятся прочерки.

4. Если будильник активирован (см. настройки), при отображении времени в младшем разряде включена точка. В заданное время включается звуковой сигнал - ежесекундные двойные сигналы в течении одной минуты. Звуковой сигнал может быть досрочно отключен нажатием на любую кнопку. При срабатывании будильника на индикатор в течении 30 секунд выводится время.

5. Ежесуточно (в 0 часов 0 минут и 30 сек) производится цифровая коррекция времени. , DS1307 .

4. Тип индикатора (общий анод или катод) выбирается джампером. Если джампер установлен, то выбран индикатор с общим анодом.

5. На схеме показаны два индикатора, устанавливается только одни.

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

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

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

Благодарность studiotandem за подготовку материалов и тестирование прошивок.

Просмотров