Метеостанція

Не вичитувався давач температури і вологості SHT21 на метеостанція через перегнивший кабель живлення, тож вирішив заодно розповісти про мою метеостанцію за вікном. Для чого метеостанція: робота із великими даними, тестування каналів передачі інформації, робота із hardware, веб розробка.

Переглянути актуальні дані по погоді можна за лінком. Опис програмної оболонки буде опубліковано пізніше.

Вибір сенсора

Щоб дані були вірні потрібно правильно підібрати сенсори.

Сенсор: SHT21 – температура + вологість

Інтерфейс: I2C, живлення: 2.1..3.0..3.6V; Температура: -40..125°C, розширення: 0.01°C, точність: ±0.3°C; Вологість: 0..100%RH, розширення: 0.04%RH, точність: ±2%RH.

Можна взяти HDC1080.

Сенсор: BMP085 – температура + тиск

Інтерфейс: I2C, живлення: 1.8..2.5..3.6V; Температура: -40..85°C, розширення: 0.1°C, точність: ±1.0°C (±2.0°C max); Тиск: 300..1100 hPa (+9000..-500 m над рівнем моря), розширення: 0.01 hPa, точність: ±1.5 hPa (±4.0 hPa max).

Сенсор: DS18B20

Інтерфейс: 1wire, живлення: 3.0..5.5V; Температура: -55..125°C, розширення: 0.1°C, точність: ±0.5°C. При розробці програм треба враховувати що дачткик інколи може видати температуру 85 градусів.

Сенсор: BME280

Інтерфейс: I2C, живлення: 1.71..2.5..3.6V; Температура: -40..85°C. Даташит.

Сенсор: кількість опадів

Зазвичай використовується механічний сенсор у вигляді каретки.

Фото і анімація Lana Sator.

На даний час на станції розміщено датчики температури, вологості і тиску (SHT21 і BMP085).

Захист датчиків від впливу сонця, опадів

Для цього використовують захисні екрани (radiation shield). В мене вийшов такий, із підставок під вазонки.

Схема.

За рік часу ззовні і всередині пластик обростає дуже мілким пилом.

На дні розміщено штекер для оперативного зняття і обслуговування.

Зчитування даних і передача на обробку

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

Використання роутера із OpenWRT

Використав TL-MR3020 (це мініроутер із 400 мгц процесором, локальною мережею і Wi-Fi): додав UART на SP3223, додав I2C на GPIO 7 і 29.  Вивів все гарно на DB9 конектор (1-5V;2-TX;3-RX;4-NC;5-GND;6-3.3V;7-LGND;8-SCL;9-SDA).

Ігсталював модулі для роботи із i2c, бінарники для роботи.

Лістинг meteo.sh

#!/bin/sh
#SHT21
RAWTEMP=$(i2cget -y 0 0x40 0xe3 w)
Q=$(echo "$RAWTEMP"|sed -r 's/0x([0-9a-f]{2})([0-9a-f]{2})/\2\1/')
RAWHUMI=$(i2cget -y 0 0x40 0xe5 w)
W=$(echo "$RAWHUMI"|sed -r 's/0x([0-9a-f]{2})([0-9a-f]{2})/\2\1/')

#BMP085
i2cset -y 0 0x77 0xf4 0x2e
sleep 1
T=$(i2cget -y 0 0x77 0xf6 w)
T=$(echo "$T"|sed -r 's/0x([0-9a-f]{2})([0-9a-f]{2})/\2\1/')
i2cset -y 0 0x77 0xf4 0xf4
sleep 1
P=$(i2cget -y 0 0x77 0xf6 w)
P=$(echo "$P"|sed -r 's/0x([0-9a-f]{2})([0-9a-f]{2})/\2\1/')
PD=$(i2cget -y 0 0x77 0xf8)
PD=$(echo "$PD"|sed -r 's/0x([0-9a-f]{2})/\1/')

if [ -z "$Q" ]; then
 Q="----"
fi
if [ -z "$W" ]; then
 W="----"
fi
if [ -z "$T" ]; then
 T="----"
fi
if [ -z "$P" ]; then
 P="----"
fi
if [ -z "$PD" ]; then
 PD="--"
fi

# echo 'Q='$Q' W='$W' T='$T' P='$P' PD='$PD

/usr/bin/wget -q -O /dev/null 'http://meteo.uaid.net.ua/P/****/'$Q$W$T$P$PD

Шоб перевірити список пристроїв на i2c шині використовуємо команду i2cdetect 0. 40 адреса SHT, 77 – BMP.

WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will probe file /dev/i2c-0.
I will probe address range 0x03-0x77.
Continue? [Y/n] Y
 0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- 77

По математиці BMP085

Тут інженери зробили дуже “легку” метематику. Опис математики.
Помилка на сторінці 5 Derived Calibration Data має бути 0,000004
Помилка у формулі y2 на сторінці 2, додатково поділив на 40 000 щоб дані співпали із тестовими. Математика в GoogleSheet.

Відображення даних на мобільному (android)

Дуже сподобався віджет на андроїд: Universal Widget.
Вказавши “Data privider URL” meteo.uaid.net.ua/uv отримуємо дані із станції.

Зчитування температури із датчиків DS18B20

Якщо є вільний постійно включений компютер із лінуксом на борту і вільним COM (serial) портом, то можна знімати дані таким скриптом. В мене він жив пару років доки роль роутера виконував комп’ютер із PfSense.

#!/bin/sh
temp=`/usr/local/bin/digitemp_DS9097 -t 0 -q -o%.2C -s /dev/cuau1 -с /usr/local/etc/digitemp.conf`
/usr/local/bin/wget -q -O /dev/null 'http://meteo.uaid.net.ua/sensor.php?SID=*&T='$temp

і закидуємо у cron щохвилини

*   *   *   *   *   root   /bin/sh /usr/local/etc/put.sh

При перщому виконанні потрібно створити конфіг файл.

/usr/local/bin/digitemp_DS9097 -i -s /dev/cuau1
DigiTemp v3.6.0 Copyright 1996-2007 by Brian C. Lane
GNU Public License v2.0 - http://www.digitemp.com
Turning off all DS2409 Couplers
.
Searching the 1-Wire LAN
28FA1686020000DC : DS18B20 Temperature Sensor
ROM #0 : 28FA1686020000DC
Wrote .digitemprc

Був підключений 18 метровим екранованим сигнальним кабелем 4*0,22. Працював як на паразитному так і на додатковому живленні.

Перехідник RS-232-1Wire.

При довгому кабелі із біметалу не вичитувало сенсор

digitemp_DS9097 -a
DigiTemp v3.6.0 Copyright 1996-2007 by Brian C. Lane
GNU Public License v2.0 - http://www.digitemp.com
CRC Failed. CRC is 63 instead of 0x00
CRC Failed. CRC is 63 instead of 0x00
CRC Failed. CRC is 63 instead of 0x00
Mar 10 14:51:42 Sensor 1 C: 10.12 F: 50.23

При короткому кабелі все ок:

digitemp_DS9097 -a
DigiTemp v3.6.0 Copyright 1996-2007 by Brian C. Lane
GNU Public License v2.0 - http://www.digitemp.com
Mar 10 13:43:16 Sensor 0 C: 40.12 F: 104.22
Mar 10 13:43:17 Sensor 1 C: 9.44 F: 48.99

Схема метеостанції яку хочу виконати на компонентах із industrial діапазоном температу:

Контакти площадки сенсорів: (+, -, int, scl, sda).

Робимо кулі до анемоментра: кулька 44,5 мм вага 361г із підшибника + молоток + мідь і маємо півсфери. Потемніли після відпалу.

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