用树莓派来采集气温数据
早就想做一个这样的东西了,不过一直到最近手头上才有闲钱,上某宝买了个温度传感器
我买的是这个
拿上手之后按照他们给的说明把这个东西往树莓派的针脚对应插上,
硬件方面就算准备好了。
插好之后的样子↓
然后就可以开搞了。
首先如果是刚装好系统的发霉派,要先sudo raspi-config
打开I2C功能。
先SSH进去,输入sudo raspi-config
,然后选择Interfacing Options
,P5 I2C
,然后YES,
YES完最后重启一下。
另外一提这玩意儿其实也能往SPI上插,但是如果你选择插SPI上,那就改成打开SPI。
重启之后安装i2c-tools
,然后康康发霉派有没有把你的sensor识别到
apt install i2c-tools -y
i2cdetect -y 1
如果看到有个77
的话,应该就是成功的,像这样↓
root@pi32:~# 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: -- -- -- -- -- -- -- 77
root@pi32:~#
我们直接用python开搞,恰巧pip里有一个直接能拿来用的包,叫做RPi.bme280
那么我们就直接把别人的作业import进来就可以了(x
pip install RPi.bme280
他给的示例代码是
import smbus2
import bme280
port = 1
address = 0x77 #因为我这按实际上的地址是77,和他的不同,所以改了。
bus = smbus2.SMBus(port)
calibration_params = bme280.load_calibration_params(bus, address)
data = bme280.sample(bus, address, calibration_params)
print(data.id) # 生成一个随机的UUID
print(data.timestamp) # 获得当前时间
print(data.temperature)# 获得温度
print(data.pressure) # 获得大气压强
print(data.humidity) # 获得相对湿度
print(data) # 以上的全家桶
复制保存跑一下,是能用的。
那么,改一下就能用了。
比如我的需求是每隔一分钟向指定URL以JSON的形式PUT一下当前的环境数据
import smbus2
import bme280
import json
import time
import requests
print("System Start.")
port = 1
address = 0x77
bus = smbus2.SMBus(port)
while True:
calibration_params = bme280.load_calibration_params(bus, address)
sensor_data = bme280.sample(bus, address, calibration_params)
timestamp = time.time()
data = {'id': int(timestamp), 'temperature': sensor_data.temperature, 'pressure': sensor_data.pressure, 'humidity': sensor_data.humidity}
json_str = json.dumps(data)
print(json_str)
httpRequest = requests.put("YOUR_URL", data=json_str)
print(httpRequest.status_code, httpRequest.content)
time.sleep(int(60))
其实我是往腾讯云的的云函数上PUT数据,因为我有一个学生优惠买来的腾讯云的数据库,不想浪费了,
那么,云函数主要就是接受树莓派PUT过来的数据,并且插进MySQL里。
<?php
function main_handler($event, $context) {
if ($event->httpMethod == "PUT"){
$envData = json_decode($event->body);
$mysql = new mysqli(DB_ADDR, DB_USERNAME, DB_PASSWORD, DB_NAME, DB_PORT);
$cmd = "INSERT INTO balcony (timestamp, temperature, pressure, humidity) VALUES ($envData->id, $envData->temperature, $envData->pressure, $envData->humidity )";
if ($mysql->query($cmd) === TRUE) {
return "ok";
}
else {
return "fail.";
}
}
}
然后把这个云函数的触发方式改成由API网关触发,把访问路径贴回树莓派上的那个YOUR_URL
就好了。
那么基本就已经完工了,只要把那坨蟒蛇丢进screen里24小时跑着就能自动记录数据了。
但是我还想把他封装进docker里,方便管理和以后的迁移(如果有的话)
塞进Docker里也不是很难,就是像平时一样写Dockerfile
和docker-compose.yml
,
但是注意如果想要把树莓派的I2C射进容器里,就应该用devices: - /dev/i2c-1
有些人可能不是/dev/i2c-1
,这个要怎么看呢,
就是ls /dev | grep i2c
。
比如我的是
root@pi32:~# ls /dev | grep i2c
i2c-1
只有一个i2c-1
,但是如果你有i2c-0
、i2c-2
、i2c-3
等等的最好也都映射进去。
最后最后,只要把树莓派连上网通上电放在你想要采集的地方,就可以了。
比如我把树莓派用透明胶贴了在阳台上
够扭曲 够弱智
有钱的话建议买了那种专门防水的箱子装一下,毕竟是电的东西。。
顺带一提,收集来的数据是这样子的
反正已经在数据库里了,想怎么搞或者做酷炫吊炸天的表格都是小case了。