当前位置: 首页 > news >正文

使用Arduino板读取CHT832X温湿度

硬件准备:

  • CHT8325ADNR芯片:CHT832X是上海申矽凌微电子的一款数字温湿度传感器,湿度精度为±1.5%RH,温度精度为±0.1°C,可以应用于车载,暖通空调,冰箱,温湿度计等环境监测。
  • 连线:
    Pin- VCC —> 5V-arduino
    Pin-SDA —> SDA -arduino
    Pin- GND —> GND-arduino
    Pin-SCL ----> SCL-arduino

在这里插入图片描述

代码实现:

#include <Wire.h>#define CHT832X_ADDR 0x44 // 7位地址// 命令定义
#define CMD_ONE_SHOT_NO_STRETCH 0x2400 // 单次测量命令(禁用时钟拉伸)
#define CMD_READ_DATA 0xE000         // 读取数据命令// 温湿度转换参数
#define TEMP_SCALE 65535.0
#define TEMP_OFFSET -45.0
#define TEMP_SLOPE 175.0
#define HUMIDITY_SCALE 100.0 / 65535.0// CRC8校验函数
uint8_t crc8(const uint8_t *data, int len) {const uint8_t POLYNOMIAL = 0x31; // CRC多项式uint8_t crc = 0xFF; // 初始值for (int i = 0; i < len; ++i) {crc ^= data[i];for (int j = 0; j < 8; ++j) {crc = (crc & 0x80) ? (crc << 1) ^ POLYNOMIAL : (crc << 1);}}return crc;
}void setup() {Serial.begin(115200);Wire.begin();delay(100); // 等待传感器初始化Serial.println("CHT832X Sensor Test");
}void loop() {// 发送单次测量命令(禁用时钟拉伸)if (sendCommand(CMD_ONE_SHOT_NO_STRETCH)) {delay(150); // 等待测量完成uint16_t rawTemp, rawHumidity;uint8_t temp_crc, humi_crc;if (readMeasurement(&rawTemp, &rawHumidity, &temp_crc, &humi_crc)) {// 验证CRCuint8_t temp_data[2] = {highByte(rawTemp), lowByte(rawTemp)};uint8_t humi_data[2] = {highByte(rawHumidity), lowByte(rawHumidity)};if (crc8(temp_data, 2) != temp_crc) {Serial.println("Temperature CRC check failed!");return;}if (crc8(humi_data, 2) != humi_crc) {Serial.println("Humidity CRC check failed!");return;}// 计算实际温湿度float humidity = rawHumidity * HUMIDITY_SCALE;float temperature = (rawTemp / TEMP_SCALE) * TEMP_SLOPE + TEMP_OFFSET;// 检查湿度值是否在合理范围内if (humidity > 100.0) humidity = 100.0;if (humidity < 0.0) humidity = 0.0;// 打印原始值和实际值Serial.print("Raw Temperature: 0x");Serial.print(rawTemp, HEX);Serial.print(" (");Serial.print(rawTemp);Serial.print(") => ");Serial.print(temperature, 2);Serial.println(" °C");Serial.print("Raw Humidity: 0x");Serial.print(rawHumidity, HEX);Serial.print(" (");Serial.print(rawHumidity);Serial.print(") => ");Serial.print(humidity, 2);Serial.println(" %RH");Serial.println("--------------------------");} else {Serial.println("Failed to read data!");}} else {Serial.println("Measurement command failed!");}delay(4000); // 每4秒测量一次
}// 发送16位命令(如触发测量)
bool sendCommand(uint16_t command) {Wire.beginTransmission(CHT832X_ADDR);Wire.write(highByte(command)); // 发送高字节Wire.write(lowByte(command));  // 发送低字节return (Wire.endTransmission() == 0); // 检查ACK
}// 读取温湿度数据
bool readMeasurement(uint16_t *temp, uint16_t *humidity, uint8_t *temp_crc, uint8_t *humi_crc) {// 发送读取数据命令Wire.beginTransmission(CHT832X_ADDR);Wire.write(highByte(CMD_READ_DATA));Wire.write(lowByte(CMD_READ_DATA));if (Wire.endTransmission(false) != 0) return false;// 请求读取6字节数据(温度2字节 + 温度CRC1字节 + 湿度2字节 + 湿度CRC1字节)Wire.requestFrom(CHT832X_ADDR, 6);if (Wire.available() >= 6) {*temp = (Wire.read() << 8) | Wire.read();    // 温度原始值*temp_crc =Wire.read();              *humidity = (Wire.read() << 8) | Wire.read(); // 湿度原始值*humi_crc  =Wire.read();                return true;}return false;
}

运行结果:

在这里插入图片描述

相关文章:

  • Linux 网络编程:select、poll 与 epoll 深度解析 —— 从基础到高并发实战
  • 探索科技的边界:代理IP与汽车产业链的创新之旅
  • 2023蓝帽杯初赛内存取证-2
  • el-table中el-input的autofocus无法自动聚焦的解决方案
  • Cursor这类编程Agent软件的模型架构与工作流程
  • 深入探讨:如何完美完成标签分类任务(数据治理中分类分级的分类思考)
  • 成熟软件项目解决方案:360°全景影像显控软件系统
  • [Godot] C#2D平台游戏基础移动和进阶跳跃代码
  • 【git】subtree拆分大的git库到多个独立git库
  • 施磊老师基于muduo网络库的集群聊天服务器(四)
  • Unitest和pytest使用方法
  • Web网页核心技术解析:从结构到节点操作
  • 如何将当前文件夹及其子文件夹下的所有word提取到一个excel里
  • 常用第三方库:dio网络库使用与封装
  • 超级扩音器手机版:随时随地,大声说话
  • 双指针-11.盛水最多的容器-力扣(LeetCode)
  • UE5 鼠标点击一个物体触发Onclick事件
  • 如何创建Vue3工程
  • 【解决 el-table 树形数据更新后视图不刷新的问题】
  • 【数据结构 · 初阶】- 堆的实现
  • 江苏一季度实现地区生产总值3.3万亿元,同比增长5.9%
  • 九江市人大常委会原党组成员、副主任戴晓慧主动交代问题,正接受审查调查
  • 经济日报:锚定重点领域和关键环节,上海浦东谋划高水平对外开放
  • 国家卫健委:无资质机构严禁开展产前筛查
  • 深一度|中国花样滑冰因何大滑坡
  • 世界读书日|全城书香,上海“全民阅读”正在进行时