[作品提交] 【得捷电子Follow me第3期】任务5:使用外部传感器

鲜de芒果   2023-11-19 21:20 楼主

任务要求

连接环境光传感器或温湿度传感器,获取传感器的数值,并转换成真实的物理量

 

硬件准备

该任务也需要搭配扩展板来实现,扩展板为 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 接口

WechatIMG192.jpeg

 

代码实现

温湿度数据的获取相对比较简单,有很多现成的库可供使用,只需要简单调用库函数即可完成温湿度数据的读取。实现代码如下:

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)

 

效果展示

WechatIMG191.jpeg

 

演示视频


 

本帖最后由 鲜de芒果 于 2023-11-19 21:15 编辑

回复评论 (2)

这个底板不错,是官方的吗?  

在爱好的道路上不断前进,在生活的迷雾中播撒光引
点赞  2023-11-20 17:02

感谢楼主提供的技术分享,先收藏学习再发表个人意见,顶起来

点赞  2023-11-23 19:51
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复