Arduino UNO驱动MCP9808高精度数字温度传感器
Arduino UNO驱动MCP9808高精度数字温度传感器
- MCP9808简介
- 引脚定义
- Arduino UNO与MCP9808模块接线
- 程序与实验结果
MCP9808简介
MCP9808 数字温度传感器可检测-40°C和+125°C之间的温度, MCP9808具有用户可编程寄存器,可以为温度检测应用提供灵活性,实现关断或低功耗模式,以及温度报警窗口限制的规范和临界输出限制。 当温度变化超出规定的边界限制时,MCP9808会输出报警信号。用户可以设置报警输出信号的极性,将其设置为低电平有效或高电平有效的比较器输出(用于温控操作)或温度报警中断输出(用于基于微处理器的系统)。报警输出也可以配置为仅临界温度输出。
该传感器具有行业标准 400 kHz、2 线 SMBus/I2C 兼容串行接口,支持通过单条串行总线控制 8 或 16 个传感器 这些特性使MCP9808成为精密的多区域温度监控应用的理想选择。
• 精度:
-40°C 至 +125°C 时为 ±0.25°C (典型值)
–20°C 至 100°C 时为 ±0.5°C (最大值)
-40°C 至 +125°C 时为 ±1°C (最大值)
• 用户可选测量分辨率:
+0.5°C、 +0.25°C、 +0.125°C 和 +0.0625°C
• 用户可编程温度限制:
温度窗口限制
临界温度限制
• 用户可编程温度报警输出
• 工作电压范围:2.7V 至 5.5V
引脚定义
符号 | 引脚功能 |
---|---|
VCC | 电源正极 |
GND | 电源负极 |
SCL | 串行时钟线 |
SDA | 串行数据线 |
A0 | 从器件地址设置 |
A1 | 从器件地址设置 |
A2 | 从器件地址设置 |
ALERT | 温度报警输出 |
A0、A1、A2从机地址设置引脚默认接10K电阻下拉到GND,所以从机地址为0x18
ALERT为开漏输出,需要外接上拉电阻
Arduino UNO与MCP9808模块接线
Arduino UNO | MCP9808 |
---|---|
5V | VCC |
GND | GND |
SDA | A4 |
SCL | A5 |
程序与实验结果
打开Arduino IDE库管理器搜索安装例程库
主要API接口函数
/*** @brief 睡眠传感器模式, 功耗降低, 此时获取传感器温度错误* @return true is set successfullyfalse is register lock is not allowed to be modified*/bool sleepMode(void);/*** @brief 唤醒传感器模式, 此时可以正常获取传感器数据* @return true is set successfullyfalse is register lock is not allowed to be modified*/bool wakeUpMode(void);/*** @brief 获取电源的配置模式* @return true // 唤醒模式false // 睡眠模式*/bool getPowerMode(void);/*** @brief 设置温度传感器的分辨率, 不同的分辨率, 获取的温度的精度不同* @param resolutionRESOLUTION_0_5 // 获取温度的小数部分为0.5的倍数 如0.5℃ 、1.0℃、1.5℃RESOLUTION_0_25 // 获取温度的小数部分为0.25的倍数 如0.25℃、0.50℃、0.75℃RESOLUTION_0_125 // 获取温度的小数部分为0.125的倍数 如0.125℃、0.250℃、0.375℃RESOLUTION_0_0625 // 获取温度的小数部分为0.0625的倍数 如0.0625℃、0.1250℃、0.1875℃@return true is set successfullyfalse is set parameter error*/bool setResolution(uint8_t resolution);/*** @brief 获取温度传感器的分辨率 ,不同的分辨率, 获取的温度的精度不同* @return resolutionRESOLUTION_0_5 // 获取温度的小数部分为0.5的倍数 如0.5℃ 、1.0℃、1.5℃RESOLUTION_0_25 // 获取温度的小数部分为0.25的倍数 如0.25℃、0.50℃、0.75℃RESOLUTION_0_125 // 获取温度的小数部分为0.125的倍数 如0.125℃、0.250℃、0.375℃RESOLUTION_0_0625 // 获取温度的小数部分为0.0625的倍数 如0.0625℃、0.1250℃、0.1875℃*/uint8_t getResolution(void);/*** @brief 获取当前的环境温度, 注意设置不同分辨率能够得到的温度精度不同* @return 温度值为浮点数, 默认保留两位小数, 单位为 ℃*/float getTemperature(void);/*** @brief 获取当前比较器的状态和温度数据, 只有在比较器模式下有效* @return 存放当前数据的结构体temperate // 当前温度state // 比较器状态的字符串,比较当前温度和上限阈值,下限阈,和临界值的关系value // 比较器的状态的值,解释如下TA 代表当前温度, TCRIT代表临界温度, TUPPER代表上限温度, TLOWER代表下限温度1 代表 TA ≥ TCRIT, TA > TUPPER, TA < TLOWER0 代表 TA < TCRIT, TA ≤ TUPPER, TA ≥ TLOWER------------------------------------| bit7 ~ bit3 | bit2 | bit1 | bit0 |------------------------------------| reserved | 0 | 0 | 0 |------------------------------------*/struct comparatorData getComparatorState(void);/*** @brief 设置锁定模式或解锁, 防止错误操作更改上限、下限、临界值的大小, 锁定后只能通过断电复位解除锁定* @param lockCRIT_LOCK // 锁定临界值, 临界值的阈值不允许被修改WIN_LOCK // 锁定上限下限, 上限下限的阈值不允许被修改CRIT_WIN_LOCK // 锁定临界值和上限下限, 上限下限和临界值的数据都不允许被修改NO_LOCK // 不锁定上限下限和临界值@return statetrue is set successfullyfalse is set parameter error*/bool setLockState(uint8_t lock);/*** @brief 获取锁定的状态, 来判断是否可以修改上限下限和临界值的阈值* @return stateCRIT_LOCK // 临界值锁定, 临界值的阈值不允许被修改WIN_LOCK // 上限下限锁定, 上限下限的阈值不允许被修改CRIT_WIN_LOCK // 临界值和窗口同时锁定, 上限下限和临界值的数据都不允许被修改NO_LOCK // 没有锁定, 上限下限和临界值的阈值都可以被修改*/uint8_t getLockState(void);/*** @brief 设置报警温度滞后的范围, 在上限下限和临界值的阈值上增加一个范围,滞后功能仅适用于降温(从热至冷),也就是说(上限/下限/临界值)减去滞后温度, ALE电平才恢复例如:温度上限为30.0度, 滞后温度为+1.5度, 当前是35度ALE已经产生电平翻转, 要想ALE恢复电平, 必须达到30-1.5(28.5)度, ALE引脚才能恢复电平* @param modeHYSTERESIS_0_0 // 没有滞后, 就是到达指定温度就响应HYSTERESIS_1_5 // 从热至冷要滞后1.5℃HYSTERESIS_3_0 // 从热至冷要滞后3.0℃HYSTERESIS_6_0 // 从热至冷要滞后6.0℃@return state0x00 is set successfully0xFE is set parameter error0xFF is register lock is not allowed to be modified*/uint8_t setAlertHysteresis(uint8_t mode);/*** @brief 获取滞后的温度* @return hysteresisHYSTERESIS_0_0 // 温度滞后范围为 +0.0℃HYSTERESIS_1_5 // 温度滞后范围为 +1.5℃HYSTERESIS_3_0 // 温度滞后范围为 +3.0℃HYSTERESIS_6_0 // 温度滞后范围为 +6.0℃*/uint8_t getAlertHysteresis(void);/*** @brief 设置ALE引脚的极性, 引脚极性为高:ALE引脚高电平为活动电平, 默认为低电平, 产生报警后ALE为高电平引脚极性为低:ALE引脚低极性为活动电平, 默认为高电平, 产生报警后ALE为低电平* @param polarityPOLARITY_HIGH // ALE引脚高电平为活动电平POLARITY_LOW // ALE引脚低极性为活动电平@return state0x00 is set successfully0xFE is set parameter error0xFF is register lock is not allowed to be modified*/uint8_t setPolarity(uint8_t polarity);/*** @brief 获取ALE引脚的极性状态, 引脚极性为高:ALE引脚高电平为活动电平, 默认为低电平, 产生报警后ALE为高电平引脚极性为低:ALE引脚低极性为活动电平, 默认为高电平, 产生报警后ALE为低电平* @return polarityPOLARITY_HIGH // ALE引脚高电平为活动电平POLARITY_LOW // ALE引脚低极性为活动电平*/uint8_t getPolarityState(void);/*** @brief 设置警报输出的模式, 比较器输出模式不需要清除中断, 中断模式需要清除中断* @param mode:COMPARATOR_OUTPUT_MODE // 比较器输出模式不需要清除中断, 例如:设置ALE引脚为低电平活动,当超过上限警报的温度时, ALE引脚从高电平到低电平, 当温度低于上限但高于下限时, ALE引脚恢复高电平INTERRPUT_OUTPUT_MODE // 中断输出模式需要清除中断, 当产生警报时, 如果不清除中断中断一直存在, 中断模式的触发, 是从一种状态变为另一种状态, 例如:设置了下限阈值20度, 上限阈值25度, 临界阈值30度, 当温度一直低于20度时不产生中断, 当温度超过25度时才产生中断, ALE引脚跳变, 此时应该清空中断, ALE引脚恢复, 特殊情况, 当ALE引脚大于临界温度30度时, 中断模式失效, 清空中断也失效, 必须等温度降到30度以下, 才恢复中断模式DISABLE_OUTPUT_MODE // 禁止输出模式后不产生警报,ALE引脚失效@return state0x00 is set successfully0xFE is set parameter error0xFF is register lock is not allowed to be modified*/uint8_t setAlertOutputMode(uint8_t mode);/*** @brief 获取警报输出的模式* @return modeCOMPARATOR_OUTPUT_MODE // 比较器输出模式INTERRPUT_OUTPUT_MODE // 中断输出模式DISABLE_OUTPUT_MODE // 禁止输出模式*/uint8_t getAlertOutputMode(void);/*** @brief 设置响应模式, 响应上限下限和临界值, 或者只响应临界值, 只响应临界值不适用于中断模式* @param modeUPPER_LOWER_CRIT_RESPONSE // 上限/下线和临界值 都响应, ONLY_CRIT_RESPONSE // 禁止上限下限响应, 只有临界值响应@return state0x00 is set successfully0xFE is set parameter error0xFF is register lock is not allowed to be modified*/uint8_t setAlertResponseMode(uint8_t mode);/*** @brief 获取中断响应的模式* @return modeUPPER_LOWER_CRIT_RESPONSE // 上限/下线和临界值 都响应ONLY_CRIT_RESPONSE // 禁止上限下限响应, 只有临界值响应*/uint8_t getAlertResponseMode(void);/*** @brief 设置临界值和上限和下限阈值,根据配置的中断模式响应高于上限温度和低于下限温度和高于临界值响应中断临界值温度必须大于上限温度上限温度必须大于下限温度 2摄氏度* @param crit// 温度临界值, 最多两位小数, 自动处理成0.25的倍数, 范围为-40 到 +125度* @param upper// 温度上限, 最多两位小数, 自动处理成0.25的倍数, 范围为-40 到 +125度* @param lower// 温度下限, 最多两位小数, 自动处理成0.25的倍数, 范围为-40 到 +125度* @return state0x00 is set successfully0xFD // 温度上限小于下限, 或者(上限温度-下限温度 < 2 )0xFE // 温度上限小于临界值0xFF is register lock is not allowed to be modified*/uint8_t setThreshold(float crit, float upper, float lower);/*** @brief 清空中断, 只使用于中断模式下, 其余模式没有效果*/void clearInterrupt(void);protected:/*** @brief 初始化传感器, 对比传感器的芯片id 和 厂商 id@return statetrue is init successfullyflase is 芯片id或者厂商id错误*/bool sensorInit(void);/*** @brief 设置电源模式, 上电模式:该模式下, 可以正常访问寄存器, 能够得到正常的温度;低功耗模式:温度测量停止, 可以读取或写入寄存器, 但是总线活动会使耗电升高* @param modePOWER_UP_MODE // 上电模式LOW_POWER_MODE // 低功耗模式* @return true is set successfalse is register lock is not allowed to be modified*/bool setPowerMode(uint8_t mode);/*** @brief 使能或者禁止报警模式, 使能报警模式后, ALE引脚到达报警条件后会产生跳变, 禁止报警模式ALE引脚没有响应* @param modeENABLE_ALERT // 使能报警模式, ALE引脚到达报警条件后会产生跳变DISABLE_ALERT // 禁止报警模式, 禁止报警模式ALE引脚没有响应@return state0x00 is set successfully0xFE is set parameter error0xFF is register lock is not allowed to be modified*/uint8_t setAlertEnable(uint8_t mode);/*** @brief 获取报警模式状态, 得到时报警模式或者非报警模式* @return modeENABLE_ALERT // 报警模式DISABLE_ALERT // 非报警模式*/uint8_t getAlertEnableState(void);/*** @brief 解析浮点数, 用于设置上限下限临界值的浮点数部分* @return 二进制的浮点数*/uint8_t parsingDecimal(float value);/*** @brief get manufacturer id* @return manufacturer idtrue // manufacturer id is truefalse // manufacturer id is false*/bool getManufacturerID(void);/*** @brief get device id* @return device idtrue // device id is truefalse // device id is false*/bool getDeviceID(void);/*** @brief 解析阈值的整数部分, 放到指定位置* @param value 要放的阈值数据* @param data 要放到的地址*/
样例代码 - getTemperature 温度在串口显示,测量温度随环境温度改变而改变。
/*!* @file getTemperature.ino* @brief 普通获取温度的例子* @n 实验现象:温度在串口显示,测量温度随环境温度改变而改变* @n i2c 地址选择,默认i2c地址为0x1F,A2、A1、A0引脚为高电平* @n 1代表高电平,0代表低电平,8种组合为* | A2 | A1 | A0 |* | 0 | 0 | 0 | 0x18* | 0 | 0 | 1 | 0x19* | 0 | 1 | 0 | 0x1A* | 0 | 1 | 1 | 0x1B* | 1 | 0 | 0 | 0x1D* | 1 | 0 | 1 | 0x1D* | 1 | 1 | 0 | 0x1E* | 1 | 1 | 1 | 0x1F default i2c address** @copyright Copyright (c) 2010 DFRobot Co.Ltd (https://www.dfrobot.com)* @licence The MIT License (MIT)* @author ZhixinLiu(zhixin.liu@dfrobot.com)* @version V0.3* @date 2021-04-16* @get from https://www.dfrobot.com* @url https://www.dfrobot.com*/
#include "DFRobot_MCP9808.h"/**i2c 地址的选择I2C_ADDRESSI2C_ADDRESS_0 0x18I2C_ADDRESS_1 0x19I2C_ADDRESS_2 0x1aI2C_ADDRESS_3 0x1bI2C_ADDRESS_4 0x1cI2C_ADDRESS_5 0x1dI2C_ADDRESS_6 0x1eI2C_ADDRESS_7 0x1f default i2c address
*/
#define I2C_ADDRESS MCP9808_ADDRESS_7
DFRobot_MCP9808_I2C mcp9808(&Wire, I2C_ADDRESS);void setup()
{Serial.begin(115200);while(!Serial);while(!mcp9808.begin()){Serial.println("begin failed!");delay(1000);} Serial.println("begin success!");/*** 唤醒传感器,此时可以正常获取传感器数据*/if(!mcp9808.wakeUpMode()){Serial.println("Register locked, Please unlock!");}else{Serial.println("Wake up sensor successfully, can read the temperature!");}/**设置温度的分辨率RESOLUTION_0_5 // 获取温度的小数部分为0.5的倍数 如0.5℃ 、1.0℃、1.5℃RESOLUTION_0_25 // 获取温度的小数部分为0.25的倍数 如0.25℃、0.50℃、0.75℃RESOLUTION_0_125 // 获取温度的小数部分为0.125的倍数 如0.125℃、0.250℃、0.375℃RESOLUTION_0_0625 // 获取温度的小数部分为0.0625的倍数 如0.0625℃、0.1250℃、0.1875℃*/if(mcp9808.setResolution(RESOLUTION_0_125)){Serial.println("设置温度的分辨率成功!");}else{Serial.println("parameter error!");}
}void loop()
{Serial.print("Temperature is ="); Serial.print(mcp9808.getTemperature());Serial.println(" C");delay(1000);
}
串口显示实验结果
Arduino UNO驱动MCP9808高精度数字温度传感器相关推荐
- DFRobot新品Fermion:MCP9808高精度数字温度传感器的简介和工作原理介绍
著名开源硬件商DFRobot新推出使用广泛的Fermion:MCP9808高精度数字温度传感器.它可检测-40°C和+125°C之间的温度,提供±0.25°C/±0.5°C(典型值 / 最大值)高级精 ...
- Arduino UNO驱动土壤湿度传感器检测
Arduino UNO驱动土壤湿度传感器检测 简介 运行要求 Arduino UNO与传感器接线 程序展示 实践效果 总结 简介 本次使用到是这个新款土壤湿度传感器! 这款电容式土壤湿度传感器区别于市 ...
- arduino超声波测距接线图详细_使用Arduino UNO开发板和超声波传感器测量距离
超声波传感器不仅提供距离测量实用程序,而且没有任何物理接触,但需要我们在无噪音和光线的情况下进行测量,与基于激光的距离测量仪器不同.此外,即使在基于激光的仪器经常降低其效率的日光下,这些仪器也便宜且更 ...
- Arduino UNO驱动ADS1115模数转换模块
Arduino UNO驱动ADS1115模数转换模块 简介 ADS1115模块原理图 Arduino UNO与ADS1115接线图 Arduino UNO测试代码 总结 原文链接:https://ww ...
- Arduino UNO驱动TM1637四位时钟数码管显示时间
Arduino UNO驱动TM1637四位时钟数码管显示时间 一.TM1637简介 二.引脚定义 三.Arduino UNO与数码管模块接线 四.测试代码 五.实验结果 一.TM1637简介 TM16 ...
- Arduino UNO驱动合宙1.8‘TFT SPI屏幕示例演示(含资料包)
Arduino UNO驱动合宙1.8"TFT SPI屏幕示例演示 效果展示 驱动参考资料包 来源于:http://www.lcdwiki.com/zh/1.8inch_Arduino_SPI ...
- Arduino uno 驱动安装问题解决(win10)
Arduino uno 驱动安装问题解决(win10) 今天安装uno的驱动怎么也安装不上,从网上找了各种帖子,终于解决了问题 首先说一下遇到的问题: 1.插入uno板在arduino中无法设置端口, ...
- Arduino Uno驱动四位数码管
Arduino Uno驱动四位数码管 我用的是 四位共阳极数码管 型号是5461BS-1数码管 接线方法 UNO引脚 数据码 3 1 4 2 5 3 6 4 7 A 8 B 9 C 10 D 11 E ...
- Arduino UNO驱动 AT24C256 EEPROM存储器模块
Arduino UNO驱动 AT24C256 EEPROM存储器模块 AT24C256模块简介 模块引脚定义 Arduino UNO与模块接线 测试代码 实验结果 AT24C256模块简介 AT24C ...
最新文章
- 什么是B/S模式?什么是C/S模式?
- 删除文件中指定的一行
- 字符编码总结(UTF-8,UNICODE)
- Linux基础命令的操作(时间与日期,日历,计算器)
- QT计算器功能的实现
- matlab 高斯模糊_摸鱼 | 茴香豆的“茴”有四种写法,模糊有几种糊法?
- pytorch数据加载时报错OSError: [Errno 22] Invalid argument
- 云米冰箱能控制扫地机器人_既能解放劳动力又能提升家庭幸福指数的小家电,云米互联网扫地机Pro开箱!...
- Nginx 简单命令
- pyTorch自然语言处理简单例子
- java 整数相等,为什么Java不会看到整数是相等的?
- 安卓应用安全指南 4.7 使用可浏览的意图
- 计算机算法设计与分析 递归实现归并排序和非递归实现归并排序
- scratch3文件转exe文件方法
- 【numpy学习】numpy教程--基于莫烦python的教程
- 方向导数与梯度——学习笔记
- 阿里巴巴争夺中国蓬勃发展的电动汽车市场
- MATLAB求单位阶跃响应,并分析参量的影响。自控例题。
- Python爬虫-爬取手机应用市场中APP下载量
- kotlin协程简单封装,助你一臂之力