Далее начинается самое интересное - программирование контроллера Ардуино УНО.
Для взаимодействия с Ethernet платой расширения я использовал стандартную библиотеку, которая идет вместе со средой разработки Ардуино ИДЕ.
Там в примерах я нашел отличный и понятный скетч вэб сервера и на его базе создал свой скетч, слегка модифицировав его.
Так как управлять светодиодами на Ардуино я уже умею
я сразу же в скетче вэб сервера прописал на HTML отображение двух кнопок с передачей параметров и условие отслеживающее эти параметры и выполняющее действие- включение и выключение светодиодов. Далее я вместо светодиодов подсоединил входы модулей реле.
После того как я испытал тестовый скетч я сразу же столкнулся первой проблемой - ардуино сбрасывала состояние выходов при отключении питания, и мне это не понравилось.
Я решил реализовать запись параметров о состоянии выходов в энергонезависимую память EEPROM контроллера ATMega328.
И при включении Ардуино считывать сохраненную информацию о состоянии до выключения питания и соответственно включать или выключать соответствующие выходы.
Для записи и считывания данных из EEPROM я воспользовался библиотекой которая есть в стандартном комплекте Ардуино ИДЕ.
После успешных испытаний появилась еще одна проблема
Мне захотелось отображать реальное состояние розеток в вэб интерфейсе для удаленного управления.
И я решил использовать для этого еще 2 цифровых входа Ардуино УНО.
На эти входы я распаял резисторы 500 Ом и подсоединил их ко входам обмоток реле, таким образом если на реле подано питание, оно включает своими контактами напряжение в розетках и через резисторы я снимаю состояние наличия напряжения на обмотках и меняю по условию строчки кона в скетче , которые меняют HTML разметкой цвет в ячейке таблицы.
Еще разок протестировав я остановился на этом варианте, наконец то меня все устроило
Выкладываю скетч сетевой розетки
- Код: выделить все
*
Arduino - WEB Remote control and secondary control power condition, Saving state swith when power is removed.
*/
#include <SPI.h>
#include <Ethernet.h>
#include <EEPROM.h>
int led1 = 4;
int led2 = 5;
int led3 = 6;
int in1 = 8;
int in2 = 9;
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //mac address
byte ip[] = { 192.168.1.58}; //ip address
byte gateway[] = { 192.168.1.1 }; //ip gateway
byte subnet[] = { 255.255.255.0 }; //ip mask
EthernetServer server(80); //ip port
String readString;
void setup() {
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(in1, INPUT);
pinMode(in2, INPUT);
// start the Ethernet connection and the server:
Ethernet.begin(mac, ip, gateway, subnet);
server.begin();
digitalWrite(led3, HIGH);
if (EEPROM.read(5)==1){digitalWrite(led1, LOW);};
if (EEPROM.read(5)==2){digitalWrite(led1, HIGH);};
if (EEPROM.read(3)==1){digitalWrite(led2, LOW);};
if (EEPROM.read(3)==2){digitalWrite(led2, HIGH);};
}
void loop() {
// Create a client connection
EthernetClient client = server.available();
if (client) {
while (client.connected()) {
if (client.available()) {
char c = client.read();
//read char by char HTTP request
if (readString.length() < 100) {
//store characters to string
readString += c;
//Serial.print(c);
}
//if HTTP request has ended
if (c == '\n') {
client.println("HTTP/1.1 200 OK"); //send new page
client.println("Content-Type: text/html");
client.println();
client.println("<HTML>");
client.println("<HEAD>");
client.println("<meta http-equiv= refresh content=5; >");
client.println("<style>a { text-decoration: none;} </style>");
client.println("</HEAD>");
client.println("<BODY bgcolor=#EEE5DE>");
client.println("<center>");
client.println("<b>NETCONT</b><br>WEB Remote Control System.<br><br>");
client.println("<table border=1 width=230px bgcolor=#FFFFFF>");
//--------------------1-------------------------------------
client.println("<tr><td><center>1</td>");
if (digitalRead(in1)==HIGH){
client.println("<td bgcolor=#7FFF00><center><a href=\"/?1off\"\"><br>ON<br><br></a></td></tr>");
} else {
client.println("<td bgcolor=#FF6347><center><a href=\"/?1on\"\"><br>OFF<br><br></a></td></tr>");
};
//----------------------2------------------------------------
client.println("<tr><td><center>2</td>");
if (digitalRead(in2)==HIGH){
client.println("<tr bgcolor=#7FFF00><center><a href=\"/?2off\"\"><br>ON<br><br></a></td></tr>");
} else {
client.println("<td bgcolor=#FF6347><center><a href=\"/?2on\"\"><br>OFF<br><br></a></td></tr>");
};
client.println("</table>");
client.println("<center><br><br>Secondary control power 2 contact<br>Saving state when power is removed");
delay(1);
//stopping client
client.stop();
//controls the Arduino if you press the buttons
if (readString.indexOf("?1on") >0){
digitalWrite(leds1, HIGH);
EEPROM.write(0, 2);
}
if (readString.indexOf("?1off") >0){
digitalWrite(leds1, LOW);
EEPROM.write(0, 1);
}
if (readString.indexOf("?2on") >0){
digitalWrite(leds2, HIGH);
EEPROM.write(1, 2);
}
if (readString.indexOf("?2off") >0){
digitalWrite(leds2, LOW);
EEPROM.write(1, 1);
}
readString="";
}
}
}
}
}