温湿度传感器的数据采集和Ardunio IDE实现STM32的串口通信

1、Ardunio IDE实现STM32的串口通信

一、I2C协议简介

2C 通讯协议(Inter-Integrated Circuit)是由 Phiilps 公司开发的,由于它引脚少,硬件 实现简单,可扩展性强,不需要 USART、CAN 等通讯协议的外部收发设备,现在被广泛 地使用在系统内多个集成电路(IC)间的通讯。

1、 I2C物理层

I2C 通讯设备之间的常用连接方式见图
在这里插入图片描述
它的物理层有如下特点:

(1) 它是一个支持设备的总线。“总线”指多个设备共用的信号线。在一个 I2C 通讯总线 中,可连接多个 I2C 通讯设备,支持多个通讯主机及多个通讯从机。

(2) 一个 I2C 总线只使用两条总线线路,一条双向串行数据线(SDA) ,一条串行时钟线 (SCL)。数据线即用来表示数据,时钟线用于数据收发同步。

(3) 每个连接到总线的设备都有一个独立的地址,主机可以利用这个地址进行不同设备之 间的访问。

(4) 总线通过上拉电阻接到电源。当 I2C 设备空闲时,会输出高阻态,而当所有设备都空 闲,都输出高阻态时,由上拉电阻把总线拉成高电平。

(5) 多个主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定由哪个设备占用 总线。

(6) 具有三种传输模式:标准模式传输速率为 100kbit/s ,快速模式为 400kbit/s ,高速模式 下可达 3.4Mbit/s,但目前大多 I 2C 设备尚不支持高速模式。

(7) 连接到相同总线的 IC 数量受到总线的最大电容 400pF 限制 。

2、I2C协议层

I2C 的协议定义了通讯的起始和停止信号、数据有效性、响应、仲裁、时钟同步和地 址广播等环节。

I2C 通讯过程的基本结构
在这里插入图片描述

二、软件I2C和硬件I2C

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

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

三、AHT20温湿度传感器的数据采集

(1)实验工具

——温湿度传感器AHT20

——单片机:STM32F103系列单片机(野火mini)

(2)主要代码

main.c

#include "led.h"
#include "delay.h"
#include "temhum.h"
#include "sys.h"
#include "usart.h"

 int main(void)
 {
    
    	 	
    u32 CT_data[2]={
    
    0};
    volatile float  hum=0,tem=0;     
     
    delay_init();	    	 //延时函数初始化	  
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
    uart_init(115200);	 //串口初始化为115200
    LED_Init();			     //LED端口初始化
    temphum_init();     //ATH20初始化    
	
	while(1)
	{
    
    
        AHT20_Read_CTdata(CT_data);       //不经过CRC校验,直接读取AHT20的温度和湿度数据 

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

        printf("湿度:%.1f%%\r\n",(hum/10));
        printf("温度:%.1f度\r\n",(tem/10));
        printf("\r\n");
        
        //延时2s,LED闪烁提示串口发送状态
        LED=0;
        delay_ms(1000);
        LED=1;
        delay_ms(1000);
	 }
}


代码参考:添加链接描述
(3)实验结果

在这里插入图片描述
在这里插入图片描述

四、参考资料

链接: link.

2、Ardunio IDE实现STM32的串口通信

安装Ardunio
在这里插入图片描述
将Arduino_STM32文件夹复制到hareware下:
在这里插入图片描述

打开软件,在工具中找到开发板,选择Generic STM32F103V series(指南者)
依次进行如下操作:在这里插入图片描述
CPU不管(默认72MHz)
在这里插入图片描述
之后连接到开发板:

1.USB线连接到"USB转串口";
2.用黄色跳帽将BOOT0与3v3相连,BOOT1与GND相连,RXD与A9相连,TXD与A10相连;

将以下代码替换掉图中:在这里插入图片描述
下面展示一些 内联代码片。

int flag=1;   
char Stop[]="stop\n";
void setup() {
    
    
//初始化
pinMode(PB0, OUTPUT);//PB0为绿色,PB1为蓝色,PB5为红色,可根据需要改动
Serial.begin(115200);
}
void loop() {
    
    
int i=0,flag_s=0;
char inByte[50];
digitalWrite(PB0, HIGH); //小灯亮
delay(500); // 延迟
digitalWrite(PB0, LOW); //小灯灭
delay(500); // 延迟
while (Serial.available()> 0)     //当发送缓冲区有数据时
{
    
    
        inByte[i] = Serial.read();    //从串口的缓冲区取出并读取一个Byte的数据
        delay(10); 
        i++ ;                              
}
if(Stop[i]=inByte[i])
{
    
    
  if(Stop[i-1]==inByte[i-1]&&Stop[i-2]==inByte[i-2]&&Stop[i-3]==inByte[i-3])
  {
    
    
  flag=0;
  Serial.println("收到!");
  }//当收到stop命令时停止并回复收到
}
if(flag==1)
{
    
      
Serial.println("Hello World!");//向串口发送数据
delay(100); // 延迟
}
}


点击工具中选择串口;

再依次点击如图所示按钮:在这里插入图片描述
再在工具中打开串口监视器:在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/iostreamhvoid/article/details/111567568