通过这个项目控制 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:
return none
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验收
到此项目所需的所有 *** 作步骤都已经完成了,试用你的自动灯光监控系统吧。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)