打印
[应用相关]

F103C8T6 GY-30 光强采集 正点原子版

[复制链接]
2167|36
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
drer|  楼主 | 2021-7-5 16:13 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
硬件见下图:


使用特权

评论回复
沙发
drer|  楼主 | 2021-7-5 16:15 | 只看该作者
BH1750.c

#include "BH1750.h"

void GPIOConfig( void )
{
        GPIO_InitTypeDef GPIO_InitStruct;

       
        RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );

        GPIO_InitStruct.GPIO_Mode        = GPIO_Mode_Out_PP;
        GPIO_InitStruct.GPIO_Speed        = GPIO_Speed_50MHz;
        GPIO_InitStruct.GPIO_Pin        = sda | scl;
        GPIO_Init( GPIOA, &GPIO_InitStruct );
}


void Delay_5us( void )
{
        delay_us(5);
}


void Delay_mms( unsigned int tmp )
{
        unsigned int i = 0;
        while ( tmp-- )
        {
                delay_ms(1);
        }
}


使用特权

评论回复
板凳
drer|  楼主 | 2021-7-5 16:16 | 只看该作者
void BH1750_Start()
{
        GPIO_SetBits( GPIOA, sda );  
        GPIO_SetBits( GPIOA, scl );   
        Delay_5us();                    
        GPIO_ResetBits( GPIOA, sda );   
        Delay_5us();                    
        GPIO_ResetBits( GPIOA, scl );  
}



使用特权

评论回复
地板
drer|  楼主 | 2021-7-5 16:16 | 只看该作者
void BH1750_Stop()
{
        GPIO_ResetBits( GPIOA, sda );   
        GPIO_SetBits( GPIOA, scl );     
        Delay_5us();                    
        GPIO_SetBits( GPIOA, sda );     
        Delay_5us();                    
}


使用特权

评论回复
5
drer|  楼主 | 2021-7-5 16:18 | 只看该作者
void BH1750_SendACK( unsigned int ack )
{
        GPIO_InitTypeDef GPIO_InitStruct;

        GPIO_InitStruct.GPIO_Mode        = GPIO_Mode_Out_PP;
        GPIO_InitStruct.GPIO_Speed        = GPIO_Speed_50MHz;
        GPIO_InitStruct.GPIO_Pin        = sda;
        GPIO_Init( GPIOA, &GPIO_InitStruct );


        if ( ack == 1 )                 
                GPIO_SetBits( GPIOA, sda );
        else if ( ack == 0 )
                GPIO_ResetBits( GPIOA, sda );
        else
                return;

        GPIO_SetBits( GPIOA, scl );     
        Delay_5us();                  
        GPIO_ResetBits( GPIOA, scl );
        Delay_5us();               
}


使用特权

评论回复
6
drer|  楼主 | 2021-7-5 16:18 | 只看该作者
unsigned int BH1750_RecvACK()
{
        GPIO_InitTypeDef GPIO_InitStruct;

        GPIO_InitStruct.GPIO_Mode        = GPIO_Mode_IPU;        
        GPIO_InitStruct.GPIO_Speed        = GPIO_Speed_50MHz;
        GPIO_InitStruct.GPIO_Pin        = sda;
        GPIO_Init( GPIOA, &GPIO_InitStruct );

        GPIO_SetBits( GPIOA, scl );                           
        Delay_5us();                                          

        if ( GPIO_ReadInputDataBit( GPIOA, sda ) == 1 )        
                mcy = 1;
        else
                mcy = 0;

        GPIO_ResetBits( GPIOA, scl );                        
        Delay_5us();                                          

        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init( GPIOA, &GPIO_InitStruct );

        return(mcy);
}


使用特权

评论回复
7
drer|  楼主 | 2021-7-5 16:19 | 只看该作者
void BH1750_SendByte( unsigned char dat )
{
        unsigned char i;

        for ( i = 0; i < 8; i++ )
        {
                if ( 0X80 & dat )
                        GPIO_SetBits( GPIOA, sda );
                else
                        GPIO_ResetBits( GPIOA, sda );

                dat <<= 1;
                GPIO_SetBits( GPIOA, scl );     
                Delay_5us();                  
                GPIO_ResetBits( GPIOA, scl );   
                Delay_5us();                  
        }
        BH1750_RecvACK();
}

使用特权

评论回复
8
drer|  楼主 | 2021-7-5 16:19 | 只看该作者
unsigned char BH1750_RecvByte()
{
        unsigned char        i;
        unsigned char        dat = 0;
        unsigned char        bit;

        GPIO_InitTypeDef GPIO_InitStruct;

        GPIO_InitStruct.GPIO_Mode        = GPIO_Mode_IPU;        
        GPIO_InitStruct.GPIO_Pin        = sda;
        GPIO_InitStruct.GPIO_Speed        = GPIO_Speed_50MHz;
        GPIO_Init( GPIOA, &GPIO_InitStruct );

        GPIO_SetBits( GPIOA, sda );                             
        for ( i = 0; i < 8; i++ )                          
        {
                dat <<= 1;
                GPIO_SetBits( GPIOA, scl );               
                Delay_5us();                                 

                if ( SET == GPIO_ReadInputDataBit( GPIOA, sda ) )
                        bit = 0X01;
                else
                        bit = 0x00;

                dat |= bit;                                   

                GPIO_ResetBits( GPIOA, scl );                  
                Delay_5us();                                   
        }

        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init( GPIOA, &GPIO_InitStruct );
        return(dat);
}


使用特权

评论回复
9
drer|  楼主 | 2021-7-5 16:20 | 只看该作者
void Single_Write_BH1750( unsigned char REG_Address )
{
        BH1750_Start();                        
        BH1750_SendByte( SlaveAddress );   
        BH1750_SendByte( REG_Address );        
        /*  BH1750_SendByte(REG_data);      
        BH1750_Stop();                        
}


使用特权

评论回复
10
drer|  楼主 | 2021-7-5 16:21 | 只看该作者
void Init_BH1750()
{
        GPIOConfig();
        Single_Write_BH1750( 0x01 );
}






使用特权

评论回复
11
drer|  楼主 | 2021-7-5 16:22 | 只看该作者
void mread( void )
{
        unsigned char i;
        BH1750_Start();                       
        BH1750_SendByte( SlaveAddress + 1 );  

        for ( i = 0; i < 3; i++ )           
        {
                BUF[i] = BH1750_RecvByte();     
                if ( i == 3 )
                {
                        BH1750_SendACK( 1 );   
                }else  {
                        BH1750_SendACK( 0 );   
                }
        }

        BH1750_Stop();                        
        Delay_mms( 5 );
}

使用特权

评论回复
12
drer|  楼主 | 2021-7-5 16:22 | 只看该作者
BH1750.h

#ifndef __BH1750_H__
#define __BH1750_H__


#include "sys.h"



#define sda        GPIO_Pin_4      
#define scl        GPIO_Pin_3   

#define   SlaveAddress 0x46     

extern unsigned char        BUF[8];      
extern int        dis_data;     
extern int        mcy;        

void Init_BH1750( void );


void conversion( unsigned int temp_data );


void Single_Write_BH1750( unsigned char REG_Address );  


unsigned char Single_Read_BH1750( unsigned char REG_Address );  


void mread( void );                          


void Delay_5us( void );


void Delay_mms( unsigned int tmp );


void GPIOConfig( void );


#endif



使用特权

评论回复
13
drer|  楼主 | 2021-7-5 16:23 | 只看该作者
使用:

  • 在main.c里面#include “BH1750.h”
  • 在main.c里声明下面几个全局变量

unsigned char        BUF[8];        
int                dis_data;      
int                mcy;         
float                lightPower;     


  • 在main.c里初始化 Init_BH1750(); /* init BH1750 */
  • 在while(1)里面,得出的lightPower就是光强 单位是lx

        delay_ms( 5 );
                t++;
                if ( t > 40 )
                {
                       


                        mread();                                    
                        dis_data        = BUF[0];
                        dis_data        = (dis_data << 8) + BUF[1];   
                        lightPower        = (float) dis_data / 1.2;      
                        Single_Write_BH1750( 0x01 );               
                        Single_Write_BH1750( 0x10 );                  
                       
                       
                        display();                                   


                        t = 0;
                }


使用特权

评论回复
14
drer|  楼主 | 2021-7-5 16:24 | 只看该作者
参考main.c



#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "timer.h"
#include  "oled.h"      /* oled */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "BH1750.h"

unsigned char        BUF[8];         
int                dis_data;      
int                mcy;            
float                lightPower;     

extern struct ds1302time time;  

char        xianshi[30];
u8        tmp_buf[33];           


void display( void )
{
       
        memset( xianshi, 0, sizeof(xianshi) );
        sprintf( xianshi, "%02d:%02d:%02d", time.hour, time.minute, time.second );
        OLED_P8x16Str( 0, 2, xianshi, 0 );
       
        memset( xianshi, 0, sizeof(xianshi) );
        sprintf( xianshi, "%.1f", lightPower );
        OLED_P8x16Str( 0, 4, xianshi, 0 );
}


使用特权

评论回复
15
drer|  楼主 | 2021-7-5 16:25 | 只看该作者
int main( void )
{
        u8        t                = 0;
        NVIC_PriorityGroupConfig( NVIC_PriorityGroup_2 );              
        delay_init();                                                  
        RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO, ENABLE );
        GPIO_PinRemapConfig( GPIO_Remap_SWJ_JTAGDisable, ENABLE );   

        uart_init( 9600 );                                            


        Init_BH1750();                                         




        while ( 1 )
        {
               

                delay_ms( 5 );
                t++;
                if ( t > 40 )
                {
                       


                        mread();                                       
                        dis_data        = BUF[0];
                        dis_data        = (dis_data << 8) + BUF[1];     
                        lightPower        = (float) dis_data / 1.2;      
                        Single_Write_BH1750( 0x01 );                  
                        Single_Write_BH1750( 0x10 );                  
                       
                       
                        display();                                   


                        t = 0;
                }
        }
}


使用特权

评论回复
16
仰望星期五| | 2021-7-6 08:22 | 只看该作者
楼主做的什么项目用的

使用特权

评论回复
17
仰望星期五| | 2021-7-6 08:23 | 只看该作者
APDS9930,这个接触过没,也是IIC,我之前调试过一次,没有成功,有空还得看看。

使用特权

评论回复
18
usysm| | 2021-7-6 16:24 | 只看该作者
这个就是ADC吧      

使用特权

评论回复
19
typeof| | 2021-7-6 16:24 | 只看该作者
光敏电阻如何采集光强  

使用特权

评论回复
20
yujielun| | 2021-7-6 16:25 | 只看该作者
除了光敏电阻,还有什么可以进行光照采集  

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

61

主题

3316

帖子

4

粉丝