[CW32F030系列] 基于芯源CW32F030 MCU的低功耗温湿度监测系统设计

[复制链接]
2745|13
 楼主| Clyde011 发表于 2024-10-15 07:50 | 显示全部楼层 |阅读模式
芯源微电子推出的CW32F030 MCU因其低功耗和多功能外设广泛应用于物联网和环境监测系统。本篇文章展示如何使用CW32F030构建一个简单的温湿度监测系统,并实现低功耗模式,适用于长期电池供电的项目。

系统概述
  • 功能描述:实时监测环境温湿度,并通过串口输出结果。采用SHT30传感器进行数据采集。系统闲置时进入低功耗模式,延长电池寿命。
  • 硬件组成
    • MCU:CW32F030
    • 温湿度传感器:SHT30
    • 串口通信模块

硬件连接
  • SHT30与CW32F030的I2C连接
    • SHT30 SDA -> MCU P0.6
    • SHT30 SCL -> MCU P0.7
    • GND -> GND
    • VCC -> 3.3V

代码实现
  1. #include <CW32F030.h>
  2. #include <i2c.h>
  3. #include <uart.h>

  4. #define SHT30_ADDR 0x44  // SHT30 I2C地址

  5. void delay_ms(unsigned int ms) {
  6.     for (unsigned int i = 0; i < ms * 1000; i++)
  7.         __NOP();  // 延时函数
  8. }

  9. void I2C_Init() {
  10.     I2C_Config_TypeDef i2c_cfg;
  11.     i2c_cfg.I2C_ClockSpeed = 100000;  // 100kHz
  12.     i2c_cfg.I2C_Mode = I2C_MODE_I2C;
  13.     I2C_Init(I2C0, &i2c_cfg);
  14. }

  15. void UART_Init() {
  16.     UART_Config_TypeDef uart_cfg;
  17.     uart_cfg.BaudRate = 9600;
  18.     uart_cfg.WordLength = UART_WORDLENGTH_8B;
  19.     uart_cfg.StopBits = UART_STOPBITS_1;
  20.     uart_cfg.Parity = UART_PARITY_NONE;
  21.     UART_Init(UART0, &uart_cfg);
  22. }

  23. void SHT30_ReadData(float *temperature, float *humidity) {
  24.     uint8_t data[6];
  25.     I2C_Start(I2C0);
  26.     I2C_SendData(I2C0, SHT30_ADDR << 1);
  27.     I2C_SendData(I2C0, 0x2C);  // 高精度测量命令
  28.     I2C_SendData(I2C0, 0x06);
  29.     delay_ms(10);  // 等待测量完成

  30.     I2C_Start(I2C0);
  31.     I2C_SendData(I2C0, (SHT30_ADDR << 1) | 1);  // 读取数据
  32.     for (int i = 0; i < 6; i++)
  33.         data[i] = I2C_ReceiveData(I2C0);
  34.     I2C_Stop(I2C0);

  35.     *temperature = ((data[0] << 8 | data[1]) * 175.0 / 65535.0) - 45.0;
  36.     *humidity = ((data[3] << 8 | data[4]) * 100.0 / 65535.0);
  37. }

  38. void Enter_LowPowerMode() {
  39.     PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
  40. }

  41. int main() {
  42.     float temp = 0.0, hum = 0.0;

  43.     I2C_Init();
  44.     UART_Init();

  45.     while (1) {
  46.         SHT30_ReadData(&temp, &hum);
  47.         printf("Temperature: %.2f C, Humidity: %.2f %%\r\n", temp, hum);
  48.         delay_ms(5000);  // 每5秒采集一次
  49.         Enter_LowPowerMode();  // 进入低功耗模式
  50.     }
  51. }
代码解析
  • I2C初始化:配置I2C为标准模式(100kHz),用于与SHT30传感器通信。
  • UART初始化:设置波特率9600,用于将温湿度数据通过串口输出。
  • 温湿度读取:读取SHT30返回的数据,并计算出实际的温湿度值。
  • 低功耗模式:每次采集数据后进入低功耗模式,减少能耗。

系统运行效果
  • 每5秒采集一次环境的温度和湿度,并通过串口输出结果。
  • 系统在数据采集之间进入低功耗模式,节省电量。

优化建议
  • 数据上传:将数据通过蓝牙或Wi-Fi上传至服务器,实现远程监控。
  • 报警功能:加入温湿度阈值判断,超出范围时触发蜂鸣器报警。
  • 自动唤醒:配置RTC定时唤醒系统,更精确控制功耗。

评论

PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);请问这行代码是标准版里的么?好像找不到。  发表于 2024-10-18 16:54
公羊子丹 发表于 2024-10-15 07:51 | 显示全部楼层
CW32F030还支持低功耗,这真的是物联网项目的福音。
周半梅 发表于 2024-10-15 07:52 | 显示全部楼层
用这片MCU做环境监测挺合适的,价格也不贵。
帛灿灿 发表于 2024-10-15 07:52 | 显示全部楼层
延时5秒再进入低功耗,这设计挺科学的。
童雨竹 发表于 2024-10-15 07:53 | 显示全部楼层
有没有人用CW32F030做过蓝牙数据传输的?求示例代码。
万图 发表于 2024-10-15 07:53 | 显示全部楼层
这片MCU跟STM32比,开发起来是不是更简单?
Wordsworth 发表于 2024-10-15 07:54 | 显示全部楼层
芯源的MCU在市场上的口碑怎么样?有人用过更多型号吗?
Bblythe 发表于 2024-10-15 07:55 | 显示全部楼层
这段代码能不能加个OLED显示模块,想做个简单的温湿度屏。
Pulitzer 发表于 2024-10-15 07:56 | 显示全部楼层
I2C通信和低功耗并存,代码写得挺清楚,学到了。
Uriah 发表于 2024-10-15 07:57 | 显示全部楼层
CW32系列还有没有其他低功耗应用的例子?想参考下。
CW32TechSupport 发表于 2024-10-15 09:20 | 显示全部楼层
Uriah 发表于 2024-10-15 07:57
CW32系列还有没有其他低功耗应用的例子?想参考下。

请参考本版帖子:CW32系列MCU应用好贴
https://bbs.21ic.com/icview-3327088-1-1.html
AdaMaYun 发表于 2024-10-16 21:11 | 显示全部楼层
典型的温度传感器使用
LOVEEVER 发表于 2024-10-21 13:18 | 显示全部楼层
MCU的使用低功耗非常实用的功能
您需要登录后才可以回帖 登录 | 注册

本版积分规则

155

主题

5872

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部