用树莓派来采集气温数据

早就想做一个这样的东西了,不过一直到最近手头上才有闲钱,上某宝买了个温度传感器

我买的是这个
BME280

拿上手之后按照他们给的说明把这个东西往树莓派的针脚对应插上,
硬件方面就算准备好了。
插好之后的样子↓
img1

然后就可以开搞了。

首先如果是刚装好系统的发霉派,要先sudo raspi-config打开I2C功能。
先SSH进去,输入sudo raspi-config,然后选择Interfacing OptionsP5 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里也不是很难,就是像平时一样写Dockerfiledocker-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-0i2c-2i2c-3等等的最好也都映射进去。


最后最后,只要把树莓派连上网通上电放在你想要采集的地方,就可以了。
比如我把树莓派用透明胶贴了在阳台上
img2

够扭曲 够弱智
有钱的话建议买了那种专门防水的箱子装一下,毕竟是电的东西。。

顺带一提,收集来的数据是这样子的
datas

反正已经在数据库里了,想怎么搞或者做酷炫吊炸天的表格都是小case了。