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

本文详细介绍了如何使用STM32单片机通过I2C协议与AHT20传感器通信,每隔2秒采集温湿度数据,并在OLED屏幕上显示。同时讲解了I2C协议、OLED屏显和汉字点阵编码的原理。通过编程实现了温湿度数据显示、屏幕滚动功能,并提供了代码参考。
摘要由CSDN通过智能技术生成

目录

一、 学习I2C总线通信协议

二、理解OLED屏显和汉字点阵编码原理

三、总结


一、 学习I2C总线通信协议


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

 协议层:

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

1.软件I2C
为了使工程更加有条理,我们把读写EEPROM相关的代码独立分开存储,方便以后移植。在“工程模板”之上新建“bsp_i2c_ee.c”及“bsp_i2c_ee.h”文件,这些文件也可根据您的喜好命名,它们不属于STM32 HAL库的内容,是由我们自己根据应用需要编写的。

编程要点

(1) 配置通讯使用的目标引脚为开漏模式;

(2) 使能I2C外设的时钟;

(3) 配置I2C外设的模式、地址、速率等参数并使能I2C外设;

(4) 编写基本I2C按字节收发的函数;

(5) 编写读写EEPROM存储内容的函数;

(6) 编写测试程序,对读写数据进行校验。

2.硬件I2C


 3.阅读AHT20数据手册,编程实现:每隔2秒钟采集一次温湿度数据,并通过串口发送到上位机(win10)
代码下载看文献第二个博客

AHT20芯片的使用过程,下载好后参考位置

二、理解OLED屏显和汉字点阵编码原理

 
1.显示自己的学号和姓名;
程序请看文献第三个博客

三个主要函数,可以修改输出想要的、

 

看结果

 2.显示AHT20的温度和湿度;
选择上面的两个程序,将第二个工程以下文件放在第一个工程这个文件下,除了sys.c,sys.h,usart.c,usart.h

 加入到工程里面

修改

 

 上面程序代码

void read_AHT20(void)
{
    uint8_t   i;
    for(i=0; i<6; i++)
    {
        readByte[i]=0;
    }
 
    //-------------
    I2C_Start();
 
    I2C_WriteByte(0x71);
    ack_status = Receive_ACK();
    readByte[0]= I2C_ReadByte();
    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();
 
    //--------------
    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("lyy");
 
    }
    printf("\r\n");
    
    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");
    t=T1/10;
    t1=T1%10;
    a=(float)(t+t1*0.1);
    h=H1/10;
    h1=H1%10;
    b=(float)(h+h1*0.1);
    sprintf(strTemp,"%.1f",a);   //调用Sprintf函数把DHT11的温度数据格式化到字符串数组变量strTemp中  
  sprintf(strHumi,"%.1f",b);    //调用Sprintf函数把DHT11的湿度数据格式化到字符串数组变量strHumi中  
    //printf(strTemp);
    //printf("/r/n");
    GUI_ShowCHinese(16,00,16,"温湿度显示",1);
    GUI_ShowCHinese(16,20,16,"温度",1);
    GUI_ShowString(53,20,strTemp,16,1);
    GUI_ShowCHinese(16,38,16,"湿度",1);
    GUI_ShowString(53,38,strHumi,16,1);
    delay_ms(1500);        
    delay_ms(1500);
    delay_ms(1500);
    delay_ms(1500);
    
}
 

 结果

3.上下或左右的滑动显示长字符,比如“Hello,欢迎来到重庆交通大学物联网205实训室!”或者一段歌词或诗词(最好使用硬件刷屏模式)。

在第二个工程的基础上修改

 

 结果

 所有代码,找不到可以参考文献博客

链接: https://pan.baidu.com/s/12T1pvoM6YUXnz_oInsYc9g 提取码: 4597

三、总结


这次试验收获很大,学习了很多新的知识,融会贯通了旧知识,加强了动手能力综合素质。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值