正点原子 发表于 3 小时前

《ESP32-S3使用指南—MicroPython版 V1.0》第二十六章 DS18B20实验


1)实验平台:正点原子ESP32S3开发板
2)购买链接:https://detail.tmall.com/item.htm?id=768499342659
3)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-347618-1-1.html
4)正点原子官方B站:https://space.bilibili.com/394620890
5)正点原子手把手教你学ESP32S3快速入门视频教程:https://www.bilibili.com/video/BV1sH4y1W7Tc
6)正点原子FPGA交流群:132780729


第二十六章 DS18B20实验

       本章,我们将介绍ESP32-S3如何读取外部温度传感器的温度,来得到较为准确的环境温度。我们将学习单总线技术,通过它来实现ESP32-S3和外部温度传感器DS18B20的通信,并把从温度传感器得到的温度显示在LCD上。
       本章分为如下几个小节:
       26.1 DS18B20及其时序简介
       26.2 ds18x20模块
       26.3 硬件设计
       26.4 程序设计
       26.5 下载验证

       26.1 DS18B20及其时序简介

       26.1.1 DS18B20简介
       DS18B20是由DALLAS半导体公司推出的一种“单总线”接口的温度传感器。与传统的热敏电阻等测温元件相比,它是一种新型的体积小、适用电压宽、与微处理器接口简单的数字化温度传感器。单总线结构具有简洁且经济的特点,可使用户轻松地组建传感器网络,从而为测量系统的构建引入全新的概念,测试温度范围为-55~+125℃,精度为±0.5℃。现场温度直接以单总线的数字方式传输,大大提高了系统的抗干扰性。它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。它工作在3~5.5V的电压范围,采用多种封装形式,从而使系统设置灵活、方便,设定分辨率以及用户设定的报警温度存储在EEPROM中,掉电后依然保存。其内部结构如下图所示。

图26.1.1.1 DS18B20内部结构图
       ROM中的64位序列号是出厂前被标记好的,它可以看作使该DS18B20的地址序列码,每个DS18B20的64位序列号均不相同。64位ROM的排列是:前8位是产品家族码,接着48位是DS18B20的序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。ROM作用是使每一个DS18B20都各不相同,这样设计可以允许一根总线上挂载多个DS18B20模块同时工作且不会引起冲突。

       26.1.2 DS18B20时序简介
       所有单总线器件要求采用严格的信号时序,以保证数据的完整性。DS18B20共有6种信号类型:复位脉冲、应答脉冲、写0、写1、读0和读1。所有这些信号,除了应答脉冲以外,都是由主机发出同步信号。并且发送所有的命令和数据都是字节的低位在前。这里我们简单介绍这几个信号的时序。

       1,复位脉冲和应答脉冲

图26.1.2.1 复位脉冲和应答脉冲时序图
       单总线上的所有通信都是以初始化序列开始。主机输出低电平,保持低电平时间至少要在480us,以产生复位脉冲。接着主机释放总线,4.7K的上拉电阻将单总线拉高,延时时间要在15~60us,并进入接收模式(Rx)。接着DS18B20拉低总线60~240us,以产生低电平应答脉冲。

       2,写时序

图26.1.2.2 写时序图
       写时序包括写0时序和写1时序。所有写时序至少需要60us,且在两次独立的写时序之间至少需要1us的恢复时间,两种写时序均起始于主机拉低总线。写1时序:主机输出低电平,延时2us,然后释放总线,延时60us。写0时序:主机输出低电平,延时60us,然后释放总线延时2us。

       3,读时序

图26.1.2.3 读时序图
       单总线器件仅在主机发出读时序时,才向主机传输数据,所以,在主机发出读数据命令后,必须马上产生读时序,以便从机能够传输数据。所有读时序至少需要60us,且在2次独立的读时序之间至少需要1us的恢复时间。每个读时序都由主机发起,至少拉低总线1us。主机在读时序期间必须释放总线,并且在时序起始后的15us之内采样总线状态。典型的读时序过程为:主机输出低电平延时2us,然后主机转入输入模式延时12us,然后读取单总线当前的电平,然后延时50us。
       在了解单总线时序之后,我们来看一下DS18B20的典型温度读取过程,DS18B20的典型温度读取过程为:复位→发SKIP ROM(0xCC)→发开始转换命令(0x44)→延时→复位→发送SKIP ROM命令(0xCC)→发送存储器命令(0xBE)→连续读取两个字节数据(即温度)→结束。
       MicroPython源代码已经提供了ds18x20.py脚本代码,读者可以在micropython\lib\micropython-lib\micropython\drivers\sensor\ds18x20找到此文件。从该文件的内容可以看出,它通过调用onewire(micropython\lib\micropython-lib\micropython\drivers\bus\onewire)模块来实现单总线协议。

       26.2 ds18x20模块

       MicroPython源代码提供了ds18x20驱动程序,用户可调用此模块来驱动DS18B20模块,下面是该模块的对象构造方法和使用方法,如下。

       1,ds18x20类的构造方法
       ds18x20的构造对象方法如下:
class dht.DS18X20(onewire)
使用示例:ds_18b20 = ds18x20.DS18X20(onewire.OneWire(Pin(0)))       该构造方法的参数描述,如下表所示。

表26.2.1 dht.DS18X20构造方法参数描述
       返回值:ds18x20对象。

       2,ds18x20模块的方法

       ①:扫描ds18x20设备。
       其函数原型如下:
ds_18b20.scan()       返回值:true:扫描有ds18b20设备;fail:无设备。

       ②:转换温度。
       其函数原型如下:
ds_18b20.convert_temp()       返回值:无。

       ③:读取温度。
       其函数原型如下:
ds_18b20.read_temp()       返回值:当前的温度。

       26.3 硬件设计

       1. 例程功能
       本章实验功能简介:DS18B20每隔1000ms左右读取一次数据,并把温度显示在LCD上。 LED闪烁用于提示程序正在运行。

       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)DHT11
              1WIRE_DQ-IO0

       3. 原理图
       DS18B20原理图,如下图所示。

图26.3.1 DS18B20原理图
       从上图可以看出,1WIRE_DQ并没有直接跟ESP32-S3的IO0相连,而是需要通过跳线帽进行连接。1WIRE_DQ和IO0连接图如下图所示。

图26.3.2 1WIRE_DQ和IO0连接图
图26.3.3 DS18B20与开发板连接的位置
       26.4 程序设计

       26.4.1 程序流程图
       程序流程图能帮助我们更好的理解一个工程的功能和实现的过程,对学习和设计工程有很好的主导作用。下面看看本实验的程序流程图。

图26.4.1.1 程序流程图
       26.4.2 程序解析
       本书籍的代码都在main.py脚本下编写的,读者可在光盘资料下找到对应的源码。DS18B20实验main.py源码如下:
from machine import Pin,SPI,I2C
import onewire, ds18x20
import atk_xl9555 as io_ex
import atk_lcd as lcd
import time


"""
* @brief       程序入口
* @param       无
* @retval      无
"""
if __name__ == '__main__':

    # 初始化LED并输出高电平
    led = Pin(1,Pin.OUT,value = 1)
    # 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, 32, 32, "ESP32-S3",lcd.RED)
    display.string(30, 80, 240, 24, 24, "DS18B20 TEST",lcd.RED)
    display.string(30, 110, 240, 16, 16, "ATOM@ALIENTEK",lcd.RED)
    display.string(30, 130, 200, 16, 16, "TEMPERATE: 00.00C", lcd.BLUE)
    # 初始化DS18B20
    ds_18b20 = ds18x20.DS18X20(onewire.OneWire(Pin(0)))

    """
   * @brief       读取ds18x20温度值
   * @param       无
   * @retval      无
    """
    def read_sensor():
      # 发现设备
      roms = ds_18b20.scan()
      # 获取数值
      ds_18b20.convert_temp()
      for rom in roms:
            temp = ds_18b20.read_temp(rom)
            if isinstance(temp, float):
                temp = round(temp, 2)
                return temp

    while True:
      # 打印温度值
      umber = float(read_sensor())
      display.num(30 + 11 * 8,130,int(umber),2,16,lcd.RED)
      display.num(30 + 14 * 8,130,int(umber * 100 % 100),2,16,lcd.RED)
      led_state = led.value()
      led.value(not led_state)
      time.sleep(1)       这示例代码导入了一些必要的Python模块,初始化了硬件,包括GPIO引脚、I2C总线、SPI接口、XL9555、DS18B20传感器和LCD显示屏。然后发送一个复位信号到LCD显示屏,使用onewire模块初始化DS18B20温度传感器,并在LCD显示屏上显示实验信息。进入一个无限循环后,代码读取DS18B20传感器的温度数据,并在LCD显示屏上显示这些数据。同时,它会改变LED的状态,使其闪烁。

       26.5 下载验证
       假设DS18B20传感器已经接上去正确的位置,将程序下载到开发板后,可以看到LED不停的闪烁,提示程序已经在运行了。LCD显示当前的温度值的内容如下图所示:

图25.5.1 程序运行效果图
       该程序还可以读取并显示负温度值,具备零下温度条件可以测试一下。
页: [1]
查看完整版本: 《ESP32-S3使用指南—MicroPython版 V1.0》第二十六章 DS18B20实验