温湿度传感器采集

  • Post author:
  • Post category:其他




实验内容:

学习I2C总线通信协议,完成基于I2C硬件协议的AHT20温湿度传感器的数据采集,并将采集的温度-湿度值通过串口输出。



一、什么是“软件I2C”和“硬件I2C”?

想要控制 STM32 产生 I2C 方式的通讯,可以采用软件模拟或硬件 I2C 这两种方式。

所谓

软件模拟

,即直接使用 CPU 内核按照 I2C 协议的要求控制 GPIO 输出高低电平。如控制产生 I2C 的起始信号时,如图 ,先控制作为 SCL 线的 GPIO 引脚输出高电平,然后控制作为 SDA 线的 GPIO 引脚在此期间完成由高电平至低电平的切换,最后再控制SCL 线切换为低电平,这样就输出了一个标准的 I2C 起始信号。

在这里插入图片描述



硬件 I2C

是指直接利用 STM32 芯片中的硬件 I2C 外设,该硬件 I2C 外设跟 USART串口外设类似,只要配置好对应的寄存器,外设就会产生标准串口协议的时序。使用它的I2C 外设则可以方便地通过外设寄存器产生 I2C协议方式的通讯,如初始化好 I2C 外设后,只需要把某寄存器位置 1,那么外设就会控制对应的 SCL 及 SDA 线自动产生 I2C起始信号,而不需要内核直接控制引脚的电平。

比较起来,硬件 I2C 直接使用外设来控制引脚,可以减轻 CPU 的负担。不过使用硬件I2C 时必须使用某些固定的引脚作为 SCL 和

SDA,软件模拟 I2C 则可以使用任意 GPIO 引脚,相对比较灵活。



二、编程实现:每隔2秒钟采集一次温湿度数据,并通过串口发送到上位机(win10)



1、任务要求

每隔2秒钟采集一次温湿度数据,并通过串口发送到上位机(win10)。



2、实验器材

① STM32最小核心板(STM32F103C8T6)

②奥松AHT21B温湿度传感器

③USB转TTL(ch340芯片)

④ IDE:keil5

⑤ 实验所用串口:USART1



3、主要代码

#include "stm32f10x.h"
#include "bsp_usart.h"
#include "delay.h"
#include "bsp_aht20.h"
#include "bsp_led.h"


int main(void)
{

	u32 CT_data[2]={0};
    volatile float  hum=0,temp=0;     
     
	  USART_Config();			//USART1初始化
	  LED_GPIO_Config();		//LED端口初始化
    delay_init();	    	//延时函数初始化	  
    temphum_init();         //初始化温湿度传感器
	
	while(1)
	{
        AHT20_Read_CTdata(CT_data);       //不经过CRC校验,直接读取AHT20的温度和湿度数据 

        hum = CT_data[0]*100*10/1024/1024;  //计算得到湿度值(放大了10倍)
        temp = CT_data[1]*200*10/1024/1024-500;//计算得到温度值(放大了10倍)

        printf("湿度:%.1f%%\r\n",(hum/10));
        printf("温度:%.1f度\r\n",(temp/10));
        printf("\r\n");
        
        /*绿灯闪烁提示串口发送状态*/
        green_led_on;
        delay_ms(1000);
		green_led_off;
        delay_ms(1000);
	 }
}



安装 Ardunio IDE 和相关软件支持库,在Ardunio 完成STM32板子的串口通信程序



1、要求

1)持续向串口输出“Hello world!”

2)当接收到“stop!”时,停止输出。



步骤

1.

安装Ardunio


2.环境

① STM32最小核心板(STM32F103R)

②USB转TTL(ch340芯片)

③ IDE:Arduino

④ 实验所用串口:USART1

3.实验代码

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);//设置串口的波特率
  pinMode(PC2,OUTPUT);//PC2是蓝色的,PC2表示LED的接口,还有一个是PC3

}
int flag=1;//串口发送标志位,1表示发送,0表示停止发送
void loop() {
  // put your main code here, to run repeatedly:
  if (flag == 1)
  {
    Serial.println("Hello World!");
    digitalWrite(PC2, HIGH);   //LED灭
    delay(500);   // 延时
    digitalWrite(PC2, LOW);   //LED亮
    delay(500);   //延时
  }
  stopSendData();
}

void stopSendData()
{
  String stopflag="stop!";//停止发送数据信号
  String receivedata="";//存放接受到的数据
  while(Serial.available()>0)//判断串口是否还有数据
  {
    receivedata=Serial.readString();//读取接收到的数据
  }
  if(receivedata==stopflag)//判断接收到的数据是否为停止发送数据的信号
  {
    flag=0;
  }
}

连接温湿度传感器

在这里插入图片描述

scl ———- pc6

sda ———- pc7

gnd ———- gnd

vcc ———- 3v3

结果展示:

在这里插入图片描述

4.配置设置

在这里插入图片描述

5.结果展示

在这里插入图片描述



版权声明:本文为weixin_45189408原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。