jinglixixi 发表于 2022-5-12 10:00

【平头哥RVB2601创意应用开发】+光照强度检测

<p align="left" style="text-align:left">有了GPIO口的使用基础,除了可以驱动OLED屏之外,还可以用来驱动相应的数字式传感器,这里是对光照强度传感器进行驱动,并配合OLED屏的显示功能来实现光照强度检测,其显示效果如图1所示。</p>

<p> &nbsp;</p>

<p>图1 显示效果</p>

<p>由于提供的电源引脚比较少,故光照强度传感器BH1750所用的引脚如图2所示,相应的对应关系为:</p>

<p>CLK---PA2</p>

<p>DIN---PA5</p>

<p> &nbsp;</p>

<p>图2 引脚连接</p>

<p>&nbsp;</p>

<p>相较于OLED屏的驱动,光照强度传感器的驱动要复杂些,它不但涉及引脚要以输出模式工作,有时还需要以输入模式工作,应适时地进行模式切换。</p>

<p>为此,对引脚输出高低电平及读取引脚状态的语句定义为:</p>

<p>#define SCL_Clr1()&nbsp; &nbsp; &nbsp; &nbsp;csi_gpio_pin_write(&amp;clk, GPIO_PIN_LOW)</p>

<p>#define SCL_Set1()&nbsp; &nbsp; &nbsp; csi_gpio_pin_write(&amp;clk, GPIO_PIN_HIGH)</p>

<p>#define SDA_Clr1()&nbsp; &nbsp; &nbsp; &nbsp;csi_gpio_pin_write(&amp;din, GPIO_PIN_LOW)</p>

<p>#define SDA_Set1()&nbsp; &nbsp; &nbsp; csi_gpio_pin_write(&amp;din, GPIO_PIN_HIGH)</p>

<p>#define IIC_SDA_IN1&nbsp;&nbsp;&nbsp; csi_gpio_pin_read(&amp;din)</p>

<p>相应的引脚工作模式配置函数为:</p>

<pre>
<code class="language-cpp">void IIC_INPUT_MODE()
{
    csi_gpio_pin_init(&amp;din, PA5);
    csi_gpio_pin_dir(&amp;din, GPIO_DIRECTION_INPUT);
}

void IIC_OUTPUT_MODE()
{
    csi_gpio_pin_init(&amp;din, PA5);
    csi_gpio_pin_dir(&amp;din, GPIO_DIRECTION_OUTPUT);
}</code></pre>

<p>&nbsp;</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&lt;8;i++)
    {
        if(data&amp;0x80) SDA_Set1();
        else SDA_Clr1();
        data &lt;&lt;= 1;
        SCL_Set1();
        udelay(2);
        SCL_Clr1();
        udelay(2);
    }
}</code></pre>

<p>&nbsp;</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&lt;&lt;8)+BUF;
    temp=(float) dis_data/1.2;
    sd=temp;
    OLED_ShowNum(20,6,sd,5,16);
}</code></pre>

<p>&nbsp;</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 &amp; RTC",16);
    BH1750_Init();
    udelay(1000 * 1000);
    OLED_ShowString(20,2,"OLED &amp; 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>&nbsp;</p>

<p>由于电源引脚紧张,后面需要将显示任务交回给LCD屏,以便空出电源引脚来连接其它的外设。</p>

<p style="text-align:justify">&nbsp;</p>

lugl4313820 发表于 2022-5-13 20:16

我也有这种想法,可是不想折腾,SPI可以空出很多IO。

jinglixixi 发表于 2022-5-14 08:36

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]
查看完整版本: 【平头哥RVB2601创意应用开发】+光照强度检测