基于I2C/SPI的温湿度采集与OLED显示

基于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实训室!”或者一段歌词或诗词(最好使用硬件刷屏模式)。

参考:
基于STM32的0.96寸OLED显示屏显示数据



一、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.显示姓名学号

  1. 根据厂商提供的资料和程序
    0.96inch SPI OLED Module
    0.96寸SPI_OLED模块配套资料包将显示屏和板子连接

  2. 将名字进行汉字取模
    使用软件进行汉字取模

  3. 将得到的存储代码放到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,
  1. 实现显示代码
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);
}
  1. main函数
int main(void)
{
   	
	delay_init();	    	       //延时函数初始化	  
	OLED_Init();			         //初始化OLED  
	OLED_Clear(0);             //清屏(全黑)
	while(1) 
	{
   	
		TEST_MainPage();         //界面显示
	}
}
  1. 结果
    请添加图片描述

2.滚动显示

  1. 水平左右移
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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值