你有没有想过为什么智能手机被称为智能手机?因为他们很聪明,对吧?他们会自动、巧妙地完成一些工作。这是简短的答案。我在想,即使电脑比手机强大得多,为什么它们不聪明!比如手机有自动亮度控制系统,很方便,我一直都在用。但不知什么原因,电脑没有自动亮度控制系统。为了改变亮度,每次我都必须按一些按钮(功能键)。在某些计算机中,一些组合键可以完成工作(通常是 fn+功能键)。我觉得这很烦人。所以我设计了一个简单的设备,可以连接到任何电脑上,电脑的亮度会自动控制,就像我们的手机一样。让我们看看我是如何让我的电脑变得智能的。
电子产品 -
其他 -
而已。
在跳跃之前讨论我们在做什么总是好的。一点理论就足以开始。
我需要某种传感器来检测光强度。LDR 或光敏电阻最适合这种情况。LDR 将面向人(就像手机传感器面向正面/人一样)并获取光强度数据。数据将由 Arduino 读取。那是范围从 0 到 1024 的模拟数据。
如果我们映射值(0 - 1024),我们可以控制亮度。我尝试使用 Arduino 的“键盘”库来使用 Arduino 按下功能按钮。这不起作用,它还会冻结硬件键盘(因为电脑知道键盘已经在工作)。
所以我将传感器数据发送到在 PC 上运行的 python 程序。其余的由 python 完成,我的意思是控制亮度。
现在,让我们开始制作吧。
为了证明我的概念,我首先在面包板上制作了电路。并编写了一个简单的程序,通过Arduino的串行监视器输出传感器数据(光强数据)。
这是我编写的程序(从 github 下载)-
// define sensor pin
int sensor_pin = A3;
void setup() {
// set things here
Serial.begin(9600); // init serial communication at 9600 bps
}
void loop() {
// mainloop
int sensorValue = analogRead(sensor_pin); // read the input on analog pin A3:
Serial.println(sensorValue); // send data over serial
delay(200); // a little delay to make things work better
}
我通过串行获得了一些输出数据。数据范围从 0 到 1024(理论上)。但实际上,没有 LDR 是完美的(即使在同一批次中也不行)。所以我得到了从 0 到 950 之类的数据。仍然有效。在我的应用程序中并不重要。
所以这是一个成功的测试,现在我可以继续下一步了。
我在easyEDA上使用了相同的电路并设计了PCB(印刷电路板)。您可以看到我使用了两个传感器,实际上这只是出于设计目的。有两个 LDR,它看起来像一只蜗牛。LDR_L 是未使用的 LDR。
然后我从PCBWay.com制作了 PCB 。PCBWay 是最好的也是我最喜欢的 PCB 制造商之一。只需 5 美元,我就可以获得 10 个 PCB!无论如何,我使用了他们的快速订购页面,然后是快速订购 pcb部分,上传了我的 PCB 并选择了颜色。而已!我认为快速订购部分对我们所有了解不多但只想完成它的人来说是一种祝福。从这里获取 PCB 。
我之前只用过黑色,它太亮了,这次我尝试了哑光黑色。等了大约 3-4 天后,我得到了漂亮的 PCB。质量一如既往地令人惊叹。焊盘、阻焊层、丝网印刷尽可能完美。我想我爱上了哑光黑。
现在是时候将东西焊接到位了。这很简单,因为那里没有太多组件。焊接所有东西,确保我没有吸入烙铁的烟雾。
我使用女性头,因为我是一个即插即用的人。您可以将 Arduino 板本身焊接在板上。
注意:不要吸入烙铁烟雾!它可能会导致癌症!
现在是时候上传Arduino的程序了。Arduino 使用串行通信将数据发送到 PC。
首先,我定义了传感器引脚,即传感器输入数据的 Arduino 引脚。
// define sensor pin
int sensor_pin = A3;
在设置功能中,我以 9600 的波特率开始串行通信。每次为 Arduino 板供电时,设置功能仅运行一次。
void setup() {
// set things here
Serial.begin(9600); // init serial communication at 9600 bps
}
然后在主循环中它获取数据并通过串行发送。保持 200ms 的一点延迟以使其顺利运行。
void loop() {
// mainloop
int sensorValue = analogRead(sensor_pin); // read the input on analog pin A3:
Serial.println(sensorValue); // send data over serial
delay(200); // a little delay to make things work better
}
这是完整的代码。从下面复制或从这里下载。
/* Computer Hack!
Brightness Controller
(C) License: GPL3-General Public License
author: ashraf minhaj
mail : ashraf_minhaj@yahoo.com
*/
// define sensor pin
int sensor_pin = A3;
void setup() {
// set things here
Serial.begin(9600); // init serial communication at 9600 bps
}
void loop() {
// mainloop
int sensorValue = analogRead(sensor_pin); // read the input on analog pin A3:
Serial.println(sensorValue); // send data over serial
delay(200); // a little delay to make things work better
}
打开 Arduino.ide 并将程序上传到我的 Arduino 板。
正如我们之前讨论的,Arduino 向 Arduino 发送数据,其余的由 python 完成。所以我写了一个简单的python脚本。
无论如何,如果您没有安装 python,请从这里安装最新版本。安装时请确保您已选中“将 python 添加到环境变量路径”框。
好的,然后我打开终端并安装了两个库,Pyserial和screen-brightness-control使用这些命令($ 符号表示它们为终端命令,复制没有它们) -
$ pip install pyserial
$ pip install screen-brightness-control
安装后,我编写了整个代码。但是,让我们向你们解释一下。
在这里,我导入库以使用它们。需要“serial.tools.list_ports”来自动检测Arduino板。
# import necessary libraries
import serial # for serial communication
import serial.tools.list_ports # to get Arduino port automatically
import screen_brightness_control as brightness # to control brightness
然后我声明 buad rate 和端口号。端口会自动检测到,所以我将其保留为空字符串。但对于我的董事会,buad rate 是 9600
BUAD_RATE = 9600 # Pro Micro's buad rate is 9600
PORT = ""
本节自动获取 USB 端口并尝试与 Arduino 连接
# get sender device port automatically
serial_ports = list(serial.tools.list_ports.comports()) # get list of ports
for s_port in serial_ports: # iterate through all ports
if 'Arduino Micro' in s_port.description: # look for Pro Micro board
PORT = str(s_port[0]) # select first found board and
break # proceed
# connect with sender device
sender = serial.Serial(PORT, BUAD_RATE)
这是将 Arduino 数据(从 0 到 1024)转换为 %data - 从 0 到 100 的函数。它称为映射。Python map 函数做了其他事情,所以我不得不写它(虽然从互联网上得到了一些帮助)。
def map_value(value, in_min=0, in_max=1024, out_min=0, out_max=100):
""" To map values. Arduio sends values from 0 to 1024. My goal
is to make them in between 0 to 100."""
return int((value - in_min) * (out_max - out_min) / (in_max - in_min) + out_min)
其余代码只是确保亮度保持在光强度水平
# mainloop
while 1:
# convert byte data into string then integer
sensor_value = int(sender.readline().decode("utf-8")) # get data
final_value = map_value(value=sensor_value) # map value (brightness in percentage)
#print(sensor_value)
print(final_value)
brightness.set_brightness(final_value) # set brightness
# close port properly so that others can use it
sender.close()
无论如何,最好关闭使用后打开的东西,无论是对话还是端口。
现在,我打开了我最喜欢的 python 编辑器并运行了程序。从github下载完整的程序。
""" Computer Hack!
Brightness Controller
(C) License: GPL3-General Public License
author: ashraf minhaj
mail : ashraf_minhaj@yahoo.com
"""
""" libraries -
$ pip install pyserial
$ pip install screen-brightness-control
"""
# import necessary libraries
import serial # for serial communication
import serial.tools.list_ports # to get Arduino port automatically
import screen_brightness_control as brightness # to control brightness
# device buadrate (bit per second)
# (change buadrate according to your need)
BUAD_RATE = 9600 # Pro Micro's buad rate is 9600
PORT = ""
# get sender device port automatically
serial_ports = list(serial.tools.list_ports.comports()) # get list of ports
for s_port in serial_ports: # iterate through all ports
if 'Arduino Micro' in s_port.description: # look for Pro Micro board
PORT = str(s_port[0]) # select first found board and
break # proceed
# connect with sender device
sender = serial.Serial(PORT, BUAD_RATE)
def map_value(value, in_min=0, in_max=1024, out_min=0, out_max=100):
""" To map values. Arduio sends values from 0 to 1024. My goal
is to make them in between 0 to 100."""
return int((value - in_min) * (out_max - out_min) / (in_max - in_min) + out_min)
# mainloop
while 1:
# convert byte data into string then integer
sensor_value = int(sender.readline().decode("utf-8")) # get data
final_value = map_value(value=sensor_value) # map value (brightness in percentage)
#print(sensor_value)
print(final_value)
brightness.set_brightness(final_value) # set brightness
# close port properly so that others can use it
sender.close()
最后,我用 USB 电缆将开发板连接到我的 PC。然后运行python程序。您可以在视频中看到其余的内容。它就像一个魅力!我以前从未对自己的工作如此满意。
现在我的电脑有点智能了。
制作快乐!!!
提示:为了节省电量,您可能需要削减 arduino LED 灯的痕迹。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !