• Raspberry Pi开发之旅-光照强度检测(BH1750)


    一、前期准备

    1.环境要求
    GY30模块(BH1750FVI传感器),树莓派系统,python-smbus,iic开启

    2.取消对IIC驱动的黑名单
    nano /etc/modprobe.d/raspi-blacklist.conf

    3.启动IIC驱动
    nano  /etc/modules
    添加i2c-dev ,如下:

    4.重启

    5.安装python-smbus
    这个安装会附带安装i2c-tools,省的单独安装了

    sudo apt-get install python-smbus
    

    6.将BH1750连接到树莓派

     GY-30 树莓派
    VCC —— 1
    GND —— 6
    SDA —— 3
    SCL —— 5
    ADDR —— 不接

    二、连接测试

    sudo i2cdetect -y 1
    

    问题分析:

    pi@raspberrypi:~$ i2cdetect -y 1
    Error: Could not open file dev/i2c-1' or `/dev/i2c/1': No such file or directory
    

    无设备目录

    解决方法:

    方法一:raspi-config,进入Interfacing Options高级设置,将spi与i2c设置为enable,reboot;

    方法二:blacklist里面有i2c,所以i2cdetect检测不到dev里面的设备,现在把blacklist里面的i2c模块注释掉就可以检测到i2cdev。

    三、光照强度测量

    1.创建iic_bh1750.c

    #include <stdio.h>
    #include <fcntl.h>
    #include <linux/i2c-dev.h>
    #include <errno.h>
    #define I2C_ADDR 0x23
    int main(void)
    {
        int fd;
        char buf[3];
        char val,value;
        float flight;
        fd=open("/dev/i2c-1",O_RDWR);
        if(fd<0)
        {
            printf("打开文件错误:%s
    ",strerror(errno)); return 1;
        }
        if(ioctl( fd,I2C_SLAVE,I2C_ADDR)<0 )
        {
            printf("ioctl 错误 : %s
    ",strerror(errno));return 1;
        }
        val=0x01;
        if(write(fd,&val,1)<0)
        {
            printf("上电失败
    ");
        }
        val=0x11;
        if(write(fd,&val,1)<0)
        {
            printf("开启高分辨率模式2
    ");
        }
        usleep(200000);
        if(read(fd,&buf,3)){
            flight=(buf[0]*256+buf[1])*0.5/1.2;
            printf("光照度: %6.2flx
    ",flight);
        }
        else{
            printf("读取错误
    ");
        }
    }
    

    编译:
    gcc  -o  bh1750  iic_bh1750.c
    执行:
    ./bh1750

    2.与python相比

    创建illuminance.py

    cd /home/pi/helloworld/illuminance
    vim illuminance.py
    

    illuminance.py

    #!/usr/bin/env python
    # encoding: utf-8
    
    import smbus
    import time
    
    #BH1750地址
    __DEV_ADDR=0x23
    
    #控制字
    __CMD_PWR_OFF=0x00  #关机
    __CMD_PWR_ON=0x01   #开机
    __CMD_RESET=0x07    #重置
    __CMD_CHRES=0x10    #持续高分辨率检测
    __CMD_CHRES2=0x11   #持续高分辨率模式2检测
    __CMD_CLHRES=0x13   #持续低分辨率检测
    __CMD_THRES=0x20    #一次高分辨率
    __CMD_THRES2=0x21   #一次高分辨率模式2
    __CMD_TLRES=0x23    #一次分辨率
    __CMD_SEN100H=0x42  #灵敏度100%,高位
    __CMD_SEN100L=0X65  #灵敏度100%,低位
    __CMD_SEN50H=0x44   #50%
    __CMD_SEN50L=0x6A   #50%
    __CMD_SEN200H=0x41  #200%
    __CMD_SEN200L=0x73  #200%
    
    bus=smbus.SMBus(1)
    bus.write_byte(__DEV_ADDR,__CMD_PWR_ON)
    bus.write_byte(__DEV_ADDR,__CMD_RESET)
    bus.write_byte(__DEV_ADDR,__CMD_SEN100H)
    bus.write_byte(__DEV_ADDR,__CMD_SEN100L)
    bus.write_byte(__DEV_ADDR,__CMD_PWR_OFF)
    def getIlluminance():
        bus.write_byte(__DEV_ADDR,__CMD_PWR_ON)
        bus.write_byte(__DEV_ADDR,__CMD_THRES2)
        time.sleep(0.2)
        res=bus.read_word_data(__DEV_ADDR,0)
        #read_word_data
        res=((res>>8)&0xff)|(res<<8)&0xff00
        res=round(res/(2*1.2),2)
        result="光照强度: "+str(res)+"lx"
        return result
    

    测试结果

    重启uwsgi服务

    sudo systemctl restart emperor.uwsgi.service
    

    测试

    在树莓派浏览器输入
    http://127.0.0.1/illuminance
    或者在电脑浏览器输入 http://树莓派IP/illuminance
    
  • 相关阅读:
    算法学习:二分法从入门到精通
    TypeScript筑基笔记一:Visual Studio Code 创建Typescript文件和实时监控
    LeetCode 92. 反转链表 II
    LeetCode 1525. 字符串的好分割数目
    字节跳动-people后台一面面经
    LeetCode 117. 填充每个节点的下一个右侧节点指针 II
    LeetCode 1529. 灯泡开关 IV
    LeetCode 165. 比较版本号
    LeetCode 312. 戳气球
    LeetCode 605. 种花问题
  • 原文地址:https://www.cnblogs.com/sirius-swu/p/6682746.html
Copyright © 2020-2023  润新知