DHTC12是一款数字温湿度传感器,采用I2C通讯,性能特征如下
照例先放上驱动文件
使用方法:
I2C的初始化和驱动OLED时一样
- void i2c_init()
- {
- gpio = bflb_device_get_by_name("gpio");
- /* I2C0_SDA */
- bflb_gpio_init(gpio, GPIO_PIN_11, GPIO_FUNC_I2C0 | GPIO_ALTERNATE | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_1);
- /* I2C0_SCL */
- bflb_gpio_init(gpio, GPIO_PIN_10, GPIO_FUNC_I2C0 | GPIO_ALTERNATE | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_1);
- i2c0 = bflb_device_get_by_name("i2c0");
- bflb_i2c_init(i2c0, 100000);
- }
复制代码 实现发送和接收方法
- uint8_t i2c_sendreg(void *i2cx,uint8_t devaddr,uint8_t *reg,uint8_t reglen,uint8_t *datas,uint16_t datalen)
- {
- struct bflb_i2c_msg_s msgs[2];
- msgs[0].addr = devaddr;
- msgs[0].flags = I2C_M_NOSTOP;
- msgs[0].buffer = reg;
- msgs[0].length = reglen;
- msgs[1].addr = devaddr;
- msgs[1].flags = I2C_M_WRITE;
- msgs[1].buffer = datas;
- msgs[1].length = datalen;
- if(reglen > 0)
- return bflb_i2c_transfer(i2cx, msgs, 2) == 0?0:1;
- else
- return bflb_i2c_transfer(i2cx, &msgs[1], 1) == 0?0:1;
- }
- uint8_t i2c_readreg(void *i2cx,uint8_t devaddr,uint8_t *reg,uint8_t reglen,uint8_t *datas,uint16_t datalen)
- {
- struct bflb_i2c_msg_s msgs[2];
- msgs[0].addr = devaddr;
- msgs[0].flags = I2C_M_NOSTOP;
- msgs[0].buffer = reg;
- msgs[0].length = reglen;
- msgs[1].addr = devaddr;
- msgs[1].flags = I2C_M_READ;
- msgs[1].buffer = datas;
- msgs[1].length = datalen;
- if(reglen > 0)
- return bflb_i2c_transfer(i2cx, msgs, 2) == 0?0:1;
- else
- return bflb_i2c_transfer(i2cx, &msgs[1], 1) == 0?0:1;
- }
复制代码 初始化DHTC12
- MY_DHTC12_DEV_Type dhtc12_dev;
- void dhtc12_init()
- {
- dhtc12_dev.i2cx = i2c0;
- dhtc12_dev.i2c_readregdatas_func = i2c_readreg;
- dhtc12_dev.i2c_sendregdatas_func = i2c_sendreg;
- dhtc12_dev.delayms_func = bflb_mtimer_delay_ms;
- MY_DHTC12_Init(&dhtc12_dev);
- }
复制代码 main函数
- int main(void)
- {
- int16_t tem,hum;
- board_init();
- gpio = bflb_device_get_by_name("gpio");
- bflb_gpio_init(gpio, GPIO_PIN_12, GPIO_OUTPUT | GPIO_FLOAT | GPIO_SMT_EN | GPIO_DRV_0);
- i2c_init();
- dhtc12_init();
- while (1) {
- bflb_gpio_set(gpio, GPIO_PIN_12);
- bflb_mtimer_delay_ms(1000);
- bflb_gpio_reset(gpio, GPIO_PIN_12);
- bflb_mtimer_delay_ms(1000);
- if(MY_DHTC12_ReadHT(&dhtc12_dev,&tem,&hum) == 0)
- printf("温度:%.1f℃ 湿度:%.1f%%\r\n",tem/10.0,hum/10.0);
- }
- }
复制代码 运行效果
、
配合上之前的OLED就能实现一个数字温湿度传感器
- int main(void)
- {
- int16_t tem,hum;
- char out[20];
- board_init();
- gpio = bflb_device_get_by_name("gpio");
- bflb_gpio_init(gpio, GPIO_PIN_12, GPIO_OUTPUT | GPIO_FLOAT | GPIO_SMT_EN | GPIO_DRV_0);
- i2c_init();
- oled_init();
- dhtc12_init();
- while (1) {
- bflb_gpio_set(gpio, GPIO_PIN_12);
- bflb_mtimer_delay_ms(1000);
- bflb_gpio_reset(gpio, GPIO_PIN_12);
- bflb_mtimer_delay_ms(1000);
- if(MY_DHTC12_ReadHT(&dhtc12_dev,&tem,&hum) == 0)
- {
- printf("温度:%.1f℃ 湿度:%.1f%%\r\n",tem/10.0,hum/10.0);
- sprintf(out,"T:%03.1f H:%03.1f%% ",tem/10.0,hum/10.0);
- MY_OLED_SSD1315_DisplayString8x16(&oled_dev,0,4,0,out);
- }
- }
- }
复制代码 效果
|