Arduino爱好者

 找回密码
 立即注册

QQ登录

只需一步,快速开始

楼主: eagler8

[经验] 【Arduino】108种传感器系列实验(39)---18B20温度传感器模块

[复制链接]
 楼主| 发表于 2022-4-20 15:59 | 显示全部楼层
高于上限的变量都会触发红色LED灯亮起

5.10-23.jpg

 楼主| 发表于 2022-4-20 16:00 | 显示全部楼层
介于两者之间的变量都将打开绿色LED灯

5.10-24.jpg

 楼主| 发表于 2022-4-20 16:01 | 显示全部楼层
程序六:高温声光报警器
1)实验开源图形编程(Mind+、编玩边学)

5.10-25.jpg

 楼主| 发表于 2022-4-20 16:01 | 显示全部楼层
实验串口返回情况

5.10-26.jpg

 楼主| 发表于 2022-4-20 16:02 | 显示全部楼层
实验场景图

5.10-27.jpg

 楼主| 发表于 2022-4-20 16:03 | 显示全部楼层
程序七:检测不同18B20芯片的唯一编码
(1)Arduino参考开源代码

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.    程序七:检测不同18B20芯片的唯一编码
  4. */

  5. #include <OneWire.h>

  6. // 18S20温度芯片I/O
  7. OneWire ds(7);  // 在引脚 D7 上

  8. void setup(void) {
  9.   // 初始化输入/输出
  10.   // 以 9600 的波特率启动串口
  11.   Serial.begin(9600);
  12. }

  13. void loop(void) {
  14.   //用于将原始数据转换为C
  15.   int HighByte, LowByte, TReading, SignBit, Tc_100, Whole, Fract;

  16.   byte i;
  17.   byte present = 0;
  18.   byte data[12];
  19.   byte addr[8];

  20.   //查找oneWire Bus上连接的所有设备
  21.   if ( !ds.search(addr)) {
  22.     Serial.print("没有更多地址。\n");
  23.     ds.reset_search();
  24.     return;
  25.   }

  26.   Serial.print("R=");
  27.   for ( i = 0; i < 8; i++) {
  28.     Serial.print(addr[i], HEX);
  29.     Serial.print(" ");
  30.   }

  31.   if ( OneWire::crc8( addr, 7) != addr[7]) {
  32.     Serial.print("CRC 无效!\n");
  33.     return;
  34.   }

  35.   if ( addr[0] == 0x10) {
  36.     Serial.print("设备为 18S20 系列设备。\n");
  37.   }
  38.   else if ( addr[0] == 0x28) {
  39.     Serial.print("设备为 18S20 系列设备。\n");
  40.   }
  41.   else {
  42.     Serial.print("设备系列无法识别:0x");
  43.     Serial.println(addr[0], HEX);
  44.     return;
  45.   }

  46.   ds.reset();
  47.   ds.select(addr);
  48.   ds.write(0x44, 1);  // 开始转换,最后备份电源开启

  49.   delay(1000);     // 也许 750 毫秒就足够了,也许不行
  50.   // 我们可能会在这里执行 ds.depower(),但重置会处理它。

  51.   present = ds.reset();
  52.   ds.select(addr);
  53.   ds.write(0xBE);    // 读取便签本

  54.   Serial.print("P=");
  55.   Serial.print(present, HEX);
  56.   Serial.print(" ");
  57.   for ( i = 0; i < 9; i++) {  // 我们需要 9 个字节
  58.     data[i] = ds.read();
  59.     Serial.print(data[i], HEX);
  60.     Serial.print(" ");
  61.   }
  62.   Serial.print(" CRC=");
  63.   Serial.print( OneWire::crc8( data, 8), HEX);
  64.   Serial.println();

  65.   //原始数据到C的转换
  66.   LowByte = data[0];
  67.   HighByte = data[1];
  68.   TReading = (HighByte << 8) + LowByte;
  69.   SignBit = TReading & 0x8000;  // 测试大多数 sig 位
  70.   if (SignBit) // 负数
  71.   {
  72.     TReading = (TReading ^ 0xffff) + 1; // 2 的补偿
  73.   }
  74.   //乘以 (100 * 0.0625) 或 6.25
  75.   Tc_100 = (6 * TReading) + TReading / 4;

  76.   Whole = Tc_100 / 100;  // 将整数部分和小数部分分开
  77.   Fract = Tc_100 % 100;

  78.   Serial.print("温度:");
  79.   if (SignBit) // 如果是负数
  80.   {
  81.     Serial.print("-");
  82.   }
  83.   Serial.print(Whole);
  84.   Serial.print(".");
  85.   if (Fract < 10)
  86.   {
  87.     Serial.print("0");
  88.   }
  89.   Serial.print(Fract);

  90.   Serial.print("\n");
  91.   //结束转换为C
  92. }
复制代码


 楼主| 发表于 2022-4-20 16:04 | 显示全部楼层
(2)实验串口返回情况(18B20设备之一)

5.10-28.jpg

 楼主| 发表于 2022-4-20 16:05 | 显示全部楼层
实验串口返回情况(18B20设备之二)

5.10-29.jpg

 楼主| 发表于 2022-4-20 16:05 | 显示全部楼层
程序八:串口打印实时摄氏温度与华氏温度值
(1)Arduino参考开源代码

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.    程序八:串口打印实时摄氏温度与华氏温度值
  4. */

  5. // 首先我们包含二个库
  6. #include <OneWire.h>
  7. #include <DallasTemperature.h>

  8. // 数据线插入 Arduino 上的引脚D7
  9. #define ONE_WIRE_BUS 7

  10. // 设置 oneWire 实例以与任何 OneWire 设备进行通信
  11. //(不仅仅是Maxim/Dallas温度IC)
  12. OneWire oneWire(ONE_WIRE_BUS);

  13. // 将我们的 oneWire 引用传递给达拉斯温度。
  14. DallasTemperature sensors(&oneWire);

  15. void setup(void) {
  16.   // 启动串口
  17.   Serial.begin(9600);
  18.   Serial.println("Dallas Temperature IC Control Library Demo");
  19.   // 启动库
  20.   sensors.begin();
  21. }

  22. void loop(void) {
  23.   // 调用sensors.requestTemperatures() 来发布全球温度
  24.   // 请求总线上的所有设备
  25.   Serial.print(" Requesting temperatures...");
  26.   sensors.requestTemperatures(); //发送命令以获取温度读数
  27.   delay(1000); // 等待 1 秒让温度抓取稳定
  28.   Serial.println("done");

  29.   Serial.print("Temperature is: ");

  30.   // 为什么是“byIndex”?
  31.   // 同一总线上可以有多个 18B20。
  32.   // 0指的是线上的第一个IC

  33.   Serial.print(sensors.getTempCByIndex(0));
  34.   Serial.print("° C  (");

  35.   Serial.print(sensors.getTempFByIndex(0));
  36.   Serial.print("° F) -");

  37.   // 读数之间暂停 1 秒
  38.   delay(1000);
  39. }
复制代码

 楼主| 发表于 2022-4-20 16:06 | 显示全部楼层
实验串口返回情况

5.10-30.jpg

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

本版积分规则

小黑屋|Archiver|手机版|Arduino爱好者

GMT+8, 2022-12-9 01:00 , Processed in 0.072000 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表