физическое Включение компа по сети

Тема в разделе "Arduino & Shields", создана пользователем keeper, 25 ноя 2014.

  1. keeper

    keeper Нерд

    Имею 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();
        }
      }
    }
     
     
  2. Кнопку Power подключи к Arduino и обрабатывай нажатие. Кстати рекомендую использовать библиотеку Bounce.
     
  3. keeper

    keeper Нерд

    как я понял вы предлагаете к ардруино подключить кнопку, вопрос а зачем если мне надо эмалировать нажатие кнопки на системнике
     
  4. К ардуино подключить кнопку компа, и ардуиной следить отжатие
     
    Последнее редактирование: 25 ноя 2014
  5. keeper

    keeper Нерд

    Наверно я все таки не правельно написал кнопка не физическая а в html форме
     
  6. Значит нужно просто обработать 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
     
    Последнее редактирование: 25 ноя 2014
  7. keeper

    keeper Нерд

    мда чет совсем непонятно для меня это ((
     
  8. Хаааа, я только нижний кусок кода увидел. У тя же там строка формируется

    // Формат строки r2=on&r3=on&r4=on

    r2=on&r3=on&r4=on&r0=1 тут просто обработай r0
     
  9. Можно завтра кстати teamviewerom посмотреть чего у тебя
     
  10. keeper

    keeper Нерд

    Не получится я в командировку уехал
    r2=on&r3=on&r4=on&r0=1 можно обяснить что это за строка я её не понял
     
  11. 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 в зависимости от чекбокса.
     
  12. keeper

    keeper Нерд

    ок приеду попробую