「雕爷学编程」Arduino动手做(39)——DS18B20温度传感器3

news2024/10/7 14:31:16

37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试多做实验,不管成功与否,都会记录下来——小小的进步或是搞不掂的问题,希望能够抛砖引玉。

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验三十九:DS18B20单总线数字温度传感器模块

在这里插入图片描述

18B20数字温度传感器模块实验所需硬件清单

Arduino Uno开发板 X1
0.96寸OLED显示屏X1
杜邦线 若干(备了9条)
高电平触发有源蜂鸣器模块X1
IIC/I2C 1602 LCD液晶屏模块X1
18B20数字温度传感器模块X2
LED发光二极管(绿、蓝色)X2
高电平触发单路5V继电器模块X1
Proto Shield 原型扩展板(带mini面包板)X1

在这里插入图片描述

程序六:高温声光报警器
(1)实验开源图形编程(Mind+、编玩边学)

在这里插入图片描述
实验串口返回情况

在这里插入图片描述
Arduino实验场景图

在这里插入图片描述

程序七:检测不同18B20芯片的唯一编码
(1)Arduino参考开源代码

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

#include <OneWire.h>

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

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

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

  byte i;
  byte present = 0;
  byte data[12];
  byte addr[8];

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

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

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

  if ( addr[0] == 0x10) {
    Serial.print("设备为 18S20 系列设备。\n");
  }
  else if ( addr[0] == 0x28) {
    Serial.print("设备为 18S20 系列设备。\n");
  }
  else {
    Serial.print("设备系列无法识别:0x");
    Serial.println(addr[0], HEX);
    return;
  }

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

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

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

  Serial.print("P=");
  Serial.print(present, HEX);
  Serial.print(" ");
  for ( i = 0; i < 9; i++) {  // 我们需要 9 个字节
    data[i] = ds.read();
    Serial.print(data[i], HEX);
    Serial.print(" ");
  }
  Serial.print(" CRC=");
  Serial.print( OneWire::crc8( data, 8), HEX);
  Serial.println();

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

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

  Serial.print("温度:");
  if (SignBit) // 如果是负数
  {
    Serial.print("-");
  }
  Serial.print(Whole);
  Serial.print(".");
  if (Fract < 10)
  {
    Serial.print("0");
  }
  Serial.print(Fract);

  Serial.print("\n");
  //结束转换为C
}

(2)实验串口返回情况(18B20设备之一)

在这里插入图片描述

实验串口返回情况(18B20设备之二)

在这里插入图片描述

程序八:串口打印实时摄氏温度与华氏温度值
(1)Arduino参考开源代码

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

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

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

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

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

void setup(void) {
  // 启动串口
  Serial.begin(9600);
  Serial.println("Dallas Temperature IC Control Library Demo");
  // 启动库
  sensors.begin();
}

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

  Serial.print("Temperature is: ");

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

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

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

  // 读数之间暂停 1 秒
  delay(1000);
}

实验串口返回情况

在这里插入图片描述

程序九:1602LCD屏实时显示摄氏温度与华氏温度值
(1)实验接线示意图(这例18B20接D6)

在这里插入图片描述

(2)Arduino参考开源代码

/*
  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
   程序九:1602LCD屏实时显示摄氏温度与华氏温度值
*/

#include <OneWire.h>//导入相关库
#include <DallasTemperature.h>
#include <LiquidCrystal_I2C.h>

const int SENSOR_PIN = 6; // Arduino 引脚连接到 18B20 传感器的 DQ 引脚
OneWire oneWire(SENSOR_PIN);         // 设置一个 oneWire 实例
DallasTemperature sensors(&oneWire); // 将 oneWire 传递给 DallasTemperature 库
LiquidCrystal_I2C lcd(0x27, 16, 2);  // I2C地址0x27,16列2行
float tempCelsius;    // 摄氏温度
float tempFahrenheit; // 华氏温度

void setup(){
  sensors.begin();    //初始化传感器
  lcd.init();         //初始化液晶屏
  lcd.backlight();    // 打开背光 
}

void loop(){
  sensors.requestTemperatures();             // 发送命令获取温度
  tempCelsius = sensors.getTempCByIndex(0);  // 读取摄氏温度
  tempFahrenheit = tempCelsius * 9 / 5 + 32; // 将摄氏度转换为华氏度

  lcd.clear();
  lcd.setCursor(0, 0);       // 从第一行开始打印
  lcd.print(tempCelsius);    // 打印摄氏温度
  lcd.print((char)223);      //打印°字符
  lcd.print("C");
  lcd.setCursor(0, 1);       // 从第二行开始打印
  lcd.print(tempFahrenheit); // 打印华氏温度
  lcd.print((char)223);      //打印°字符
  lcd.print("F");

  delay(500);
}

Arduino实验场景图

在这里插入图片描述
在这里插入图片描述

程序十:从多个 DS18B20 传感器获取温度
(1)实验接线示意图

在这里插入图片描述

(2)Arduino参考开源代码

/*
  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
   程序十:从多个 DS18B20 传感器获取温度
*/

#include <OneWire.h>//导入驱动库
#include <DallasTemperature.h>

// 数据线插入 Arduino 上的端口D4
#define ONE_WIRE_BUS 4
// 设置一个 oneWire 实例以与任何 OneWire 设备
//进行通信(不仅仅是 Maxim/Dallas 温度 IC)
OneWire oneWire(ONE_WIRE_BUS);

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

int numberOfDevices; //找到的温度设备数量
// 我们将使用这个变量来存储找到的设备地址
DeviceAddress tempDeviceAddress;

void setup(void) {
  // 启动串口
  Serial.begin(9600);

  // 启动库
  sensors.begin();

  /// 获取网络上的设备数量
  numberOfDevices = sensors.getDeviceCount();

  // 定位总线上的设备
  Serial.print("Locating devices...");
  Serial.print("Found ");
  Serial.print(numberOfDevices, DEC);
  Serial.println(" devices.");

  // 循环遍历每个设备,打印出地址
  for (int i = 0; i < numberOfDevices; i++) {
    //在线路中搜索地址
    if (sensors.getAddress(tempDeviceAddress, i)) {
      Serial.print("Found device ");
      Serial.print(i, DEC);
      Serial.print(" with address: ");
      printAddress(tempDeviceAddress);
      Serial.println();
    } else {
      Serial.print("Found ghost device at ");
      Serial.print(i, DEC);
      Serial.print(" but could not detect address. Check power and cabling");
    }
  }
}

void loop(void) {
  sensors.requestTemperatures(); // 发送命令获取温度
  //循环遍历每个设备,打印出温度数据
  for (int i = 0; i < numberOfDevices; i++) {
    //在线路中搜索地址
    if (sensors.getAddress(tempDeviceAddress, i)) {

      // 输出设备ID
      Serial.print("Temperature for device: ");
      Serial.println(i, DEC);

      // 打印数据
      float tempC = sensors.getTempC(tempDeviceAddress);
      Serial.print("Temp C: ");
      Serial.print(tempC);
      Serial.print(" Temp F: ");
      // 将 摄氏温度转换为华氏温度
      Serial.println(DallasTemperature::toFahrenheit(tempC));
    }
  }
  delay(5000);
}

// 打印设备地址的函数
void printAddress(DeviceAddress deviceAddress) {
  for (uint8_t i = 0; i < 8; i++) {
    if (deviceAddress[i] < 16) Serial.print("0");
    Serial.print(deviceAddress[i], HEX);
  }
}

实验串口返回情况(发现3个设备,显示不同温度)

在这里插入图片描述

Arduino实验场景图

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/782632.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

厦门枫叶时代看电视的新趋势

随着“5G电视”技术的不断普及和城市数字化转型的加速&#xff0c;电视行业也在发生着翻天覆地的变化。在这个背景下&#xff0c;第28届上海电视节推出了高端论坛板块——“白玉兰对话”&#xff0c;共同探讨电视行业的未来发展。其中备受瞩目的中国电视剧发展论坛&#xff0c;…

荔枝派Zero(全志V3S)驱动开发之USB摄像头

文章目录 前言一、内核配置 UVC二、编译内核并烧录到 SD 卡三、上电测试四、mjpeg-streamer 视频流服务器测试1、jpeg 库的移植2、移植 mjpeg-streamer①、前置软件②、下载 mjpg-streamer 源码③、修改 mjpg-streamer 源码④、编译 mjpg-streamer 源码 3、搬移文件到 nfs 目录…

2023/07/23

1. 必须等待所有请求结束后才能执行后续操作的处理方式 方式一&#xff1a; async func () {const p1 await api1();const p2 await api2();const p3 await api3();Promise.all([p1, p2, p3]).then(res > {后续操作...}) }方式二&#xff1a;待补充 2. flex 弹性盒子布…

300M的联通宽带,电脑直接连接光猫只有100M;电脑连接路由器,然后路由器连接光猫却有300M???

1. 现象 300M的联通宽带&#xff0c;用了小半年之后发现网络比以前满&#xff0c;通过https://www.speedtest.cn网站测试发现只有100M 2. 猜测 难道是联通这帮人&#xff0c;偷偷把我网速降到了100M&#xff1f;&#xff1f;&#xff1f; 3. 排查过程 打电话让联通师傅上门排查…

使用 Qt designer

使用 Qt designer 1、配置Qt designer外部工具2、Qt designer&#xff08;Qt 设计师&#xff09;使用2.1 创建保存文件ui2.2 pyuic5.exe 工具 转化成为py文件2.3 直接导入UI文件 2、qrc资源管理器 1、配置Qt designer外部工具 实质就是 Qt\bin 工具中 designer.exe 请查看 PyQ…

Docker 核心概念深度解析:探索容器、镜像和仓库在Docker生态系统中的重要作用和 应用

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

Redis应用(3)——Redis的项目应用(二):抢购图书 ---> Redis高并发的问题 分布式锁Redission的使用

目录 引出Redis的高并发问题redis的高并发问题Redisson中间件引入RedissonRedisson配置Redisson应用报错&#xff1a;java.lang.NoClassDefFoundErro Redis的项目应用&#xff08;二&#xff09;&#xff1a;抢购图书1.0版本&#xff0c;Java代码&#xff1a;数据不安全测试方法…

Python+Selenium做自动化测试

一.项目介绍 目的 测试某官方网站登录功能模块可以正常使用 用例 1.输入格式正确的用户名和正确的密码&#xff0c;验证是否登录成功&#xff1b; 2.输入格式正确的用户名和不正确的密码&#xff0c;验证是否登录失败&#xff0c;并且提示信息正确&#xff1b; 3.输入格式正…

H 欢乐颂+J 睡美人

H 欢乐颂 登录—专业IT笔试面试备考平台_牛客网 思路&#xff1a;这个题就是题意比较难懂&#xff0c;思路还挺好想的&#xff0c;其实就是每个点都有几个状态&#xff0c;然后只有存在相同状态的点之间才可以连边&#xff0c;假设点i的状态和为a&#xff0c;点j的状态和为b&a…

Packet Tracer – 配置无线路由器上的端口转发

Packet Tracer – 配置无线路由器上的端口转发 地址分配表 设备 接口 IP 地址 子网掩码 LA 互联网 209.165.134.1 255.255.255.252 LAN 192.168.0.1 255.255.255.0 拓扑图 目标 第 1 部分&#xff1a;配置端口转发 第 2 部分&#xff1a;验证 ServerA 远程连接 …

C语言基础:预处理指令的使用

本文结合工作经验&#xff0c;研究C语言中常见的预处理指令的用法。 文章目录 1 预处理指令概念2 常见的预处理指令2.1 #include包含头文件2.2 #define定义宏2.2.1 类对象宏&#xff08;object-like macro&#xff09;2.2.2 类函数宏&#xff08;function-like macro&#xff…

Docker 镜像的创建

Docker 镜像的创建 创建镜像有三种方法&#xff0c;分别为基于已有镜像创建、基于本地模板创建以及基于Dockerfile创建。 1&#xff0e;基于现有镜像创建 基于现有镜像创建 先使用现有镜像创建容器 docker run 再进入容器进行内容的更新 docker exex 最后提交成新的进行 …

C++语法总结

今天给大家带来的不是某个知识点的解说&#xff0c;而是我花了几个小时的时间&#xff0c;写的一个C的思维导图&#xff0c;希望大家能够喜欢 以上是我对C语法的一些理解&#xff0c;有些可能是我遗漏了&#xff0c;有不对的地方希望大家能够指出&#xff0c;最后&#xff0c;子…

【Atcoder】 [ARC151D] Binary Representations and Queries

题目链接 Atcoder方向 Luogu方向 题目解法 首先需要得到一个性质&#xff1a; 当 X i ≠ X j Xi\ne Xj XiXj 时&#xff0c; i , j i,j i,j 操作的先后顺序可以交换 证明&#xff1a; 可以画一张图&#xff0c;只考虑 Y i Y j 0 YiYj0 YiYj0 的情况&#xff0c;其他情…

力扣256.翻转二叉树(递归/qBFS) 剑指offer 32 从上到下打印二叉树(q BFS)I II III(三道题)

采用队列 class Solution { public:TreeNode* invertTree(TreeNode* root) {queue<TreeNode*> q;if(rootNULL) return root;q.push(root);int i0;while(!q.empty()){TreeNode *curq.front();swap(cur->left,cur->right);if(cur->left) q.push(cur->left);if…

电商系统架构设计系列(六):电商的「账户系统」设计要特别考虑哪些问题?

上篇文章中&#xff0c;我给你留了一个思考题&#xff1a;电商的账户系统&#xff0c;该如何设计&#xff1f; 今天这篇文章&#xff0c;我们来说一下电商的账户系统。 引言 账户系统负责记录和管理用户账户的余额&#xff0c;这个余额就是每个用户临时存在电商的钱&#xff…

Spring整合Mybatis原理

首先介绍一下Mybatis的工作原理 先简略的放两张图&#xff0c;后面的知识结合这两张图比较好理解 Mybatis的基本工作原理 在 Mybatis 中&#xff0c;我们可以使用⼀个接口去定义要执行sql&#xff0c;简化代码如下&#xff1a; 定义⼀个接口&#xff0c;Select 表示要执行查询…

UE 材质实现让远处物体变小

CameraDepthFade: 根据距离摄像机的距离改变值 Fade Length: 从0到1的过渡距离 Fade Offset&#xff1a;小于该值的地方值为1 UV平铺&#xff1a;值越大&#xff0c;平铺的越少&#xff0c;纹理重复显示的越少&#xff0c;视觉效果纹理变大&#xff0c;值越小&#xff0c;平铺…

[Linux笔记]gcc/g++,动静态库,make/makefile/.PHONY

都是编译器&#xff0c;二者的选项是重叠的 基本上&#xff0c;gcc专门用于编译c&#xff0c;g专门用于编译c gcc/g形成的可执行程序默认是release版的。若要debug版&#xff0c;则使用-g选项。 如&#xff1a;gcc -o mytest test.c -g -stdc99 编译命令格式例&#xff1a; gc…

MYSQL-死锁大集合

为什么会死锁 数据准备 建个表 CREATE TABLE t_order (id int NOT NULL AUTO_INCREMENT,order_no int DEFAULT NULL,create_date datetime DEFAULT NULL,PRIMARY KEY (id),KEY index_order (order_no) USING BTREE ) ENGINEInnoDB ; 存个数据 然后我们分别创建两个事务 事…