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

2024-04-17 22:08

本文主要是介绍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);//使用硬件IICint 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 bytei++;}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提高篇10—光强传感器控制OLED背光的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/912984

相关文章

浅析如何使用Swagger生成带权限控制的API文档

《浅析如何使用Swagger生成带权限控制的API文档》当涉及到权限控制时,如何生成既安全又详细的API文档就成了一个关键问题,所以这篇文章小编就来和大家好好聊聊如何用Swagger来生成带有... 目录准备工作配置 Swagger权限控制给 API 加上权限注解查看文档注意事项在咱们的开发工作里,API

Spring IOC控制反转的实现解析

《SpringIOC控制反转的实现解析》:本文主要介绍SpringIOC控制反转的实现,IOC是Spring的核心思想之一,它通过将对象的创建、依赖注入和生命周期管理交给容器来实现解耦,使开发者... 目录1. IOC的基本概念1.1 什么是IOC1.2 IOC与DI的关系2. IOC的设计目标3. IOC

如何提高Redis服务器的最大打开文件数限制

《如何提高Redis服务器的最大打开文件数限制》文章讨论了如何提高Redis服务器的最大打开文件数限制,以支持高并发服务,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录如何提高Redis服务器的最大打开文件数限制问题诊断解决步骤1. 修改系统级别的限制2. 为Redis进程特别设置限制

Python实现局域网远程控制电脑

《Python实现局域网远程控制电脑》这篇文章主要为大家详细介绍了如何利用Python编写一个工具,可以实现远程控制局域网电脑关机,重启,注销等功能,感兴趣的小伙伴可以参考一下... 目录1.简介2. 运行效果3. 1.0版本相关源码服务端server.py客户端client.py4. 2.0版本相关源码1

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

键盘快捷键:提高工作效率与电脑操作的利器

键盘快捷键:提高工作效率与电脑操作的利器 在数字化时代,键盘快捷键成为了提高工作效率和优化电脑操作的重要工具。无论是日常办公、图像编辑、编程开发,还是游戏娱乐,掌握键盘快捷键都能带来极大的便利。本文将详细介绍键盘快捷键的概念、重要性、以及在不同应用场景中的具体应用。 什么是键盘快捷键? 键盘快捷键,也称为热键或快捷键,是指通过按下键盘上的一组键来完成特定命令或操作的方式。这些快捷键通常涉及同

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [

arduino ide安装详细步骤

​ 大家好,我是程序员小羊! 前言: Arduino IDE 是一个专为编程 Arduino 微控制器设计的集成开发环境,使用起来非常方便。下面将介绍如何在不同平台上安装 Arduino IDE 的详细步骤,包括 Windows、Mac 和 Linux 系统。 一、在 Windows 上安装 Arduino IDE 1. 下载 Arduino IDE 打开 Arduino 官网

如何提高 GitHub 的下载速度

如何提高 GitHub 的下载速度 文章目录 如何提高 GitHub 的下载速度1. 注册账号2. 准备好链接3. 创建仓库4. 在码云上下载代码5. 仓库更新了怎么办 一般来说,国内的朋友从 GitHub 上面下载代码,速度最大是 20KB/s,这种龟速,谁能忍受呢? 本文介绍一种方法——利用“码云”,可以大大提高下载速度,亲测有效。 1. 注册账号 去“码云”注册一

控制反转 的种类

之前对控制反转的定义和解释都不是很清晰。最近翻书发现在《Pro Spring 5》(免费电子版在文章最后)有一段非常不错的解释。记录一下,有道翻译贴出来方便查看。如有请直接跳过中文,看后面的原文。 控制反转的类型 控制反转的类型您可能想知道为什么有两种类型的IoC,以及为什么这些类型被进一步划分为不同的实现。这个问题似乎没有明确的答案;当然,不同的类型提供了一定程度的灵活性,但