本网页已闲置超过3分钟,按键盘任意键或点击空白处,即可回到网页

基于Bolt IoT的自动灯光监控系统

发布时间:2022-07-26
分享到:

基于Bolt IoT的自动灯光监控系统

发布时间:2022-07-26
分享到:

通过这个项目控制 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() 完成的。html 代码如下:

<!DOCTYPE html>
<html>
   <head>
       <title>Automated Light Monitoring System</title>
       <script type="text/javascript" src="https://cloud.boltiot.com/static/js/boltCommands.js">
       </script>
       <script>
       setKey('{{ApiKey}}','{{Name}}');
       </script>
   </head>
   <body>
       <center>
       <div class="ON">
           <button class="button button1" onclick="digitalWrite(1, 'HIGH');digitalWrite(2, 'HIGH');">ON</button>
       </div>
       <div class="AUTO">
           <button class="button button2" onclick="digitalWrite(2, 'LOW');">AUTO</button>
       </div>
       <div class="OFF">
           <button class="button button3" onclick= "digitalWrite(1, 'LOW');digitalWrite(2, 'HIGH');">OFF</button>
       </div>
       </center>
       <style type="text/css">
           body {
               margin:0;
               padding:0;
           }
           div {
               height: 33.3vh;
               width: 60.9vh;
               align-content: center;
           }
           .ON{background-color: #FFFFFF;}
           .AUTO{background-color: #2f3640;}
           .OFF{background-color: #FFFFFF;}
           .button {
               border: none;
               color: white;
               padding: 15px 32px;
               text-align: center;
               width:200px;
               height:80px;
               text-decoration: none;
               display: block;
               font-size: 35px;
               font-family: Arial, Helvetica, sans-serif;
               box-shadow: 1px 1px 6px 0px black;
           }
           .button1 {background-color: #4CAF50;
               position: absolute;
               top: 10%;
               left:22%;
           }
           .button2 {background-color: #03A9F4;
               position: absolute;
               top: 43.5%;
               left:22%;
           }
           .button3 {background-color: #F44336;
               position: absolute;
               top: 76.5%;
               left:22%;
           }
       </style>
    </body>
</html>

设计的用户界面如下图所示:

4.5验收

到此项目所需的所有操作步骤都已经完成了,试用你的自动灯光监控系统吧。

如果您对此项目有任何想法、意见或问题,请在下方留言。

以上内容翻译自网络,原作者:Srishti Rastogi,如涉及侵权,可联系删除。

加入微信技术交流群

技术交流,职业进阶

关注与非网服务号

获取电子工程师福利

加入电路城 QQ 交流群

与技术大牛交朋友

讨论