【平头哥RVB2601创意应用开发】+光照强度检测
<p align="left" style="text-align:left">有了GPIO口的使用基础,除了可以驱动OLED屏之外,还可以用来驱动相应的数字式传感器,这里是对光照强度传感器进行驱动,并配合OLED屏的显示功能来实现光照强度检测,其显示效果如图1所示。</p><p> </p>
<p>图1 显示效果</p>
<p>由于提供的电源引脚比较少,故光照强度传感器BH1750所用的引脚如图2所示,相应的对应关系为:</p>
<p>CLK---PA2</p>
<p>DIN---PA5</p>
<p> </p>
<p>图2 引脚连接</p>
<p> </p>
<p>相较于OLED屏的驱动,光照强度传感器的驱动要复杂些,它不但涉及引脚要以输出模式工作,有时还需要以输入模式工作,应适时地进行模式切换。</p>
<p>为此,对引脚输出高低电平及读取引脚状态的语句定义为:</p>
<p>#define SCL_Clr1() csi_gpio_pin_write(&clk, GPIO_PIN_LOW)</p>
<p>#define SCL_Set1() csi_gpio_pin_write(&clk, GPIO_PIN_HIGH)</p>
<p>#define SDA_Clr1() csi_gpio_pin_write(&din, GPIO_PIN_LOW)</p>
<p>#define SDA_Set1() csi_gpio_pin_write(&din, GPIO_PIN_HIGH)</p>
<p>#define IIC_SDA_IN1 csi_gpio_pin_read(&din)</p>
<p>相应的引脚工作模式配置函数为:</p>
<pre>
<code class="language-cpp">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);
}</code></pre>
<p> </p>
<p>以GPIO口模拟I2C发送字节数据的函数为:</p>
<pre>
<code class="language-cpp">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);
}
}</code></pre>
<p> </p>
<p>读取并显示检测值的函数为:</p>
<pre>
<code class="language-cpp">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;
dis_data=(dis_data<<8)+BUF;
temp=(float) dis_data/1.2;
sd=temp;
OLED_ShowNum(20,6,sd,5,16);
}</code></pre>
<p> </p>
<p>实现图示显示效果的主程序为:</p>
<pre>
<code class="language-cpp">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);
}
}</code></pre>
<p> </p>
<p>由于电源引脚紧张,后面需要将显示任务交回给LCD屏,以便空出电源引脚来连接其它的外设。</p>
<p style="text-align:justify"> </p>
我也有这种想法,可是不想折腾,SPI可以空出很多IO。 lugl4313820 发表于 2022-5-13 20:16
我也有这种想法,可是不想折腾,SPI可以空出很多IO。
<p><img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/handshake.gif" width="48" /></p>
页:
[1]