Цифровая комнатная метеостанция. Народная метеостанция Метеостанция из компьютера своими руками

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

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

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

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

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

Для данного действия я взял себе Arduino Uno и Ethernet Shield w5100 для нее. Все это заказывалось из Китая на Aliexpress.

Так же там заказал себе датчики: DHT22, DHT11, DS18B20, BMP280 (в планах еще датчики газа, дыма…)

Покурив форумы, гугл, яндекс, я нашел неплохой вариант скетча — https://student-proger.ru/2014/11/meteostanciya-2-1/

Там же в комментариях человек выкладывал дописанный скетч с датчиками освещенности, газа. Я взял их за основу.

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

Ниже приведу пример итогового скетча, что получился у меня.

В данный момент у меня подключены датчики:
DHT22 — 1шт.
DHT11 — 1шт.
BMP280 — 1шт.
DS18B20 — 2шт.

ВНИМАНИЕ! Перед тем как заливать скетч, не забудьте изменить MAC-адрес устройства, чтобы не пересекаться с другими (например взять Mac-адрес вашего мобильного телефона и изменить в нем последние буквы/цифры, что не «будоражило» вашу локальную сеть!

Примерная схема подключения (картинка взята на просторах интернета от данного скетча):

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

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

Вспомнил на досуге о простой самоделке, которую встречал в журнале «Юный натуралист» и делал в восьмидесятых годах прошлого века.

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

Конечно, сравнивать эту конструкцию с метрологическими приборами не стоит, но в качестве грубого прогноза она вполне работоспособна.

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

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


Как работает самодельный барометр

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

  • атмосферное давление через прорезь в стекле;
  • влажность воздуха;
  • температура окружающей среды.

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

Необходимые инструменты

В обязательном порядке потребуется:

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

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

Технология изготовления

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

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

Способы создания отверстия

Работа надфилем

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

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

Сверление отверстия в стекле

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

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

Поэтому для сверления отверстия подбирают специальные сверла с алмазным напылением наконечника. Работают ими очень осторожно.

Наполнение колбы водой

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

Самодельный барометр из лампочки в принципе готов к эксплуатации. Но для удобства использования его можно:

  • подкрасить воду прибора, например, раствором марганцовки. Конденсат станет лучше виден;
  • снабдить устройством подвешивания или подставкой.

О креплении самодельного барометра

Крепежный узел прибора изготавливают для эксплуатации в одном из двух вариантах:

  1. подвешивании на ручку или крючок;
  2. стационарной установке на подоконнике.

Петля для подвешивания

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

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

Подставка

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

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

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

Как расшифровать информацию и пользоваться прибором

Наблюдение за конденсатом

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

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

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

Особенности эксплуатации

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

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

О точности показаний

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

Для их отслеживания метеорологи используют:


Мы же значительно искажаем все эти процессы.

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

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

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

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

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

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

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

Сейчас предлагаю посмотреть видеоролик владельца MrSam0delkin «Барометр из лампочки».

– Влажность:

Диапазон измерения 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 за подготовку материалов и тестирование прошивок.

(хроно-термо-гигро-барометр)

Как поется в известной песне «Главней всего погода в доме…». Конечно автор под погодой имел ввиду душевное состояние супругов живущих под одной крышей. Но если подходить к этой фразе буквально, то она о том, что под крышей кроме душевного должен быть и климатический комфорт. Предлагаемое устройство обеспечивает измерение и отображение на светодиодном индикаторе температуры и относительной влажности воздуха в помещении, значения атмосферного давления и текущего времени.

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

Внешний вид станции показан на рисунках (Рисунок 1 и Рисунок 2).

Рисунок 1.
Внешний вид станции

Рисунок 2.
Внешний вид станции (обратная сторона)

Видео с демонстрацией работы станции представлено ниже:


Электрическая схема.

Схема электрическая принципиальная представлена на рисунке 3.

Рисунок 3.
Схема электрическая принципиальная.

Станция собрана на микроконтроллере ATmega8. Цепочка R1С1 обеспечивает начальный сброс (Reset) микроконтроллера при включении. Предусмотрено внутрисхемное программирование МК через разъем XP3 «SPI программатор».
Фьюзы МК ATmega8: HIGH=0xD9, LOW=0xE4.

В качестве дисплея используется четырех-разрядный 7-сегментный индикатор типа CL5642BN c общим анодом и двухточечным («:») разделителем часов и минут. Катоды сегментов индикатора подключены к МК через ограничительные резисторы. МК обеспечивает динамическую индикацию поочередно включая транзисторные ключи VT3…VT6.

Хронометр собран на микросхеме DS1307 по штатной схеме включения. Точность хода часов обеспечивается кварцевым резонатором Y1 с частотой 32768Гц. При отсутствии основного питания (5 Вольт) непрерывность хода часов обеспечивается резервным источником питания на гальваническом элементе CR2032 (3 Вольта). Взаимодействие МК с микросхемой DS1307 осуществляется по шине TWI (I2C). Линии шины TWI «подтянуты» к питанию VCC2 резисторами R20, R21. Установка часов и минут обеспечивается кнопками SA1 («Часы+»), SA2 («Минуты+»), SA3 («Установка»). При этом необходимо в момент начала цикла отображения данных на дисплее нажать и удерживать кнопку «Установка». Нажатием или нажатием с удержанием кнопок «Часы+» или «Минуты+» устанавливается время хронометра. При отпускании кнопки «Установка» в микросхему DS1307 в соответствующие ячейки запишутся значения часов и минут, отображенные на дисплее, а в ячейку секунд запишется значение 0. Таким образом можно точно синхронизировать время с внешними эталонными источниками точного времени (например, от вещательных радиостанций или телевидения).

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

Измерение температуры осуществляется датчиком DHT11. МК управляет датчиком по последовательному однопроводному двунаправленному интерфейсу. Линия интерфейса «подтянута» к питанию VCC2 резистором R19.

Для экономного расходования энергии батарей микроконтроллер большую часть своего времени пребывает в состоянии глубокого сна («power-down»). При этом МК перед засыпанием обесточивает все измерительные датчики, подключенные к VCC2 (хронометр, датчик атмосферного давления, датчик влажности и температуры). Обесточивание датчиков обеспечивается ключами на транзисторах VT1 и VT2.

Для пробуждения МК в схему станции включен датчик движения HC-SR501. Его задача - вывести МК из состояния сна. При срабатывании датчик посылает сигнал МК, который пробуждается сам и подает питание VCC2 на периферийные датчики (хронометр, датчик атмосферного давления, датчик влажности и температуры). Ключ на транзисторе VT7 обеспечивает инверсию сигнала датчика движения для согласования с МК. Переключатель «Движение» позволяет отключить датчик движения, для еще большей экономии энергии батарей. В этом случае альтернативную команду на пробуждение МК можно подать нажатием кнопки «Установка».

Питание станции осуществляется от двух альтернативных типов источников: от трех батарей типа АА или от сетевого источника питания 5 Вольт по шине USB. Для переключения между источниками питания необходимо установить переключатель «Питание» в одно из положений: «USB» или «Батарея». При питании от батарей ток потребления станции в режиме сна составляет не более 200мкА, что при емкости батареи 2000мАч соответствует 10000 часам (более одного года) непрерывной работы.

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

При питании от шины USB иногда целесообразно обеспечить постоянное измерение значений датчиками и отображение данных на дисплее. Для этого необходимо установить переключатель «Дисплей» в положение «Вкл». В этом случае МК не будет переводится в состояние сна.

Печатные платы.

Печатные платы разработаны в программе Dip Trace. Они выполнены на одностороннем фольгированном стеклотекстолите. Расположение деталей на основной печатной плате показано на рисунке (Рисунок 4). На рисунке перемычки со стороны монтажа выделены цветными ломаными линиями. Печатная плата со стороны дорожек показана на рисунке (Рисунок 5).

Рисунок 4.
Печатная плата (вид со стороны радиодеталей).

Рисунок 5.
Печатная плата (вид снизу, зеркальное отображение).

Кнопки и переключатели пульта управления станцией установлены на отдельной печатной плате (Рисунок 6 и Рисунок 7).

Рисунок 6.
Печатная плата Пульта управления (вид сверху).

Рисунок 7.
Печатная плата Пульта управления (вид со стороны дорожек).

Гнездо для подключения USB кабеля установлено на отдельной плате, купленной на AliExpress (Рисунок 8).

Рисунок 8.
Плата с гнездом USB.

Монтаж.

Станция смонтирована в корпусе универсальной коробки для кабельных каналов «Промрукав» - IP42; 400V; полистирол ГОСТ Р 50827.1-2009 ТУ 3464-001-97341529-2012 Артикул 40-0460.

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

Батарея питания - три элемента AA 1.5 Вольт каждый размещены в специализированном держателе - «кроватке» .

Размещение радиодеталей на печатной плате показан на рисунке (Рисунок 9).

Рисунок 9.
Внешний вид размещения деталей на плате.

Архив к статье «CTBH.rar» содержит:

1. Папку CTBH - файлы проекта на Си в среде Atmel Studio 7.
2. CTBH.dch - схема электрическая принципиальная в формате Dip Trace.
3. CTBH.dip - печатная плата устройства в формате Dip Trace.
4. CTBH_Buttons.dip - печатная плата Пульта управления в формате Dip Trace.
5. CTBH.hex - загрузочный файл для МК.

Удачи Вам в творчестве и всего наилучшего!

Скачать архив.

Что еще почитать