学习I2C总线通信协议,使用STM32F103完成基于I2C协议的AHT20温湿度传感器的数据采集,并将采集的温度-湿度值通过串口输出。具体任务:
1)解释什么是“软件I2C”和“硬件I2C”? (阅读野火配套教材的第23章“I2C–读写EEPROM”原理章节)
“软件I2C”(Software I2C)和"硬件I2C"(Hardware I2C)是两种不同的实现方式,用于在微控制器或微处理器上进行I2C通信(Inter-Integrated Circuit,即集成电路之间的串行通信协议)。
软件I2C是指通过软件模拟实现的I2C通信协议,通常在没有硬件支持或者需要额外I2C通信通道时使用。在软件I2C中,通信的时序和数据传输是通过控制GPIO引脚的高低电平来实现的,而不是由硬件外设来管理。软件I2C的实现需要考虑时序的精确性,以及在微控制器上处理并发任务时的效率问题。
硬件I2C是指微控制器或微处理器内置的硬件模块,专门用于处理I2C通信协议。硬件I2C通过专用的硬件引脚和寄存器来管理通信的时序和数据传输,具有更高的时序精度和稳定性。
2)阅读AHT20数据手册,编程实现:每隔2秒钟采集一次温湿度数据,显示到OLED上,同时通过串口发送到上位机的“串口助手”软件。
在stm32cubemx上配置:
GPIO
SYS
RCC
TIM1
I2C1
I2C2
USART1
时钟
引入AHT20和OLED的库:
主程序:
int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_I2C1_Init();
MX_I2C2_Init();
MX_TIM1_Init();
MX_USART1_UART_Init();
uint32_t CT_data[ 2]={ 0, 0} ;
volatile int c1, t1;
HAL_Delay(50);
AHT20_Init();
HAL_Delay(500);
u8g2_t u8g2;
u8g2Init( & u8g2);
while (1) {
AHT20_Read_CTdata_crc(CT_data);
c1 = CT_data[0] * 1000 / 1024 / 1024;//计算得到湿度值c1(放大了10倍>
t1 = CT_data[1] * 2000 / 1024 / 1024 - 500;//计算得到温度值t1(放大了10倍>
printf("Await");
printf("\r\n");
printf("9");
HAL_Delay(100);
printf("8");
HAL_Delay(100);
printf("7");
HAL_Delay(100);
printf("6");
HAL_Delay(100);
printf("5");
HAL_Delay(100);
printf("4");
HAL_Delay(100);
printf("3");
HAL_Delay(100);
printf("2");
HAL_Delay(100);
printf("1");
HAL_Delay(100);
printf("0");
HAL_Delay(100);
printf("\r\n");
printf("Temperature:%d%d.%d", t1 / 100, (t1 / 10) % 10, t1 % 10);
printf("\r\n");
printf("Humidity:%d%d.%d", c1 / 100, (c1 / 10) % 10, c1 % 10);
printf("\r\n");
char Onedate[ 20];
char Twodate[ 20];
sprintf(Onedate, "Temperature:%d%d.%d", t1 / 100, (t1 / 10) % 10, t1 % 10);
sprintf(Twodate, "Humidity:%d%d.%d", c1 / 100, (c1 / 10) % 10, c1 % 10);
u8g2_FirstPage( & u8g2);
do {
draw( & u8g2);
u8g2_ClearBuffer( & u8g2);
u8g2_DrawStr( & u8g2, 3, 30, Onedate);
u8g2_DrawStr( & u8g2, 3, 40, Twodate);
} while (u8g2_NextPage( & u8g2));
}
}
实物图: