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();

}