发帖
7 0 0

【Ai-M61-32SU入门】I2C读取DHTC12温湿度

lvxinjia123
论坛元老

11

主题

37

回帖

3100

积分

论坛元老

积分
3100
Ai-M61-Kit外设移植教程 973 7 2024-5-26 10:47:25
DHTC12是一款数字温湿度传感器,采用I2C通讯,性能特征如下

微信截图_20240526103941.png

照例先放上驱动文件
上传的附件: my_dhtc12.rar (2.78 KB, 下载次数: 4)

使用方法:
I2C的初始化和驱动OLED时一样
  1. void i2c_init()
  2. {
  3.     gpio = bflb_device_get_by_name("gpio");
  4.     /* I2C0_SDA */
  5.     bflb_gpio_init(gpio, GPIO_PIN_11, GPIO_FUNC_I2C0 | GPIO_ALTERNATE | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_1);
  6.     /* I2C0_SCL */
  7.     bflb_gpio_init(gpio, GPIO_PIN_10, GPIO_FUNC_I2C0 | GPIO_ALTERNATE | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_1);

  8.     i2c0 = bflb_device_get_by_name("i2c0");

  9.     bflb_i2c_init(i2c0, 100000);
  10. }
复制代码
实现发送和接收方法
  1. uint8_t i2c_sendreg(void *i2cx,uint8_t devaddr,uint8_t *reg,uint8_t reglen,uint8_t *datas,uint16_t datalen)
  2. {
  3.     struct bflb_i2c_msg_s msgs[2];
  4.     msgs[0].addr = devaddr;
  5.     msgs[0].flags = I2C_M_NOSTOP;
  6.     msgs[0].buffer = reg;
  7.     msgs[0].length = reglen;

  8.     msgs[1].addr = devaddr;
  9.     msgs[1].flags = I2C_M_WRITE;
  10.     msgs[1].buffer = datas;
  11.     msgs[1].length = datalen;
  12.     if(reglen > 0)
  13.         return bflb_i2c_transfer(i2cx, msgs, 2) == 0?0:1;
  14.     else
  15.         return bflb_i2c_transfer(i2cx, &msgs[1], 1) == 0?0:1;
  16. }

  17. uint8_t i2c_readreg(void *i2cx,uint8_t devaddr,uint8_t *reg,uint8_t reglen,uint8_t *datas,uint16_t datalen)
  18. {
  19.     struct bflb_i2c_msg_s msgs[2];

  20.     msgs[0].addr = devaddr;
  21.     msgs[0].flags = I2C_M_NOSTOP;
  22.     msgs[0].buffer = reg;
  23.     msgs[0].length = reglen;

  24.     msgs[1].addr = devaddr;
  25.     msgs[1].flags = I2C_M_READ;
  26.     msgs[1].buffer = datas;
  27.     msgs[1].length = datalen;
  28.     if(reglen > 0)
  29.         return bflb_i2c_transfer(i2cx, msgs, 2) == 0?0:1;
  30.     else
  31.         return bflb_i2c_transfer(i2cx, &msgs[1], 1) == 0?0:1;
  32. }
复制代码
初始化DHTC12
  1. MY_DHTC12_DEV_Type dhtc12_dev;
  2. void dhtc12_init()
  3. {
  4.     dhtc12_dev.i2cx = i2c0;
  5.     dhtc12_dev.i2c_readregdatas_func = i2c_readreg;
  6.     dhtc12_dev.i2c_sendregdatas_func = i2c_sendreg;
  7.     dhtc12_dev.delayms_func = bflb_mtimer_delay_ms;
  8.     MY_DHTC12_Init(&dhtc12_dev);
  9. }
复制代码
main函数
  1. int main(void)
  2. {
  3.     int16_t tem,hum;
  4.     board_init();
  5.     gpio = bflb_device_get_by_name("gpio");
  6.     bflb_gpio_init(gpio, GPIO_PIN_12, GPIO_OUTPUT | GPIO_FLOAT | GPIO_SMT_EN | GPIO_DRV_0);
  7.     i2c_init();
  8.     dhtc12_init();
  9.     while (1) {
  10.         bflb_gpio_set(gpio, GPIO_PIN_12);
  11.         bflb_mtimer_delay_ms(1000);
  12.         bflb_gpio_reset(gpio, GPIO_PIN_12);
  13.         bflb_mtimer_delay_ms(1000);
  14.         if(MY_DHTC12_ReadHT(&dhtc12_dev,&tem,&hum) == 0)
  15.             printf("温度:%.1f℃  湿度:%.1f%%\r\n",tem/10.0,hum/10.0);
  16.     }
  17. }
复制代码
运行效果
微信截图_20240526103435.png

配合上之前的OLED就能实现一个数字温湿度传感器
  1. int main(void)
  2. {
  3.     int16_t tem,hum;
  4.     char out[20];
  5.     board_init();
  6.     gpio = bflb_device_get_by_name("gpio");
  7.     bflb_gpio_init(gpio, GPIO_PIN_12, GPIO_OUTPUT | GPIO_FLOAT | GPIO_SMT_EN | GPIO_DRV_0);
  8.     i2c_init();
  9.     oled_init();
  10.     dhtc12_init();
  11.     while (1) {
  12.         bflb_gpio_set(gpio, GPIO_PIN_12);
  13.         bflb_mtimer_delay_ms(1000);
  14.         bflb_gpio_reset(gpio, GPIO_PIN_12);
  15.         bflb_mtimer_delay_ms(1000);
  16.         if(MY_DHTC12_ReadHT(&dhtc12_dev,&tem,&hum) == 0)
  17.         {
  18.             printf("温度:%.1f℃  湿度:%.1f%%\r\n",tem/10.0,hum/10.0);
  19.             sprintf(out,"T:%03.1f  H:%03.1f%% ",tem/10.0,hum/10.0);
  20.             MY_OLED_SSD1315_DisplayString8x16(&oled_dev,0,4,0,out);
  21.         }
  22.     }
  23. }
复制代码
效果
微信截图_20240526103710.png

──── 0人觉得很赞 ────

使用道具 举报

2024-5-26 11:50:59
2024-5-26 14:26:40
赞!
2024-5-26 17:08:05
2024-5-26 22:59:50
赞👍
2024-5-27 09:30:17
不错不错!
2024-7-4 19:05:40
学习了
2024-7-24 19:43:24
恭喜
您需要登录后才可以回帖 立即登录
高级模式
返回
统计信息
  • 会员数: 28186 个
  • 话题数: 40025 篇