jinglixixi 发表于 2021-5-23 01:00

【AT32F421测评】+ BH1750温湿度检测

<p style="text-align:justify">BH1750是一种数字式光强度传感器,它采用I2C接口方式工作,故较为节省GPIO口资源。将它与OLED屏组合在一起即可形成一个小巧而便捷的光强度检测装置,其运行效果如下图所示。</p>

<p></p>

<p>光强检测效果</p>

<p>&nbsp;</p>

<p>BH1750与MCU的连接关系为:</p>

<p>SCL---PB10</p>

<p>SDA---PB11</p>

<p>定义相关引脚输出高低电平的引脚为:</p>

<p>#define SCL_Set()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GPIOB-&gt;BSRE =GPIO_Pins_10</p>

<p>#define SCL_Clr()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; GPIOB-&gt;BRE =GPIO_Pins_10</p>

<p>#define SDA_Set()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GPIOB-&gt;BSRE =GPIO_Pins_11</p>

<p>#define SDA_Clr()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GPIOB-&gt;BRE =GPIO_Pins_11</p>

<p>定义SDA引脚位读取的定义语句为:</p>

<p>#define IIC_SDA_IN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;GPIO_ReadInputDataBit(GPIOB, GPIO_Pins_11)</p>

<p>配置SDA引脚为输入功能的函数为:</p>

<pre>
<code class="language-cpp">void IIC_INPUT_MODE_SET()
{
   GPIO_InitType GPIO_InitStructure;
   RCC_AHBPeriphClockCmd(RCC_AHBPERIPH_GPIOB, ENABLE);
   GPIO_StructInit(&amp;GPIO_InitStructure);
   GPIO_InitStructure.GPIO_Pins = GPIO_Pins_11;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
   GPIO_InitStructure.GPIO_Pull = GPIO_Pull_PU;
   GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;
   GPIO_Init(GPIOB, &amp;GPIO_InitStructure);
}</code></pre>

<p>配置SDA引脚为输出功能的函数为:</p>

<pre>
<code class="language-cpp">void IIC_OUTPUT_MODE_SET()
{
   GPIO_InitType GPIO_InitStructure;
   RCC_AHBPeriphClockCmd(RCC_AHBPERIPH_GPIOB, ENABLE);
   GPIO_StructInit(&amp;GPIO_InitStructure);
   GPIO_InitStructure.GPIO_Pins = GPIO_Pins_11;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
   GPIO_InitStructure.GPIO_OutType = GPIO_OutType_PP;
   GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;
   GPIO_Init(GPIOB, &amp;GPIO_InitStructure);
}</code></pre>

<p>BH1750的启动函数为:</p>

<pre>
<code class="language-cpp">void BH1750_Start()
{
      IIC_OUTPUT_MODE_SET();
      SDA_Set();
      SCL_Set();
      Delay_us(5);
      SDA_Clr();
      Delay_us(5);
      SCL_Clr();
}</code></pre>

<p>BH1750的停止函数为:</p>

<pre>
<code class="language-cpp">void BH1750_Stop()
{
    IIC_OUTPUT_MODE_SET();
    SDA_Clr();
    SCL_Set();
    Delay_us(5);
    SDA_Set();
    Delay_us(5);
}</code></pre>

<p>BH1750的发送应答函数为:</p>

<pre>
<code class="language-cpp">void BH1750_SendACK(char ack)
{
    IIC_OUTPUT_MODE_SET();
    SCL_Clr();
    if(ack) SDA_Set();
    else SDA_Clr();
    Delay_us(2);
    SCL_Set();
    Delay_us(5);
    SCL_Clr();
}</code></pre>

<p>BH1750的发送字节数据的函数为:</p>

<pre>
<code class="language-cpp">void BH1750_SendByte(char data)
{
   char i;
   IIC_OUTPUT_MODE_SET();
   SCL_Clr();
   Delay_us(2);
   for (i=0;i&lt;8;i++)
   {
      if(data&amp;0x80) SDA_Set();
      else SDA_Clr();
      data &lt;&lt;= 1;
      SCL_Set();
      Delay_us(2);
      SCL_Clr();
      Delay_us(2);
   }
}</code></pre>

<p>BH1750的多字节读取的函数为:</p>

<pre>
<code class="language-cpp">void Multiple_Read_BH1750()
{
    BH1750_Start();
    BH1750_SendByte(SlaveAddress+1);
    BH1750_RecvACK();
    BUF = BH1750_RecvByte();
    BH1750_SendACK(0);
    BUF = BH1750_RecvByte();
    BH1750_SendACK(1);
    BH1750_Stop();
    Delay_ms(5);
}</code></pre>

<p>读取光强的函数为:</p>

<pre>
<code class="language-cpp">void Get_Sunlight_Value()
{
    int dis_data=0;
    float temp;
    char i=0;
    int sd;
    Single_Write_BH1750(0x01);  // power on
    Single_Write_BH1750(0x10);  // H- resolution mode
    Delay_ms(180);
    Multiple_Read_BH1750();
    for(i=0;i&lt;3;i++)    dis_data=BUF;
    dis_data=(dis_data&lt;&lt;8)+BUF;
    temp=(float)dis_data/1.2;
    sd=(int)temp;
    if(sd&lt;54612) OLED_ShowNum(0,2,sd,5,16);
}</code></pre>

<p>&nbsp;</p>

<p>实现光强采集与显示的主程序为:</p>

<pre>
<code class="language-cpp">int main(void)
{
    AT32_Board_Init();
    AT32_OLED_Init();
    OLED_Init();
    OLED_Clear();
    OLED_ShowString(0,0,"AT32F421 TEST",16);
    OLED_ShowString(0,2,"OLED &amp; BH1750",16);
    BH1750_Init();
    Delay_ms(1000u);
    OLED_Clear();
    OLED_ShowString(0,0,"Sunlight=",16);
    OLED_ShowString(48,2,"lx",16);
    while(1)
    {
       Get_Sunlight_Value();
       Delay_ms(500 );
    }
}</code></pre>

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

okhxyyo 发表于 2021-8-17 15:28

<p><span style="font-size:16px;">汇总:</span></p>

<p><span style="font-size:16px;"><a href="https://bbs.eeworld.com.cn/thread-1161499-1-1.html" target="_blank" title="【AT32F421测评】+ 初识及开发环境构建">【AT32F421测评】+ 初识及开发环境构建</a></span></p>

<p><span style="font-size:16px;"><a href="https://bbs.eeworld.com.cn/thread-1162154-1-1.html" target="_blank" title="【AT32F421测评】+ OLED屏的显示驱动">【AT32F421测评】+ OLED屏的显示驱动</a></span></p>

<p><span style="font-size:16px;"><a href="https://bbs.eeworld.com.cn/thread-1162903-1-1.html" target="_blank" title="【AT32F421测评】+数码管模块与自动计数显示">【AT32F421测评】+数码管模块与自动计数显示</a></span></p>

<p><span style="font-size:16px;"><a href="https://bbs.eeworld.com.cn/thread-1163372-1-1.html" target="_blank" title="【AT32F421测评】+PWM调节风扇转速">【AT32F421测评】+PWM调节风扇转速</a></span></p>

<p><span style="font-size:16px;"><a href="https://bbs.eeworld.com.cn/thread-1164011-1-1.html" target="_blank" title="【AT32F421测评】+RTC电子时钟">【AT32F421测评】+RTC电子时钟</a></span></p>

<p><span style="font-size:16px;"><a href="https://bbs.eeworld.com.cn/thread-1164422-1-1.html" target="_blank" title="【AT32F421测评】+数码管模块的显示驱动">【AT32F421测评】+数码管模块的显示驱动</a></span></p>

<p><span style="font-size:16px;"><a href="https://bbs.eeworld.com.cn/thread-1164557-1-1.html" target="_blank" title="【AT32F421测评】+串行通讯测试">【AT32F421测评】+串行通讯测试</a></span></p>

<p><span style="font-size:16px;"><a href="https://bbs.eeworld.com.cn/thread-1165008-1-1.html" target="_blank" title="【AT32F421测评】+ ADC数据采集及显示">【AT32F421测评】+ ADC数据采集及显示</a></span></p>

<p><span style="font-size:16px;"><a href="https://bbs.eeworld.com.cn/thread-1165656-1-1.html" target="_blank" title="【AT32F421测评】+ W25Q16存储模块的读写">【AT32F421测评】+ W25Q16存储模块的读写</a></span></p>

<p><span style="font-size:16px;"><a href="https://bbs.eeworld.com.cn/thread-1166282-1-1.html" target="_blank" title="【AT32F421测评】+ DHT22温湿度检测">【AT32F421测评】+ DHT22温湿度检测</a></span></p>

<p><span style="font-size:16px;"><a href="https://bbs.eeworld.com.cn/thread-1166463-1-1.html" target="_blank" title="【AT32F421测评】+ BH1750温湿度检测">【AT32F421测评】+ BH1750温湿度检测</a></span></p>

<p>&nbsp;</p>

火辣西米秀 发表于 2021-5-23 09:15

<p>是的BH1750确实很方便,用I2C接口方式工作,很节省GPIO宝贵资源</p>

jinglixixi 发表于 2021-5-23 09:46

火辣西米秀 发表于 2021-5-23 09:15
是的BH1750确实很方便,用I2C接口方式工作,很节省GPIO宝贵资源

<p><img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/handshake.gif" width="48" /></p>

Albert.G 发表于 2021-5-24 11:23

<p>楼主有很多周边模组啊,这样测评很方便。</p>

jinglixixi 发表于 2021-5-24 11:38

Albert.G 发表于 2021-5-24 11:23
楼主有很多周边模组啊,这样测评很方便。

<p>一边测评,一边购置!</p>

freebsder 发表于 2021-5-24 22:18

<p>谢谢分享,期待后续。</p>

w494143467 发表于 2021-5-25 10:26

<p>这个模块比光敏电阻精度高。</p>

jinglixixi 发表于 2021-5-25 11:28

w494143467 发表于 2021-5-25 10:26
这个模块比光敏电阻精度高。

<p>一个是精度高,另一个是免去了数值的标定,所以选它还是值得的。</p>
页: [1]
查看完整版本: 【AT32F421测评】+ BH1750温湿度检测