【AT32F421测评】+ BH1750温湿度检测
<p style="text-align:justify">BH1750是一种数字式光强度传感器,它采用I2C接口方式工作,故较为节省GPIO口资源。将它与OLED屏组合在一起即可形成一个小巧而便捷的光强度检测装置,其运行效果如下图所示。</p><p></p>
<p>光强检测效果</p>
<p> </p>
<p>BH1750与MCU的连接关系为:</p>
<p>SCL---PB10</p>
<p>SDA---PB11</p>
<p>定义相关引脚输出高低电平的引脚为:</p>
<p>#define SCL_Set() GPIOB->BSRE =GPIO_Pins_10</p>
<p>#define SCL_Clr() GPIOB->BRE =GPIO_Pins_10</p>
<p>#define SDA_Set() GPIOB->BSRE =GPIO_Pins_11</p>
<p>#define SDA_Clr() GPIOB->BRE =GPIO_Pins_11</p>
<p>定义SDA引脚位读取的定义语句为:</p>
<p>#define IIC_SDA_IN 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(&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, &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(&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, &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<8;i++)
{
if(data&0x80) SDA_Set();
else SDA_Clr();
data <<= 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<3;i++) dis_data=BUF;
dis_data=(dis_data<<8)+BUF;
temp=(float)dis_data/1.2;
sd=(int)temp;
if(sd<54612) OLED_ShowNum(0,2,sd,5,16);
}</code></pre>
<p> </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 & 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"> </p>
<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> </p>
<p>是的BH1750确实很方便,用I2C接口方式工作,很节省GPIO宝贵资源</p>
火辣西米秀 发表于 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>
<p>楼主有很多周边模组啊,这样测评很方便。</p>
Albert.G 发表于 2021-5-24 11:23
楼主有很多周边模组啊,这样测评很方便。
<p>一边测评,一边购置!</p>
<p>谢谢分享,期待后续。</p>
<p>这个模块比光敏电阻精度高。</p>
w494143467 发表于 2021-5-25 10:26
这个模块比光敏电阻精度高。
<p>一个是精度高,另一个是免去了数值的标定,所以选它还是值得的。</p>
页:
[1]