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

STM32和STM32CubeMX实现SHT30温湿度传感器 保姆级教程

【背景】

公司忽然说要知道产品的工作的环境情况,要知道工作的温度和湿度。那我就在板子上做个温湿度传感器。温湿度传感器很多,有名的DHT11什么的多得很,我在淘宝上看了一下,发现卖sht系列的比较多,我就选了个sht30的。

【硬件设计】

硬件设计很简单,就是i2c通信就行了。VDD=3.3V

【软件设计】

也很简单。我开始在网上看了一下,用模拟I2C的很多,还有人把程序搞成付费的,没有必要。这程序很简单,用STM32的HAL库最简单了。几句就能搞定。我现在免费的完全公开给大家。

sht30.h

#ifndef __SHT30_H_ #define __SHT30_H_ #include "main.h" #include <stdint.h> #include <sys/types.h> #include "uart.h" #include "delay.h" #define SHT30_ADDRESS 0x44 // I2C address of the SHT30 sensor #define SHT30_ADDRESS_WRITE (SHT30_ADDRESS << 1) // I2C write address #define SHT30_ADDRESS_READ (SHT30_ADDRESS << 1) | 0x01 // I2C read address, HAL_I2C_Master_Receive()会自动处理读写位,不需要手动处理,但是手动处理也可以,这个或上的读写位被库函数忽略了。 extern I2C_HandleTypeDef hi2c2; extern uint8_t sht30_data[6]; // Buffer to store the 6 bytes of data read from the SHT30 sensor void sht30_read(uint8_t *data, uint16_t len); uint8_t sht30_crc(const uint8_t *data, uint16_t len); void sht30_crc_test(void); #endif /* __SHT30_H_ */

sht30.c

#include "sht30.h" // 初始值 0xFF,多项式 0x31 uint8_t sht30_crc(const uint8_t *data, uint16_t len) { uint8_t crc = 0xFF; // 初始值为0xFF for (uint16_t i = 0; i < len; i++) { crc ^= data[i]; // 将当前字节与CRC进行异或运算 for (uint8_t j = 0; j < 8; j++) { if (crc & 0x80) // 检查最高位是否为1 { crc = (crc << 1) ^ 0x31; // 左移一位并与多项式0x31进行异或 } else { crc <<= 1; // 仅左移一位 } } } return crc; } void sht30_crc_test(void) { // Test implementation for CRC calculation uint8_t crc_test = 0; uint8_t crc_in_data[2] = {0xbe, 0xef}; crc_test= sht30_crc(crc_in_data, 2); printf("SHT30 CRC 0x%02X\r\n", crc_test); delay_ms(1000); } void sht30_read(uint8_t *data, uint16_t len) { // 发送读取命令 uint8_t cmd[2] = {0x2C, 0x06}; // 高精度测量命令 // uint8_t cmd[2] = {0xE0, 0x00}; // 周期读测量命令 int status=0; status = HAL_I2C_Master_Transmit(&hi2c2, SHT30_ADDRESS_WRITE, (uint8_t *)cmd, 2, 0xffff); // 发送命令到SHT30, 100ms if (status != HAL_OK) { printf("SHT30 command transmit failed with status: %d\r\n", status); return; } // 等待测量完成,SHT30的测量时间约为15ms delay_ms(20); // 接收数据 status = HAL_I2C_Master_Receive(&hi2c2, SHT30_ADDRESS_WRITE, data, len, 0xffff); // 接收数据 if (status != HAL_OK) { printf("SHT30 data receive failed with status: %d\r\n", status); return; } if(sht30_crc(data, 2) != data[2] || sht30_crc(data + 3, 2) != data[5]) { printf("SHT30 CRC check failed\r\n"); return; } uint16_t rawTemp = (data[0] << 8) | data[1]; uint16_t rawHum = (data[3] << 8) | data[4]; float temperature = -45 + 175 * ((float)rawTemp / 65535.0); float humidity = 100 * ((float)rawHum / 65535.0); printf("SHT30 Temperature: %.2f Degree, Humidity: %.2f%%\r\n", temperature, humidity); }

I2C使用的i2c2, 时钟是100khz的。

main.c

while(1)里放下列代码

#if 1 sht30_crc_test(); sht30_read(sht30_data, 6); printf("SHT30 data read: "); for (int i = 0; i < 6; i++) { printf("0x%02X ", sht30_data[i]); } printf("\r\n"); #endif

【结果检验】

打印出来的结果是这样。

办公室的温度是26.64°,湿度49.63%

用示波器看看i2c的波形,如下。

放大点看,是这样的。

这就是i2c的波形,并不是很好的方波。但是,看起来,信号还算比较完美的。

好了,大功告成,亲个嘴儿。

http://www.gsyq.cn/news/1605997.html

相关文章:

  • 社区公益服务平台 Java+SpringBoot+Vue 前后分离
  • 营销智能体选哪个?一份基于实际场景的对比指南正在改变内容生成、投放优化和用户互动的效率。但市场上的产品形态差异很大:有的只是套了壳的通用写作工具,有的是传统营销 SaaS 加了个 AI 入口。选错不仅
  • 口碑佳的智能产品有何奥秘
  • 收藏!AI应用开发路线图:Java后端+Python大模型,小白也能轻松入门并快速上手
  • 软件数据可视化化的图表展示与交互
  • 暑假将至,校园安防不“放假”:国标GB28181视频监控平台EasyCVR这套视频融合方案让安全“全年无休”
  • [百度网盘] 大模型AI应用开发企业级项目实战(提示词工程+大模型NLP应用+AI对话产品)
  • 数据库巡检怎么做?Prometheus+Grafana监控体系搭建指南
  • 记一次由「系统Swap空间」被频繁使用导致的性能急剧下降
  • 软件检测实验室CMA资质认定技术人员和管理人员岗位要求与职责划分
  • GPT-5.6震撼来袭!OpenAI开启智能体基础设施时代,跑分已不重要!
  • 快速集成脑筋急转弯API:用Python构建你的命令行问答游戏
  • MSPM0 SYSCTL模块深度解析:时钟与功耗管理实战指南
  • 16 CFR 1640软垫家具阻燃
  • 从后厨到前台:一家连锁餐企如何用三年时间完成合同管理的数字化重构
  • 5款热门有声书软件实测,哪款最适合你?
  • 操作系统内存分配:伙伴系统与Slab分配器的结合
  • 【ChatGPT API成本控制实战手册】:20年架构师亲授7大隐形计费陷阱与精准预算建模法
  • 微信小程序性能优化:首屏加载与渲染提速指南
  • 20人研发团队MacBook选型找谁咨询
  • Java毕设选题推荐:基于 Java 的上下级任务对接管理平台设计与开发 轻量化企业任务审批与跟踪管理系统设计实现【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 智能推荐化技术中的协同过滤内容推荐与混合推荐
  • 降重降AI工具哪个好?多款工具实测对比
  • 捷克行业市场整体发展情况解读
  • 2026年期货公司避险对冲能力深度对比:选对平台比选对手续费更重要
  • MySQL 查询优化实战记录
  • 大湾区首家突破 200 亿估值具身智能公司诞生,自变量超豪华投资阵容曝光
  • 专精特新与高新技术企业为何需要基于容度原理的颠覆性技术?
  • 本地文档处理链怎么做轻一点?从 PDF、Markdown 到 JSON 看 ZTools
  • 字节面试题:Agent 的记忆系统怎么设计?短期记忆和长期记忆到底有什么区别?