|
【年中粉丝节】+STM32G491 Nucleo-64开发板+AHT10温湿度传感器,实现温湿度检测并在OLED上显示。 年中我也来分享一波自己做过的,凑个热闹,搞点积分!!! 开发板用的是STM32G491 Nucleo-64开发板:
具体参数如下图:
传感器是奥松的AHT10,IIC接口:
显示用的是12864的OLED,也是IIC接口。 下面进入程序配置,打开CUBEMX。选择IIC1跟IIC2还有串口跟LED。
生成程序后用keil打开,修改逻辑部分: 先是OLED,在之前的标准库的例程上修改一下写函数,其他的基本不变:
串口修改(没有用到):
接着是AHT10的,由于硬件IIC没有测试成功,采用的模拟IIC: /** brief 检查AHT10读温湿度数据 param *temperature:需要读出的温度数据,float指针类型,精度范围+-0.3C param *humidity:需要读出的湿度数据,u8指针类型,精度范围+-2RH return 0 读数据正常 1读数据失败 */ uint8_t AHT10ReadData(float *temperature,uint8_t *humidity) { uint8_t ack; uint32_t SRH=0,ST=0; uint8_t 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(); HAL_Delay(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; } ( _$ h# S) p% D4 u( o) c; N6 N最后在主程序调用和显示即可: int main(void) { /* USER CODE BEGIN 1 */ float TEM[1]={0}; uint8_t HUM[1]={0}; /* USER CODE END 1 */ 4 ]& m" }* v' q. m2 r /* MCU Configuration--------------------------------------------------------*/ : o" X3 L7 A9 Z \ [3 t /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); 3 w0 H* B$ h: b) F& I /* USER CODE BEGIN Init */ /* USER CODE END Init */ % A' {8 K, r/ l% n+ h, a1 N" U+ r /* Configure the system clock */ SystemClock_Config(); 3 @7 | J( Z$ l/ r* V3 p; z* ~; ~- S, b /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_LPUART1_UART_Init(); // MX_I2C1_Init(); MX_I2C2_Init(); MX_USART1_UART_Init(); /* USER CODE BEGIN 2 */ OLED_Init(); : J l% ~- J: R% l6 C AHT10Init(); //IIC初始化 // AHT10Reset(); /* USER CODE END 2 */ 3 D3 b- j/ x* Q2 @% X( C /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ + d* L, G* W& ~ L, |. I /* USER CODE BEGIN 3 */ 7 a8 c1 e( @. U8 p$ Y# X4 b5 Q //温度: OLED_ShowChinese(0,0,4,16,1); OLED_ShowChinese(16,0,5,16,1); OLED_ShowChinese(32,0,2,16,1); OLED_ShowChinese(48,0,3,16,1); OLED_ShowString(64,0,":",16,1); OLED_Write_Float(72,0,TEM[0],16,1); OLED_ShowChinese(112,0,10,16,1); //湿度: OLED_ShowChinese(0,20,4,16,1); OLED_ShowChinese(16,20,5,16,1); OLED_ShowChinese(32,20,11,16,1); OLED_ShowChinese(48,20,3,16,1); OLED_ShowString(64,20,":",16,1); OLED_Write_Int(72,20,HUM[0],16,1); OLED_ShowString(112,20,"%",16,1); OLED_Refresh(); # s+ Q: N, V" `8 Y" s% ^ HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin); AHT10ReadData(TEM,HUM); printf("TEM=%0.1f,HUM=%d\n",TEM[0],HUM[0]); HAL_Delay(1000); } /* USER CODE END 3 */ } 下面是实测图:
如果对程序有兴趣的可以留言,HAL库的程序确实有点大,传不上来。 分享结束!年中给日天添把火!!! ; f/ H3 _9 l7 V: L. D* K$ N- ?( C3 s! Z+ f4 N, |/ B( F. E7 A& ^ |
|
为什么截图有些显示不出来! T+ Z/ g3 U/ Y9 U6 t7 [2 O1 {% y |
微信公众号
手机版