Метеостанція на 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
bme280 bmp280 gps mpu-6050 options stm32 ssd1331 ssd1306 eb-500 3d-printer soldering tim mpu-9250 dma watchdog piezo exti web raspberry-pi docker ngnix solar bluetooth foc html css brushless flask dc-dc capture gpio avr rs-232 mpx4115a atmega mongodb st-link barometer pwm nvic git java-script programmator dht11 hih-4000 pmsm encoder max1674 smd sensors rtc adc lcd motor timer meteo examples i2c usb flash sms rfid python esp8266 servo books bldc remap eeprom bkp battery ethernet uart usart displays led websocket nodemcu wifi
Архіви













