精华内容
下载资源
问答
  • Arduino提高篇09—数字光强传感器

    千次阅读 2019-11-29 08:57:08
    数字光强传感器

    数字光照传感器

    光敏电阻是常用的光感元件,但是其感应范围比较窄,响应速度慢,且受外界干扰较大。要接收强光时,需要更加精准的数字光照传感器。本篇介绍GY-30模块的使用,其板载BH1750数字光传感器专用IC。

    1. 光强传感器介绍

    GY-30模块基于BH1750FVI芯片,模块采用IIC通讯方式,内置16bit ADC转换器,可以直接数字输出,光照强度范围:0~65525 lx,勒克斯「lux,通常简写为lx」是照度的国际单位。

    GY-30模块

    主要特点

    • 内置16Bit ADC转换器。
    • IIC通讯协议,直接输出数字量。
    • 供电:3~5V。
    • 范围:0~65535lx。
    • 不区分环境光源,接近视觉灵敏度的分光特性。
    • 板载通信电平转换。

    2. 实验材料

    • Uno R3开发板
    • 配套USB数据线
    • 面包板及配套连接线
    • 数字光强传感器GY-30模块

    3. 实验步骤

    1. 根据原理图搭建电路图。

    GY-30模块的VCC、GND分别连接开发板的5V、GND,模块的SDA、SCL分别连接开发板的A4、A5引脚,模块的ADD引脚不连接。

    实验原理图如下图所示:

    实验原理图

    实物连接图如下图所示:

    实物连接图

    2. 新建sketch,拷贝如下代码替换自动生成的代码并进行保存。

    /*
     * BH1750
     * 数字光照传感器实验
     */
     
    #include <Wire.h> //IIC
    
    int BH1750address = 0x23;
    byte buff[2];
    uint16_t val = 0;
    
    void setup()
    {
      Wire.begin();
      BH1750_Init(BH1750address);
      Serial.begin(9600);
    }
    
    void loop()
    {
      if (2 == BH1750_Read(BH1750address))
      {
        if (buff[0] == 255 && buff[1] == 255)
        {
          val = 65535;
        } else {
          val = ((buff[0] << 8) | buff[1]) / 1.2; //芯片手册中规定的数值计算方式
        }
    
        Serial.print(val, DEC);
        Serial.println("[lx]");
      }
      delay(500);
    }
    
    int BH1750_Read(int address) 
    {
      int i = 0;
      Wire.beginTransmission(address);
      Wire.requestFrom(address, 2);
      while (Wire.available())
      {
        buff[i] = Wire.read();  // receive one byte
        i++;
      }
      Wire.endTransmission();
      return i;
    }
    
    void BH1750_Init(int address)
    {
      Wire.beginTransmission(address);
      Wire.write(0x10);
      Wire.endTransmission();
    }
    

    3. 连接开发板,设置好对应端口号和开发板类型,进行程序下载。

    程序下载

    4. 实验现象

    打开串口监视器,波特率设置成与程序中相一致的9600。监视器中将显示环境光强度,可以通过遮挡或照射模块来改变光强度。

    实验现象

    关注微信公众号:TonyCode
    Arduino学习交流群:868283450

    更多内容,欢迎关注我的公众号。 微信扫一扫下方二维码即可关注:
    扫码加入微信公众号:TonyCode

    展开全文
  • 关注、星标公众号,不错过精彩内容光强传感器控制OLED背光像手机、平板之类的电子设备,屏幕亮度都能随环境光强度自动调节,其内部使用的是小体积的数字光照传感器。本篇我们使用GY-30光照传感器模块来控制OLED显示...
    关注、星标公众,不错过精彩内容
    d485e8a22568dbc73e7f7c09f882922b.png
    光强传感器控制OLED背光

    像手机、平板之类的电子设备,屏幕亮度都能随环境光强度自动调节,其内部使用的是小体积的数字光照传感器。本篇我们使用GY-30光照传感器模块来控制OLED显示屏的背光亮度,使其随环境光自动调节。

    1. 实验材料

    • Uno R3开发板

    • 配套USB数据线

    • 面包板及配套连接线

    • OLED显示屏

    • 数字光强传感器GY-30模块

    2. 实验步骤

    1. 根据原理图搭建电路图。

    OLED屏的VCC、GND、SDA、SCL与GY-30模块的VCC、GND、SDA、SCL相对应连接,然后连接到开发板的5V、GND、A4、A5。两个模块都使用了硬件IIC,由于各自地址不同,所以并不会相互影响,这也是IIC通讯协议的优势所在。

    实验原理图如下图所示:

    cc5ea606d15cf1a3a0f5303cfc477dfb.png
    实验原理图

    实物连接图如下图所示:

    151d4052870b7c3bd07f729d94487109.png
    实物连接图

    2. 新建sketch,拷贝如下代码替换自动生成的代码并进行保存。

    /*
       OLED_BH1750
       光照传感器OLED背光控制
    */

    3. 连接开发板,设置好对应端口号和开发板类型,进行程序下载。

    e700bf6bea7b8d75cb9c84b4f070ea38.png
    程序下载

    3. 实验现象

    OLED屏幕显示采集到的环境光强,并且屏幕亮度随环境光强度而自动调节。

    9e765046119c921338eba6d6180467d2.gif
    实验现象

    4. 实验分析

    在U8g2库中,通过函数setContrast()来调节背光亮度,此函数接收0~255之间的数值,数值越大,背光越亮。

    我们通过map()函数,截取光照强度的一部分[0, 500],映射成[0,255]之间的数值。我们希望当光照弱时背光亮一些,光照强时背光暗一些,所以setContrast()函数接收的数值使用255减去实际的光照强度,如下:

    255 - 


    推荐阅读:

    Arduino基础入门篇汇总

    Arduino提高篇09—数字光强传感器

    Arduino遇到Node.js:通过Web界面控制LED的亮度

    若觉得文章对你有帮助,随手点『好看、转发分享、留言,也是对我的支持。

    关注公众号「TonyCode」,后台回复“提高”,获取文中代码。

    3f29324f2ca552ebb83c9620ebe552fd.png

    长按识别图中二维码关注

    展开全文
  • GY-30数字光强传感器通过I²C通信协议接入Arduino过程中的一些问题和解决方案: 网上流行着两个版本: 版本一: https://blog.csdn.net/zjnsky/article/details/51732943 版本二: ...

    GY-30数字光强传感器通过I²C通信协议接入Arduino过程中的一些问题和解决方案:

    网上流行着两个版本:
    版本一:
    https://blog.csdn.net/zjnsky/article/details/51732943
    版本二:
    https://blog.csdn.net/ubibots/article/details/51613360

    我用版本一的代码,发现并不对,串口打印一直显示光照强度为 0 ,很奇怪,也研究了很久,去 Wire 这个库文件看了函数实现,后来发现

    Wire.requestFrom(ADDR, 2); // 2byte every time

    这一行代码出现了问题。
    这个 requestFrom
    网上对它的描述都是:

    Wire.requestFrom()
    描述:

    主设备请求从设备一个字节,这个字节可以被主设备用 read()或available()接受。
    Wire.requrstFrom(addtess,quantity)
    Wire.requrstFrom(addtess,quantity,stop)

    参数 :
    addtess : 7位的器件地址
    quantity : 请求得到的数量 stop :布尔形,‘1’
    则在请求结束后发送一个停止命令,并释放总线。‘0’则继续发送请求保持连接。

    返回:
    字节形 ,从从机接受到的字节数目。

    然而并没有提,要用 requestFrom 前后必须要加:

    Wire.beginTransmission(ADDR);

    Wire.endTransmission();

    这两句,分别为开始一次传输数据,和结束一次传输。
    也就是将 requestFrom 这行代码改为以下,即可完成从设备向主设备发送数据
    在这里也就是 gy30(从设备) 向 arduino 板(主设备)传输光强度的采集量

    Wire.beginTransmission(ADDR);
    Wire.requestFrom(ADDR, 2);
    Wire.endTransmission();
    展开全文
  • 作者:颜哲锟GY-30数字光强传感器通过I²C通信协议接入Arduino过程中的一些问题和解决方案前言刚拿到GY-30数字光强传感器的时候,真心感觉比原来的模拟输出的光强传感器要精确好几倍。没被拆封的GY-30模块,排针是...

    作者

    颜哲锟

    简介

    GY-30数字光强传感器通过I²C通信协议接入Arduino过程中的一些问题和解决方案

    前言

    刚拿到GY-30数字光强传感器的时候,真心感觉比原来的模拟输出的光强传感器要精确好几倍。

    没被拆封的GY-30模块,排针是需要自己焊的。

    注:I²C,这是正确的写法,但也有简写成IIC或I2C。

    1.单个GY-30接入Arduino UNO

    焊完用杜邦线和Arduino板子相连即可,淘宝商家提供的手册是基于UNO板的,GY-30的VCC接Arduino的5v,GND接GND,SDA接A4,SCL接A5,ADD是地址引脚,单个sensor工作时不用接。一个UNO板子和一个GY-30传感器连接起来很容易就调试成功了。

    附上代码

    附上代码
    
    #include <Wire.h> //IIC库
    
    #include <math.h> 
    
    int BH1750address = 0x23;//芯片地址为16位23
    
    byte buff[2];
    
    void setup()
    
    {
    
      Wire.begin();
    
      Serial.begin(9600);
    
    }
    
    
    
    
    void loop()
    
    {
    
     int i;
    
     uint16_t val=0;
    
     BH1750_Init(BH1750address);
    
     delay(1000);
    
     if(2==BH1750_Read(BH1750address))
    
      {
    
       val=((buff[0]<<8)|buff[1])/1.2;
    
       Serial.print(val,DEC);     
    
       Serial.println("[lx]"); 
    
      }
    
     delay(150);
    
    }
    
    
    
    
    int BH1750_Read(int address) //
    
    {
    
      int i=0;
    
      Wire.beginTransmission(address);
    
      Wire.requestFrom(address, 2);
    
      while(Wire.available()) //
    
      {
    
        buff[i] = Wire.read();  // read one byte
    
        i++;
    
      }
    
      Wire.endTransmission();  
    
      return i;
    
    }
    
    
    
    
    void BH1750_Init(int address) 
    
    {
    
      Wire.beginTransmission(address);
    
      Wire.write(0x10);//1lx reolution 120ms
    
      Wire.endTransmission();
    
    }

    2.尝试让多个GY-30接入Arduino MEGA2560

    我需要让4个GY-30同时接入,所以尝试更换成接口更多的MEGA2560,以实现将串口模拟成IIC接口并实现通信,但Arduino的串口监视器没有数据读出。

    此坑略去几百字,附上总结:

    我理解成“SDA接A4,SCL接A5”是通过Arduino的模拟口传输的,所以把UNO换成其他型号的板子也应该是A4和A5口,但MEGA2560的串口监视器上的光强数据不再读出,翻墙找到UNO和MEGA的电路图,秒懂错误原因。这I²C压根不是通过A4A5口的模拟输出口传输的,而是UNO的A4A5口还是有SDA和SCL功能。

    附上翻墙拿到的2个电路图。

    Arduino UNO 引脚图
    Arduino UNO 引脚图2

    3.GY-30数字光强传感器的地址问题的解决方案以及在IIC协议下的总结发现

    3.1GY-30的地址解决方案

    解决了串口引脚接线问题,接下来需要解决一下基于Arduino利用IIC协议和GY-30通行时的地址问题。

    我起先对IIC地址的理解是像IP地址那样可以自己设置,最后发现并不全对,这需要看芯片是否支持更改地址。

    此坑略去几千字,附上总结:

    对于这个GY-30数字光强传感器,内置BH1750FVI,sensor外接有5个引脚,GND ADD SDA SCL VCC。通过阅读芯片技术手册(英文版淘宝自取或中文版http://wenku.baidu.com/link?url=rXMAHAejMui15JWn20Rr8pR-came8Oo5WA3N5H29PGOLh_YL5a7_YUsKtuFk6dqHCpnxoMbfPNx52yJt8sOL2m6-FQyPYZsIjlQoQt_eMBe)遗憾地发现,这芯片只支持2个I²Cslave地址从属地址,1011100是高电平地址为0x5c,0100011为低电平,地址是0x23。不用ADD引脚或者接GND时,芯片默认为低电平即0x23,当ADD接5V或者3.3V时,芯片为高电平即0x5c。

    3.2 IIC协议下的地址解决方案

    3.2.1

    其实本来考虑的是想更改sensor的地址,然后让4个sensor同时连接在I²C总线上,但内置BH1750FVI只能实现2个地址,所以方案最终改成了用2个Arduino板子分别控制横向和纵向方向上的2个sensor。

    在寻找更改芯片地址的技术资料和初始化命令的时候,找到过这种思路的先例,一般sensor的技术手册、数据手册会有详细的地址和引脚接线信息,这是一个普遍的寻址思路。

    3.2.2

    当然还有一种设置地址的方法。比如,BLinkM(有I²C功能的已装配完毕的彩色LED模块),它的地址是需要自己设置的,需要从http://code.google.com/p/blinkm-projects/下载BlinkMTester的测试程序。编译并上传BlinkMTester测试程序,将每个BlinkM模块逐一连接到Arduino,使用BlinkMTester测试程序的扫描命令S显示当前连接模块的地址,并使用A命令来给每个模块设置不同的地址。

    3.3总结

    I²C Bus 的通信协议对于多个不同传感器的接入有很大方便,能减少大量线路。

    但对于接多个相同的传感器,问题变得复杂,上限数量需要看sensor的内置芯片是否支持重置地址;如果不能重置,则上限要看芯片支持分配几个地址。

    附上示意图
    设备连线

    展开全文
  • 使用GY-30数字光强传感器检测光照强度,并在串口输出检测结果; 实验器件 arduino X 1 GY-30数字光强传感器 X 1 USB数据烧写线 X 1 杜邦线 X 4 实验连线 GY-30 Arduino VCC 5V GND GND SDA A4 SCL ...
  • 数字光强传感器GY-30模块 2. 实验步骤 1. 根据原理图搭建电路图。 OLED屏的VCC、GND、SDA、SCL与GY-30模块的VCC、GND、SDA、SCL相对应连接,然后连接到开发板的5V、GND、A4、A5。两个模块都使用了硬件IIC,...
  • 我在的队伍的设计的项目就是智能窗户,智能窗户可以采集本地传感器采集到的环境参数,根据参数具有一套内部的逻辑判断,可以对温度,湿度,光强,粉尘等因素实现智能开闭(例如高温开窗通风),还能把这些参数发布到局域网上,...
  • 转自Yeelink博客。... 本文介绍如何在Arduino上实现自己的Yeelink客户端,以便将采集到的传感器数据上传到Yeelink平台上。该例程会每隔30s采集一次传感器数据并发送...BH1750光强传感器模块(你可以替换成自己的传感器) 软
  • 本篇介绍光敏电阻,通过模拟输入采集环境光强来控制LED灯亮度,做一个无需人为干预的自动控制设备。传感器是一种检测装置,能感受并采集到被测量的信息,在当下物联网、智能家居中占据重要地位。一切智能化、自动化...
  • @Arduino开发小项目—光控灯 本篇文章介绍光敏电阻,通过模拟输入采集环境光强来控制LED灯亮度,做一个无需人为干预的自动控制设备。 传感器是一种检测装置,能感受并采集到被测量的信息,在当下物联网、智能家居中...
  • Arduino-光控灯的实现

    千次阅读 2019-06-17 20:39:20
    利用光敏电阻,模拟输入采集环境光强,来控制LED灯亮度,做一个无需人为干预的自动控制设备。光传感器是利用光敏元件将光信号转换为电信号的传感器,它的敏感波长在可见光波长附近,包括红外线波长和紫外线波长。光...
  • flower care sys 基于arduino Blinker的物联网植物养护系统 背景信息: ...可以很容易的拓展多种传感器如温度传感器,空气湿度传感器,光照强度传感器,进行更加智能的杨虎 预计拓展场景:检测光强和温...
  • 在本Arduino教程中,我们将学习如何使用Arduino和TCS230 / TCS3200颜色传感器检测颜色。您可以观看以下视频或阅读下面的书面教程以了解更多详细信息。 Arduino颜色感应教程-TCS230 TCS3200颜色感应器 TCS230颜色...
  • 本篇介绍光敏电阻,通过模拟输入采集环境光强来控制LED灯亮度,做一个无需人为干预的自动控制设备。 传感器是一种检测装置,能感受并采集到被测量的信息,在当下物联网、智能家居中占据重要地位。一切智能化、自动化...
  • 智能家居系统设计与实现

    万次阅读 2018-07-15 23:17:20
    一、设计目的1、根据酷痞Coolpy数据库,相当于一个云平台和Web服务,理解网页控制电源开关的方法和过程,掌握HTML5页面访问与控制的具体协议和通信命令。...3、通过Arduino获取光强的强度数值,将...
  • FloewrCareSys.zip

    2019-11-02 21:00:51
    基于arduino;基于blinker物联网平台;使用3D打印制作的一个浇花系统; 能够实现自动浇花,土壤水分检测,实时同步数据到手机端,手机端可以控制手动进行浇花 可以很容易的拓展多种传感器如温度传感器,空气湿度...

空空如也

空空如也

1 2
收藏数 24
精华内容 9
关键字:

arduino光强传感器