Возникла потребность удаленно наживать на кнопку домофона. Собрал в эзернет розетке связку из ардуинки и сетевого контроллера и релюшки на 5 В.
Из двух готовых проектов собрал зомби-быдло-код
Сделал пассивный PoE адаптер, поставил на место.
Код под катом (компилировалось в IDE 1,8,5), необходима библиотека Ethercard
/* Подключение "ENC28J60 Module" к Arduino.
VCC - 3.3V
GND - GND
SCK - Pin 13
SO - Pin 12
SI - Pin 11
CS - Pin 10 Можна выбрать любой. */
#include <EtherCard.h> // Необходима библиотека https://github.com/jcw/ethercard
// уникальный MAC Address
static byte mymac[] = {0x5A,0x5A,0x5A,0x5A,0x5A,0x5A};
// IP адрес
static byte myip[] = { 192,168,1,11 };
// Буфер
byte Ethernet::buffer[900];
BufferFiller bfill;
int LedPins = 4;
const char http_OK[] PROGMEM =
"HTTP/1.0 200 OK\r\n"
"Content-Type: text/html\r\n"
"Pragma: no-cache\r\n\r\n";
const char http_Found[] PROGMEM =
"HTTP/1.0 302 Found\r\n"
"Location: /\r\n\r\n";
const char http_Unauthorized[] PROGMEM =
"HTTP/1.0 401 Unauthorized\r\n"
"Content-Type: text/html\r\n\r\n"
"<h1>401 Unauthorized</h1>";
//------------
void homePage()
{
bfill.emit_p(PSTR("$F"
"<title>Arduino Door Open Webserver</title>"
"<p align='center'>"
"<input type=submit value='OPEN DOOR' style=width:50%;height:200px onClick=location.href='http://192.168.1.11/?ArduinoPIN4=on'><br>"
"</p>"),
http_OK);
}
void setup()
{
Serial.begin(9600);
if (ether.begin(sizeof Ethernet::buffer, mymac,10) == 0);
//получение адреса от DHCP
//if (!ether.dhcpSetup());
//ether.printIp("My Router IP: ", ether.myip);
//работа со статичным IP адресом
ether.staticSetup(myip);
ether.printIp("My SET IP: ", ether.myip);
pinMode(LedPins,OUTPUT);
digitalWrite (LedPins,LOW);
}
void loop()
{
delay(1);
word len = ether.packetReceive(); // check for ethernet packet
word pos = ether.packetLoop(len); // check for tcp packet
if (pos) {
bfill = ether.tcpOffset();
char *data = (char *) Ethernet::buffer + pos;
if (strncmp("GET /", data, 2) != 0) {
bfill.emit_p(http_Unauthorized);
}
else {
data += 5;
if (data[0] == ' ') {
homePage(); // Return home page
}
else if (strncmp("?ArduinoPIN4=on ", data, 16) == 0) {
//PinStatus = true;
digitalWrite(LedPins,HIGH);
delay (500);
digitalWrite(LedPins,LOW);
bfill.emit_p(http_Found);
}
else {
// Page not found
bfill.emit_p(http_Unauthorized);
}
}
ether.httpServerReply(bfill.position()); // send http response
}
}