OLED滚动显示及温湿度检测

文章目录

一、I2C介绍

1、IC2简介

I2C 通讯协议 (Inter - Integrated Circuit) 是由 Phiilps 公司开发的,它具有引脚少,硬件实现简单,可扩展性强,不需要 USART、CAN 等通讯协议的外部收发设备的优点。

I2C在通讯设备上的连接方式如图:
OLED滚动显示及温湿度检测
从图中就可看出,它仅需要两根线即可进行连接在总线上的器件之间的数据传输。

2、工作原理

SDA(串行数据线)SCL(串行时钟线)都是双向I/O线,接口电路为开漏输出.需通过上拉电阻接电源VCC.当总线空闲时.两根线都是高电平,连接总线的外同器件都是CMOS器件,输出级也是开漏电路.在总线上消耗的电流很小,因此,总线上扩展的器件数量主要由电容负载来决定,因为每个器件的总线接口都有一定的等效电容.而线路中电容会影响总线传输速度.当电容过大时,有可能造成传输错误.所以,其负载能力为400pF,因此可以估算出总线允许长度和所接器件数量。
主器件用于启动总线传送数据,并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件.在总线上主和从、发和收的关系不是恒定的,而取决于此时数据传送方向。如果主机要发送数据给从器件,则主机首先寻址从器件,然后主动发送数据至从器件,最后由主机终止数据传送;如果主机要接收从器件的数据,首先由主器件寻址从器件.然后主机接收从器件发送的数据,最后由主机终止接收过程。在这种情况下.主机负责产生定时时钟和终止数据传送。

3、软件I2C与硬件I2C

简单的来说硬件I2C即是对应芯片上的I2C外设,有相应的I2C驱动电路,其管脚也是专用的。程序员只需要调用I2C的控制函数即可,不用直接的去控制SCL与SDA的电平输出。
而软件I2C,是用软件来控制GPIO管脚状态进行模拟I2C通信波形。即程序员用程序来控制SCL与SDA线的高低电平状态,模拟I2C时序的协议。
如何区分它们:

  • 可以看底层配置,比如IO口配置,如果配置了IO口的功能(IIC功能)那就是固件IIC,否则就是模拟
  • 可以看IIC写函数,看里面有木有调用现成的函数或者给某个寄存器赋值,如果有,则肯定是固件IIC功能,没有的话肯定是数据一个bit一个bit模拟发生送的,肯定用到了循环,则为模拟。
  • 根据代码量判断,模拟的代码量肯定比固件的要大。
  • 硬件IIC用法比较复杂,模拟IIC的流程更清楚一些。
  • 硬件IIC速度比模拟快,并且可以用DMA
  • 模拟IIC可以在任何管脚上,而硬件只能在固定管脚上。

二、监测温湿度并返回上位机。

1、过程与准备

1.需要准备:

  • 实现该次实验需要一个AHT20温度传感器。
  • 一个stm32的最小开发板
  • 若干杜邦线
  • Keil5软件

2.AHT20芯片使用代码
AHT20使用过程

void  read_AHT20_once(void)
{
	delay_ms(10);

	reset_AHT20();//重置AHT20芯片
	delay_ms(10);

	init_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");
}

AHT20引脚定义

#define SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}
#define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}
 
	 
#define IIC_SCL    PBout(6) 
#define IIC_SDA    PBout(7)  
#define READ_SDA   PBin(7)

3.AHT20接线方法

VCC——3.3V
GND——GND
SCL——PB6
SDA——PB7

2、结果展示

OLED滚动显示及温湿度检测
图片上显示室内温度为22.5,湿度59.1%。当用手抓住传感器时,温度逐渐上升。

三、OLED灯的使用

1、使用PCtoLCD2002提取字模

a.软件可以在网上搜索下载安装即可,很简单。
b.为了始编译之后在OLED显示屏上汉字显示正确,需对软件进行如下设置。
点击软件中的选项后,进行如下设置
OLED滚动显示及温湿度检测
c.关于软件的使用
OLED滚动显示及温湿度检测
红框处输入自己想要的汉字,左边选择生成字模即可。下方的内容即为生成的字模,直接复制粘贴即可。

2、代码显示姓名

1.完整代码
2.相关修改
将上述的字模放入oledfont.h文件里的指定位置如下:
OLED滚动显示及温湿度检测
这里字模就设置好了,然后设置需要显示的文字,在test.c文件里,如下:
OLED滚动显示及温湿度检测
这里的文字都需要取字模然后在程序里写好才能用。
到了这里其实编译烧录就能成了。
然后介绍其中的一些参数意思

  • GUI_ShowString中,前面0,16分别表示X坐标与Y坐标。引号中类容表示显示的内容(这个函数仅能使用字符),后面的16,1分别表示字符显示格式和显示样式(1:白字黑底,0:黑子白底)
  • CUI_ShowChinese中,前面两个还是坐标,第三个为汉字点阵大小,然后是要显示的汉字,最后是显示格式(同上)。
    3.OLED连接方法。
    OLED滚动显示及温湿度检测

3、效果展示

OLED滚动显示及温湿度检测

四、总结

看着还是挺有成就感的,虽然自己只是做了很小很小的改动。但怎么来说终于是看到了代码的效果了。不像以前总是仿真,感觉都是虚的。虽然说是学,但是感觉这些协议看是看了,但就是看不懂。工程还是很大的,但我也主要是只看了那几个代码。整个工程还有很大的研究价值,可以继续研究。

完整代码:
链接:https://pan.baidu.com/s/1brOj8G_eJVAxk21IVe3ofg
提取码:4455

参考链接:
https://blog.csdn.net/ssj925319/article/details/111588662
https://blog.csdn.net/qq_43279579/article/details/111597278

上一篇:STM32F030开发日志之I2C


下一篇:STC8H开发(七): I2C驱动MPU6050三轴加速度+三轴角速度检测模块