【得捷电子Follow me第2期】任务1:控制屏幕显示温度写入sd卡
[复制链接]
本帖最后由 ltand 于 2023-11-15 14:05 编辑
用于读取 MCP9808 温度传感器和光敏传感器的数据,显示在屏幕上,并将温度数据写入 SD 卡中的temp.txt文件
使用的硬件要求:
esp32-s3带屏幕
光敏传感器
MCP9808温度传感器
SD卡
官方文档接线方式:
但是有个问题温度传感器和读取sd卡线插法检查多次, 但是读取sd卡库反馈no sdcard异常有点奇怪
下面是步骤说明:
1. 导入必要的库:代码中导入了一系列必要的库,包括与硬件通信的 busio、显示和图像处理的 displayio、温度传感器 MCP9808 的库 adafruit_mcp9808,以及用于读取 SD 卡的库 sdcardio 和 storage。
import board
import busio
import displayio
# 显示库
import adafruit_imageload
from adafruit_display_text import label
from adafruit_bitmap_font import bitmap_font
import time
import analogio
# 温度传感器外置库
import adafruit_mcp9808
# SD卡外置库
import sdcardio
import storage
2. 初始化硬件:通过 busio 初始化 I2C 总线,连接 MCP9808 温度传感器。同时,使用 sdcardio 初始化 SD 卡,并将其挂载到文件系统上。
# MCP9808温度传感器
i2c = busio.I2C(board.SCL, board.SDA)
mcp = adafruit_mcp9808.MCP9808(i2c)
# SD卡
spi = board.SPI()
cs = board.D13
sdcard = sdcardio.SDCard(spi, cs)
vfs = storage.VfsFat(sdcard)
storage.mount(vfs, "/sd")
3. 创建显示对象和图像组:通过 displayio 创建显示对象和图像组,加载背景图片,并将其添加到显示组中。
display = board.DISPLAY
group = displayio.Group()
# 加载图片
image, palette = adafruit_imageload.load("/image/bg.png")
palette.make_transparent(0)
grid = displayio.TileGrid(image, pixel_shader=palette)
group.append(grid)
# 显示当前图像组
display.show(group)
4. 加载字体和初始化文本标签:使用 bitmap_font 加载字体,然后创建文本标签并设置其位置和颜色。
# 加载字体并定义字体颜色
font = bitmap_font.load_font("/font/SIMLI_16.pcf")
# 白色
color = 0xFFFFFF
# 初始化文本标签
text_label = label.Label(font, text="海内存知己,天涯若比邻", color=color)
text_label.x = 0
text_label.y = 60
group.append(text_label)
5. 初始化光敏传感器:使用 analogio 初始化 A0 引脚作为光敏传感器,创建一个用于显示光敏传感器值的文本标签。
# 初始化光敏传感器
abc = analogio.AnalogIn(board.A0)
abc_label = label.Label(font, text=f"abc: {abc.value}", color=color)
abc_label.x = 20
abc_label.y = 100
group.append(abc_label)
6. 初始化温度标签:使用 analogio 初始化 A3 引脚作为温度标签,并创建一个用于显示温度的文本标签。
# 温度标签
temp_label = analogio.AnalogIn(board.A3)
temp_label = label.Label(font, text="", color=color)
temp_label.x = 40
temp_label.y = 100
group.append(temp_label)
7. 显示修改后的图像组:通过 display.show(group) 将修改后的图像组显示在屏幕上。
# 显示修改后的图像组
display.show(group)
8. 不断读取 MCP9808 温度传感器的数据,将摄氏度和华氏度显示在屏幕上,并将温度数据追加到数组中。
9. 写入温度数据和光敏传感器值到 SD 卡:使用 open 函数以写入模式打开 /sd/temp.txt 文件,将整个温度数据数组以每行一个值的方式写入文件。同时,将光敏传感器的值更新到显示文本标签。
temperature_data = [] # 用于存储温度数据的数组
while True:
# 等待一段时间,避免刷新过快导致占用过多资源
tempC = mcp.temperature
tempF = tempC * 9 / 5 + 32 # 转换成 F
temp_label.text = str(tempC)
print("Temperature: {} C {} F".format(tempC, tempF))
display.show(group)
temperature_data.append(tempF) # 将温度数据添加到数组中
with open("/sd/temp.txt", "w") as f:
# 将整个数组写入文件,每个温度值占一行
f.write("\n".join(map(str, temperature_data)))
time.sleep(2)
最后持续地读取温度和光敏传感器的数据,并将数据显示在屏幕上,同时将温度数据写入 SD 卡文件, 借鉴官方例子,使用什么库获取到传感器的值,并将他们显示在屏幕上
下边是代码展示:
import board
import busio
import displayio
# 显示库
import adafruit_imageload
from adafruit_display_text import label
from adafruit_bitmap_font import bitmap_font
import time
import analogio
# 温度传感器外置库
import adafruit_mcp9808
# SD卡外置库
import sdcardio
import storage
def run():
# MCP9808温度传感器
i2c = busio.I2C(board.SCL, board.SDA)
mcp = adafruit_mcp9808.MCP9808(i2c)
# SD卡
spi = board.SPI()
cs = board.D13
sdcard = sdcardio.SDCard(spi, cs)
vfs = storage.VfsFat(sdcard)
storage.mount(vfs, "/sd")
display = board.DISPLAY
group = displayio.Group()
# 加载图片
image, palette = adafruit_imageload.load("/image/bg.png")
palette.make_transparent(0)
grid = displayio.TileGrid(image, pixel_shader=palette)
group.append(grid)
# 显示当前图像组
display.show(group)
# 加载字体并定义字体颜色
font = bitmap_font.load_font("/font/SIMLI_16.pcf")
# 白色
color = 0xFFFFFF
# 初始化文本标签
text_label = label.Label(font, text="海内存知己,天涯若比邻", color=color)
text_label.x = 0
text_label.y = 60
group.append(text_label)
# 初始化光敏传感器
abc = analogio.AnalogIn(board.A0)
abc_label = label.Label(font, text=f"abc: {abc.value}", color=color)
abc_label.x = 20
abc_label.y = 100
group.append(abc_label)
# 温度标签
temp_label = analogio.AnalogIn(board.A3)
temp_label = label.Label(font, text="", color=color)
temp_label.x = 40
temp_label.y = 100
group.append(temp_label)
# 显示修改后的图像组
display.show(group)
temperature_data = [] # 用于存储温度数据的数组
while True:
# 等待一段时间,避免刷新过快导致占用过多资源
tempC = mcp.temperature
tempF = tempC * 9 / 5 + 32 # 转换成 F
temp_label.text = str(tempC)
print("Temperature: {} C {} F".format(tempC, tempF))
display.show(group)
temperature_data.append(tempF) # 将温度数据添加到数组中
with open("/sd/temp.txt", "w") as f:
# 将整个数组写入文件,每个温度值占一行
f.write("\n".join(map(str, temperature_data)))
time.sleep(2)
|