基于I2C/SPI的温湿度采集与OLED显示
嵌入式第10-11周作业
一. (简答题)
1. 学习I2C总线通信协议,使用STM32F103完成基于I2C协议的AHT20温湿度传感器的数据采集,并将采集的温度-湿度值通过串口输出。具体任务:
1)解释什么是“软件I2C”和“硬件I2C”? (阅读野火配套教材的第23章“I2C–读写EEPROM”原理章节)
2)阅读AHT20数据手册,编程实现:每隔2秒钟采集一次温湿度数据,并通过串口发送到上位机(win10)。
参考:
1. stm32通过I2C接口实现温湿度(AHT20)的采集
2. 奥松AHT20传感器厂商资料
AHT20产品手册a2.pdf
2. 理解OLED屏显和汉字点阵编码原理,使用STM32F103的SPI或IIC接口实现以下功能:
1) 显示自己的学号和姓名;
2) 显示AHT20的温度和湿度;
3) 上下或左右的滑动显示长字符,比如“Hello,欢迎来到重庆交通大学物联网205实训室!”或者一段歌词或诗词(最好使用硬件刷屏模式)。
目录
一、I2C总线通信协议
1.I2C协议简介
I2C 通讯协议(Inter-Integrated Circuit)是由Phiilps公司开发的,由于它引脚少,硬件实现简单,可扩展性强,不需要USART、CAN等通讯协议的外部收发设备,现在被广泛地使用在系统内多个集成电路(IC)间的通讯。
2.什么是“软件I2C”和“硬件I2C”
- 硬件I2C对应芯片上的I2C外设,没有相应I2C驱动电路,其所使用的的I2C管脚也是专用的,其效率远高于软件I2C;硬件I2C一般也较为稳定,但是程序更繁琐,硬件I2C是直接调用寄存器的
- 软件I2C一般是使用GPIO管脚,用软件控制管脚状态以模拟I2C通信波形,模拟I2C协议的时序。
3.硬件II2C和软件I2C有什么区别
所谓硬件I2C对应芯片上的I2C外设,有相应I2C驱动电路,其所使用的I2C管脚也是专用的;软件I2C一般是用GPIO管脚,用软件控制管脚状态以模拟I2C通信波形。
硬件I2C的效率要远高于软件的,而软件I2C由于不受管脚限制,接口比较灵活。
模拟I2C 是通过GPIO,软件模拟寄存器的工作方式,而硬件(固件)I2C是直接调用内部寄存器进行配置。如果要从具体硬件上来看,可以去看下芯片手册。因为固件I2C的端口是固定的,所以会有所区别。
如何区分它们
-
可以看底层配置,比如IO口配置,如果配置了IO口的功能(IIC功能)那就是固件IIC,否则就是模拟
-
可以看IIC写函数,看里面有木有调用现成的函数或者给某个寄存器赋值,如果有,则肯定是固件IIC功能,没有的话肯定是数据一个bit一个bit模拟发生送的,肯定用到了循环,则为模拟。
-
根据代码量判断,模拟的代码量肯定比固件的要大。
-
硬件IIC用法比较复杂,模拟IIC的流程更清楚一些。
-
硬件IIC速度比模拟快,并且可以用DMA
-
模拟IIC可以在任何管脚上,而硬件只能在固定管脚上。
软件i2c是程序员使用程序控制SCL,SDA线输出高低电平,模拟i2c协议的时序。一般较硬件i2c稳定,但是程序较为繁琐,但不难。
硬件i2c程序员只要调用i2c的控制函数即可,不用直接的去控制SCL,SDA高低电平的输出。但是有些单片机的硬件i2c不太稳定,调试问题较多。
二、温湿度传感器的数据采集并通过串口输出
源文件:
链接:https://pan.baidu.com/s/1uPcNv1gWT2zi0AOEWCPyjg
提取码:2817
烧录
手握上去温度升高:
三、OLED屏显和点阵编码原理
1.OLED的定义和优势
OLED,即有机发光二极管(Organic Light-Emitting Diode),又称为有机电激光显示(Organic Electroluminesence Display, OELD)。OLED由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一代的平面显示器新兴应用技术。OLED显示技术具有自发光的特性,采用非常薄的有机材料涂层和玻璃基板,当有电流通过时,这些有机材料就会发光,而且OLED显示屏幕可视角度大,并且能够节省电能。
2.OLED模块显存已经显示原理
OLED本身是没有显存的,它的显存是依赖于SSD1306提供的(之后讲解的TFTLCD是本身自带显存,利用FSMC来进行控制)。而SSD1306提供一块显存,芯片具体的讲解见下文。SSD1306的显存总共为12864bit大小,SSD1306将这些显存分为了8页。每页包含了128个字节,总共8页,这样刚好是12864的点阵大小。
- 在STM32的内部建立一个缓存(共128*8个字节),在每次修改的时候,只是修改STM32上的缓存(实际上就是SRAM),在修改完了之后,一次性把STM32上的缓存数据写入到OLED的GRAM。
3.点阵编码原理
上一篇博客有定义过点阵汉字的字模读取与显示
4.SPI协议
SPI是串行外设接口(Serial Peripheral Interface)的缩写,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,越来越多的芯片集成了这种通信协议.
四、OLED屏显示例
1.显示姓名学号
-
根据厂商提供的资料和程序
0.96inch SPI OLED Module
0.96寸SPI_OLED模块配套资料包将显示屏和板子连接 -
将名字进行汉字取模
使用软件进行汉字取模 -
将得到的存储代码放到gui.c下的oledfont.h的16*16处
在字符串前加上文字 不然会无法识别
0x10,0x00,0x11,0xF8,0x10,0x10,0x10,0x20,0xFC,0x40,0x10,0x80,0x31,0xFE,0x38,0x92,
0x54,0x92,0x54,0x92,0x91,0x12,0x11,0x22,0x12,0x22,0x14,0x42,0x10,0x94,0x11,0x08,
0x40,0x00,0x4D,0xFE,0x70,0x20,0x44,0x40,0x45,0xFC,0x3D,0x04,0x01,0x24,0x0D,0x24,
0x71,0x24,0x11,0x24,0xFF,0x24,0x11,0x44,0x38,0x50,0x54,0x88,0x91,0x04,0x12,0x02,
- 实现显示代码
void TEST_MainPage(void)
{
GUI_ShowCHinese(28,20,16,"杨颖",1);
//GUI_ShowString(40,32,"64X128",16,1);
GUI_ShowString(4,48,"631907060126",16,1);
//GUI_ShowString(4,48,"www.lcdwiki.com",16,1);
delay_ms(1500);
delay_ms(1500);
}
- main函数
int main(void)
{
delay_init(); //延时函数初始化
OLED_Init(); //初始化OLED
OLED_Clear(0); //清屏(全黑)
while(1)
{
TEST_MainPage(); //界面显示
}
}
- 结果
2.滚动显示
- 水平左右移
OLED_WR_Byte(0x2E,OLED_CMD); //关闭滚动
OLED_WR_Byte(0x26,OLED_CMD); //水平向左或者右滚动 26/27
OLED_WR_Byte(0x00,OLED_CMD); //虚拟字节
OLED_WR_Byte(0x00,OLED_CMD); //起始页 0
OLED_WR_Byte(0x07,OLED_CMD); //滚动时间间隔
OLED_WR_Byte