Arduino提高篇10—光强传感器控制OLED背光

光强传感器控制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通讯协议的优势所在。

实验原理图如下图所示:

实验原理图

实物连接图如下图所示:

实物连接图

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

/*
   OLED_BH1750
   光照传感器OLED背光控制
*/
#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h> 

U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);//使用硬件IIC

int BH1750address = 0x23;
byte buff[2];
uint16_t val = 0;
char str[6];

void setup()
{
  Wire.begin();
  BH1750_Init(BH1750address);
  u8g2.begin();
  u8g2.setFont(u8g2_font_fur20_tf);
}

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; //芯片手册中规定的数值计算方式
    }
  }

  strcpy(str, u8x8_u16toa(val, 5));  

  u8g2.firstPage();
  do {
    u8g2.drawStr(20, 20, "-Light-");
    u8g2.drawStr(10, 60, str);
    u8g2.drawStr(95, 60, "Lx");
    u8g2.setContrast(255 - map(val, 0, 500, 0, 255)); //将光照数据进行区间映射,控制OLED背光
  } while ( u8g2.nextPage() );
}

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. 连接开发板,设置好对应端口号和开发板类型,进行程序下载。

程序下载

3. 实验现象

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

实验现象

4. 实验分析

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

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

u8g2.setContrast(255 - map(val, 0, 500, 0, 255));

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

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

### Arduino光强传感器基本信息 Arduino光强传感器是一种能够测量周围环境中光线强度并将该信息转化为电信号的装置。对于精确的应用场景,数字光强传感器如GY-30模块被广泛采用。这类传感器内置有16位ADC转换器,通过IIC通讯协议输出数字化后的光照强度数值[^2]。 #### GY-30模块特性 - **高精度**:提供高达16位分辨率的数据读取能力。 - **宽电压支持**:可在3至5伏特之间稳定工作。 - **广范围监测**:能覆盖从完全黑暗到强烈阳光下的整个照度区间(0~65535勒克斯)。 - **良好匹配人类视觉敏感曲线**:具备接近于人眼对不同波长光线反应特征的频谱响应性能。 - **兼容性强**:配备电平转换电路以便与其他低功耗单片机轻松对接[^4]。 ### 工作原理 当光线照射到光电二极管上时会产生电流变化;这种变化经过放大处理后再由模数转换器转变为可以被计算机理解的一系列离散值——即所谓的“数字信号”。具体来说,在GY-30中集成了专门设计用于光学检测的集成电路BH1750FVI,它负责完成上述过程中的大部分任务,并最终向主控单元报告当前环境内的实际照明水平。 ### 使用教程 为了实现基本功能演示或者更复杂的交互逻辑,通常会按照以下方式操作: #### 所需组件清单 - Arduino Uno R3 开发板及其USB连线; - 面包板以及若干跳线; - 数字光强传感模块(GY-30); - 可选配件:OLED显示屏(如果希望实时展示测得的结果)[^3]。 #### 编程指南 下面给出一段基础示例代码用来获取来自TSL2561或相似型号器件所感知到的信息,并将其打印出来供开发者查看: ```cpp #include <Wire.h> #define ADDR_TSL2561 0x39 // TSL2561 I2C 地址定义 void setup() { Serial.begin(9600); Wire.begin(); // 初始化TSL2561... } float calculateLux(int data0, int data1){ float ratio = (data1/(data0+data1)); if ((ratio >= 0) && (ratio <= 0.52)){ return (0.0304 * data0) - (0.062 * data0 * pow(ratio, 1.4)); } else{ return (0.0224 * data0) - (0.031 * data1); } } ``` 此段代码展示了如何初始化I²C总线并与指定地址处的目标设备建立联系,同时还包含了计算lux值的方法`calculateLux()`,这有助于进一步分析所得数据的意义所在[^1]。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值