当前位置: 首页 > 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.jsqmd.com/news/1094035/

相关文章:

  • 社区公益服务平台 Java+SpringBoot+Vue 前后分离
  • RAG 答不准?多半不是模型不行,是缺了 Rerank
  • dart_common_extensions:一套 Dart 常用扩展方法集合
  • 全球自组网电台硬件技术路线解析
  • 2026门店收银系统服务商测评解析:凤梨收银系统适配本地业态的优质服务商推荐
  • SmsForwarder Windows客户端
  • P.2简易计算器
  • 营销智能体选哪个?一份基于实际场景的对比指南正在改变内容生成、投放优化和用户互动的效率。但市场上的产品形态差异很大:有的只是套了壳的通用写作工具,有的是传统营销 SaaS 加了个 AI 入口。选错不仅
  • 移动端安全加固方案
  • 日志分析与谷歌收录优化流程:Vue单页网站收录率提至80%技巧
  • 编译型语言与解释型语言的深度区别
  • 收藏!AI应用开发路线图:Java后端+Python大模型,小白也能轻松入门并快速上手
  • PHP代码加密平台深度对比:IonCube与SourceGuardian技术选型指南
  • 口碑佳的智能产品有何奥秘
  • Rust的#[test]测试属性与基准测试在持续集成中的自动化运行
  • 【毕业设计】基于 Java 的员工任务下达与反馈管理系统设计 办公场景下任务分配信息管理系统的设计与实现(源码+文档+远程调试,全bao定制等)
  • CO₂RR计算的“疑难解答手册”--80+课题组验证的实战方案分享
  • 软件数据可视化化的图表展示与交互
  • TMP815单相全波风扇电机预驱动器:从原理到实战的完整设计指南
  • chinese 15 sentences
  • 基于MCP协议与Playwright构建零代码AI自动化测试框架
  • 暑假将至,校园安防不“放假”:国标GB28181视频监控平台EasyCVR这套视频融合方案让安全“全年无休”
  • 气溶胶载荷及其属性(微物理、光学、辐射)
  • 解决ios应用4.3a拒审难题(帮助应用上架App Store)
  • [百度网盘] 大模型AI应用开发企业级项目实战(提示词工程+大模型NLP应用+AI对话产品)
  • 现场动平衡前,为什么要先确认基础和紧固:方法与流程
  • MC6470与PIC18单片机在运动感知与导航中的应用实践
  • 5分钟解锁你的音乐收藏:ncmdump如何帮你打破格式限制
  • 数据库巡检怎么做?Prometheus+Grafana监控体系搭建指南
  • Linux 5.10 CAN/CANFD机制详解