【得捷电子Follow me第3期】任务5:使用外部传感器
[复制链接]
本帖最后由 鲜de芒果 于 2023-11-19 21:15 编辑
任务要求
连接环境光传感器或温湿度传感器,获取传感器的数值,并转换成真实的物理量
硬件准备
该任务也需要搭配扩展板来实现,扩展板为 Seeed Studio Expansion Board Base for XIAO
另外,需要搭配温湿度传感器模块 Grove - AHT20 I2C Industrial Grade Temperature and Humidity Sensor 和 光传感器模块 Grove - Light Sensor v1.2 来完成相应功能。
如下图所示,将温湿度传感器模块 Grove - AHT20 I2C Industrial Grade Temperature and Humidity Sensor 连接至扩展板的 I2C 接口。将 光传感器模块 Grove - Light Sensor v1.2 连接至扩展板的 A0-D0 接口
代码实现
温湿度数据的获取相对比较简单,有很多现成的库可供使用,只需要简单调用库函数即可完成温湿度数据的读取。实现代码如下:
sensor = ahtx0.AHT20(i2c) # 使用I2C驱动创建AHT20温湿度传感器对象
print("Temperature: %04.2f C" % sensor.temperature) # 温度
print("Humidity: %04.2f %%" % sensor.relative_humidity) # 湿度
光强度数据的获取相对麻烦一点,能找到的资料比较有限,官网资料与实际硬件模块有出入。这里比较纠结应该如何实现换算。 这里我使用的方案是根据官网模块说明,最大量程为 350 Lux。通过与 12 bit ADC值的对应转换关系计算得到当前光照度。
lux = light_lux = light_adc * 350 / bit_12_max_value
print("light value: %04.2f Lux, adc value: %d" %(light_lux, light_adc))
另外,光敏电阻的阻值计算使用了 官方示例 中的公式进行换算,不过实现上并未用到智能家居的环境监测应用中。环境监测只需要用到光照度。
light_r = (bit_12_max_value - light_adc) * 10 / light_adc
print("light resistance value: %04.2f K" %(light_r))
任务完整代码如下:
import ahtx0
import utime
import ujson
import machine
from task2 import i2c, display
from task4 import station
# 温湿度传感器
sensor = ahtx0.AHT20(i2c) # 使用I2C驱动创建AHT20温湿度传感器对象
# 光照传感器
adc = machine.ADC(machine.Pin(2)) # ADC引脚初始化
adc.atten(machine.ADC.ATTN_11DB) # 应用输入衰减, 11dB 衰减, 允许输入电压范围 (150mV - 2450mV)
adc.width(machine.ADC.WIDTH_12BIT) # ESP32C3 为12位ADC
temperature = 0 # 温度数据
humidity = 0 # 湿度数据
lux = 0 # 光照强度
lux_adc = 0 # 光照采样
wifi_rssi = 0 # 信号强度
# 获取温湿度数据函数
def get_temperature_humidity_data():
print("Temperature: %04.2f C" % sensor.temperature)
print("Humidity: %04.2f %%" % sensor.relative_humidity)
global temperature
global humidity
temperature = sensor.temperature
humidity = sensor.relative_humidity
bit_12_max_value = (1 << 12) - 1 # 12 位数据最大值
max_light_lux = 350 # 光照传感器最大量程
# 获取光照强度(单位: 流明)
def get_light_data():
global lux_adc
global lux
lux_adc = light_adc = adc.read() # 通过ADC读取光照传感器模拟量
# 将光照强度的模拟量转换为强度单位 流明(Lux)
# 根据模块说明,最大量程为 350 Lux。通过与 12 bit ADC值的对应转换关系计算得到当前光照度
lux = light_lux = light_adc * 350 / bit_12_max_value
print("bit_12_max_value: ", bit_12_max_value)
print("light value: %04.2f Lux, adc value: %d" %(light_lux, light_adc))
"""
以下参考官方 wiki 的阻值计算公式进行计算,详见: https://wiki.seeedstudio.com/Grove-Light_Sensor/#software-3
"""
light_r = (bit_12_max_value - light_adc) * 10 / light_adc
print("light resistance value: %04.2f K" %(light_r))
# 获取当前连接wifi信号强度
def get_wifi_rssi():
global wifi_rssi
wifi_rssi = station.status('rssi')
# OLED显示传感器数据
def show_sensor_value():
display.fill(0) # 清除显示
display.rect(0, 0, 126, 62, 1) # 绘制矩形
display.text("Follow me 3", 5, 10) # 显示文字
display.text("temp: %.2f C" %(temperature), 5, 22) # 显示温度文本
display.text("humi: %.2f %%" %(humidity), 5, 34) # 显示湿度文本
display.text("%d = %.2fLux" %(lux_adc, lux), 5, 46) # 显示光照度文本
display.show() # 显示内容
# 运行任务5示例
def run_task5_demo():
get_temperature_humidity_data()
get_light_data()
show_sensor_value()
# 获取传感器数据,用于将传感器数据上报至智能家居平台
def get_sensor_data():
json_data = {
'temperature': f'{temperature:.2f}', # 温度数据
'humidity': f'{humidity:.2f}', # 湿度数据
'lux': f'{lux:.2f}', # 光照强度
'lux_adc': lux_adc, # 光照采样
'wifi_rssi': f'{wifi_rssi:.2f}' # 信号强度
}
# print(ujson.dumps(json_data))
return ujson.dumps(json_data)
效果展示
演示视频
|