如果您對科技領域有一定瞭解的話,一定聽說過“loT(物聯網)”一詞。其概念是將每個裝置都連接到互聯網上,從而實現裝置與裝置之間、使用者與裝置之間的相互通信。而其中具有突破性的工具之一就是將ESP8266序列至Wi-Fi晶片。今天,我們將透過解讀Arduino的研發思想來製作一個使用該晶片的兒童安全鎖。我稱它為“兒童安全鎖”,但是您可以將其用於任何想要上鎖物件,並且只能在某些特定情況下才能打開。例如,使您的室友(或您自己)無法拿到冰箱裡那些誘人的餅乾。
專案清單:
該部分代碼可以在https://github.com/gasparnori/iot_lock獲取
連接ESP8266進行程式設計
這種晶片有很多優點,但同時也有很多缺點。它成本低,相對簡單,並且用途十分廣泛,但是在使用的時候很容易遇到一些陷阱。基於板載電平轉換器和切換的模組也許可以説明您避免這些問題,但是請謹記以下幾點:
與ESP通信
現在您已經建立了連接,我們來看看您的晶晶片況如何。有幾種Arduino序列通信工具可以使用,其中我認為ESPlorer是最佳選擇。下載後,只需直接運行ESPlorer.jar檔即可。設定好您的埠和通信速率(序列傳輸速率),通常設定為115200,但是可能某些裝置需要設定為其他不同的速率,如果設定為115200無法正常工作,請嘗試其他的值直到找到最佳值為止。首先,為了檢查通信是否正常,請按下重置按鈕,如果能夠看到一條歡迎使用的資訊,證明您可以正常進行下一步操作。然後可以嘗試操作左上角的一些指令,比如簡單的AT指令,或連接到本地的Wi-Fi網路。現在我們可以準備對模組進行程式設計了。
對ESP8266進行程式設計
有兩種控制晶片的方法。可以使用Arduino研發板,透過序列埠進行簡單的AT指令操作實現控制(也就是您剛剛操作過的指令)。或者用一種更簡單的方式:直接上傳代碼到晶片上。在本課程中,我們選擇第二種方式。打開Arduino IDE,進入Tools–>Board–>Board Manager,找到ESP板,然後進行安裝。
新建一個草圖,進入Tools–>Board並選擇您的ESP模組。另外,請確保在Tools–>Port中選擇正確的埠。
現在,將以下代碼複製到您的草圖中,將晶片轉換為程式設計模式,按下重新開機按鈕,然後開始程式設計。上傳代碼後,再將其調回“uart mode”,再按下重新開機按鈕,然後再次打開ESPlorer,查看模組返回的內容。如果一切正常,您將會看到兩條資訊,一個是您所連接的Wi-Fi,另一個是您的IP位址。在瀏覽器中打開您的IP位址,應該看到以下資訊:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
#include <ESP8266WiFi.h> #include <ESP8266WebServer.h> //Your ssid and password const char* ssid = "...."; const char* password = "....."; ESP8266WebServer server(80); //This form will be sent to your browser, when the device is locked String form_closed = "<html>" "<head>" "</head>" "<body>" "<center>" "<img width='200px' src='https://www.endlessicons.com/wp-content/uploads/2012/12/lock-icon-614x460.png'>" "<form action='msg'> <p>Do you really need that chocolate?</p>" "<select name='msg'>" "<option value='open'>Yesssssss</option>" "<option value='close'>No, I continue my diet...</option>" "</select>" "<input type='submit' value='Open'></form>" "</center>" "</body>" "</html>"; //this form will be sent to your browser, when the device is open //there is a redirect link in the html to the main page String form_open = "<html>" "<head>" "<meta http-equiv='refresh' content='3;url=/' />" "</head>" "<body>" "<center>" "<h1>Voillaaaa </h1>" "<img width='400px' src='https://www.clipartreview.com/_images_300/A_refrigerator_with_an_open_door_100429-171689-937009.jpg'>" "</center>" "</body>" "</html>"; void handleMessage(){ String state= server.arg("msg"); Serial.println(state); if(state=="close"){ server.send(200, "text/html", form_closed); } else{ server.send(200, "text/html", form_open); //after 3 seconds closes back either way delay(3000); Serial.println("close"); } } void setup(void){ //open Serial port Serial.begin(115200); //open Wifi connection WiFi.begin(ssid, password); Serial.println("Serial started..."); // Wait for connection while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("Wifi connected to "); Serial.println(ssid); Serial.print("IP address: "); Serial.println(WiFi.localIP()); //handling the form itself server.on("/msg", handleMessage); //handling the main site server.on("/", [](){ server.send(200, "text/html", form_closed); }); //handling wrong url server.onNotFound([](){ server.send(404, "text/plain", "File Not Foundnn"); }); server.begin(); Serial.println("HTTP server started"); } void loop(void){ server.handleClient(); } |
代碼說明
當您打開網站時,將會看到一個html主頁,如果您想要打開兒童安全鎖,則網站會將您重置向到“/msg?msg=open”或者“/msg?msg=close” URL。在該URL中,您將看到另一個html頁面,並停留3秒鐘,然後會再次跳轉到第一個頁面上。幸運的是,大多數的重置向都是透過html代碼來完成的,伺服器只需要將每個可能的URL與返回的html網站(form_closed 和form_open事件)相關聯即可。為了將html與URL相關聯,我們使用server.on函數(url, handler)。最重要的通信過程在handleMessage函數中實現。伺服器從URL中讀取mag參數,並將其作為打開或者斷路兒童安全鎖的指令在序列埠發送出去。
如果一切運行正常,我們就準備將它連接到一個真正的Arduino裝置上。
Arduino 設定
從Arduino的角度來說,我們所使用的是非常簡單的設定。雖然螺線管的最高工作電壓為12V,但是目前在該應用中,5V的工作電壓以及Arduino的輸出引腳提供的電流已經足以使電磁鐵工作(但是如果您想要一個更高能量的電磁鐵,透過借助電晶體或者繼電器就可以很容易地達到提升的目的)。因此,卸下USB轉換器,並且將序列埠與地面連接在一起,然後,再次由穩壓器向兩個裝置提供Vin。
請謹記以下幾點:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
int lock=8; void setup() { pinMode(lock, OUTPUT); digitalWrite(lock, HIGH); Serial.begin(115200); } void loop() { while (!Serial.available()) {}; //reading the answer to a string String a= Serial.readString(); if (a=="openrn") { digitalWrite(lock, LOW); }; if (a=="closern") { digitalWrite(lock, HIGH); }; } |
讓我們來把它們放在一起:
對於這個鎖來說我使用了一個塑膠棒來穩定螺線管,並且使用一顆硬幣充當能夠產生磁力的東西以保證在工作狀態中能夠保持兒童安全鎖的功能。如果您打算使用在冰箱或者其他金屬門上,那麼可能就沒這個必要了。
總結
在這裡,我們透過使用一個小螺線管和ESP8266模組,創建了一個可運行的IoT兒童安全鎖。ESP模組作為伺服器,透過本地IP位址提供了鎖定訪問途徑。透過按一下網站上的按鈕來實現開啟或斷路該兒童安全鎖,該網站在任何與ESP所連接的相同Wi-Fi上的裝置上都可以使用。