如何利用Bolt IoT实现自动灯光监控系统的设计

如何利用Bolt IoT实现自动灯光监控系统的设计,第1张

  通过这个项目控制 LED 亮度的开启、关闭和自动更改,并发出警告,以提示周围环境亮度的突然变化。

  1、简介

  该项目主要具有三个功能,即打开 LED、自行改变 LED 强度和关闭 LED。这些功能分别使用 Bolt Android 应用程序中设计的三个按钮进行控制,即 ON、AUTO 和 OFF。单击 AUTO 按钮时,LED 的亮度由使用光检测电阻器 (LDR) 相对于周围环境的光强度确定) 或光传感器。LDR 的读数映射到 LED 的强度范围,并使用脉冲宽度调制 (PWM) 生成可变输出。

  注意:如果该系统用于监测光敏环境的光强度,例如某种药物储存,那么光强度的突然变化可能是有害的。使用 Z 分数分析检测到这种突然变化,并使用 Telegram Bot 设置了警报系统以通知 *** 作员。然后可以使用应用程序立即打开或关闭灯。

  2、Telegram 上的警报通知

如何利用Bolt IoT实现自动灯光监控系统的设计,pYYBAGLfo-2AEkb8AAGBi-VQ5cY642.png,第2张

  3. LED亮度自动控制

  在本节中,我们研究项目的“自动”功能,即根据周围环境的亮度自动改变 LED 的强度。使用 LDR 测量周围环境的亮度。

  3.1 LED 和 LDR 的电路连接

  下面给出了 LED 和 LDR 的电路连接以及螺栓模块,用于根据周围环境的亮度自动 LED 强度。

如何利用Bolt IoT实现自动灯光监控系统的设计,poYBAGLfo-iAK7L5AAHRFOWMXMw926.png,第3张

  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 以黄色突出显示。

如何利用Bolt IoT实现自动灯光监控系统的设计,poYBAGLfo-GAJwuSAAC_6nv5_-A866.png,第4张

  转到 API 部分以了解 API 密钥。

如何利用Bolt IoT实现自动灯光监控系统的设计,pYYBAGLfo92AT0f2AADZWwiTyoQ793.png,第5张

  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 分数分析所需的最小输入值数量,乘法因子确定边界与输入值曲线的接近程度。

如何利用Bolt IoT实现自动灯光监控系统的设计,pYYBAGLfo9mAfweiAABzA_u8xnM393.png,第6张

  上面给出的是计算边界的公式。这里输入表示为“Vi”,“r”表示帧大小,“C”是乘法因子。首先,我们计算输入值的平均值(Mn)(对于每个新输入,再次计算平均值)。每个输入值的变化(来自平均值)为 (Vi - Mn)^2。Z 分数 (Zn) 的计算如上所示(每个输入值的变化平均值的平方根乘以乘法因子)。界限表示为“Tn”,上限计算为 (Vi + Zn),下限计算为 (Vi - Zn)。

  帧大小和倍增因子是使用试错法确定的。

  3.5创建 Telegram 频道和机器人

  安装 Telegram App 并使用您的手机号码登录。然后按照以下步骤创建 Telegram 频道。

如何利用Bolt IoT实现自动灯光监控系统的设计,pYYBAGLfo9SAdcquAAELjfY7Q_U389.png,第7张

  在配置文件中,输入 Telegram Bot ID(或令牌)。

  要知道 Telegram Chat ID,首先向频道发送消息。然后在浏览器中输入以下网址:

  https://api.telegram.org/bot《token》/getUpdates

  (输入令牌时省略“《”和“》”)

  如下所示的 json 数组将出现具有 Telegram 聊天 ID。Telegram 频道聊天 ID 被红色覆盖。

如何利用Bolt IoT实现自动灯光监控系统的设计,poYBAGLfo9CARvQJAAD_SnzgiYM982.png,第8张

  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功能)

如何利用Bolt IoT实现自动灯光监控系统的设计,pYYBAGLfo8aAPDCZAAGW-3hBiOk016.png,第9张

  4. 打开/关闭 LED

  使用 Bolt 模块的 digitalWrite() JavaScript 函数,可以将 LED 的输出设为“HIGH”或“LOW”,从而打开或关闭 LED。只有一个输入引脚可同时用于 ON 和 OFF 功能。由于数字引脚 0 用于自动功能,因此我们将数字引脚 1 用于开/关功能。但是我们不能同时将两个不同的输入引脚连接到 LED。因此,为了根据用户的选择一次只将一个输入连接到 LED,我们使用 2:1 多路复用器

  4.1多路复用器的概念

如何利用Bolt IoT实现自动灯光监控系统的设计,poYBAGLfo8GABUb6AABz2ALIoQ0666.png,第10张

  上图表示 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多路复用器的逻辑门图和实现如下:

如何利用Bolt IoT实现自动灯光监控系统的设计,poYBAGLfo72AOPT3AABMNTCTEKY817.png,第11张

  4.3 在 Bolt Cloud 上设置

  转到https://cloud.boltiot.com/ ,然后按照以下步骤 *** 作:

如何利用Bolt IoT实现自动灯光监控系统的设计,poYBAGLfo7iAOgZ4AADLU_SKbXY369.png,第12张

  4.4用户界面设计

  用户界面使用 html 设计并使用 Bolt Android 应用程序实现。UI 与 Bolt 模块的链接是使用 JavaScript 函数 digitalWrite() 完成的。

如何利用Bolt IoT实现自动灯光监控系统的设计,pYYBAGLfppSAOSrIAAB5k0Uhgd4192.png,第13张如何利用Bolt IoT实现自动灯光监控系统的设计,pYYBAGLfppuASvqBAABYcIH761w857.png,第14张如何利用Bolt IoT实现自动灯光监控系统的设计,poYBAGLfpqGAUBmsAABijSjNWEY620.png,第15张

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

如何利用Bolt IoT实现自动灯光监控系统的设计,poYBAGLfo7CAaAhAAACER6urt0o595.png,第16张

  4.5验收

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

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/dianzi/2711263.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-08-17
下一篇 2022-08-17

发表评论

登录后才能评论

评论列表(0条)

保存