目录
6. 伺服控制电灯开关
举一个实际生活中的例子,我想制造一种可以通过按下电灯开关来实现房间电灯自动打开的设备。下面,我将会结合Arduino + 伺服电机+ 3D 打印机 + Wi-Fi 模块来实现它!
注意:我们将要制造的自动电灯开关仅适用于按钮式电灯开关系统。
我们从通过3D打印制造用于按下电灯开关按钮的部件开始。
本次使用的伺服电机是MG996R,其扭矩比之前的产品中使用的电机扭矩更大。该伺服电机的扭矩为9.4kg,工作电压为4.8 – 6.6 V。我们还将使用ESP-WROOM-02 Wifi,并尝试通过PC或智能手机来移动伺服电机,从而对开关进行控制操作。
我用胶带将设备固定在电灯开关上。
完成后,测试一下伺服电机是否正常工作,是否可以打开电灯。
它做到了是吗?太好了!我想您已经意识到了,我们刚刚所制备的开关只能用来打开电灯。不幸的是,这种开关不能用来关掉电灯或者再次打开电灯。我希望我们的开关在两端都能够被按下,从而实现自动打开和关闭电灯。
我们来测量一下房间电灯开关的宽度。我的开关大约是4cm。我认为最好在支撑部件上设计一些突出的结构,以便从两端按下电灯的开关按钮。因此,我用3D打印的方法制造了以下部件:
安装到伺服电机上后,我们将对ESP-WROOM-02模块编写程序,以进行开关的远程控制。
7. 电灯开关的远程控制
将该机械系统连接到安装在房间中的无线路由器上,并且根据获取的IP地址,我们可以提供一个操作伺服电机的功能。
当ESP-WROOM-02开机时,我们可以设置一个报告服务器,并连接外部API,以在从无线路由器获取IP地址后,通过电子邮件转发IP地址。
#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车