STM32
直播中

张虎豹

7年用户 1583经验值
私信 关注
[问答]

怎样使用SPI通信的OLED屏幕去显示AHT20测试的温湿度呢

OLED显示模块有何特点呢?

怎样使用SPI通信的OLED屏幕去显示AHT20测试的温湿度呢?

回帖(1)

h1654155275.5782

2021-12-1 14:27:01
本文使用SPI 通信的OLED屏幕,芯片使用的是STM32F103ZET6。OLED模块整体来说比较简单,就是加字模,调函数的过程。初学者可以好好看看里面包含的函数,还是很有趣的。
  OLED 屏幕

  OLED,即有机发光二极管。OLED由于同时具备自发光,不需要光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一代的平面显示技术。
  LCD都需要背光,而 OLED 不需要,因为它是自发光的。这样同样的显示, OLED 效果要
来得好一些。 以目前的技术, OLED 的尺寸 还难以大型化,但是分辨率确可以做 到很高。在本章中 ,我们使用的是 ALINETEK 的 OLED 显示模块;
  该模块有以下特点:
  

  • 模块有单色和双色两种可选,单色为 纯蓝色 ,而双色则为黄蓝双色。
  • 尺寸小,显示尺寸为 0.96 寸,而模块的尺寸仅为 27mm*26mm 大小。
  • 高分辨率,该模块的分辨率为 128*64 。
  • 多种接口方式,该模块提供了总共 5 种接口包括: 6800 、 8080 两种并行接口方式、3
    线或 4 线的穿行 SPI 接口方式, IIC 接口方式(只需要 2 根线就可以控制 OLED 了!)。
  • 不需要高压,直接接 3.3V 就可以工作了。

  


  • 本文使用的是7线0.96寸SPI的OLED模块。
  • 芯片:STM32F103ZET6(正点原子)


引脚连接:
  [tr]OLEDSTM32[/tr]
VCC3V3 或 5V
D0PD6(SCL)
D1PD7(SDA)
RESPD4
DCPD5
CSPD3
其中,CS 可以不用连接。
  实验目标

  


  • 显示自己的学号和姓名
  • 显示AHT20的温度和湿度
  • 上下或左右的滑动显示长字符,比如“Hello,欢迎来到重庆交通大学物联网205实训室!”

  
显示字符串函数
  需要找一个OLED的例程,在例程里进行修改。(一般商家会提供例程)
  学号显示可以使用显示字符串的函数,姓名则需要显示汉字的函数。
注意:显示汉字时,需要将汉字的点阵(利用软件生成点阵)放到存放点阵的文件中。

  

  

  代码分析1

void OLED_ShowString(u8 x,u8 y,u8 *chr)
{
        unsigned char j=0;
        while (chr[j]!='')
        {                OLED_ShowChar(x,y,chr[j]);
                        x+=8;
                if(x>120){x=0;y+=2;}
                        j++;
        }
}
例:OLED_ShowString(32,0,"********");
其中x,y是定义显示的位置,chr代表字符串。将收到的字符串存入字符数组中,按字符的方式输出。
  
显示汉字函数

void OLED_ShowCHinese(u8 x,u8 y,u8 no)
{                                  
        u8 t,adder=0;
        OLED_Set_Pos(x,y);       
    for(t=0;t<16;t++)
                {
                                OLED_WR_Byte(Hzk[2*no][t],OLED_DATA);
                                adder+=1;
     }       
                OLED_Set_Pos(x,y+1);       
    for(t=0;t<16;t++)
                        {       
                                OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA);
                                adder+=1;
      }                                       
}
   例:OLED_ShowCHinese(16,0,1);
其中的x,y依然定义显示的位置,后面的no表示你存入字模的数组下标。
  
  
显示数字函数
  用OLED 显示AHT20 测试的温湿度,就需要将AHT20 的模块加入到工程中。
然后,将AHT20中的主函数也移植到工程的主函数中,注意重定义问题。
由于显示温湿度是使用的数字显示,所以就需要使用到显示数字的函数。
  代码分析2

void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size)
{                
        u8 t,temp;
        u8 enshow=0;                                                  
        for(t=0;t         {
                temp=(num/oled_pow(10,len-t-1))%10;
                if(enshow==0&&t<(len-1))
                {
                        if(temp==0)
                        {
                                OLED_ShowChar(x+(size/2)*t,y,' ');
                                continue;
                        }else enshow=1;
                          
                }
                 OLED_ShowChar(x+(size/2)*t,y,temp+'0');
        }
}
   例:OLED_ShowNum(48,2,c1,2,16);
其中x,y的含义和上面是相同的,num表示数字或者变量的值,len表示显示数字的位数,size表示显示数字的字体大小。
从函数中可以看出来,显示数字也是按照显示字符的方式来显示的。
  
  实验结果
添加所需要用到的字模到字模文件中去,依次调用其中的文字,然后利用编程进行循环显示即可。
  主函数


#include "delay.h"
#include "sys.h"
#include "oled.h"
#include "led.h"
#include "AHT20.h"
#include "myiic.h"
#include "usart.h"
int32_t main(void)
{
uint32_t CT_data[2];
        volatile int  c1,t1;
        int i,j;
        SensorDelay_us(40000);//刚上电,延时40ms才可以读取状态
        delay_init();
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
    uart_init(115200);         //串口初始化为115200
        delay_ms(40);//刚上电,延时40ms才可以读取状态
        if(!((AHT20_Read_Status()&0x08)==0x08))//首先发0x71读取状态字bit[3],如果=1,为校准输出,无须初始化!!!    正常情况下读回来的状态是0x1C或者是0x18,读回来是0x80表示忙状态;
        {
        AHT20_Init(); //初始化AHT20
        }
        OLED_Init();                        //初始化OLED  
        OLED_Clear();
        while(1)
        {
                OLED_ShowCHinese(0,0,0);
                OLED_ShowCHinese(16,0,1);
                OLED_ShowString(32,0,"********");
                delay_ms(5000);
         AHT20_Read_CTdata(CT_data);       //不经过CRC校验,直接读取AHT20的温度和湿度数据    推荐每隔大于1S读一次
     c1 = CT_data[0]*100*10/1024/1024;  //计算得到湿度值(放大了10倍)
         t1 = CT_data[1]*200*10/1024/1024-500;//计算得到温度值(放大了10倍)
                c1=c1/10;
                t1=t1/10;
                printf("湿度:%d",c1);
                printf("温度:%dn",t1);
                delay_ms(5000);
                OLED_ShowCHinese(0,2,3);//湿
                OLED_ShowCHinese(16,2,4);//度
                OLED_ShowCHinese(32,2,5);//:
                OLED_ShowNum(48,2,c1,2,16);//温度显示
                OLED_ShowChar(62,2,'%');
                OLED_ShowCHinese(0,4,2);//温
                OLED_ShowCHinese(16,4,4);//度
                OLED_ShowCHinese(32,4,5);//:
                OLED_ShowNum(48,4,t1,2,16);//湿度显示
                OLED_ShowChar(62,4,'C');
               
                //你好,欢迎来到重庆交通大学物联网实验室
                for(i=0;i<12;i++)
                {
                        OLED_ShowCHinese(0,6,6+i);//你
                        OLED_ShowCHinese(16,6,7+i);//好
                        OLED_ShowCHinese(32,6,8+i);//,
                        OLED_ShowCHinese(48,6,9+i);//欢
                        OLED_ShowCHinese(64,6,10+i);//迎
                        OLED_ShowCHinese(80,6,11+i);//来
                        OLED_ShowCHinese(96,6,12+i);//到
                        OLED_ShowCHinese(112,6,13+i);//重
                        if(i==11)
                        {
                                i=0;
                                delay_ms(5000);
                                for(j=0;j<8;j++)
                                {
                                        OLED_ShowCHinese(112,6,6+j);
                                        OLED_ShowCHinese(112,6,7+j);
                                        OLED_ShowCHinese(112,6,8+j);
                                        OLED_ShowCHinese(112,6,9+j);
                                        OLED_ShowCHinese(112,6,10+j);
                                        OLED_ShowCHinese(112,6,11+j);
                                        OLED_ShowCHinese(112,6,12+j);
                                        OLED_ShowCHinese(112,6,13+j);
                                }
                        }
                        delay_ms(5000);
                }
         }
}
  总结


   OLED显示就是调用OLED里面的函数,然后在屏幕中进行显示的过程。一般用来显示字符、字符串、汉字以及一些小一点的图片也是能显示的。文字的显示都是有对应的点阵的,才能够进行显示。
了解OLED的使用就是对OLED调用函数的了解,请大佬指导纠错。
  
举报

更多回帖

发帖
×
20
完善资料,
赚取积分