[其他ST产品] 嵌入式STM32深入之基于IIC和SPI协议的温湿度采集

[复制链接]
1404|28
 楼主| 裤脚口感好 发表于 2023-1-31 22:40 | 显示全部楼层
AHT20芯片读取数据 read_AHT20函数
  1. void read_AHT20(void)
  2. {
  3.         uint8_t   i;

  4.         for(i=0; i<6; i++)
  5.         {
  6.                 readByte[i]=0;
  7.         }

  8.         //-------------
  9.         I2C_Start();

  10.         I2C_WriteByte(0x71);
  11.         ack_status = Receive_ACK();
  12.         readByte[0]= I2C_ReadByte();
  13.         Send_ACK();

  14.         readByte[1]= I2C_ReadByte();
  15.         Send_ACK();

  16.         readByte[2]= I2C_ReadByte();
  17.         Send_ACK();

  18.         readByte[3]= I2C_ReadByte();
  19.         Send_ACK();

  20.         readByte[4]= I2C_ReadByte();
  21.         Send_ACK();

  22.         readByte[5]= I2C_ReadByte();
  23.         SendNot_Ack();
  24.         //Send_ACK();

  25.         I2C_Stop();

  26.         //--------------
  27.         if( (readByte[0] & 0x68) == 0x08 )
  28.         {
  29.                 H1 = readByte[1];
  30.                 H1 = (H1<<8) | readByte[2];
  31.                 H1 = (H1<<8) | readByte[3];
  32.                 H1 = H1>>4;

  33.                 H1 = (H1*1000)/1024/1024;

  34.                 T1 = readByte[3];
  35.                 T1 = T1 & 0x0000000F;
  36.                 T1 = (T1<<8) | readByte[4];
  37.                 T1 = (T1<<8) | readByte[5];

  38.                 T1 = (T1*2000)/1024/1024 - 500;

  39.                 AHT20_OutData[0] = (H1>>8) & 0x000000FF;
  40.                 AHT20_OutData[1] = H1 & 0x000000FF;

  41.                 AHT20_OutData[2] = (T1>>8) & 0x000000FF;
  42.                 AHT20_OutData[3] = T1 & 0x000000FF;
  43.         }
  44.         else
  45.         {
  46.                 AHT20_OutData[0] = 0xFF;
  47.                 AHT20_OutData[1] = 0xFF;

  48.                 AHT20_OutData[2] = 0xFF;
  49.                 AHT20_OutData[3] = 0xFF;
  50.                 printf("\r\n");

  51.         }
  52.         printf("\r\n");
  53.         printf("温度:%d%d.%d",T1/100,(T1/10)%10,T1%10 );
  54.         printf("湿度:%d%d.%d",H1/100,(H1/10)%10,H1%10);
  55.         printf("\r\n");
  56. }



 楼主| 裤脚口感好 发表于 2023-1-31 22:42 | 显示全部楼层
 楼主| 裤脚口感好 发表于 2023-1-31 22:42 | 显示全部楼层
电路连接
温湿度传感器接法
本程序采用的软件I2C实现,GPIO引脚PB6,PB7。
具体定义代码如下
  1. #define SDA_IN() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}
  2. #define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}
  3. #define IIC_SCL PBout(6) //SCL
  4. #define IIC_SDA PBout(7) //SDA
  5. #define READ_SDA PBin(7)
 楼主| 裤脚口感好 发表于 2023-1-31 22:42 | 显示全部楼层
SCL连接PB6,SDA连接PB7

如果采用硬件I2C进行实现,可以查看关于STM32的原理图,可以看到硬件I2C接口,野火stm32mini开发板的I2C接口是PA2,PA3,要实现硬件I2C读取数据,就根据上面介绍的方式进行配置,即可完成通讯。
5942963d928dbcc3d1.png
 楼主| 裤脚口感好 发表于 2023-1-31 23:42 | 显示全部楼层
实现
(1)烧录正常,打开串口助手
此时发现没有什么问题
 楼主| 裤脚口感好 发表于 2023-1-31 23:42 | 显示全部楼层
改变传感器环境(哈口气)
发现此时显示温度上升至30.9,湿度上升到94.7
3216663d936e0c2be7.png
4906463d936cf490f5.png
 楼主| 裤脚口感好 发表于 2023-1-31 23:42 | 显示全部楼层
所以,这里实验其温度得到了明显升高,环境湿度改变后同样湿度也有了变化

 楼主| 裤脚口感好 发表于 2023-1-31 23:43 | 显示全部楼层
总结
通过本次实验的操作,我们复习而之前的标准库的代码书写,然后学习利用I2C总线上允许连接多个微处理器以及各种外围设备,如存储器、LED及LCD驱动、A/D及D/A转换器等。为了保证数据可靠地传送,任一时刻总线只能由某一台主机控制,各微处理器应该在总线空闲时发送数据。
通过本次实验,详细了解到了I2C总线协议,以及AHT20温湿度传感器的使用。对于我们更加深入学习STM32更近了一步,也是我们必须要尝试的一步,从最开始的学习到现在收获多多!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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