[LKS32 硬件] 【LKS32MC081评测】+光强检测与OLED屏显示

[复制链接]
1542|8
 楼主| jinglixixi 发表于 2022-6-14 10:53 | 显示全部楼层 |阅读模式
本帖最后由 jinglixixi 于 2022-6-14 22:24 编辑

先前介绍了串行数码管模块的显示驱动,它比较适用于工控环境下。若在一般情况下,则使用OLED屏显示会较为合适。
当然,这里所说的OLED屏是I2C接口的显示屏,若使用SPI接口的显示屏,则会太消耗引脚资源。
相较于串行数码管模块的驱动,I2C接口的OLED屏其使用的引脚更少,显示的信息则更丰富,其显示效果如图1所示。
1.jpg
图1 显示效 果
该显示屏使用如图2所示,其引脚连接关系为:
CLK---P1.10
DIN---P1.11

2.jpg
图2 使用接口
对所用引脚的配置函数为:
  1. void oled_gpio_init(void)
  2. {
  3.     GPIO_InitTypeDef GPIO_InitStruct;
  4.     GPIO_StructInit(&GPIO_InitStruct);
  5.     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
  6.     GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
  7.     GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
  8.     GPIO_Init(GPIO1, &GPIO_InitStruct);
  9.     GPIO_StructInit(&GPIO_InitStruct);
  10.     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
  11.     GPIO_InitStruct.GPIO_Pin = GPIO_Pin_11;
  12.     GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
  13.     GPIO_Init(GPIO1, &GPIO_InitStruct);
  14. }

定义引脚输出高低电平输出的语句为:
#define OLED_SCLK_Clr()  GPIO_ResetBits(GPIO1, GPIO_Pin_10)
#define OLED_SCLK_Set()  GPIO_SetBits(GPIO1, GPIO_Pin_10)
#define OLED_SDIN_Clr()  GPIO_ResetBits(GPIO1, GPIO_Pin_11)
#define OLED_SDIN_Set()  GPIO_SetBits(GPIO1, GPIO_Pin_11)
以GPIO口模拟I2C发送字节数据的函数如下:
  1. void Write_IIC_Byte(unsigned char IIC_Byte)
  2. {
  3.     unsigned char i;
  4.     unsigned char m,da;
  5.     da=IIC_Byte;
  6.     OLED_SCLK_Clr();
  7.     for(i=0;i<8;i++)
  8.     {
  9.         m=da;
  10.         m=m&0x80;
  11.         if(m==0x80)
  12.         {
  13.             OLED_SDIN_Set();
  14.         }
  15.         else
  16.             OLED_SDIN_Clr();
  17.         Delayus(2);
  18.         da=da<<1;
  19.         OLED_SCLK_Set();
  20.         Delayus(2);
  21.         OLED_SCLK_Clr();
  22.         Delayus(2);
  23.      }
  24. }

实现屏幕清除的函数为:
  1. void OLED_Clear(void)
  2. {
  3.     uint8_t i,n;
  4.     for(i=0;i<8;i++)
  5.     {
  6.         OLED_WR_Byte(0xb0+i,OLED_CMD);
  7.         OLED_WR_Byte(0x00,OLED_CMD);
  8.         OLED_WR_Byte(0x10,OLED_CMD);
  9.         for(n=0;n<128;n++) OLED_WR_Byte(0,OLED_DATA);
  10.     }
  11. }

实现字符串显示的函数为:
  1. void OLED_ShowString(uint8_t x,uint8_t y,uint8_t *chr,uint8_t Char_Size)
  2. {
  3.     unsigned char j=0;
  4.     while (chr[j]!='\0')
  5.     {
  6.             OLED_ShowChar(x,y,chr[j],Char_Size);
  7.             x+=8;
  8.             if(x>120)
  9.             {
  10.                 x=0;
  11.                 y+=2;
  12.             }
  13.             j++;
  14.     }
  15. }

实现图1所示显示效果的主程序如下:
  1. int main(void)
  2. {
  3.   Hardware_init();
  4.   oled_gpio_init();
  5.   OLED_Init();
  6.   OLED_Clear();
  7.   OLED_ShowString(20,0,"LKS32MC081",16);
  8.   OLED_ShowString(20,2,"OLED TEST",16);
  9.   while (1);
  10. }

对于电机控制来讲,它离不开对外界的感知,从而来进行调控。因此,对各种传感器的使用也是十分普遍的。
就传感器的工作原理来讲,可将其分为3类,即数字式、脉冲类及模拟类。
对于模拟类的传感器,它要配合ADC数据采集来使用;对脉冲类传感器,则主要是依托MCU片内的相应定时/计数器;而对于数字式传感器来讲,它之需要GPIO口和延时函数就可实现数据的检测。
这里以数字式光照强度传感器为例来进行介绍,其传感器的型号为BH1750,是一款I2C接口的器件。
该器件所用的接口如图3所示,其引脚连接关系为:
CLK---P0.4
DIN---P0.14


3.jpg
图3 使用接口
由于光照强度传感器涉及数据的读写,因此在工作时要进行工作模式的转换,其模式的设置函数为:
  1. void IIC_INPUT_MODE_SET()
  2. {
  3.     GPIO_InitTypeDef GPIO_InitStruct;
  4.     GPIO_StructInit(&GPIO_InitStruct);
  5.     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
  6.     GPIO_InitStruct.GPIO_Pin = GPIO_Pin_14;
  7.     GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
  8.     GPIO_Init(GPIO0, &GPIO_InitStruct);
  9. }


  10. void IIC_OUTPUT_MODE_SET()
  11. {
  12.     GPIO_InitTypeDef GPIO_InitStruct;
  13.     GPIO_StructInit(&GPIO_InitStruct);
  14.     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
  15.     GPIO_InitStruct.GPIO_Pin = GPIO_Pin_14;
  16.     GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
  17.     GPIO_Init(GPIO0, &GPIO_InitStruct);
  18. }
4.jpg
图4 光照状态
5.jpg
图5 遮挡状态
读取与显示光照强度的函数为:
  1. void Get_Sunlight_Value()
  2. {
  3.     int dis_data=0;
  4.     float temp;
  5.     char i=0;
  6.     unsigned int sd;
  7.     Single_Write_BH1750(0x01);
  8.     Single_Write_BH1750(0x10);
  9.     delay(180);
  10.     Multiple_Read_BH1750();
  11.     for(i=0;i<3;i++)    dis_data=BUF[0];
  12.     dis_data=(dis_data<<8)+BUF[1];
  13.     temp=(float)dis_data/1.2;
  14.     sd=temp;
  15.     if(sd<54612) OLED_ShowNum(0,6,sd,5,16);
  16. }

实现所示检测效果的主程序如下:
  1. int main(void)
  2. {
  3.      u16 i;
  4.      Hardware_init();
  5.      GPIO_LED(ALL_OFF);
  6.      oled_gpio_init();
  7.      OLED_Init();
  8.      OLED_Clear();
  9.      OLED_ShowString(20,0,"LKS32MC081",16);
  10.      OLED_ShowString(20,2,"OLED TEST",16);
  11.      for(i=0;i<100;i++) delay(0xFFFF);
  12.      OLED_ShowString(20,2,"BH1750 TEST",16);
  13.      BH1750_Init();
  14.      for(i=0;i<100;i++) delay(0xFFFF);
  15.      OLED_ShowString(0,4,"Sunlight=",16);
  16.      OLED_ShowString(48,6,"lx",16);
  17.      while(1)
  18.     {
  19.           Get_Sunlight_Value();
  20.           for(i=0;i<100;i++) delay(0xFFFF);
  21.     }
  22. }

将光照强度的检测与计时和电机控制功能相结合,就可以完成一个光控的电动窗帘。

updownq 发表于 2022-6-20 15:32 | 显示全部楼层
OLED屏刷新速度怎么样  
biechedan 发表于 2022-6-20 16:18 | 显示全部楼层
可以使用光敏测试  
gouguoccc 发表于 2022-6-20 19:22 来自手机 | 显示全部楼层
这个光照强度检测准不准?
tail066 发表于 2022-6-21 21:50 | 显示全部楼层
感觉楼主对显示的应用很棒
 楼主| jinglixixi 发表于 2022-6-22 09:55 | 显示全部楼层
tail066 发表于 2022-6-21 21:50
感觉楼主对显示的应用很棒

哈哈,岂敢岂敢。
match007 发表于 2022-6-22 21:01 | 显示全部楼层
光强是怎么监测的,那个小板板某宝的?
 楼主| jinglixixi 发表于 2022-6-23 09:07 | 显示全部楼层
match007 发表于 2022-6-22 21:01
光强是怎么监测的,那个小板板某宝的?

通过窗口采集光线,可读取到数据值(单位为勒克斯LX),某宝可买到。
呐咯密密 发表于 2022-6-23 16:15 | 显示全部楼层
又没有试试硬件I2C好用不
您需要登录后才可以回帖 登录 | 注册

本版积分规则

521

主题

2949

帖子

39

粉丝
快速回复 在线客服 返回列表 返回顶部