通过这个项目控制 led 亮度的开启、关闭和自动更改,并发出警告,以提示周围环境亮度的突然变化。
1、简介
该项目主要具有三个功能,即打开 led、自行改变 led 强度和关闭 led。这些功能分别使用 bolt android 应用程序中设计的三个按钮进行控制,即 on、auto 和 off。单击 auto 按钮时,led 的亮度由使用光检测电阻器 (ldr) 相对于周围环境的光强度确定) 或光传感器。ldr 的读数映射到 led 的强度范围,并使用脉冲宽度调制 (pwm) 生成可变输出。
注意:如果该系统用于监测光敏环境的光强度,例如某种药物储存,那么光强度的突然变化可能是有害的。使用 z 分数分析检测到这种突然变化,并使用 telegram bot 设置了警报系统以通知操作员。然后可以使用应用程序立即打开或关闭灯。
2、telegram 上的警报通知
3. led亮度自动控制
在本节中,我们研究项目的“自动”功能,即根据周围环境的亮度自动改变 led 的强度。使用 ldr 测量周围环境的亮度。
3.1 led 和 ldr 的电路连接
下面给出了 led 和 ldr 的电路连接以及螺栓模块,用于根据周围环境的亮度自动 led 强度。
ldr 的输入来自模拟引脚 a0,led 的输出写入数字引脚 0。ldr 端子没有极性。使用螺栓模块的 3.3v 引脚为 ldr 供电。ldr 上的电阻随着落在其上的光强度的变化而变化。由于 bolt 模块无法读取电阻值,但可以读取电压值,因此制作了一个分压器电路,并且 bolt 模块的输入是 10k 电阻两端的电压(因为它连接在 ldr 端子和地之间),这取决于关于 ldr 的电阻。led 的较长端子连接到较高的电位,较短的端子连接到较低的电位。这里较短的端子接地,较长的端子通过串联的 330k 电阻连接到数字引脚 0。数字引脚 0 输出(取决于 ldr/a0 引脚输入)充当 led 的电源并因此确定。它的强度
3.2配置文件
该项目的 python 编码已在 ubuntu (linux) 中完成。在我们开始编写 python 中自动控制 led 亮度的代码之前,我们需要制作一个配置文件,该文件将包含每个用户/设备的特定键。我们将在我们的主代码中导入这个文件并使用各种属性。这样做的好处是每个用户只需更改配置文件的内容即可使用该产品。
以下是配置文件(命名为 conf.py):
api_key = “xxxx” //bolt cloud api key
device_id = “boltxxxx” //device id of the bolt module
telegram_chat_id = “-xxxx” //chat id of the created telegram channel
telegram_bot_id = “botxxxx” //bot id of the created telegram bot
frame_size = 10 //frame size for z score analysis
mul_factor = 1 //multiplication factor for z score analysis
bolt 模块的 api 密钥和设备 id 可以如下确定:
按照https://cloud.boltiot.com/ 上的说明将您的 bolt 设备连接到 bolt 云。
之后将出现以下屏幕。螺栓设备 id 以黄色突出显示。
转到 api 部分以了解 api 密钥。
3.3 ldr 值到 led 值的映射
ldr 的取值范围是从 0 到 1024,而 led 的取值范围是从 0 到 255。显然,一对一映射是不可能的,但可以进行大约 4:1 的映射。执行如下:input_to_led = 255 - (output_from_ldr / 4) ldr 的输出从 255(led 的最大强度)中减去,因为映射必须反向进行,即周围环境中的亮度越高,led 的亮度越低。
3.4光强突变检测(z-评分分析)
z分数分析用于异常检测。此处的异常是指变量的值(周围环境的光强度)超出某个值范围。值的范围称为界限(上限和下限)。这些界限是使用输入值、帧大小和乘法因子计算的。帧大小是 z 分数分析所需的最小输入值数量,乘法因子确定边界与输入值曲线的接近程度。
上面给出的是计算边界的公式。这里输入表示为“vi”,“r”表示帧大小,“c”是乘法因子。首先,我们计算输入值的平均值(mn)(对于每个新输入,再次计算平均值)。每个输入值的变化(来自平均值)为 (vi - mn)^2。z 分数 (zn) 的计算如上所示(每个输入值的变化平均值的平方根乘以乘法因子)。界限表示为“tn”,上限计算为 (vi + zn),下限计算为 (vi - zn)。
帧大小和倍增因子是使用试错法确定的。
3.5创建 telegram 频道和机器人
安装 telegram app 并使用您的手机号码登录。然后按照以下步骤创建 telegram 频道。
在配置文件中,输入 telegram bot id(或令牌)。
要知道 telegram chat id,首先向频道发送消息。然后在浏览器中输入以下网址:
https://api.telegram.org/bot《token》/getupdates
(输入令牌时省略“《”和“》”)
如下所示的 json 数组将出现具有 telegram 聊天 id。telegram 频道聊天 id 被红色覆盖。
3.6 ‘auto’ 功能的完整代码
import requests, json, time, math, statistics //import various python libraries
from boltiot import bolt
//import the boltiot module from the bolt python library
import conf //import the configuration file
//---------function to compute bounds or z score analysis------------//
def compute_bounds(history_data, frame_size, factor):
//function to compute bounds
if len(history_data) frame_size:
del history_data[0:len(history_data) - frame_size]
mn = statistics.mean(history_data)
variance = 0
for data in history_data:
variance += math.pow((data-mn),2)
zn = factor * math.sqrt(variance/frame_size)
high_bound = history_data[frame_size -1] +zn
low_bound = history_data[frame_size - 1] - zn
return [high_bound, low_bound] //returns low bound and high bound
//---------------function for telegram alerts----------------------//
def send_telegram_message(message):
url = https://api.telegram.org/+ conf.telegram_bot_id +/sendmessage
data = {
chat_id: conf.telegram_chat_id,
text: message
}
try:
response = requests.request(
get
url,
params=data
)
print(telegram response:)
print(response.text)
telegram_data = json.loads(response.text)
return telegram_data[ok]
except exception as e:
print(an error occurred in sending the alert message via telegram)
print(e)
return false
//-----------------------------------------------------------------//
mybolt = bolt(conf.api_key, conf.device_id) //to identify your bolt device
history_data = [] //array of input values from ldr
while true:
//---------------------read input from ldr--------------------------//
response_ldr = mybolt.analogread('a0') //read input from ldr at a0 pin
ldr_data = json.loads(response_ldr)//retrieve the input data in json format
if ldr_data['success']!='1':
print(there was an error while retrieving the data)
print(ldr_data['value'])
time.sleep(10)
continue
try:
sensor_value = int(data_ldr['value'])
//store current input value in variable
except e:
print(there was an error while parsing the response)
print(e)
continue
print(ldr sensor value is: +str(sensor_value)) //print ldr input value
print(response_ldr)
//----------------------monitoring intensity of led--------------------------//
led_value_1 = int(sensor_value/4)
if led_value-1 > 255:
led_value_1 = 255
led_value = 255 - led_value_1//output value to led based on ldr input value
response_led = mybolt.analogwrite('0', led_value) //write output at pin 0
print(automated led value is: +str(led_value)) //print led output value
print(response_led)
//----------------performing z score analysis--------------------------//
bound = compute_bounds(history_data, conf.frame_size, conf.mul_factor)
//call compute_bounds function
//-------------collecting sufficient data for z score analysis---------//
if not bound:
//if number of inputs are not sufficient to do z score analysis
required_data_count = conf.frame_size - len(history_data) -1
if (required_data_count != 0 and required_data_count != 1):
print(not enough data to compute z score. need,required_data_count,more data points.)
elif (required_data_count == 1):
print(not enough data to compute z score. need 1 more data point.)
else:
print(enough data to compute z score.)
history_data.append(int(ldr_data['value']))
//append each new input to array history_data[]
time.sleep(10) //wait for 10 seconds
continue
//-----------detecting anomaly and sending alerts--------------//
try:
if sensor_value > bound[0]: //if input crosses upper bound
print(the light level has increased suddenly.)
message = the light intensity has increased suddenly. the current value is +str(sensor_value)+. the automated led intensity is +str(led_value)+.
telegram_status = send_telegram_message(message)
print(telegram status:,telegram_status)
elif sensor_value < bound[1]: //if input crosses lower bound
print(the light level has decreased suddenly.)
message = the light intensity has decreased suddenly. the current value is +str(sensor_value)+. the automated led intensity is +str(led_value)+.
telegram_status = send_telegram_message(message)
print(telegram status:,telegram_status)
history_data.append(sensor_value)
//append each new input to array history_data[]
except exception as e:
print(error)
print(e)
time.sleep(10) //wait for 10 seconds
3.7 python代码输出截图(auto功能)
4. 打开/关闭 led
使用 bolt 模块的 digitalwrite() javascript 函数,可以将 led 的输出设为“high”或“low”,从而打开或关闭 led。只有一个输入引脚可同时用于 on 和 off 功能。由于数字引脚 0 用于自动功能,因此我们将数字引脚 1 用于开/关功能。但是我们不能同时将两个不同的输入引脚连接到 led。因此,为了根据用户的选择一次只将一个输入连接到 led,我们使用 2:1 多路复用器。
4.1多路复用器的概念
上图表示 2:1 多路复用器的功能。从真值表中我们看到,如果选择行的值为“0”或“低”,则输出等于输入 0,如果选择行的值为“1”或“高”,则输出等于输入1。我们使用bolt模块的数字引脚2给选择线输入。我们得出以下结论:
要使 on/off 功能起作用,请选择 line = ‘1’,因此必须使用 digitalwrite() 函数将数字引脚 2 的值写入为“high”。此外,led 是 on 还是 off 将取决于写入数字引脚 1 的值,即“high”表示 led 点亮,“low”表示 led 熄灭。如果 select line = ‘0’ 则系统将使用 python 程序在 auto 模式下运行,该程序将值写入数字引脚 0 并自动化 led 的强度
4.2使用基本门实现 2:1 多路复用器
s 代表选择线,而 s‘ 代表它的否定。令p0、p1、p2分别代表数字引脚0、1、2的值。2:1多路复用器的布尔函数如下:输出=s’.p0+s.p1;其中 s 是 p2 的输入
显然,要实现多路复用器,我们需要一个非门、两个与门和一个或门。这些门的 ic 编号分别为 7404、7408 和 7432。2:1多路复用器的逻辑门图和实现如下:
4.3 在 bolt cloud 上设置
转到https://cloud.boltiot.com/ ,然后按照以下步骤操作:
4.4用户界面设计
用户界面使用 html 设计并使用 bolt android 应用程序实现。ui 与 bolt 模块的链接是使用 javascript 函数 digitalwrite() 完成的。
设计的用户界面如下图所示:
4.5验收
到此项目所需的所有操作步骤都已经完成了,试用你的自动灯光监控系统吧。
基于欧/美/日/韩对氢燃料电池的战略布局的详细解析
研究人员开发出新型数学模型的应用与人工智能的复杂性和训练
科大讯飞股份有限公司与北京外国语大学正式签署校企战略合作协议
区块链技术架构是如何成型的
什么是能源互联网_它有哪些运作模式
如何利用Bolt IoT实现自动灯光监控系统的设计
高铁的电从哪里来?高铁上停电该怎么办?
易华录打造普陀数绘治理体系
日本Seven Dreamers公司开发一种名为Laundroid的洗衣折叠机器人
5G+教育大势所趋,运营商赋能智慧校园建设
孔板流量计的优缺点,孔板流量计的安装要点
西云数据运营的亚马逊云科技中国(宁夏)区域(数据中心一期) 入选2022年度国家绿色数据中心
Socket 771
2020年智能手机市场出现反弹,益于5G网络的逐渐商用
徕声RT-1圈铁入耳式耳机怎么样 好不好用
氮化镓(GaN)功率器件技术解析
12V 输入至 1.0V、1.5V 和 3.3V 输出 (在 10A) 降压型稳压器
第四代IGBT和第七代IGBT的性能对比
DAC0832引脚图管脚图及内部电路框图
紫光展锐发布全球首款LTE Cat.1bis物联网专用芯片