Можно расширить до 16 реле.
При подаче команды http://192.168.1.61/ генерирует ответ состояния всех выходов:
{"Relay_0":0 ,"Relay_1":0 ,"Relay_2":0 ,"Relay_3":0 ,"Relay_4":0 ,"Relay_5":0 ,"Relay_6":0 ,"Relay_7":0 }
При подаче команды http://192.168.1.61/sw_on=1 rele 1 на PIN 3 включится и ответ получим такой:
{"Relay_0":0 ,"Relay_1":1 ,"Relay_2":0 ,"Relay_3":0 ,"Relay_4":0 ,"Relay_5":0 ,"Relay_6":0 ,"Relay_7":0 }
т.е. если разобрать команду http://192.168.1.61/sw_on=1 то будет:
http://192.168.1.61/- адрес
sw_on - включить
sw_off - выключить
=1 - номер реле (0,1,2,3,4,5,6,7).
Как заставить МДМ читать ответ и менять свойства объекта, пока не разобрался, ко этот скеч можно использовать, если не так важно знать состояние реле.
СпойлерПоказать
Код: Выделить всё
/*
Ethernet shield nano or Ethernet ENC28j60
To turn on the relay, just enter the link in the browser
http://192.168.1.61/sw_on=1 "1" is the relay number.
To turn off the relay
http://192.168.1.61/sw_off=1
In response we get a JSON relay state {"sw_0":0 ,"sw_1":0 }.
*/
//#include <UIPEthernet.h> // Used for Ethernet ENC28j60
//**********************//
#include <WebServer.h> // Used only with W5100 or W5500
#include <Ethernet.h> //
#include <SPI.h> //
//*********************//
#define PIN_RELAY_0 2
#define PIN_RELAY_1 3
#define PIN_RELAY_2 4
#define PIN_RELAY_3 5
#define PIN_RELAY_4 6
#define PIN_RELAY_5 7
#define PIN_RELAY_6 8
#define PIN_RELAY_7 9
// **** ETHERNET SETTING ****
// Ethernet MAC address - must be unique on your network
byte mac[] = { 0x41, 0x44, 0x41, 0x43, 0x48, 0x41 };
//Ethernet interface IP address (unique in your network)
IPAddress ip(192, 168, 1, 61);
//ethernet interface IP port (80 = http)
EthernetServer server(80);
EthernetClient client;
String str = "";
void setup() {
Serial.begin(115200);
Serial.print("START");
pinMode(PIN_RELAY_0, OUTPUT);
pinMode(PIN_RELAY_1, OUTPUT);
pinMode(PIN_RELAY_2, OUTPUT);
pinMode(PIN_RELAY_3, OUTPUT);
pinMode(PIN_RELAY_4, OUTPUT);
pinMode(PIN_RELAY_5, OUTPUT);
pinMode(PIN_RELAY_6, OUTPUT);
pinMode(PIN_RELAY_7, OUTPUT);
SW(0, LOW);
SW(1, LOW);
SW(2, LOW);
SW(3, LOW);
SW(4, LOW);
SW(5, LOW);
SW(6, LOW);
SW(7, LOW);
// start the Ethernet connection and the server:
Ethernet.begin(mac, ip);
server.begin();
Serial.print("IP Address: ");
Serial.println(Ethernet.localIP());
Serial.println();
}
void loop() {
client = server.available();
if( client ){
Serial.println("BEGIN-------------->\n");
boolean currentLineIsBlank = true;
String line = "";
bool firstLine = true;
while (client.connected()){
if (client.available()) {
char c = client.read();
Serial.print(c);
if (c == '\n' && currentLineIsBlank) {
String html = "{";
for(int i=0; i<8; i++){
if( SW_state(i) ){
html += "\"Relay_"+String(i)+"\":1 "; //html += "\"sw_"+String(i)+"\":1 ";
}else{
html += "\"Relay_"+String(i)+"\":0 "; //html += "\"sw_"+String(i)+"\":0 ";
}
if( i<7 ) html += ",";
}
html += "}";
client.println(html);
break;
}
if (c == '\n') {
currentLineIsBlank = true;
if( firstLine ) {
firstLine = false;
Serial.println("-------------------------------" + line);
if( line.indexOf( "sw_on=0" ) >= 0 ){SW(0, HIGH);}
else if( line.indexOf( "sw_off=0" ) >= 0 ){SW(0, LOW);}
else if( line.indexOf( "sw_on=1" ) >= 0 ){SW(1, HIGH);}
else if( line.indexOf( "sw_off=1" ) >= 0 ){SW(1, LOW);}
else if( line.indexOf( "sw_on=2" ) >= 0 ){SW(2, HIGH);}
else if( line.indexOf( "sw_off=2" ) >= 0 ){SW(2, LOW);}
else if( line.indexOf( "sw_on=3" ) >= 0 ){SW(3, HIGH);}
else if( line.indexOf( "sw_off=3" ) >= 0 ){SW(3, LOW);}
else if( line.indexOf( "sw_on=4" ) >= 0 ){SW(4, HIGH);}
else if( line.indexOf( "sw_off=4" ) >= 0 ){SW(4, LOW);}
else if( line.indexOf( "sw_on=5" ) >= 0 ){SW(5, HIGH);}
else if( line.indexOf( "sw_off=5" ) >= 0 ){SW(5, LOW);}
else if( line.indexOf( "sw_on=6" ) >= 0 ){SW(6, HIGH);}
else if( line.indexOf( "sw_off=6" ) >= 0 ){SW(6, LOW);}
else if( line.indexOf( "sw_on=7" ) >= 0 ){SW(7, HIGH);}
else if( line.indexOf( "sw_off=7" ) >= 0 ){SW(7, LOW);}
}
}else if (c != '\r') {
currentLineIsBlank = false;
if( firstLine ) {
line = line + c;
}
}
}
}
delay(10);
client.stop();
Serial.println("END-------------->\n");
}
}
bool SW_state(byte num){
bool val;
switch(num){
case 0: val = digitalRead(PIN_RELAY_0); break;
case 1: val = digitalRead(PIN_RELAY_1); break;
case 2: val = digitalRead(PIN_RELAY_2); break;
case 3: val = digitalRead(PIN_RELAY_3); break;
case 4: val = digitalRead(PIN_RELAY_4); break;
case 5: val = digitalRead(PIN_RELAY_5); break;
case 6: val = digitalRead(PIN_RELAY_6); break;
case 7: val = digitalRead(PIN_RELAY_7); break;
}
return !val;
}
void SW(byte num, bool val){
val = !val;
switch(num){
case 0: digitalWrite(PIN_RELAY_0, val); break;
case 1: digitalWrite(PIN_RELAY_1, val); break;
case 2: digitalWrite(PIN_RELAY_2, val); break;
case 3: digitalWrite(PIN_RELAY_3, val); break;
case 4: digitalWrite(PIN_RELAY_4, val); break;
case 5: digitalWrite(PIN_RELAY_5, val); break;
case 6: digitalWrite(PIN_RELAY_6, val); break;
case 7: digitalWrite(PIN_RELAY_7, val); break;
}
}