【小安派试玩】DS18B20温度传感器

[复制链接]
查看2186 | 回复13 | 2023-9-2 19:59:48 | 显示全部楼层 |阅读模式
前言:DS18B20是一款数字温度传感器,它能够通过1-Wire总线协议与主控设备进行通信。DS18B20传感器具有高精度的特点,能够以0.5°C的测量精度提供准确的环境温度读数。它采用数字输出形式,可在12位分辨率内根据需求进行调整。有多种功能和应用模式,包括温度测量、温度告警和热管理等。通过配置寄存器,用户可以灵活选择适合自己应用的工作模式。该传感器寿命长,且具备低功耗特性,非常适合在需要长时间运行和对功耗有严苛要求的电池供电应用中使用。DS18B20常被应用于工业自动化、环境监测、气象仪器、医疗设备等领域。其高精确度、数字化输出和多功能性使得DS18B20成为广泛使用的温度测量解决方案。无论是在要求高精度温度测量的工业环境,还是在需要准确监测温度的其他实际应用中,DS18B20都是一款可靠的选择。
中文数据手册点我点我(推荐一个查手册的好地方,嘉立创商城)


大家好,没错,俺又来啦,楼楼这次跟大家分享如何使用小安派读取DS18B20温度传感器的温度,这个传感器相信大家用的的还是挺多的,楼楼也一样!

实物展示:

· ds18b20温度传感器模块





1693655399136.jpg



· 串口输出的当前温度信息:


ds18b20.gif



经过楼楼的一翻研究,最终实现了用小安派读取温度传感器的温度(楼楼借鉴了网络中现有的驱动文件做了调整,可以成功读取温度)
接线部分楼楼就不说啦,这个很简单,相信大家都会(gnd接gnd,vcc接vcc,DQ接小安派的一个IO口)

函数介绍:

函数调用非常简单,先初始化,然后就可以读取温度啦

1:ds18b20_init(这里是引脚号)

2:ds18b20_read() 返回温度信息


代码:
ds18b20.h文件,直接新建一个ds18b20.h的头文件,然后copy到里面,在main.c中引入就可以了

  1. /*ds18b20温度传感器驱动*/

  2. #ifndef _ds18b20_H_
  3. #define _ds18b20_H_

  4. #include "bflb_mtimer.h"
  5. #include "bflb_gpio.h"

  6. struct bflb_device_s *gpio;
  7. uint8_t _pin;

  8. // 初始化IO
  9. void ds18b20_init(uint8_t pin)
  10. {
  11. gpio = bflb_device_get_by_name("gpio");
  12. bflb_gpio_init(gpio, pin, GPIO_INPUT|GPIO_PULLUP);
  13. _pin = pin;
  14. }


  15. // 总线复位.
  16. uint8_t ds18b20_reset(void)
  17. {
  18.     uint8_t r;
  19.     uint8_t retries = 125;
  20.     bflb_gpio_init(gpio, _pin, GPIO_OUTPUT);
  21.     bflb_gpio_set(gpio,_pin);
  22.     bflb_mtimer_delay_us(8);
  23.     bflb_gpio_init(gpio, _pin, GPIO_INPUT);

  24.     do
  25.     {
  26.         if (retries-- == 0)
  27.         {
  28.             return 0;
  29.         }
  30.         bflb_mtimer_delay_us(2);
  31.     } while (!bflb_gpio_read(gpio,_pin));

  32.     bflb_gpio_init(gpio, _pin, GPIO_OUTPUT);
  33.     bflb_gpio_reset(gpio,_pin);   // pull low for 500uS
  34.     bflb_mtimer_delay_us(500);
  35.     bflb_gpio_init(gpio, _pin, GPIO_INPUT);
  36.     bflb_mtimer_delay_us(65);
  37.     r = !bflb_gpio_read(gpio,_pin);
  38.     bflb_mtimer_delay_us(500);
  39.     return r;
  40. }


  41. // 读一个字节.
  42. uint8_t ds18b20_read_one_char(void)
  43. {
  44.     uint8_t i = 0;
  45.     uint8_t dat = 0;

  46.     for (i = 8; i > 0; i--)
  47.     {
  48.         bflb_gpio_init(gpio, _pin, GPIO_OUTPUT);
  49.         bflb_mtimer_delay_us(1);                   //保证两次读操作时间间隔1us以上
  50.         bflb_gpio_reset(gpio,_pin);    // 给脉冲信号
  51.         bflb_mtimer_delay_us(2);                   //保证主机拉低总线1μs以上
  52.         dat >>= 1;
  53.         bflb_gpio_set(gpio,_pin);    // 给脉冲信号
  54.         bflb_mtimer_delay_us(5);
  55.         bflb_gpio_init(gpio, _pin, GPIO_INPUT);
  56.         if (bflb_gpio_read(gpio,_pin))     //主机对总线采样的数 判断
  57.             dat |= 0x80;
  58.         bflb_mtimer_delay_us(50);                  //等待读操作结束
  59.     }
  60.     return (dat);
  61. }

  62. // 写一个字节.
  63. void ds18b20_write_one_char(unsigned char dat)
  64. {
  65.     unsigned char i = 0;
  66.     bflb_gpio_init(gpio, _pin, GPIO_OUTPUT);

  67.     for (i = 8; i > 0; i--)
  68.     {
  69.         bflb_mtimer_delay_us(1);
  70.         bflb_gpio_reset(gpio,_pin);
  71.         bflb_mtimer_delay_us(2);
  72.         (dat & 0x01) ? bflb_gpio_set(gpio,_pin) : bflb_gpio_reset(gpio,_pin);
  73.         bflb_mtimer_delay_us(70);
  74.         bflb_gpio_set(gpio,_pin);
  75.         dat >>= 1;
  76.     }
  77. }


  78. // 描述: 读温度
  79. float ds18b20_read()
  80. {
  81.     uint8_t low_byte, high_byte;
  82.     int16_t TReading, SignBit, Tc_100;

  83.     ds18b20_reset();
  84.     ds18b20_write_one_char(0xCC); // 跳过读序号列号的操作
  85.     ds18b20_write_one_char(0x44); // 启动温度转换

  86.     bflb_mtimer_delay_us(600);

  87.     ds18b20_reset();
  88.     ds18b20_write_one_char(0xCC); //跳过读序号列号的操作
  89.     ds18b20_write_one_char(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
  90.     bflb_mtimer_delay_us(600);

  91.     low_byte = ds18b20_read_one_char();  //读取温度值低位
  92.     high_byte = ds18b20_read_one_char(); //读取温度值高位

  93.     TReading = (high_byte << 8) + low_byte;
  94.     SignBit = TReading & 0x8000;

  95.     if (SignBit)
  96.     {
  97.         TReading = (TReading ^ 0xffff) + 1;
  98.         TReading = 0 - TReading;
  99.     }
  100.     Tc_100 = (6 * TReading) + TReading / 4;

  101.     return (float)Tc_100 / 100.0;
  102. }

  103. #endif
复制代码

main.c文件调用:
  1. #include "board.h"
  2. #include "ds18b20.h"


  3. float data;
  4. int main(void)
  5. {
  6.     board_init();

  7.     ds18b20_init(24); //初始化,传感器在哪个io就填哪个。
  8.    
  9.     printf("hello world\r\n");
  10.     while (1) {
  11.         data = ds18b20_read(); // 循环读取温度
  12.         printf("temperature:%.2f °C\r\n", data);
  13.         bflb_mtimer_delay_ms(1000);
  14.     }
  15. }
复制代码

好了,以上就是楼楼本次关于ds18b20温度传感器的内容分享,楼楼在代码中楼楼添加了一些注释,还有一些注释是原本就有的,楼楼比较菜,如果有什么地方不对大家可以自行修改(该驱动文件移植于网络,并非本人原创)


本帖被以下淘专辑推荐:

回复

使用道具 举报

ai_mcu | 2023-9-2 20:48:25 | 显示全部楼层
期哥努力发帖的样子真好看
明天总会更好
回复 支持 反对

使用道具 举报

jkernet | 2023-9-2 21:05:34 | 显示全部楼层
感谢分享
回复

使用道具 举报

不是你的猫 | 2023-9-2 21:12:08 | 显示全部楼层

感谢分享
回复

使用道具 举报

翁vjk | 2023-9-2 23:08:51 | 显示全部楼层
支持期哥
回复

使用道具 举报

18350766600@139 | 2023-9-3 19:44:30 | 显示全部楼层
学习一下,谢谢分享
回复 支持 反对

使用道具 举报

student9527 | 2023-11-15 20:30:06 | 显示全部楼层
投币了
回复

使用道具 举报

ywjdlq | 2023-11-28 11:04:17 | 显示全部楼层
大佬,读取结果一直是-0.06是什么情况啊
回复 支持 反对

使用道具 举报

干簧管 | 2023-11-29 09:41:39 | 显示全部楼层
支持期哥
回复

使用道具 举报

干簧管 | 2023-11-29 19:36:34 | 显示全部楼层
投币
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则