STM32通过I2C接口实现温湿度(AHT20)的采集与OLED显示及显示姓名学号
文章目录
- 一、了解I2C总线协议
- 二、实现AHT20采集程序
- 三、温湿度采集——OLED显示
- 三、总结
- 四、参考链接
一、了解I2C总线协议
1.什么是I2C协议
I2C 通讯协议(Inter-Integrated Circuit)是由 Phiilps 公司开发的,由于它引脚少,硬件实现简单,可扩展性强,不需要 USART、CAN 等通讯协议的外部收发设备,现在被广泛地使用在系统内多个集成电路(IC)间的通讯。
2.I2C 协议的物理层和协议层
物理层
I2C是一个支持设备的总线。可连接多个 I2C 通讯设备,支持多个通讯主机及多个通讯从机。对于I2C 总线,只使用两条总线线路,一条双向串行数据线(SDA) ,一条串行时钟线(SCL)。
协议层
主要是定义了通讯的起始和停止信号、数据有效性、响应、仲裁、时钟同步和地址广播等。
通讯的起始和停止信号
数据有效性
(1)从图中可以看出I2C在通讯的时候,只有在SCL处于高电平时,SDA的数据传输才是有效的。SDA 信号线是用于传输数据,SCL 信号线是保证数据同步。
(2)当SDA传输数据后,接收方对接受到的数据进行一个应答。如果希望继续进行传输数据,则回应应答信号(低电平),否则回应非应答信号(高电平)。
3.I2C的两种方式——硬件I2C和软件I2C
硬件I2C
直接利用 STM32 芯片中的硬件 I2C 外设。
软件I2C
直接使用 CPU 内核按照 I2C 协议的要求控制 GPIO 输出高低电平,从而模拟I2C。
二、实现AHT20采集程序
1.了解AHT20芯片的相关信息
具体信息请到官方下载对应产品介绍文档,资料链接如下
http://www.aosong.com/class-36.html
2.具体代码添加过程
在野火提供的示例代码中,打开一个只包含固件库的空项目。向工程中添加相关代码,添加代码的具体内容请参考下面链接:https://blog.csdn.net/hhhhhh277523/article/details/111397514
完整代码
3主要代码的分析
AHT20芯片的使用过程
void read_AHT20_once(void)
{delay_ms(10);reset_AHT20();//重置AHT20芯片delay_ms(10);init_AHT20();//初始化AHT20芯片delay_ms(10);startMeasure_AHT20();//开始测试AHT20芯片delay_ms(80);read_AHT20();//读取AHT20采集的到的数据delay_ms(5);
}
AHT20芯片读取数据
void read_AHT20(void)
{uint8_t i;for(i=0; i<6; i++){readByte[i]=0;}I2C_Start();//I2C启动I2C_WriteByte(0x71);//I2C写数据ack_status = Receive_ACK();//收到的应答信息readByte[0]= I2C_ReadByte();//I2C读取数据Send_ACK();//发送应答信息readByte[1]= I2C_ReadByte();Send_ACK();readByte[2]= I2C_ReadByte();Send_ACK();readByte[3]= I2C_ReadByte();Send_ACK();readByte[4]= I2C_ReadByte();Send_ACK();readByte[5]= I2C_ReadByte();SendNot_Ack();//Send_ACK();I2C_Stop();//I2C停止函数//判断读取到的第一个字节是不是0x08,0x08是该芯片读取流程中规定的,如果读取过程没有问题,就对读到的数据进行相应的处理if( (readByte[0] & 0x68) == 0x08 ){H1 = readByte[1];H1 = (H1<<8) | readByte[2];H1 = (H1<<8) | readByte[3];H1 = H1>>4;H1 = (H1*1000)/1024/1024;T1 = readByte[3];T1 = T1 & 0x0000000F;T1 = (T1<<8) | readByte[4];T1 = (T1<<8) | readByte[5];T1 = (T1*2000)/1024/1024 - 500;AHT20_OutData[0] = (H1>>8) & 0x000000FF;AHT20_OutData[1] = H1 & 0x000000FF;AHT20_OutData[2] = (T1>>8) & 0x000000FF;AHT20_OutData[3] = T1 & 0x000000FF;}else{AHT20_OutData[0] = 0xFF;AHT20_OutData[1] = 0xFF;AHT20_OutData[2] = 0xFF;AHT20_OutData[3] = 0xFF;printf("读取失败!!!");}printf("\r\n");//根据AHT20芯片中,温度和湿度的计算公式,得到最终的结果,通过串口显示printf("温度:%d%d.%d",T1/100,(T1/10)%10,T1%10);printf("湿度:%d%d.%d",H1/100,(H1/10)%10,H1%10);printf("\r\n");
}
结果
三、温湿度采集——OLED显示
1. 添加OLED显示代码
下载链接:https://github.com/Sunlight-Dazzling/stm32_AHT20_OLED/tree/main/User/usart
2添加功能代码
bsp_i2c.c中添加:
#include "bsp_i2c.h"
#include "delay.h"uint8_t ack_status=0;
uint8_t readByte[6];
uint8_t AHT20_status=0;uint32_t H1=0; //Humility
uint32_t T1=0; //Temperatureuint8_t AHT20_OutData[4];
uint8_t AHT20sendOutData[10] = {0xFA, 0x06, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF};
增加show_info函数,这个函数是将信息显示到OLED屏上的。
void show_info(){GUI_ShowCHinese(10,10,16,"张赟",1);GUI_ShowString(10,30,"631907060331",16,1);GUI_ShowString(5,50,"tem:",16,1);GUI_ShowNum(40,50,T1/100,1,16,1);GUI_ShowNum(49,50,(T1/10)%10,1,16,1);GUI_ShowString(56,50,".",16,1);GUI_ShowNum(58,50,T1%10,1,16,1);GUI_ShowString(70,50,"wet:",16,1);GUI_ShowNum(100,50,H1/100,1,16,1);GUI_ShowNum(109,50,(H1/10)%10,1,16,1);GUI_ShowString(116,50,".",16,1);GUI_ShowNum(118,50,H1%10,1,16,1);
}
main函数
int main(void)
{ delay_init(); uart_init(115200); IIC_Init();NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 OLED_Init(); //初始化OLED OLED_Clear(0); //清屏(全黑)while(1){printf("温度湿度显示");read_AHT20_once();//读取温湿度show_info();//显示delay_ms(5000);//延时OLED_Clear(0);//清屏read_AHT20_once();//读取温湿度show_info();delay_ms(5000);OLED_Clear(0);}
}
3.显示自己的学号和姓名
点阵字库生成工具:https://pan.baidu.com/s/1bBjj-yzrJO-8J3yq8Jlohg
提取码:2000
用工具生成字模,张赟存储代码:
实现显示代码,放在gui.c的oledfont.h里面。
运行结果
三、总结
本实验主要是学习I2C总线通信协议,使用STM32F103完成基于I2C协议的AHT20温湿度传感器的数据采集,并将采集的温度-湿度值通过串口输出。
四、参考链接
https://blog.csdn.net/qq_43279579/article/details/111597278
https://blog.csdn.net/qq_55691662/article/details/121570226?spm=1001.2014.3001.5501
STM32通过I2C接口实现温湿度(AHT20)的采集与OLED显示及显示姓名学号相关推荐
- STM32通过I2C接口采集温湿度
目录 一.I2C总线协议 1. I2C总线简介 1.1 物理接口 1.2 通讯特征 1.3 I2C总线状态 2. I2C总线通信协议 2.1 起始位和结束位 2.2 数据格式与应答 2.3 数据传输通 ...
- 10.STM32中用I2C接口发送数据到EEPROM寄存器在从此寄存器读数据
10.STM32中用I2C接口发送数据到EEPROM寄存器在从此寄存器读数据.
- 树莓派体验12 - 树莓派I2C接口获取温湿度
i2c-tools工具安装 apt-get install i2c-tools i2c-tools包含如下命令: i2cdetect i2cdump i2cget i2cset 通过r ...
- stm32f10x通过I2C接口实现温湿度(AHT20)的采集及显示
目录 一.I2C通信协议 1.协议简介 2.I2C总线特点 3.I2C工作原理 二. I2C实现方式 1.软件I2C 2.硬件I2C 3.硬软件I2C比较 三.温湿度数据采集 1.实验要求 2.主要代 ...
- STM32基于I2C温湿度采集
目录 一.题目要求 二.关于I2C 1.什么IIC 2.IIC的主要特点 3.IIC协议数据传输过程 三.关于DHT20 1.概述 2.引脚参数 四.DHT20温湿度采集 1.程序代码分析 2.实验效 ...
- STM32基于SPI接口的OLED数据显示
文章目录 一.SPI简介 1.1 什么是SPI 1.2 SPI原理 1.3 SPI的连接方式 1.4 协议层 二.OLED 2.1 OLED原理 2.2 点阵编码原理与显示 三.OLED显示实验 3. ...
- 基于IIC和SPI协议的温湿度采集与OLED显示
前言 环境 KEIL:5.0 FIyMcu:V0.993 开发板:STM32F103C8T6 器件 AHT-20 温湿度传感器 0.96英寸OLED屏幕 任务1内容 学习I2C总线通信协议,使用STM ...
- stm32通过I2C实现温湿度(AHT20)采集
目录 一.I2C总线通信协议 1.1 I2C介绍 1.2 I2C物理层 1.3.I2C协议层 1.4.软件IIC和硬件IIC 1.5 IIC数据传送 1.6 IIC发送数据 1.7 IIC读数据: 二 ...
- I2C总线通信协议及实操stm32通过I2C实现温湿度(AHT20)采集
I2C总线通信协议及实操stm32通过I2C实现温湿度(AHT20)采集 一实验要求 二.12C总线通信协议 1.12C介绍 2.I2C物理层 3.I2C协议层 4.软件IIC和硬件IIC 三.STM ...
最新文章
- 文件控制块的三类信息
- Asp.net 性能监控之压测接口“卡住” 分析
- poj 2079(旋转卡壳)
- Windows的空格预览神器 | QuickLook
- ios学习:Xcode工具
- MySQL备份,恢复方案,mysqlbinlog,mysqldump,主从,主主复制
- 【密码学基础】05 有限域
- TCP 报文段首部格式讲解
- 中国交通标志检测数据集
- 马克思主义基本原理知识框架图——政治经济学中各种资本的划分
- 在项目中如何做图片优化
- 一文详解elasticsearch的索引生命周期管理—rollover+curator—ilm
- jsoup的简单实用兼谈一个简单的汇率查询(原创)
- 0.96OLED图标取模,包括信号图标,蓝牙图标,闹钟,电池
- 【Spring框架一】——Spring框架简介
- 《吃透 MQ 系列》之扒开 Kafka 的神秘面纱
- qLabel 字体大小不受控制
- iOS学习—iOS长按手势事件
- 724便利店系统完整项目及讲解
- 【设计模式】我终于读懂了观察者模式。。。
热门文章
- Novavax向美国提交新冠疫苗紧急使用授权申请;西门子医疗发布最新业绩 | 医药健闻...
- C++循环输出M * N 的螺旋矩阵
- 新加坡内推 | Motional新加坡分部招聘自动驾驶感知算法实习生
- 两个字符串首尾相连,查看是否相同
- YOLOV3 网络结构学习笔记
- 操作系统文件管理之FCB
- hadoop和spark HA部署
- opencv 图像上画出目标运动的轨迹_OpenCV视频分析-Meanshift、Camshift运动轨迹绘制...
- 【42】android Context深度剖析
- hadoop设置java环境_Hadoop环境安装设置