舉一個實際生活中的例子,我想製造一種可以透過按下電燈開關來實現房間電燈自動打開的裝置。下面,我將會結合Arduino + 伺服馬達+ 3D 印表機 + Wi-Fi 模組來實現它!
注意:我們將要製造的自動電燈開關僅適用於按鈕式電燈開關系統。
我們從透過3D列印製造用於按下電燈開關按鈕的零件開始。
本次使用的伺服馬達是MG996R,其扭矩比之前的產品中使用的馬達扭矩更大。該伺服馬達的扭矩為9.4kg,工作電壓為4.8 – 6.6 V。我們還將使用ESP-WROOM-02 Wifi,並嘗試透過PC或智慧手機來行動伺服馬達,從而對開關進行控制操作。
我用膠帶將裝置固定在電燈開關上。
完成後,測試一下伺服馬達是否正常工作,是否可以打開電燈。
它做到了是嗎?太好了!我想您已經意識到了,我們剛剛所製備的開關只能用來打開電燈。不幸的是,這種開關不能用來關掉電燈或者再次打開電燈。我希望我們的開關在兩端都能夠被按下,從而實現自動打開和斷路電燈。
我們來測量一下房間電燈開關的寬度。我的開關大約是4cm。我認為最好在支撐零件上設計一些突出的結構,以便從兩端按下電燈的開關按鈕。因此,我用3D列印的方法製造了以下零件:
安裝到伺服馬達上後,我們將對ESP-WROOM-02模組編寫程式,以進行開關的遠端控制。
將該機械系統連接到安裝在房間中的無線路由器上,並且根據獲取的IP位址,我們可以提供一個操作伺服馬達的功能。
當ESP-WROOM-02開機時,我們可以設定一個報告伺服器,並連接外部API,以在從無線路由器獲取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 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
#include <ESP8266WiFi.h> #include <Servo.h> const char *ssid = "[wifi_ssid]"; const char *password = "[wifi_password]"; //IP report server configuration const char* host = "xxxx.xx.xxx"; String url = "/xxxx/"; Servo myservo; Servo myservo2; WiFiServer server(80); String IpAddress2String(const IPAddress& ipAddress) { return String(ipAddress[0]) + String(".") +\ String(ipAddress[1]) + String(".") +\ String(ipAddress[2]) + String(".") +\ String(ipAddress[3]) ; } void setup() { Serial.begin(115200); delay(10); Serial.println("Start!"); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); server.begin(); Serial.println("Server started"); Serial.println(WiFi.localIP()); //********************************************************* // IP address notification //********************************************************* WiFiClient client; const int httpPort = 80; if (!client.connect(host, httpPort)) { Serial.println("connection failed"); return; } url += IpAddress2String(WiFi.localIP()); client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"); delay(1000); Serial.print("Connecting url to "); Serial.println(url); //********************************************************************* } void loop() { WiFiClient client = server.available(); if (!client) { return; } Serial.println("new client"); while(!client.available()){ delay(1); } String req = client.readStringUntil('\r'); Serial.println(req); client.flush(); // Match the request int selectServo = 0; int posSlash0 = req.indexOf("/"); String tmp = req.substring(0,posSlash0); int posSlash1st = req.indexOf("/",1+posSlash0); String action = req.substring(1+posSlash0,posSlash1st); int posSlash2nd = req.indexOf("/",1+posSlash1st); String sel = req.substring(1+posSlash1st,posSlash2nd); int posSlash3rd = req.indexOf("/",1+posSlash2nd); String valueTmp = req.substring(1+posSlash2nd,posSlash3rd); int posSpace = valueTmp.indexOf(" "); String value = valueTmp.substring(0,posSpace); if(action == "favicon.ico HTTP"){ return; } //GET /servo/1/60 HTTP/1.1 Serial.print("POS:"); Serial.print(posSlash1st); Serial.print(":"); Serial.print(posSlash2nd); Serial.print(":"); Serial.println(posSlash3rd); Serial.print("ACTION:"); Serial.println(action); Serial.print("SELECT SERVO:"); Serial.println(sel); Serial.print("VALUE:"); Serial.println(value); if(sel == "0"){ myservo.write(value.toInt()); } client.flush(); String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>"; s += "<head><meta name='viewport' content='width=device-width, initial-scale=1'>"; s += "<link href='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css' rel='stylesheet' media='screen'>"; s += "<script type='text/javascript' src='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js'></script>"; s += "</head><body>"; s += "\r\nSERVO "; s += sel; s += " is "; s += String(value); s += "<div class='container'><div class='row'>"; s += "<div class='col-md-12'><h3>Servo0</h3></div>"; s += "<div class='col-md-12'><a class='btn btn-primary' href='/servo/0/0'>ON</a></div>\n"; s += "<div class='col-md-12'><a class='btn btn-info' href='/servo/0/50'>OFF</a></div>\n"; s += "<div class='col-md-12'><a class='btn btn-info' href='/servo/0/30'>STAY</a></div>\n"; s += "</div></div>"; s += "</body>"; s += "</html>\n"; client.print(s); delay(1); Serial.println("Client disonnected"); } |
如上述視訊所示,我能夠從我的PC端打開/斷路電燈。
今天,我們創建了一個伺服控制電燈開關,實現了無線和遠端控制。這些類型的裝置有很多用途。下次,我們將結合多個伺服馬達來製造一個相機穩定器或雲台,這是更有創意的一個項目。敬請期待!
相關文章:
使用Arduino控制馬達第三部分—製造一輛透過伺服馬達控制轉向的RC車