第二十三章 内部温度传感器实验
本章,我们将介绍ESP32-S3的内部温度传感器并使用它来读取温度值,然后在LCD模块上显示出来。
本章分为如下几个小节:
23.1 内部温度传感器简介
23.2 sensor模块
23.2 硬件设计
23.3 程序设计
23.4 下载验证
23.1 内部温度传感器简介
温度传感器生成一个随温度变化的电压。内部ADC将传感器电压转化为一个数字量。温度传感器的测量范围为–20°C 到110°C。温度传感器适用于监测芯片内部温度的变化,该温度值会随着微控制器时钟频率或IO负载的变化而变化。一般来讲,芯片内部温度会高于外部温度。ESP32-S3温度传感器相关内容,请看《esp32-s3_technical_reference_manual_cn.pdf》技术手册39.4章节。
温度传感器的输出值需要使用转换公式转换成实际的温度值 (°C)。转换公式如下:
T(°C) = 0.4386 * VALUE –27.88 * offset –20.52
其中 VALUE 即温度传感器的输出值,offset 由温度偏移决定。温度传感器在不同的实际使用环境(测量温度范围)下,温度偏移不同,见下表所示。
表23.1.1 温度传感器的温度偏移
23.2 sensor模块
sensor驱动程序(sensor.c/.h)可以在以下路径中找到:A盘à6,软件资料à1,软件à2,MicroPython开发工具à01-Windowsà2,正点原子MicroPython驱动àCModules_LibàSENSOR。作者对该模块的函数和使用进行了详细解释。如果读者不了解这个程序的编写流程,请重新阅读第七章的内容。
1,sensor类的构造方法
sensor的构造对象方法如下:
class sensor.init() 使用示例:sensor.init()
返回值:无。
2,sensor模块的方法
①:读取ESP32-S3内部温度。
其函数原型如下:
sensor.sensor_read()
返回值:返回内部温度。
23.3 硬件设计
1. 例程功能
本章实验功能简介:通过ADC的通道读取ESP32-S3内部温度传感器的电压值,并将其转换为温度值,显示在SPILCD屏上。
2. 硬件资源
1)XL9555
IIC_INT-IO0(需在P5连接IO0)
IIC_SDA-IO41
IIC_SCL-IO42
2)SPILCD
CS-IO21
SCK-IO12
SDA-IO11
DC-IO40(在P5端口,使用跳线帽将IO_SET和LCD_DC相连)
PWR- IO1_3(XL9555)
RST- IO1_2(XL9555)
3)内部温度传感器
3. 原理图
本章实验使用的ADC为ESP32-S3的片上资源,因此并没有相应的连接原理图。
23.4 程序设计
23.4.1 程序流程图
程序流程图能帮助我们更好的理解一个工程的功能和实现的过程,对学习和设计工程有很好的主导作用。下面看看本实验的程序流程图。
图23.4.1.1 程序流程图
23.4.2 程序解析
本书籍的代码都在main.py脚本下编写的,读者可在光盘资料下找到对应的源码。内部温度传感器实验main.py源码如下:
from machine import Pin,SPI,I2C import atk_xl9555 as io_ex import atk_lcd as lcd import atk_sensor as sensor import time """ * @brief 程序入口 * @param 无 * @retval 无 """ if __name__ == '__main__': # IIC初始化 i2c0 = I2C(0, scl = Pin(42), sda = Pin(41), freq = 400000) # XL9555初始化 xl9555 = io_ex.init(i2c0) # 复位LCD xl9555.write_bit(io_ex.SLCD_RST,0) time.sleep_ms(100) xl9555.write_bit(io_ex.SLCD_RST,1) time.sleep_ms(100) # 初始化SPI spi = SPI(2,baudrate = 80000000, sck = Pin(12), mosi=Pin(11), miso=Pin(13)) # 初始化LCD,lcd = 0为正点原子2.4寸屏幕;lcd = 1为正点原子1.3寸SPILCD屏幕; display = lcd.init(spi,dc = Pin(40,Pin.OUT,Pin.PULL_UP,value = 1), cs = Pin(21,Pin.OUT,Pin.PULL_UP,value = 1),dir = 1,lcd = 0) xl9555.write_bit(io_ex.SLCD_PWR,1) time.sleep_ms(100) # 实验信息 display.string(30, 50, 240, 16, 16, "ESP32-S3",lcd.RED) display.string(30, 70, 240, 16, 16, "Temperature TEST",lcd.RED) display.string(30, 90, 240, 16, 16, "ATOM@ALIENTEK",lcd.RED) display.string(30, 120, 200, 16, 16, "TEMPERATE: 00.00C", lcd.RED) # 初始化内部温度传感器 sensor.init() while True: umber = float(sensor.sensor_read()) display.num(30 + 11 * 8,120,int(umber),2,16,lcd.BLUE) display.num(30 + 14 * 8,120,int(umber * 100 % 100),2,16,lcd.BLUE) time.sleep_ms(500)
main函数代码比较简单,主要是通过sensor.sensor_read函数读取ESP32-S3内部温度值,最后在SPILCD上显示。
23.5 下载验证
将程序下载到开发板后,LCD显示的内容如下图所示:
图23.5.1 内部温度传感器实验测试图
大家可以看看你的温度值与实际是否相符合(因为芯片会发热,所以一般会比实际温度偏高)?