Сохранение состояния реле в EEPROM
- Войдите на сайт для отправки комментариев
Пнд, 08/12/2014 - 17:10
Добрый день. Нужна помощь.
Собрал на основе Mega2560 и ethernet shild'a веб сервер для управления реле. Но есть проблема: при перезагрузке ардуины состояние реле не сохраняется. Пробовал сохранять состояние реле в EEPROM, но у меня не вышло.
Готово решения не нашел. Прошу помочь в данном вопросе. Пример кода управления реле (код не мой, найден на просторах интернета):
#include <SPI.h> #include <Ethernet.h> byte mac[] = { 0xCA, 0xAF, 0x78, 0x1C, 0x13, 0x77 }; //mac - адрес ethernet shielda byte ip[] = { 192, 168, 1, 155 }; // ip адрес ethernet shielda byte subnet[] = { 255, 255, 255, 0 }; //маска подсети EthernetServer server(80); //порт сервера int numPins = 4; //кол-во реле int pins[] = { 30, 31, 32, 33 }; // Пины для реле int pinState[] = {0, 0, 0, 0}; // Состояние пинов void setup(){ // Изначально выключаем все реле for (int i = 0; i < numPins; i++) { pinMode(pins[i], OUTPUT); digitalWrite(pins[i], 1); } Ethernet.begin(mac, ip, subnet); Serial.begin(9600); } void loop() { EthernetClient client = server.available(); if (client) { while (client.connected()) { int dataCount = client.available(); if (dataCount > 0) { // Считываем данные передаваемые серверу с клиента for (int i = 0; i < dataCount; i++) { char ch = client.read(); // Если данные передаются, то они будут переданы POST запросом, который начинается с символа 'P' if (i == 0 && ch != 'P') break; if (ch == '\n' && i < dataCount - 1) { // Находим строку, в которой содержатся передаваемые данные char chNext = client.read(); if (chNext == 'r') { // Выключаем все реле pinState[0] = 0; pinState[1] = 0; pinState[2] = 0; pinState[3] = 0; // Считываем первый номер реле, который нужно включить char relayNum = client.read(); pinState[relayNum-'0'] = 1; Serial.write(relayNum); // Считываем вспомогательную информацию (=on&) relayNum = client.read(); relayNum = client.read(); relayNum = client.read(); relayNum = client.read(); // Пока есть данные об остальных реле, считываем и заносим в массив pinState while (relayNum != -1) { relayNum = client.read(); relayNum = client.read(); pinState[relayNum-'0'] = 1; Serial.write(relayNum); relayNum = client.read(); relayNum = client.read(); relayNum = client.read(); relayNum = client.read(); } } else { // Если не было передано данных, то выключаем все реле pinState[0] = 0; pinState[1] = 0; pinState[2] = 0; pinState[3] = 0; } } } } // В соответствие с переданными данными включаем реле for (int i = 0; i < 4; i++) { digitalWrite(pins[i], !pinState[i]); } // =============Формируем HTML-страницу================================================= client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println(); client.println("<head> "); client.println("<meta http-equiv='Content-Type' content='text/html; charset=utf-8' /> "); client.println("<title>Arduino WEB-сервер</title>"); client.println("</head> "); client.println("<body"); client.println("<hr />"); client.println("<h1>Arduino WEB-сервер</h1>"); client.println("==============================");//линия===================================== //==============Вывод значений на web-страницу============================ client.println("<h3>Управление реле</h3>"); client.println("<form method='post'>"); client.print("<div>Реле 1 <input type='checkbox' "); if (pinState[0] == 1) client.print("checked"); client.println(" name='r0'></div>"); client.print("<div>Реле 2 <input type='checkbox' "); if (pinState[1] == 1) client.print("checked"); client.println(" name='r1'></div>"); client.print("<div>Реле 3 <input type='checkbox' "); if (pinState[2] == 1) client.print("checked"); client.println(" name='r2'></div>"); client.print("<div>Реле 4 <input type='checkbox' "); if (pinState[3] == 1) client.print("checked"); client.println(" name='r3'></div>"); client.println("<br> "); client.println("<input type='submit' value='Применить'>"); client.println("</form>"); client.println("</body></html>"); client.stop(); } } }
Вы уверены, что ваши реле выключаются нулем?
А где сохранение в еепром?
Вы уверены, что ваши реле выключаются нулем?
Да, код работает корректно
А где сохранение в еепром?
так как не работало, я его не сохранил(
Привет.вот тебе скетч,я его нашел в нете...на базе его и скетча как у тебя я сделал себе не плохое удаленное управление(в этом мне не понравилось что страница автоматом перегружается при изменении хоть одного реле,мне больше нравится когда порасставлял галочки,а потом нажал применить).в нем реализовано сохранение состояния пинов в память..обрати внимание,там сохраняется по прошествии минуты бездействия клиента,так что найди строку и поменяй к примеру на секунду,чтоб после каждого изменения состояния пина тут же сохраняло.. ..все отлично работает,так что ковыряй,там еще много полезных вещей есть для новичка...чтобы реле управлялись низким уровнем,там надо в самом начале один boolean изменить true на false(или наоборот,уже забыл),переведи коментарии на русский и станет все ясно...