通過(guò)這個(gè)項(xiàng)目控制 LED 亮度的開(kāi)啟、關(guān)閉和自動(dòng)更改,并發(fā)出警告,以提示周圍環(huán)境亮度的突然變化。
1、簡(jiǎn)介
該項(xiàng)目主要具有三個(gè)功能,即打開(kāi) LED、自行改變 LED 強(qiáng)度和關(guān)閉 LED。這些功能分別使用 Bolt Android 應(yīng)用程序中設(shè)計(jì)的三個(gè)按鈕進(jìn)行控制,即 ON、AUTO 和 OFF。單擊 AUTO 按鈕時(shí),LED 的亮度由使用光檢測(cè)電阻器 (LDR) 相對(duì)于周圍環(huán)境的光強(qiáng)度確定) 或光傳感器。LDR 的讀數(shù)映射到 LED 的強(qiáng)度范圍,并使用脈沖寬度調(diào)制 (PWM) 生成可變輸出。
注意:如果該系統(tǒng)用于監(jiān)測(cè)光敏環(huán)境的光強(qiáng)度,例如某種藥物儲(chǔ)存,那么光強(qiáng)度的突然變化可能是有害的。使用 Z 分?jǐn)?shù)分析檢測(cè)到這種突然變化,并使用 Telegram Bot 設(shè)置了警報(bào)系統(tǒng)以通知操作員。然后可以使用應(yīng)用程序立即打開(kāi)或關(guān)閉燈。
2、Telegram 上的警報(bào)通知
3. LED亮度自動(dòng)控制
在本節(jié)中,我們研究項(xiàng)目的“自動(dòng)”功能,即根據(jù)周圍環(huán)境的亮度自動(dòng)改變 LED 的強(qiáng)度。使用 LDR 測(cè)量周圍環(huán)境的亮度。
3.1 LED 和 LDR 的電路連接
下面給出了 LED 和 LDR 的電路連接以及螺栓模塊,用于根據(jù)周圍環(huán)境的亮度自動(dòng) LED 強(qiáng)度。
LDR 的輸入來(lái)自模擬引腳 A0,LED 的輸出寫入數(shù)字引腳 0。LDR 端子沒(méi)有極性。使用螺栓模塊的 3.3V 引腳為 LDR 供電。LDR 上的電阻隨著落在其上的光強(qiáng)度的變化而變化。由于 Bolt 模塊無(wú)法讀取電阻值,但可以讀取電壓值,因此制作了一個(gè)分壓器電路,并且 Bolt 模塊的輸入是 10k 電阻兩端的電壓(因?yàn)樗B接在 LDR 端子和地之間),這取決于關(guān)于 LDR 的電阻。LED 的較長(zhǎng)端子連接到較高的電位,較短的端子連接到較低的電位。這里較短的端子接地,較長(zhǎng)的端子通過(guò)串聯(lián)的 330k 電阻連接到數(shù)字引腳 0。數(shù)字引腳 0 輸出(取決于 LDR/A0 引腳輸入)充當(dāng) LED 的電源并因此確定。它的強(qiáng)度
3.2配置文件
該項(xiàng)目的 python 編碼已在 Ubuntu (Linux) 中完成。在我們開(kāi)始編寫 Python 中自動(dòng)控制 LED 亮度的代碼之前,我們需要制作一個(gè)配置文件,該文件將包含每個(gè)用戶/設(shè)備的特定鍵。我們將在我們的主代碼中導(dǎo)入這個(gè)文件并使用各種屬性。這樣做的好處是每個(gè)用戶只需更改配置文件的內(nèi)容即可使用該產(chǎn)品。
以下是配置文件(命名為 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 密鑰和設(shè)備 ID 可以如下確定:
按照https://cloud.boltiot.com/ 上的說(shuō)明將您的 Bolt 設(shè)備連接到 Bolt 云。
之后將出現(xiàn)以下屏幕。螺栓設(shè)備 ID 以黃色突出顯示。
轉(zhuǎn)到 API 部分以了解 API 密鑰。
3.3 LDR 值到 LED 值的映射
LDR 的取值范圍是從 0 到 1024,而 LED 的取值范圍是從 0 到 255。顯然,一對(duì)一映射是不可能的,但可以進(jìn)行大約 4:1 的映射。執(zhí)行如下:input_to_LED = 255 - (output_from_LDR / 4) LDR 的輸出從 255(LED 的最大強(qiáng)度)中減去,因?yàn)橛成浔仨毞聪蜻M(jìn)行,即周圍環(huán)境中的亮度越高,LED 的亮度越低。
3.4光強(qiáng)突變檢測(cè)(Z-評(píng)分分析)
Z分?jǐn)?shù)分析用于異常檢測(cè)。此處的異常是指變量的值(周圍環(huán)境的光強(qiáng)度)超出某個(gè)值范圍。值的范圍稱為界限(上限和下限)。這些界限是使用輸入值、幀大小和乘法因子計(jì)算的。幀大小是 Z 分?jǐn)?shù)分析所需的最小輸入值數(shù)量,乘法因子確定邊界與輸入值曲線的接近程度。
上面給出的是計(jì)算邊界的公式。這里輸入表示為“Vi”,“r”表示幀大小,“C”是乘法因子。首先,我們計(jì)算輸入值的平均值(Mn)(對(duì)于每個(gè)新輸入,再次計(jì)算平均值)。每個(gè)輸入值的變化(來(lái)自平均值)為 (Vi - Mn)^2。Z 分?jǐn)?shù) (Zn) 的計(jì)算如上所示(每個(gè)輸入值的變化平均值的平方根乘以乘法因子)。界限表示為“Tn”,上限計(jì)算為 (Vi + Zn),下限計(jì)算為 (Vi - Zn)。
幀大小和倍增因子是使用試錯(cuò)法確定的。
3.5創(chuàng)建 Telegram 頻道和機(jī)器人
安裝 Telegram App 并使用您的手機(jī)號(hào)碼登錄。然后按照以下步驟創(chuàng)建 Telegram 頻道。
在配置文件中,輸入 Telegram Bot ID(或令牌)。
要知道 Telegram Chat ID,首先向頻道發(fā)送消息。然后在瀏覽器中輸入以下網(wǎng)址:
https://api.telegram.org/bot《token》/getUpdates
(輸入令牌時(shí)省略“《”和“》”)
如下所示的 json 數(shù)組將出現(xiàn)具有 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. 打開(kāi)/關(guān)閉 LED
使用 Bolt 模塊的 digitalWrite() JavaScript 函數(shù),可以將 LED 的輸出設(shè)為“HIGH”或“LOW”,從而打開(kāi)或關(guān)閉 LED。只有一個(gè)輸入引腳可同時(shí)用于 ON 和 OFF 功能。由于數(shù)字引腳 0 用于自動(dòng)功能,因此我們將數(shù)字引腳 1 用于開(kāi)/關(guān)功能。但是我們不能同時(shí)將兩個(gè)不同的輸入引腳連接到 LED。因此,為了根據(jù)用戶的選擇一次只將一個(gè)輸入連接到 LED,我們使用 2:1 多路復(fù)用器。
4.1多路復(fù)用器的概念
上圖表示 2:1 多路復(fù)用器的功能。從真值表中我們看到,如果選擇行的值為“0”或“低”,則輸出等于輸入 0,如果選擇行的值為“1”或“高”,則輸出等于輸入1。我們使用Bolt模塊的數(shù)字引腳2給選擇線輸入。我們得出以下結(jié)論:
要使 ON/OFF 功能起作用,請(qǐng)選擇 Line = ‘1’,因此必須使用 digitalWrite() 函數(shù)將數(shù)字引腳 2 的值寫入為“HIGH”。此外,LED 是 ON 還是 OFF 將取決于寫入數(shù)字引腳 1 的值,即“HIGH”表示 LED 點(diǎn)亮,“LOW”表示 LED 熄滅。如果 Select Line = ‘0’ 則系統(tǒng)將使用 python 程序在 AUTO 模式下運(yùn)行,該程序?qū)⒅祵懭霐?shù)字引腳 0 并自動(dòng)化 LED 的強(qiáng)度
4.2使用基本門實(shí)現(xiàn) 2:1 多路復(fù)用器
S 代表選擇線,而 S‘ 代表它的否定。令P0、P1、P2分別代表數(shù)字引腳0、1、2的值。2:1多路復(fù)用器的布爾函數(shù)如下:輸出=S’.P0+S.P1;其中 S 是 P2 的輸入
顯然,要實(shí)現(xiàn)多路復(fù)用器,我們需要一個(gè)非門、兩個(gè)與門和一個(gè)或門。這些門的 IC 編號(hào)分別為 7404、7408 和 7432。2:1多路復(fù)用器的邏輯門圖和實(shí)現(xiàn)如下:
4.3 在 Bolt Cloud 上設(shè)置
轉(zhuǎn)到https://cloud.boltiot.com/ ,然后按照以下步驟操作:
4.4用戶界面設(shè)計(jì)
用戶界面使用 html 設(shè)計(jì)并使用 Bolt Android 應(yīng)用程序?qū)崿F(xiàn)。UI 與 Bolt 模塊的鏈接是使用 JavaScript 函數(shù) digitalWrite() 完成的。
設(shè)計(jì)的用戶界面如下圖所示:
4.5驗(yàn)收
到此項(xiàng)目所需的所有操作步驟都已經(jīng)完成了,試用你的自動(dòng)燈光監(jiān)控系統(tǒng)吧。
評(píng)論
查看更多