Имею uno + enternet shield + модуль реле переделываю скетч под удаленное включение компа вроде все работает но немогу реализовать отключение реле по отжатию кнопки, так как работает физическая кнопка Power. помогите дописать функцию Код (Text): #include <SPI.h> #include <Ethernet.h> byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // Мак адрес byte ip[] = { 192, 168, 0, 177 }; // IP адрес (В броузере вводим 192.168.0.2) EthernetServer server(8090); int numPins = 1; // каличество задействованных пинов int pins[] = { 2}; // Пины для реле int pinState[] = {1}; // Состояние пинов void setup() { // Изначально выключаем все реле for (int i = 0; i < numPins; i++) { pinMode(pins[i], OUTPUT); digitalWrite(pins[i], 0); } Serial.begin(9600); Ethernet.begin(mac, ip); server.begin(); } 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(); // Формат строки r2=on&r3=on&r4=on (Пример если нужно включены 2,3,4 реле) if (chNext == 'r') { // Выключаем все реле pinState[0] = 0; // Считываем первый номер реле, который нужно включить char relayNum = client.read(); pinState[relayNum-'0'] = 1; Serial.write(relayNum); // Считываем вспомогательную информацию (=on&) relayNum = client.read(); // Пока есть данные об остальных реле, считываем и заносим в массив pinState while (relayNum != -1) { relayNum = client.read(); relayNum = client.read(); pinState[relayNum-'0'] = 0; 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 < 1; i++) // i < 1; единица количество задействованных пинов { digitalWrite(pins[i], !pinState[i]); } // Выводим HTML страницу, на которой пользователь может включить или выключить нужные ему реле client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println(); client.println("<html>"); client.println("<head>"); client.println("<title>Power ON PC</title>"); client.println("</head>"); client.println("<body>"); client.println("<h3>Power ON PC</h3>"); client.println("<form method='post'>"); client.print("<div>PowerON<input type='checkbox' "); if (pinState[0] == 0) client.print("checked"); client.println(" name='r0'></div>"); client.println("<br>"); client.println("<input type='submit' value='Refresh'>"); client.println("</form>"); client.println("</body>"); client.println("</html>"); client.stop(); } } }
Кнопку Power подключи к Arduino и обрабатывай нажатие. Кстати рекомендую использовать библиотеку Bounce.
как я понял вы предлагаете к ардруино подключить кнопку, вопрос а зачем если мне надо эмалировать нажатие кнопки на системнике
Значит нужно просто обработать POST запрос, в PHP это делается так echo $_POST["r0"]; Отсылаешь данные на эту же страницу http://192.168.0.2/ Смотришь, что в клиент Read // char c = client.read(); Парсишь строку и отсылаешь ардуинке чтобы нажала кнопку power В ардуино до этого еще недошел (не было Ethernet в амперке) Вот почитай про разбор HTTP ответа. http://forum.arduino.cc/index.php?topic=44646.0 Вот тут описалово вэб сервера http://playground.arduino.cc/Code/WebServer
Хаааа, я только нижний кусок кода увидел. У тя же там строка формируется // Формат строки r2=on&r3=on&r4=on r2=on&r3=on&r4=on&r0=1 тут просто обработай r0
Не получится я в командировку уехал r2=on&r3=on&r4=on&r0=1 можно обяснить что это за строка я её не понял
int dataCount = client.available(); //Вот эта строка судя по коду проверяет сколько символов в строке запроса. Запрос у тебя формируется вот так вот http://192.168.0.2/?r2=on&r3=on&r4=on&r0=1. Посмотри, что в строке браузера написано. !!! Но почему то в коде он ищет букву P в строке. И если она есть то далее смотрит, что в переменных и включает реле. for (int i = 0; i < dataCount; i++) { char ch = client.read(); } Вот этот цикл, у тебя считывает по символьно строку запроса и парсит ее. 1. Посмотри, что выводится в адресной строке в браузер, при нажатии кнопки submit 2. Если формируется строка вида http://192.168.0.2/?r2=on&r3=on&r4=on То ее нужно разобрать и считать переменные. Сделай форму по другому используя метод GET client.println("<form action='/' method='GET'>"); client.print("<div>PowerON<input type='checkbox' "); if (pinState[0] == 0) client.print("checked"); client.println(" name='r0'></div>"); client.println("<br>"); client.println("<input type='submit' value='Refresh'>"); client.println("</form>"); При нажатии на кнопку Refresh в браузере должна вылезти строка http://192.168.0.2/?r0=1 или 0 в зависимости от чекбокса.