这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界» 论坛首页» 嵌入式开发» STM32» STM32G070RB探测17-模拟IIC采集温湿度显示到OLED

共3条 1/1 1 跳转至

STM32G070RB探测17-模拟IIC采集温湿度显示到OLED

高工
2021-01-07 23:58:47 打赏
今天整理一下代码,顺便搞一下温湿度传感器 AHT10把之前在自动生成的文件下写的代码都移植出来,写成单独的.c和.h文件放在单独的文件夹下,然后之后我们其他地方用的话,我们可以直接复制走,这就是传说中的,模块化编程,具体可以查看大Z老师之前的老帖子

单片机模块化编程---第一弹(一)

添加头文件所在文件夹的方式

工程右键,属性

进入正题,今天我来采集一下AHT10的温湿度,同时把它显示在OLED上(AHT10和OLED是同一个IIC总线)

我们先移植一下模拟IIC,我是直接导入了我之前用过的库,只需修改宏定义即可

同样库文件我会放在帖子最后

搞好了IIC驱动,下一步就是看AHT10的手册了

IIC首先要确定设备地址 从数据手册可知,设备地址为0X38

我们可以计算出来读地址和写地址

#define AHT10_ADDRESS 0x38 #define AHT10_WRITE (AHT10_ADDRESS<<1) #define AHT10_READ (AHT10_WRITE+1)

根据手册编写初始化函数

发送0XE1表示初始化,据此编写

/** brief AHT10初始化函数 param NONE return NONE */ void AHT10Init() { IIC_Init(); IIC_Start(); IIC_Send_Byte(AHT10_ADDRESS); IIC_Send_Byte(0xe1); IIC_Stop(); delay_ms(40);//延时20ms让传感器稳定 }

然后编写读取函数,继续看手册

整个流程写的一清二楚

再看下转换公式

开写

/** brief 检查AHT10读温湿度数据 param *temperature:需要读出的温度数据,float指针类型,精度范围+-0.3C param *humidity:需要读出的湿度数据,u8指针类型,精度范围+-2RH return 0 读数据正常 1读数据失败 */ u8 AHT10ReadData(float *temperature,u8 *humidity) { u8 ack; u32 SRH=0,ST=0; u8 databuff[6]; IIC_Start(); IIC_Send_Byte(AHT10_WRITE); IIC_Wait_Ack(); IIC_Send_Byte(0xac); IIC_Wait_Ack(); IIC_Send_Byte(0x33); IIC_Wait_Ack(); IIC_Send_Byte(0x00); IIC_Wait_Ack(); IIC_Stop(); delay_ms(80);//延时一会等待数据读出 IIC_Start(); IIC_Send_Byte(AHT10_READ); IIC_Wait_Ack(); ack=IIC_Read_Byte(1); if((ack&0x40)==0) { databuff[0]=IIC_Read_Byte(1); databuff[1]=IIC_Read_Byte(1); databuff[2]=IIC_Read_Byte(1); databuff[3]=IIC_Read_Byte(1); databuff[4]=IIC_Read_Byte(0); IIC_Stop(); SRH=(databuff[0]<<12)+(databuff[1]<<4)+(databuff[2]>>4); ST=((databuff[2]&0X0f)<<16)+(databuff[3]<<8)+(databuff[4]); *humidity=(int)(SRH*100.0/1024/1024+0.5); *temperature=((int)(ST*2000.0/1024/1024+0.5))/10.0-50; return 0; } IIC_Stop(); return 1; }
主函数来了

初始化

OLED_Init(); AHT10Init();

while(1)

while (1) { if(AHT10ReadData(&tem,&hum)==0) { printf("tem:%.1f\r\nhum:%d%%\r\n",tem,hum); } else { printf("aht10 not read\r\n"); } OLED_ShowCHinese(0u,0u,0); OLED_ShowCHinese(16u,0u,1); OLED_ShowCHinese(32u,0u,2); OLED_ShowCHinese(48u,0u,3); OLED_ShowCHinese(64u,0u,4); OLED_ShowCHinese(80u,0u,5); OLED_P8x16Str(0u,2u,(uint8_t *)"EEPW & STM32"); sprintf(buf,"tem:%.1f",tem); OLED_P8x16Str(0u,4u,(uint8_t *)buf); sprintf(buf,"hum:%d%%",hum); OLED_P8x16Str(0u,6u,(uint8_t *)buf); HAL_Delay(5000); }

效果 展示

能看的出我住的地方害挺暖和,暖气-冬天滴神xxxxxxxxxx OLED_ShowCHinese(0u,0u,0);OLED_ShowCHinese(16u,0u,1);OLED_ShowCHinese(32u,0u,2);OLED_ShowCHinese(48u,0u,3);OLED_ShowCHinese(64u,0u,4);OLED_ShowCHinese(80u,0u,5);



工程师
2021-01-12 22:15:33 打赏
2楼

感谢您的分享


工程师
2021-01-12 22:56:25 打赏
3楼

十分感谢您的分享


共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册]