【平头哥RVB2601创意应用开发】+光照强度检测
[复制链接]
有了GPIO口的使用基础,除了可以驱动OLED屏之外,还可以用来驱动相应的数字式传感器,这里是对光照强度传感器进行驱动,并配合OLED屏的显示功能来实现光照强度检测,其显示效果如图1所示。
图1 显示效果
由于提供的电源引脚比较少,故光照强度传感器BH1750所用的引脚如图2所示,相应的对应关系为:
CLK---PA2
DIN---PA5
图2 引脚连接
相较于OLED屏的驱动,光照强度传感器的驱动要复杂些,它不但涉及引脚要以输出模式工作,有时还需要以输入模式工作,应适时地进行模式切换。
为此,对引脚输出高低电平及读取引脚状态的语句定义为:
#define SCL_Clr1() csi_gpio_pin_write(&clk, GPIO_PIN_LOW)
#define SCL_Set1() csi_gpio_pin_write(&clk, GPIO_PIN_HIGH)
#define SDA_Clr1() csi_gpio_pin_write(&din, GPIO_PIN_LOW)
#define SDA_Set1() csi_gpio_pin_write(&din, GPIO_PIN_HIGH)
#define IIC_SDA_IN1 csi_gpio_pin_read(&din)
相应的引脚工作模式配置函数为:
- void IIC_INPUT_MODE()
- {
- csi_gpio_pin_init(&din, PA5);
- csi_gpio_pin_dir(&din, GPIO_DIRECTION_INPUT);
- }
-
- void IIC_OUTPUT_MODE()
- {
- csi_gpio_pin_init(&din, PA5);
- csi_gpio_pin_dir(&din, GPIO_DIRECTION_OUTPUT);
- }
以GPIO口模拟I2C发送字节数据的函数为:
- void BH1750_SendByte(char data)
- {
- char i;
- IIC_OUTPUT_MODE();
- SCL_Clr1();
- udelay(2);
- for (i=0;i<8;i++)
- {
- if(data&0x80) SDA_Set1();
- else SDA_Clr1();
- data <<= 1;
- SCL_Set1();
- udelay(2);
- SCL_Clr1();
- udelay(2);
- }
- }
读取并显示检测值的函数为:
- void Get_Sunlight_Value()
- {
- int dis_data=0;
- float temp;
- unsigned int sd;
- Single_Write_BH1750(0x01);
- Single_Write_BH1750(0x10);
- udelay(1000 * 180);
- Multiple_Read_BH1750();
- dis_data=BUF[0];
- dis_data=(dis_data<<8)+BUF[1];
- temp=(float) dis_data/1.2;
- sd=temp;
- OLED_ShowNum(20,6,sd,5,16);
- }
实现图示显示效果的主程序为:
- int main(void)
- {
- csi_error_t ret;
- csi_rtc_time_t last_time, base_time, alarm_time;
- board_yoc_init();
- oled_pinmux_init();
- OLED_Init();
- OLED_Clear();
- OLED_ShowString(20,0,"CH2601",16);
- OLED_ShowString(20,2,"OLED & RTC",16);
- BH1750_Init();
- udelay(1000 * 1000);
- OLED_ShowString(20,2,"OLED & BH1750",16);
- OLED_ShowString(20,4,"Sunlight=",16);
- OLED_ShowString(68,6,"lx",16);
- while (1) {
- Get_Sunlight_Value();
- udelay(1000 * 1000);
- }
- }
由于电源引脚紧张,后面需要将显示任务交回给LCD屏,以便空出电源引脚来连接其它的外设。
|