单片机课设:MSP430+DS18B20+ESP8266+阿里云构建实时温度监控平台

要实现的东西
课设要做温度监视并且通过串口发送到PC和阿里云。
材料:
DS18B20温度传感器
MSP430f169
esp8266
杜邦线
学习一下DS18B20
ds18b20是一个单总线的传感器,只通过一个引脚DQ便可进行数据传输。
测温范围为-55℃到+125℃,在-10℃到+85℃范围内误差为±0.4°。
返回16位二进制温度数值
引脚图:
内部由 64 位ROM,高速暂存器,存储器 组成。
64位ROM
64 位ROM存储独有的序列号。
ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码,每个DS18B20的64位序列号均不相同。这样就可以实现一根总线上挂接多个DS18B20的目的。(但是我们不挂载多个)
高速暂存器
温度传感器
一个字节的温度上限和温度下限报警触发器(TH和TL)
配置寄存器允许用户设定9位,10位,11位和12位的温度分辨率,分别对应着温度的分辨率为:0.5°C,0.25°C,0.125°C,0.0625°C,默认为12位分辨率,
存储器:由一个高速的RAM和一个可擦除的EEPROM组成,EEPROM存储高温和低温触发器(TH和TL)以及配置寄存器的值,(就是存储低温和高温报警值以及温度分辨率)
高速暂存器由9个字节组成
字节0~1 是温度存储器,用来存储转换好的温度。第0个字节存储温度低8位,第一个字节存储温度高8位
字节2~3 是用户用来设置最高报警和最低报警值(TH和TL)。
字节4 是配置寄存器,用来配置转换精度,可以设置为9~12 位。
字节5~7 保留位。芯片内部使用
字节8 CRC校验位。是64位ROM中的前56位编码的校验码。由CRC发生器产生。
温度存储机制
DS18B20的核心功能是直接温度-数字测量。其温度转换可由用户自定义为9、10、11、12位精度分别为0.5℃、0.25℃、0.125℃、0.0625℃分辨率。DS18B20采用16位补码的形式来存储温度数据,温度是摄氏度。当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个字节。
高字节的五个S为符号位,温度为正值时S=1,温度为负值时S=0
剩下的11位为温度数据位,对于12位分辨率,所有位全部有效,对于11位分辨率,位0(bit0)无定义,对于10位分辨率,位0和位1无定义,对于9位分辨率,位0,位1,和位2无定义。
配置寄存器
在配置寄存器中,我们可以通过R0和R1设置DS18B20的转换分辨率,DS18B20在上电后默认R0=1和R1=1(12分辨率),寄存器中的第7位和第0位到4位保留给设备内部使用。
工作步骤
DS18B20的工作步骤可以分为三步:
1.初始化DS18B20 2.执行ROM指令 3.执行DS18B20功能指令
其中第二步执行ROM指令,也就是访问每个DS18B20,搜索64位序列号,读取匹配的序列号值,然后匹配对应的DS18B20,如果我们仅仅使用单个DS18B20,可以直接跳过ROM指令。而跳过ROM指令的字节是0xCC。
1.初始化DS18B20
DQ管脚的常态是高电平。
根据时序图我们得出初始化的步骤:
1.单片机拉低总线至少480us,产生复位脉冲,然后释放总线(拉高电平)转为接收模式。
2.这时DS8B20检测到请求之后,会拉低信号,大约持续60~240us表示应答。
3.DS8B20拉低电平的60~240us之间,单片机读取总线的电平,如果是低电平,那么表示初始化成功
4.DS18B20拉低电平60~240us之后,会释放总线。
根据此我们可以写出MSP430的初始化代码(我把DQ接到了单片机的P10端口):
2.执行ROM指令
我们首先需要掌握,如何向DS18B20写数据。
总线控制器通过控制单总线高低电平持续时间从而把逻辑1或0写DS18B20中。每次只传输1位数据
根据时序图我们得出以下结论
写0:
1.拉低总线持续60-120us
2.释放总线(拉高电平)
写1:
拉低总线2-15us
释放总线
代码实现:
掌握了写操作,我们还需要知道写什么:
常用的是:
跳过ROM0xCC
温度转换 0x44
开启温度读取转换,读取好的温度会存储在高速暂存器的第0个和第一个字节中
读取温度 0xBE
读取高速暂存器存储的数据(共9个Byte)
对于本步骤我们选择直接跳过ROM指令
3.执行DS18B20功能指令
在此之前我们先了解以下怎么读DS18B20来自的数据
读操作和写操作一样,也是按位读取,从低位向高位
根据时序图,我们总结如下步骤
拉低总线至少1us,然后释放总线
开始读取,在一个读时隙内,若为1则释放总线为高电平,若为0则拉低电平。
因此代码这样写:
实现了以上函数我们就可以从DS18B20取出温度的数据了:
一个疑点:为什么得到的数值要乘0.625呢?
关于这个我思考了很久,一直在想0.625和12位分辨率的关系,结果发现官方文档里写了他们的对应关系,也就是说这不是算出来的是规定的,这也推出了一些结论:
小数位是低四位因为 也就是说,寄存器内每步进1相当于温度步进0.0625。因需要如此处理,而代码中乘0.625是原来真实的值扩大了十倍,最后取整相当于保留了小数点后一位。而(float)expression的作用则是使计算更精确。
学习一下串口
司马自动更新操你妈
串口通信: https://baike.baidu.com/item/串口通信/3775296?fromModule=lemma_inlink(Serial Communication), 是指外设和计算机间,通过数据信号线: https://baike.baidu.com/item/信号线/8807477?fromModule=lemma_inlink 、地线、控制线等,按位进行传输数据的一种通讯方式。
UART是通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART,是一种异步收发传输器,是设备间进行异步通信的关键模块。UART负责处理数据总线和串行口之间的串/并、并/串转换,并规定了帧格式;通信双方只要采用相同的帧格式和波特率,就能在未共享时钟信号的情况下,仅用两根信号线(Rx 和Tx)就可以完成通信过程,因此也称为异步串行通信。
MSP430UART初始化配置步骤:
SWRT复位(UxCTL)
该位的状态影响着其他一些控制位和状态位的状态。在串行口的使用过程中,这一位是比较重要的控制位。一次正确的 USART 模块初始化应该是这样的顺序:先在 SWRST=1 情况下设置串行口;然后设置 SWRST=0;最后如果需要中断,则设置相应的中断使能。
SWRT0 SWRT1
设置字符长度CHAR(UxCTL)
07位 18位
设置串口时钟SSEL(UxTCTL )
这两位确定波特率发生器的时钟源
0外部时钟 UCLKI 1辅助时钟 ACLK 2子系统时钟 SMCLK 3子系统时钟 SMCLK
设置波特率寄存器UxBRx
UxBR0 和 UxBR1 两个寄存器用于存放波特率分频因子的整数部分。 其中 UXBR0 位低字节,UXBR1 为高字节。两字节和起来为一个 16 位字,成为 UBR。在异步通信时,UBR 的允许值不小于 3。如果 UBR<3,则接收和发送会发生不可预测的错误
UxBR0低字节 UxBR1高字节
设置UxMCTL 波特率调整寄存器
如果波特率发生器的输入频率BRCLK不是所需的波特率的整数倍,带有一小数,则整数部分写入UBR 寄存器,小数部分由调整控制寄存器 UxCTL 的内容反映。波特率由以下公式计算: 波特率 = BRCLK / (UBR+ (M7+M6+..+M0) / 8 ) 其中 M0,M1,…M6 及 M7 为控制器 UxMCTL 中的各位。调整寄存器的 8 为分别对应 8 次分频,如果 M=1,则相应次的分频增加一个时钟周期;如果 Mi=0,则分频计数器不变
配置串口模块控制寄存器 MEx
UTXE0串口 0 的发送允许 URXE0串口 0 的接收允许 UTXE1串口 1 的发送允许 URXE1串口 1 的接收允许 0禁止 1允许
SWRST=0
配置接收中断控制IE
UTXIE0串口 0 的发送中断允许 URXIE0串口 0 的接收中断允许 UTXIE1串口 1 的发送中断允许 URXIE1串口 1 的接收中断允许 0禁止 1允许
设置IO口为普通I/O模式,设置IO口方向为输出
实例
发送函数
IFG1 中断标志寄存器 1 IFG2 中断标志寄存器 2
UTXIFG0串口 0 的发送中断标志 URXIFG0串口 0 的接收中断标志 UTXIFG1串口 1 的发送中断标志 URXIFG1串口 1 的接收中断标志 0无中断请求标志 1有中断请求标志
相应的中断函数
一个问题
我的温度数据是short型两个字节,而串口是按字节逐位发送如何发送呢?
我目前只能一个字节一个字节的发,结果是整数十六进制的形式
(写完整篇后更新)解决了,可以数字转换成字符串形式:
学习一下ESP8266
ESP8266 是一款由上海乐鑫信息科技: https://zh.wikipedia.org/w/index.php?title=乐鑫信息科技&action=edit&redlink=1[1]: https://zh.wikipedia.org/wiki/ESP8266开发板#cite_note-Espressif_ESP8266-1开发的可以作为微控制器: https://zh.wikipedia.org/wiki/微控制器使用的成本极低且具有完整TCP/IP协议栈: https://zh.wikipedia.org/wiki/TCP/IP协议栈的Wi-Fi IoT: https://zh.wikipedia.org/wiki/IoT控制芯片。
MQTT:一种通讯协议
我们只是使用,并不关注其原理
烧写固件
一般的esp8266芯片需要烧录MQTT固件才能进行连接阿里云的功能
首先在安信可的网站: https://docs.ai-thinker.com/esp8266下载固件,和烧录相关程序。
其中esp8266与USB-串口连线如下:
TTLESP8266 3V33V3 GNDGND GNDIO0 RX/TXTX/RX GNDRST
当程序显示等待上电复位时让RST接地,然后拉高。
这样就完成了烧录
完成与阿里云的通讯
相关参数由该软件生成。
成功之后阿里云的云平台的相关设备会显示在线。
与阿里云进行数据交互
属性设置
复制内容
成功则显示在下图
调试
按顺序操作
可以看见右方返回参数,串口助手也返回了相关信息
上报数据
复制该内容
成功上传数据!!!
esp8266与MSP430f149的交互
先找到引脚功能表
UART0在MSP430f169有现成的接口,用于和PC通信,UART1的TXD和RXT分别位于P36和P37这两个IO接口。
如下初始化设置:
UART1对应esp8266芯片,向其发送数据,相当于对它发送命令,其向主控机返回的信息,可以通过中断函数向UART0发送数据,显示在串口调试助手用于调试。
定义相关功能函数:
通过以上功能就可以完成向阿里云转发上传温度数据了!
完整代码:
通过阿里云平台IoT Sutdio可以开发一个物联网APP来方便查看温度
An unforgettable journey!!!