Метеостанція на Raspberry Pi своїми руками
Для відтворення цієї метеостанції знадобиться:
- - мікрокомп`ютер Raspberry Pi з операційною системою Raspbian (Raspberry Pi – що це таке?)
- - BME280 - датчик атмосферного тиску, температури і відносної вологості (BME280 – датчик атмосферного тиску)
- - Дисплей WH1602 не обов`язково (Raspberry Pi – LCD display 1602)
Схема підключення датчика зображена на малюнку.
Дисплей WH1602 підключається як показано на малюнку. Наявність дисплея не обов`язкова:
Детальніше про дисплей WH1602 читайте тут: Raspberry Pi – LCD display 1602
Налаштування I2C
Для включення I2C шини на Raspberry Pi потрібно виконати операції, що описані нижче.
Варіант #1:
Запустити налаштування командою raspi-config
Зайти у меню Advanced Options->I2C
Увімкнути I2C, дозволити загрузку модуля для I2C
Варіант #2:
Редагуємо файл: /etc/modprobe.d/raspi-blacklist.conf:
nano /etc/modprobe.d/raspi-blacklist.conf
Закоментуємо рядок blacklist i2c-bcm2708. Приклад вмісту файлу:
#blacklist i2c-bcm2708
Коригуємо файл /etc/modules:
sudo nano /etc/modules
Додаємо рядки:
i2c-bcm2708
i2c-dev
Коригуємо файл /boot/config.txt:
sudo nano /boot/config.txt
Додаємо рядок:
dtparam=i2c_arm=on
Встановлюємо i2c-tools утиліти
sudo apt-get install python-smbus i2c-tools
Перезавантажуємо Raspberry Pi:
reboot
Після перезавантаження можемо переглянути всі підключені прилади до шин I2C:
sudo i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- 76 --
В даному випадку на шині 1 тільки один пристрій за адресою 0x76
Детальніше про I2C читайте тут: Raspberry-Pi – I2C (TWI)
Встановлення програмного забезпечення
apt-get install sqlite3
apt-get install apache2
Запускаємо apache:
service apache2 start
Встановлення скрипта weather.py
Качаємо скрипти (у /home/pi/ буде створена директорія weather і в неї закачані потрібні файли):
cd /home/pi
git clone https://github.com/avislab/weather.git
cd /home/pi/weather
Створюємо базу даних:
python ./install.py
Налаштування скрипта
Відкрийте скрипт:
nano /home/pi/weather/weather.py
Перевіряємо:
home_dir - папка де лежить скрипт.
www_dir - папка www - сервера в яку буде записуватись html файл з графіками.
Приклад:
home_dir = "/home/pi/scripts/weather/"
www_dir = "/var/www/weather/"
Тестовий запуск:
python /home/pi/weather/weather.py
Скрипт має відпрацювати без помилок і сформувати файл з графіками у директорії www_dir
Зайдіть браузером для перегляду:
http://IP-address/weather/
IP-address - ip-адреса вашого Raspberry Pi
Встановлюємо запуск скрипта кожні 15 хвилин
sudo echo "*/15 * * * * root /home/pi/weather/weather.py" >> /etc/crontab
Як працює скрипт
сrontab запускає cкрипт кожні 15 хвилин (дивись файл /etc/crontab). Цей параметр можна змінити за бажанням.
Далі коментарі до деяких рядків.
Скрипт опитує датчик:
#Read data from Sensor
ps = BME280()
ps_data = ps.get_data()
Водить поточні дані у консоль та на дисплей:
print "Temperature:", convert(ps_data[`t`], units[temperature_field]), "°"+units[temperature_field], "Pressure:", convert(ps_data[`p`], units[pressure_field]), units[pressure_field], "Humidity:", ps_data[`h`], units[humidity_field]
#LCD
lcd = Adafruit_CharLCD()
lcd.clear()
lcd.home()
lcd.message(`T=%s P=%s` % (convert(ps_data[`t`], units[temperature_field]), convert(ps_data[`p`], units[pressure_field])))
lcd.message(`H=%s%%` % (ps_data[`h`]))
Якщо хочете щоб говорив розкоментуйте наступні рядки і встановить програму espeak:
#speak_str = "Тем пе ратура "
#if ps_data[`t`] < 0:
# speak_str += "минус"
#speak_str += str(int(round(abs(ps_data[`t`]))))
#os.system(`espeak "` + speak_str + `" -vru -s50 -a100 2> /dev/null`)
Підключається до бази даних і записує данні у базу даних:
#Connect to database
con = sqlite3.connect(home_dir + database_name)
cur = con.cursor()
#Insert new reccord
SQL="INSERT INTO weather VALUES({0}, `{1}`, {2}, {3})".format(time.time(), ps_data[`t`], ps_data[`p`], ps_data[`h`])
cur.execute(SQL)
con.commit()
Видаляє старі данні з бази даних:
#Delete data older than 30 days
start_time = time.time() - 86400 * delete_data_older_than_days
SQL = "DELETE FROM weather WHERE (id < {0})".format(start_time)
cur.execute(SQL)
con.commit()
Де delete_data_older_than_days - період у днях за який дані зберігаються у базі.
Читає шаблон:
#Read template & make index.htm
f = open(home_dir+`templates/index.tpl`, `r`)
txt = f.read()
f.close()
Формує HTML з графіками:
#Prepare html
date_time = datetime.datetime.fromtimestamp(time.time()).strftime(`%Y-%m-%d %H:%M`)
#Units
txt = re.sub(`{temperature_unit}`, units[temperature_field], txt)
txt = re.sub(`{pressure_unit}`, units[pressure_field], txt)
txt = re.sub(`{humidity_unit}`, units[humidity_field], txt)
#Current data
txt = re.sub(`{time}`, date_time, txt)
txt = re.sub(`{temperature}`, str(convert(ps_data[`t`], units[temperature_field])), txt)
txt = re.sub(`{pressure}`, str(convert(ps_data[`p`], units[pressure_field])), txt)
txt = re.sub(`{humidity}`, str(ps_data[`h`]), txt)
#Day ago
txt = re.sub(`{temperature24h}`, get_chart_data(temperature_field, 1), txt)
txt = re.sub(`{pressure24h}`, get_chart_data(pressure_field, 1), txt)
txt = re.sub(`{humidity24h}`, get_chart_data(humidity_field, 1), txt)
#Last week
txt = re.sub(`{temperature7d}`, get_chart_data(temperature_field, 7), txt)
txt = re.sub(`{pressure7d}`, get_chart_data(pressure_field, 7), txt)
txt = re.sub(`{humidity7d}`, get_chart_data(humidity_field, 7), txt)
Записує HTML:
#Writing file index.htm
f = open(www_dir+`index.htm`,`w`)
f.write(txt)
f.close()
Закриває базу даних:
#Database connection close
con.close()
Відправляє данні на сайт:
#Send data to my site
s="{0}:{1}:0:{2}:".format(int(ps_data[`p`]), int(ps_data[`t`]), int(ps_data[`h`]))
response = urllib2.urlopen("http://mysite.com.ua/getdata.php?data="+s)
Приклад скрипта на PHP для прийому даних і запису у файл:
<?php
// IP access
if ($_SERVER[`REMOTE_ADDR`] != "8.8.8.8") {
die(`Access deny.`);
}
$fp = fopen ("getdata.txt", "a+");
fwrite ($fp, date("d.m.Y H:i:s "));
fwrite ($fp, implode($_GET));
fwrite ($fp, date(""));
fclose ($fp);
?>
SimpleHTTP.py
Якщо Ви з якихось причин не бажаєте використовувати Apache у якості web-сервера, достатньо запустити скрипт SimpleHTTP.py:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import SimpleHTTPServer
import SocketServer
import os
PORT = 80
DocumentRoot = "/home/pi/scripts/weather/http"
os.chdir(DocumentRoot)
Handler = SimpleHTTPServer.SimpleHTTPRequestHandler
httpd = SocketServer.TCPServer(("", PORT), Handler)
print "serving at port", PORT
httpd.serve_forever()
Перед запуском слід перевірити що вказана директорій DocumentRoot існує і співпадає з www_dir вказаній у скрипті weather.py
Успіхів.
Дивись також:
- Raspberry Pi — що це таке?
- Raspberry Pi — GPIO
- Raspberry Pi — UART
- Raspberry Pi — FT232
- Raspberry Pi — PWM і Сервопривод
- Raspberry Pi — DHT11
- Raspberry Pi - FM Transmitter
- Прошивка AVR мікроконтролерів за допомогою Raspberry Pi
- Raspberry Pi — LCD display 1602
- Raspberry Pi — WiFi
- Raspberry-Pi — I2C (TWI)
- Raspberry Pi - DS18B20
- Raspberry Pi Camera
- nRF24L01+ ATMEGA + Raspberry Pi
- BMP180 + Raspberry Pi + WH1602
- Wi-Fi Метео станція
- Raspbian. Apache + PHP + Python + MySQL
- Встановлюємо Raspbian на Raspberry Pi без клавіатури та монітору
- IR-дистанційне керування. Використання LIRC у Python
- Raspberry Pi. Raspbian. Відправлення пошти через аккаунт Gmail
- Neoway M590 – GSM/GPRS modem
- MPU-6050 – гіроскоп – акселерометр
- HMC5883L Магнітометр
- PWM контролер з інтерфейсом I2С на базі мікросхеми PCA9685
- Метеостанція на Raspberry Pi своїми руками
- Raspberry Pi. Live-stream video
Tags
web java-script bmp280 adc bldc stm32 rs-232 programmator 3d-printer flash pwm sms motor docker raspberry-pi meteo gps ngnix bme280 timer ssd1331 mpu-6050 bkp battery rfid st-link tim mpx4115a ssd1306 encoder atmega pmsm wifi options rtc examples nvic soldering mongodb esp8266 books lcd foc flask barometer bluetooth ethernet brushless uart watchdog servo gpio solar git remap dma usart eb-500 smd nodemcu sensors displays html python capture dht11 led i2c eeprom piezo exti websocket max1674 usb dc-dc avr hih-4000 css mpu-9250
Архіви













