2.1 網路控制開關
本程式預設可以控制五路開關,還可以再增加,但因為Arduino 的 D10、D11、D12、D13 預設給SPI介面,不能用
因此可用的腳位為 D2 ~ D9 與 A0(14)~A5(19),最多可控制14路開關
增加腳位的方式,可以將下列藍色程式碼的部分依數字遞增的方式新增即可。
本人認為,像小米檯燈一樣,需要透過APP來控制燈光實在不方便,
這樣不就每一台行動裝置都要安裝小米智能家庭APP?
所以把控制網頁寫在物聯網伺服器內,只要可以上網的裝置,就能透過瀏覽器進入控制網頁控制
手機畫面
本實作可透過 http://192.168.1.101/ 連線
程式碼
#include "SPI.h"
#include "Ethernet.h"
#include "WebServer.h"
#include "Streaming.h"
const byte LED1_PIN = 8;
const byte LED2_PIN = 7;
const byte LED3_PIN = 6;
const byte LED4_PIN = 5;
const byte LED5_PIN = 4;
boolean state[7];
static byte mac[] = { 0xF0, 0x7B, 0xCB, 0x4B, 0x7C, 0x9F };
IPAddress ip(192, 168, 1, 101);
IPAddress subnet(255, 255, 255, 0);
IPAddress gateway(192, 168, 1, 1);
WebServer webserver("", 80);
P(htmlHead) =
"<!doctype html><html>"
"<head><meta charset=\"utf-8\">"
"<meta name=\"viewport\" content=\"width=device-width; initial-scale=2.0; maximum-scale=2.0; user-scalable=0;\">"
"<title>Arduino 微網站</title>"
"</head><body>"
"<form method=\"POST\" action=\"/\">";
P(htmlFoot) = "<br><br><input name=\"button\" type=\"submit\"value=\"送出\">"
"</form>"
"</body></html>";
P(state1_0) = "燈光1:<input name=\"light1\" type=\"radio\" value=\"ON\"> 開"
"<input name=\"light1\" type=\"radio\" value=\"OFF\" checked> 關"
"<br>" ;
P(state1_1) = "燈光1:<input name=\"light1\" type=\"radio\" value=\"ON\" checked> 開"
"<input name=\"light1\" type=\"radio\" value=\"OFF\" > 關"
"<br>" ;
P(state2_0) = "燈光2:<input name=\"light2\" type=\"radio\" value=\"ON\"> 開"
"<input name=\"light2\" type=\"radio\" value=\"OFF\" checked> 關"
"<br>" ;
P(state2_1) = "燈光2:<input name=\"light2\" type=\"radio\" value=\"ON\" checked> 開"
"<input name=\"light2\" type=\"radio\" value=\"OFF\" > 關"
"<br>" ;
P(state3_0) = "燈光3:<input name=\"light3\" type=\"radio\" value=\"ON\"> 開"
"<input name=\"light3\" type=\"radio\" value=\"OFF\" checked> 關"
"<br>" ;
P(state3_1) = "燈光3:<input name=\"light3\" type=\"radio\" value=\"ON\" checked> 開"
"<input name=\"light3\" type=\"radio\" value=\"OFF\" > 關"
"<br>" ;
P(state4_0) = "燈光4:<input name=\"light4\" type=\"radio\" value=\"ON\"> 開"
"<input name=\"light4\" type=\"radio\" value=\"OFF\" checked> 關"
"<br>" ;
P(state4_1) = "燈光4:<input name=\"light4\" type=\"radio\" value=\"ON\" checked> 開"
"<input name=\"light4\" type=\"radio\" value=\"OFF\" > 關"
"<br>" ;
P(state5_0) = "燈光5:<input name=\"light5\" type=\"radio\" value=\"ON\"> 開"
"<input name=\"light5\" type=\"radio\" value=\"OFF\" checked> 關"
"<br>" ;
P(state5_1) = "燈光5:<input name=\"light5\" type=\"radio\" value=\"ON\" checked> 開"
"<input name=\"light5\" type=\"radio\" value=\"OFF\" > 關"
"<br>" ;
void defaultCmd(WebServer &server, WebServer::ConnectionType type, char *, bool){
server.httpSuccess();
char name[16], value[16];
while (server.readPOSTparam(name, 16, value, 16)){
if (strcmp(name, "light1") == 0) {
if (strcmp(value, "ON") == 0) {
digitalWrite(LED1_PIN, HIGH);
state[1]=1;
} else {
digitalWrite(LED1_PIN, LOW);
state[1]=0;
}
}
if (strcmp(name, "light2") == 0) {
if (strcmp(value, "ON") == 0) {
digitalWrite(LED2_PIN, HIGH);
state[2]=1;
} else {
digitalWrite(LED2_PIN, LOW);
state[2]=0;
}
}
if (strcmp(name, "light3") == 0) {
if (strcmp(value, "ON") == 0) {
digitalWrite(LED3_PIN, HIGH);
state[3]=1;
} else {
digitalWrite(LED3_PIN, LOW);
state[3]=0;
}
}
if (strcmp(name, "light4") == 0) {
if (strcmp(value, "ON") == 0) {
digitalWrite(LED4_PIN, HIGH);
state[4]=1;
} else {
digitalWrite(LED4_PIN, LOW);
state[4]=0;
}
}
if (strcmp(name, "light5") == 0) {
if (strcmp(value, "ON") == 0) {
digitalWrite(LED5_PIN, HIGH);
state[5]=1;
} else {
digitalWrite(LED5_PIN, LOW);
state[5]=0;
}
}
}
if (type != WebServer::HEAD) {
server.printP(htmlHead);
if(state[1]==1){
server.printP(state1_1);
}else{
server.printP(state1_0);
}
if(state[2]==1){
server.printP(state2_1);
}else{
server.printP(state2_0);
}
if(state[3]==1){
server.printP(state3_1);
}else{
server.printP(state3_0);
}
if(state[4]==1){
server.printP(state4_1);
}else{
server.printP(state4_0);
}
if(state[5]==1){
server.printP(state5_1);
}else{
server.printP(state5_0);
}
// server.printP(homePage);
server.printP(htmlFoot);
}
}
void setup() {
pinMode(LED1_PIN, OUTPUT);
pinMode(LED2_PIN, OUTPUT);
pinMode(LED3_PIN, OUTPUT);
pinMode(LED4_PIN, OUTPUT);
pinMode(LED5_PIN, OUTPUT);
Ethernet.begin(mac, ip, gateway, subnet);
webserver.setDefaultCommand(&defaultCmd); // 處理「首頁」請求
webserver.begin();
}
void loop() {
webserver.processConnection();
}
加入 mDNS 功能
本實作可透過 http://tomorrows.local/ 連入控制網頁
或透過 http://192.168.1.101/ 連線
程式碼
#include "SPI.h"
#include "Ethernet.h"
#include "WebServer.h"
#include "Streaming.h"
#include <EthernetBonjour.h>
const byte LED1_PIN = 8;
const byte LED2_PIN = 7;
const byte LED3_PIN = 6;
const byte LED4_PIN = 5;
const byte LED5_PIN = 4;
boolean state[7];
static byte mac[] = { 0xF0, 0x7B, 0xCB, 0x4B, 0x7C, 0x9F };
IPAddress ip(192, 168, 1, 101);
IPAddress subnet(255, 255, 255, 0);
IPAddress gateway(192, 168, 1, 1);
WebServer webserver("", 80);
P(htmlHead) =
"<!doctype html><html>"
"<head><meta charset=\"utf-8\">"
"<meta name=\"viewport\" content=\"width=device-width; initial-scale=2.0; maximum-scale=2.0; user-scalable=0;\">"
"<title>Arduino 微網站</title>"
"</head><body>"
"<form method=\"POST\" action=\"/\">";
P(htmlFoot) = "<br><br><input name=\"button\" type=\"submit\"value=\"送出\">"
"</form>"
"</body></html>";
P(state1_0) = "燈光1:<input name=\"light1\" type=\"radio\" value=\"ON\"> 開"
"<input name=\"light1\" type=\"radio\" value=\"OFF\" checked> 關"
"<br>" ;
P(state1_1) = "燈光1:<input name=\"light1\" type=\"radio\" value=\"ON\" checked> 開"
"<input name=\"light1\" type=\"radio\" value=\"OFF\" > 關"
"<br>" ;
P(state2_0) = "燈光2:<input name=\"light2\" type=\"radio\" value=\"ON\"> 開"
"<input name=\"light2\" type=\"radio\" value=\"OFF\" checked> 關"
"<br>" ;
P(state2_1) = "燈光2:<input name=\"light2\" type=\"radio\" value=\"ON\" checked> 開"
"<input name=\"light2\" type=\"radio\" value=\"OFF\" > 關"
"<br>" ;
P(state3_0) = "燈光3:<input name=\"light3\" type=\"radio\" value=\"ON\"> 開"
"<input name=\"light3\" type=\"radio\" value=\"OFF\" checked> 關"
"<br>" ;
P(state3_1) = "燈光3:<input name=\"light3\" type=\"radio\" value=\"ON\" checked> 開"
"<input name=\"light3\" type=\"radio\" value=\"OFF\" > 關"
"<br>" ;
P(state4_0) = "燈光4:<input name=\"light4\" type=\"radio\" value=\"ON\"> 開"
"<input name=\"light4\" type=\"radio\" value=\"OFF\" checked> 關"
"<br>" ;
P(state4_1) = "燈光4:<input name=\"light4\" type=\"radio\" value=\"ON\" checked> 開"
"<input name=\"light4\" type=\"radio\" value=\"OFF\" > 關"
"<br>" ;
P(state5_0) = "燈光5:<input name=\"light5\" type=\"radio\" value=\"ON\"> 開"
"<input name=\"light5\" type=\"radio\" value=\"OFF\" checked> 關"
"<br>" ;
P(state5_1) = "燈光5:<input name=\"light5\" type=\"radio\" value=\"ON\" checked> 開"
"<input name=\"light5\" type=\"radio\" value=\"OFF\" > 關"
"<br>" ;
void defaultCmd(WebServer &server, WebServer::ConnectionType type, char *, bool){
server.httpSuccess();
char name[16], value[16];
while (server.readPOSTparam(name, 16, value, 16)){
if (strcmp(name, "light1") == 0) {
if (strcmp(value, "ON") == 0) {
digitalWrite(LED1_PIN, HIGH);
state[1]=1;
} else {
digitalWrite(LED1_PIN, LOW);
state[1]=0;
}
}
if (strcmp(name, "light2") == 0) {
if (strcmp(value, "ON") == 0) {
digitalWrite(LED2_PIN, HIGH);
state[2]=1;
} else {
digitalWrite(LED2_PIN, LOW);
state[2]=0;
}
}
if (strcmp(name, "light3") == 0) {
if (strcmp(value, "ON") == 0) {
digitalWrite(LED3_PIN, HIGH);
state[3]=1;
} else {
digitalWrite(LED3_PIN, LOW);
state[3]=0;
}
}
if (strcmp(name, "light4") == 0) {
if (strcmp(value, "ON") == 0) {
digitalWrite(LED4_PIN, HIGH);
state[4]=1;
} else {
digitalWrite(LED4_PIN, LOW);
state[4]=0;
}
}
if (strcmp(name, "light5") == 0) {
if (strcmp(value, "ON") == 0) {
digitalWrite(LED5_PIN, HIGH);
state[5]=1;
} else {
digitalWrite(LED5_PIN, LOW);
state[5]=0;
}
}
}
if (type != WebServer::HEAD) {
server.printP(htmlHead);
if(state[1]==1){
server.printP(state1_1);
}else{
server.printP(state1_0);
}
if(state[2]==1){
server.printP(state2_1);
}else{
server.printP(state2_0);
}
if(state[3]==1){
server.printP(state3_1);
}else{
server.printP(state3_0);
}
if(state[4]==1){
server.printP(state4_1);
}else{
server.printP(state4_0);
}
if(state[5]==1){
server.printP(state5_1);
}else{
server.printP(state5_0);
}
// server.printP(homePage);
server.printP(htmlFoot);
}
}
void setup() {
pinMode(LED1_PIN, OUTPUT);
pinMode(LED2_PIN, OUTPUT);
pinMode(LED3_PIN, OUTPUT);
pinMode(LED4_PIN, OUTPUT);
pinMode(LED5_PIN, OUTPUT);
Ethernet.begin(mac, ip, gateway, subnet);
webserver.setDefaultCommand(&defaultCmd); // 處理「首頁」請求
webserver.begin();
EthernetBonjour.begin("tomorrows"); //紅字的tomorrows 可以修改
EthernetBonjour.addServiceRecord("tomorrows.Web._http", //紅字可以修改
80,
MDNSServiceTCP);
}
void loop() {
EthernetBonjour.run();
webserver.processConnection();
}
改由按鈕來控制燈光
本實作可透過 http://tomorrows.local/ 連入控制網頁
或透過 http://192.168.1.101/ 連線
手機連線介面
程式碼
#include "SPI.h"
#include "Ethernet.h"
#include "WebServer.h"
#include "Streaming.h"
#include <EthernetBonjour.h>
const byte LED1_PIN = 8;
const byte LED2_PIN = 7;
const byte LED3_PIN = 6;
const byte LED4_PIN = 5;
const byte LED5_PIN = 4;
boolean state[7];
static byte mac[] = { 0xF0, 0x7B, 0xCB, 0x4B, 0x7C, 0x9F };
IPAddress ip(192, 168, 1, 101);
IPAddress subnet(255, 255, 255, 0);
IPAddress gateway(192, 168, 1, 1);
WebServer webserver("", 80);
P(htmlHead) =
"<!doctype html><html>"
"<head><meta charset=\"utf-8\">"
"<meta name=\"viewport\" content=\"width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;\">"
"<meta http-equiv=\"refresh\" content=\"30\">" //3 表示每30秒更新一次,可修改
"<title>Arduino 微網站</title>"
"</head><body>"
"<form method=\"POST\" action=\"/\">";
P(htmlFoot) = "</form>"
"</body></html>";
P(LED1) = "燈光1:<input name=\"light1\" type=\"submit\" value=\"ON\">-- "
"<input name=\"light1\" type=\"submit\" value=\"OFF\"> ";
P(LED2) = "燈光2:<input name=\"light2\" type=\"submit\" value=\"ON\">-- "
"<input name=\"light2\" type=\"submit\" value=\"OFF\"> ";
P(LED3) = "燈光3:<input name=\"light3\" type=\"submit\" value=\"ON\">-- "
"<input name=\"light3\" type=\"submit\" value=\"OFF\"> ";
P(LED4) = "燈光4:<input name=\"light4\" type=\"submit\" value=\"ON\">-- "
"<input name=\"light4\" type=\"submit\" value=\"OFF\"> ";
P(LED5) = "燈光5:<input name=\"light5\" type=\"submit\" value=\"ON\">-- "
"<input name=\"light5\" type=\"submit\" value=\"OFF\"> ";
P(ON) = "---狀態:ON<br><br>";
P(OFF) = "---狀態:OFF<br><br>";
void defaultCmd(WebServer &server, WebServer::ConnectionType type, char *, bool){
server.httpSuccess();
char name[16], value[16];
while (server.readPOSTparam(name, 16, value, 16)){
if (strcmp(name, "light1") == 0) {
if (strcmp(value, "ON") == 0) {
digitalWrite(LED1_PIN, HIGH);
state[1]=1;
} else {
digitalWrite(LED1_PIN, LOW);
state[1]=0;
}
}
if (strcmp(name, "light2") == 0) {
if (strcmp(value, "ON") == 0) {
digitalWrite(LED2_PIN, HIGH);
state[2]=1;
} else {
digitalWrite(LED2_PIN, LOW);
state[2]=0;
}
}
if (strcmp(name, "light3") == 0) {
if (strcmp(value, "ON") == 0) {
digitalWrite(LED3_PIN, HIGH);
state[3]=1;
} else {
digitalWrite(LED3_PIN, LOW);
state[3]=0;
}
}
if (strcmp(name, "light4") == 0) {
if (strcmp(value, "ON") == 0) {
digitalWrite(LED4_PIN, HIGH);
state[4]=1;
} else {
digitalWrite(LED4_PIN, LOW);
state[4]=0;
}
}
if (strcmp(name, "light5") == 0) {
if (strcmp(value, "ON") == 0) {
digitalWrite(LED5_PIN, HIGH);
state[5]=1;
} else {
digitalWrite(LED5_PIN, LOW);
state[5]=0;
}
}
}
if (type != WebServer::HEAD) {
server.printP(htmlHead);
server.printP(LED1);
if(state[1]==1){
server.printP(ON);
}else{
server.printP(OFF);
}
server.printP(LED2);
if(state[2]==1){
server.printP(ON);
}else{
server.printP(OFF);
}
server.printP(LED3);
if(state[3]==1){
server.printP(ON);
}else{
server.printP(OFF);
}
server.printP(LED4);
if(state[4]==1){
server.printP(ON);
}else{
server.printP(OFF);
}
server.printP(LED5);
if(state[5]==1){
server.printP(ON);
}else{
server.printP(OFF);
}
// server.printP(homePage);
server.printP(htmlFoot);
}
}
void setup() {
pinMode(LED1_PIN, OUTPUT);
pinMode(LED2_PIN, OUTPUT);
pinMode(LED3_PIN, OUTPUT);
pinMode(LED4_PIN, OUTPUT);
pinMode(LED5_PIN, OUTPUT);
Ethernet.begin(mac, ip, gateway, subnet);
webserver.setDefaultCommand(&defaultCmd); // 處理「首頁」請求
webserver.begin();
EthernetBonjour.begin("tomorrows"); //紅字的tomorrows 可以修改
EthernetBonjour.addServiceRecord("tomorrows.Web._http", //紅字可以修改
80,
MDNSServiceTCP);
}
void loop() {
EthernetBonjour.run();
webserver.processConnection();
}