首页 > 控制电路 >温控电路 > DS18B20蓝牙温度计

DS18B20蓝牙温度计

来源:互联网发布者:TJVFhCJ 关键词: DS18B20 蓝牙 温度计 更新时间: 2026/03/13

DS18B20 蓝牙温度计

DS18B20 蓝牙温度计

DS18B20 蓝牙温度计

一天早上我醒来,想知道外面的温度是多少,而不是跑去家得宝花2美元买一个玻璃温度计,我决定自己构建一个无线温度传感器。板子的核心是一个SO8封装的PIC12F675微控制器。板子的右侧是线性电源(LP2950),底部中心是DS18B20单总线温度传感器,在左边你可以看到Sure TTL蓝牙模块。

DS18B20 蓝牙温度计

作为标准协议的忠实粉丝,我选择通过蓝牙SPP(串行端口协议)链路传输温度数据,而不是XBee或其他类似的无线架构。尽管蓝牙无线电相比XBee模块消耗更多功率,但优点是在接收端不需要定制硬件。由于几乎所有现代笔记本电脑都集成了蓝牙芯片组,这实际上意味着在PC端不需要硬件。

在翻遍了我所有的杂项零件箱后,我找到了一个几年前为另一个项目购买的Sure蓝牙模块。为了原型制作,这个表面贴装模块已经连接到一个自制蚀刻的PCB上,带有排针,以便可以插入面包板。由于我没有热风返修站,我为最终项目订购了另一个GP-GC021模块。下面显示的模块是我最初开始使用的那个,而上面的照片显示了我最近获得的模块。

我决定使用PIC12F675作为主MCU,没有其他原因,只是因为我零件箱里有一个。我原本计划利用PIC的内部4MHz振荡器,但后来发现由于串行模块固定在9600波特,主系统时钟必须提升到8MHz以保持同步并以正确的速度传输数据。

与我所有的项目一样,原理图和PCB布局都是在Altium Designer中完成的。多年来,我尝试过几种不同的EDA(电子设计自动化)套件,包括Eagle、ExpressPCB和EdwinXP,但我发现Altium远胜于其他软件。如果你只是一个爱好者,Altium可能超出你的预算,但他们的学生许可非常棒;许多学院和大学拥有大量许可证甚至站点许可证。在Okanagan学院,我们非常幸运能够访问学院的浮动许可证,这允许学生在任何我们想要的计算机上使用Altium,无论我们是否在校园内。我应该澄清,虽然我不为Altium工作,但多年来我与CAD软件进行了许多史诗般的战斗;虽然Altium和我有过分歧,但总体而言,使用它是一种乐趣。

 脚注:

- 原理图、固件和所有其他相关文件都包含在附带的ZIP存档中。

- 编程不是我的强项,因此固件是用PICBasic编写的。ZIP存档中有一个可直接烧录的HEX文件,但是如果你想修改固件,你需要拥有ProtonIDE的副本才能编译它。

- 如果你计划从附带的Gerber文件制作PCB,请注意F1(传感器VCC总线上的保险丝)的焊盘尺寸实际上太小了(抱歉)。

- 这里的所有内容均按原样提供,没有任何保修。


 ’****************************************************************

’*  蓝牙温度计 - R1 B23.BAS                          *

’****************************************************************

’ MCU 选择

Device = 12F675

’ 8.000MHz 晶体

XTAL = 8          

’ 定义符号引脚参考

Symbol DQ = GPIO.0  ’ 单总线网络引脚

Symbol TX = GPIO.1  ’ 蓝牙 TX

Symbol RX = GPIO.2  ’ 蓝牙 RX

’ 配置熔丝:外部振荡器(高速),看门狗关闭,代码保护关闭

Config HS_OSC, WDT_OFF, CP_OFF

’ 定义变量

Dim temperature As Word

Dim C As Byte

Dim CPerD As Byte

Dim sample_count As Word

Dim sample_delay As Word

Dim tx_pace As Word

Dim temp_dec As Byte

Dim sign As Byte

’ 在每个字符传输之间插入小延迟以防止数据丢失

tx_pace = 80

’ 采样率

sample_delay = 10000

’ 将所有引脚设置为数字

ALL_DIGITAL = true

’ 设置引脚方向

Output TX

Input RX

’ 20秒启动延迟

DelayMS 20000

’ 显示“上电自检”信息

SerOut TX, 84, tx_pace, [13, 10, 10, 10, "蓝牙温度计 - 启动成功", 13, 10]

SerOut TX, 84, tx_pace, [13, 10, "硬件版本: R3.0"]

SerOut TX, 84, tx_pace, [13, 10, "固件版本: R1 B23"]

SerOut TX, 84, tx_pace, [13, 10, "采样间隔(秒): ", Dec sample_delay/1000, 13, 10]

’ SerOut 数据格式: SerOut (引脚)(波特模式(9600 8N1 反转))(节奏)[数据]

’ 空白行

SerOut TX, 84, tx_pace, [13,10,10,10]

’ 等待两秒

DelayMS 2000

’ 将采样计数器初始化为零

sample_count = 0

’ 打印“开始”向主机发出数据收集开始的信号

SerOut TX, 84, tx_pace, ["开始", 13, 10,10]

’ 主采样/传输循环

acquisition:

OWrite DQ, 1, fault, [$CC, $44] ’ 发送计算温度命令

’ 如果未找到单总线传感器,跳转到“故障”函数

’ OWrite 和 ORead 函数非常全面 - 详见 PICBasic 库

Repeat

DelayMS 50 ’ 等待转换完成

ORead DQ, 4, [C] ’ 从 DS18B20 读取计数器值

Until C <> 0

OWrite DQ, 1, [$CC, $BE] ’ 发送“读取暂存器”命令

ORead DQ, 2, [temperature.LowByte,temperature.HighByte, C, C, C, C, C, CPerD]

 

’ 判断值是正还是负;翻转符号

’ 位 8-15 为 1 表示负温度,0 表示正温度

If temperature.8=1 Then

    ’ 如果为负,则丢弃第一位,并反转值      

    temperature=(temperature.LowByte ^ $FF) >> 1

       

    ’ 如果 Count = 0 则递增 Temp

    If C = 0 Then temperature = temperature + 1    

    ’ 将符号改为负

    sign = "-"                                                          

Else

    ’ 如果为正,则丢弃第一个字节

    temperature = (temperature >> 1)  

    ’ 并将符号值改为正              

    sign = "+"      

    ’ 反转十进制值                                                  

    temp_dec = 100 - temp_dec                            

EndIf

’ 每个 Count 是 1/16 度,因此 100/16 = 6.25,这是我们的十进制值(温度的)

temp_dec = (6.25 * C)  

’ 递增采样计数器

sample_count = (sample_count + 1)

’ 通过蓝牙链路将数据传输到主机

’ 传输 "" 似乎可以防止数据丢失

SerOut TX, 84, tx_pace, [""]

’ 格式: 采样计数, 逗号, 符号, 温度整数, 小数点, 温度小数, "c"

SerOut TX, 84, tx_pace, [Dec sample_count, ", ", sign, Dec temperature, ".", Dec Dig temp_dec, 1, 0, "c", 13, 10]

’ 在发送下一个样本前等待指定时间

DelayMS sample_delay

’ 重新开始采样采集过程

GoTo acquisition

’ 如果未找到单总线传感器,第一个 OWRITE 命令将失败并跳转到这里指示故障  

fault:

SerOut TX, 84, tx_pace, [13, 10, "错误: 检测到单总线网络故障 - 检查传感器接线", 13, 10]

DelayMS 1000

’ 重试 - 如果问题修复,返回正常操作

GoTo acquisition

DS18B20 蓝牙温度计

DS18B20 蓝牙温度计

DS18B20 蓝牙温度计

DS18B20 蓝牙温度计

提问/讨论

这里还没有内容,您有什么问题吗?

我要提问/讨论

推荐帖子 最新更新时间:2026-03-25 20:36

VxWorks+VmWare下使用串口的问题
  X86平台下用VxWorks编程控制串口,跟硬件最相关的就是对串口的读写操作。自己编了一个小的读写程序,在机器上跑不通。具体表现为:写操作无效(另一方用串口调试助手收不到数据),但是write()返回值正常,也能看到VmWare上的串口设备有闪动;读操作是无限循环的,只要有数
 adingx实时操作系统RTOS
彩色液晶接口电路设计及触摸屏的编程与调试
基于TFT6448BS-5.7设计的 彩色液晶接口电路设计及触摸屏的编程与调试 谢谢!!!!分享!!! 感谢支持 回复 沙发 幸运十一月 的帖子 谢谢分享。偶来顶顶顶,楼主加油,赞一个 回复 楼主 gxkj001 的帖子 谢谢斑竹的支持 回复 4楼 鑫海宝贝 的帖
 gxkj001单片机
《Google Android开发技术》自我推荐
《 Google Android 开发技术》,西电出版,作者:张勇,2011.10 内 容 简 介 Android 系统是安装在智能移动设备上的嵌入式操作系统,包括 Linux 内核、系统库与 Java 运行时、应用程序框架和应用程序层等
 zhnyongLinux开发
为什么程序老是进入死循环
这个是我根据一个lm3s_lib_interrupt.pdf,写的一个关于LM3S9B96按键中断的程序,可是进不了中断,不过按键查询可以。按键中断却不行,为什么呢?哪个大侠帮忙看下。 为什么程序老是进入死循环 1.中断配置 2.中断向量表修改。 做好了是没有问题的。。。
 zzgezi微控制器 MCU
各位大侠。。本人是新手求助一个关于温室大棚湿度温度测控系统设计
基于单片机的温室大棚温湿度测控系统设计 使用51系列单片机STC89S51与智能温度传感器芯片DS18B20(查一下大棚温度)、湿度传感器(查一下型号,注意大棚湿度范围)液晶模块1602(可用别的型号)及外围电路等完成设计与实现; 功能是实时采集温度、湿度信号,进行A/D转换,单
 suye_sunny单片机
用LM3S8962 做的首款产品进入调试阶段
背景: 使用LM3S8962做的光电曲线测试产品,主要使用LM3S8962的串口,SSI 接口和I2C 接口,网口备份用. 目前原理图和PCB 都已经完成, PCB板子也已经回来了. 经过一天辛勤劳动,扳子焊接完毕. 用于我没有数码相机,图片就上不了 1. 汇报一下,从北
 eeleader微控制器 MCU

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版 版权声明

EEWORLD 电路图 站点相关: 下载中心 Datasheet 参考设计

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved