Web + реле

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

  1. jks123

    jks123 Нерд

    Вот етот код пашет только на три выхода, если использовать этот полностью то контроллер виснет даже пинга нет. Если 4 выхода использовать - то 3 кнопки есть но с глуками нажимаются и состояние выхода не показывают, 4 выход вкл. и выкл. только через адрес кнопки в вебе почему то нет. Вот где грабли!? Форумчане!
     
  2. Alex19

    Alex19 Гуру

    Здесь надо по другому. Если нужно более 2 выходов.

    Тогда надо получить работающий на 1 или 2 выходах.
    И потом использовать массивы. Не хотел их вводить, чтобы не усложнять код, ради 2 выходов.

    Побег, буду около 3 часов.

    UPD. Увы не выходит, ближе к вечеру.
     
    Последнее редактирование: 20 мар 2014
  3. jks123

    jks123 Нерд

    Код (Text):
    #include "etherShield.h"
    #include "ETHER_28J60.h"

    int outputPin6 = 6;
    int anotherOutputPin7 = 7;
    int outputPin8 = 8;

    static uint8_t mac[6] = {0x54, 0x55, 0x58, 0x10, 0x00, 0x24}; // this just needs to be unique for your network,

    static uint8_t ip[4] = {10, 0, 0, 100}; // IP address for the webserver

    static uint16_t port = 80; // Use port 80 - the standard for HTTP

    ETHER_28J60 e;

    void setup()
    {
      e.setup(mac, ip, port);
      pinMode(anotherOutputPin7, OUTPUT);
      pinMode(outputPin6, OUTPUT);
      pinMode(outputPin8, OUTPUT);
     
    }

    void loop()
    {
      char* params;
      if (params = e.serviceRequest())
      {
        e.print("<H1>JKS home</H1>");
        if (strcmp(params, "?led1=on") == 0)
        {
          if (!digitalRead(outputPin6))
          {
            digitalWrite(outputPin6, HIGH);
          }
        }
        else if (strcmp(params, "?led3=on") == 0)
        {
          if (!digitalRead(outputPin8))
          {
            digitalWrite(outputPin8, HIGH);
          }
        }
       
        else if (strcmp(params, "?led2=on") == 0)
        {
          if (!digitalRead(anotherOutputPin7))
          {
            digitalWrite(anotherOutputPin7, HIGH);
          }
        }
        else if (strcmp(params, "?led1=off") == 0)// Modified -- 2011 12 15 # Ben Schueler
        {
          if (digitalRead(outputPin6))
          {
            digitalWrite(outputPin6, LOW);
          }
        }
       
        else if (strcmp(params, "?led3=off") == 0)// Modified -- 2011 12 15 # Ben Schueler
        {
          if (digitalRead(outputPin8))
          {
            digitalWrite(outputPin8, LOW);
          }
        }
        else if (strcmp(params, "?led2=off") == 0) // Modified -- 2011 12 15 # Ben Schueler
        {
          if (digitalRead(anotherOutputPin7))
          {
            digitalWrite(anotherOutputPin7, LOW);
          }
        }
     
        if (digitalRead(outputPin6))
        {
          e.print("<a href='?led1=off'><button style='border: 1px solid #ff0000; border-left: 10px solid #ff0000' type='button'>LED 1 ON</button></a>");
        }
        else
        {
          e.print("<a href='?led1=on'><button style='border: 1px solid #000; border-left: 10px solid #000' type='button'>LED 1 OFF</button></a>");
        }
        if (digitalRead(outputPin8))
        {
          e.print("<a href='?led3=off'><button style='border: 1px solid #ff0000; border-left: 10px solid #ff0000' type='button'>LED 2 ON</button></a>");
        }
        else
        {
          e.print("<a href='?led3=on'><button style='border: 1px solid #000; border-left: 10px solid #000' type='button'>LED 2 OFF</button></a>");
        }
       
        if (digitalRead(anotherOutputPin7))
        {
          e.print("<a href='?led2=off'><button style='border: 1px solid #ff0000; border-left: 10px solid #ff0000' type='button'>LED 3 ON</button></a>");
        }
        else
        {
          e.print("<a href='?led2=on'><button style='border: 1px solid #000; border-left: 10px solid #000' type='button'>LED 3 OFF</button></a>");
        }

        e.respond();
      }
    }
     
  4. jks123

    jks123 Нерд

    вот рабочий на три кнопки со статусом
     
  5. Alex19

    Alex19 Гуру

    Разобрались, отлично.
    Глянул на код похож, видимо какая-то мелочь. В чем была проблема?

    UPD. Наконец-то разобрался со своей электроникой.
     
    Последнее редактирование: 20 мар 2014
  6. jks123

    jks123 Нерд

    На три кнопки разобрался, а вот на 4-8 нет. модуль тупо виснет. Что за електроника дома? я тож ваяю. досталисть почти нашару раутавтоматик УДМ03 контроллеры . щас весь свет на них делаю
     
  7. Alex19

    Alex19 Гуру

    Воевал с прямо пропорциональным гидравлическим клапаном. Сам управлялся просто, а вот снимать показания возникли проблемы. Ход штока 10мм, а надо было получить 100 шагов, максимум с 1 % погрешности.

    Начинал с катушек, мало знаний., да и много сложностей, слишком много у меня разно мастных типов клапанов. Затем пошли в ход пром. датчики Balluff индуктивного перемещения, но дорогие, сейчас штангенциркуль :).

    У меня пакет платок, от ардуины:), больше 3-ков. Но в реально, использую только контролеры, реле, монитор и клавиатуру, дальше пром. электроника.

    Проектов не много, но в основном связанных со станочками, для производства.

    Сейчас, попробую накидать расширявшему схему, думал нужно только 2 реле.
     
  8. jks123

    jks123 Нерд

    я смотрю Вы тож железо полюбляете. :)
     
  9. Megakoteyka

    Megakoteyka Оракул Модератор

    Код можно сильно упростить, избавившись от от огромного количества условий.
    Попробуйте передавать параметры в виде 1 и 0 вместо on и off.
    Тогда нужно будет проанализировать строку вида "?ledX=Y", где X - номер пина, а Y - его состояние.
    Вместо сравнения строки со всеми возможными вариантами гораздо проще ее разобрать и выделить в отдельные переменные X и Y, которые можно непосредственно сунуть в digitalWrite(), предварительно преобразовав из строки в числа. Тогда программа получится простой и компактной. Кроме того, не придется вносить особых изменений в код для добавления новых входов - достаточно будет просто модифицировать код HTML-страницы, добавив ссылки с нужными параметрами.
     
    Alex19 нравится это.
  10. jks123

    jks123 Нерд

    я тут ардуиной пока клапана дергаю, правда контролирую пошла жидкость или нет.
     
    Последнее редактирование: 20 мар 2014
  11. jks123

    jks123 Нерд

    буду тренеровать контроллер, попробую с переменными
     
  12. Alex19

    Alex19 Гуру

    Правильно + массивы, сейчас так и делаю
     
  13. Alex19

    Alex19 Гуру

    Как-то так, проверьте работает ли.
    Специально оставил, ком порт, чтобы отлаживаться.

    Код (Text):

    #include "etherShield.h"
    #include "ETHER_28J60.h"

    static uint8_t mac[6] = {0x54, 0x55, 0x58, 0x10, 0x00, 0x24};  // this just needs to be unique for your network,
                                                                    // so unless you have more than one of these boards
                                                                    // connected, you should be fine with this value.
                                                         
    static uint8_t ip[4] = {192, 168, 1, 15};                      // the IP address for your board. Check your home hub
                                                                    // to find an IP address not in use and pick that
                                                                    // this or 10.0.0.15 are likely formats for an address
                                                                    // that will work.

    static uint16_t port = 80;                                      // Use port 80 - the standard for HTTP

    ETHER_28J60 e;

    int pins[]={6,7};
    #define pinsCount 2

    void setup()
    {
      e.setup(mac, ip, port);
      for(int i=0;i<pinsCount;i++){
          pinMode(pins[i],OUTPUT);
      }
      Serial.begin(9600);
    }

    void loop()
    {
      char* params;
      if (params = e.serviceRequest())
      {
     
        e.print("<h1>Управление</h1>");
        //params = "http://192.168.0.150/?cmd0=1";
     
        int paramsArrayCount = strlen(params);
        boolean beginParametr = false;
        boolean beginValue = false;
     
        String paramsRequest;
        String valueRequest;
       
        for(int i=0;i<paramsArrayCount;i++)
        {
          if (beginParametr && params[i] != '=')
          {
            paramsRequest += params[i];
          }
       
          if (beginValue)
          {
            valueRequest += params[i];
          }
             
          if (params[i] == '?')
          {
            beginParametr = true;
          }
       
          if (params[i] == '=')
          {
            beginParametr = false;
            beginValue = true;
          }
        }
     
        //Serial.println(paramsRequest);
        //Serial.println(valueRequest);
     
        int workPin = paramsRequest.substring(3).toInt();
        boolean value = valueRequest == "1";
     
        Serial.println(workPin);
     
        if(IsValidPinNo(workPin))
        {
          SetRele(workPin, value);
        }
     
        for(int i=0;i<pinsCount;i++)
        {
          String btnText = "<A HREF='?cmd" + String(i) + "=" + GetStateBtn(i) + "'>Led" + String(i) + " " + GetStateBtnName(i) + "</A><BR/>";
       
          char charBuf[btnText.length()];
          btnText.toCharArray(charBuf, btnText.length());

          e.print(charBuf);
       
          //Serial.println(charBuf);
        }
     
        e.respond();
        //delay(100);
      }
    }

    bool IsValidPinNo(int pinIndex){ // возвращает true если индекс пина правильный.
       return pinIndex>=0 && pinIndex<pinsCount;
    }

    void SetRele(int outPinIndex, boolean valueRequest)
    {
      if (digitalRead(pins[outPinIndex]) != valueRequest)
      {
        digitalWrite(outPinIndex, valueRequest);
     
        //Serial.println(outPinIndex);
        //Serial.println(valueRequest);
      }
    }

    String GetStateBtnName(int outPinIndex)
    {
      if (digitalRead(pins[outPinIndex]))
      {
        return "Off";
      }
      else
      {
        return "On";
      }
    }

    String GetStateBtn(int outPinIndex)
    {
      if (digitalRead(pins[outPinIndex]))
      {
        return "0";
      }
      else
      {
        return "1";
      }
    }

     
    Убедимся, что работает, поясню, что тут за идея

    http://192.168.0.150/?cmd0=1
    Вкл
    http://192.168.0.150/?cmd0=0
    Выкл
     
  14. Alex19

    Alex19 Гуру

    С другом на 2-их покупаем, да и много идей умерло из-за отсутствия времени.

    А так сетевая, релюх, драйверов мотора, экранов, клав. мембраных, датчик лини, датчик цвета, ИК препятствий, датчиков препятствий, часы , датчик тока, температуры, акселерометр, гироскоп, барометр и компас и по мелочи.

    Что-то покупалось, что-то доставалось за даром, на барахолках. Как говорится, если, что откроем магазин:)

    Полагаю делаете умный дом с контролем.

    Не знаком, что это?
     
    Последнее редактирование: 21 мар 2014
  15. jks123

    jks123 Нерд

  16. jks123

    jks123 Нерд

    меня товарищь поддергивает по умному дому. когда жена дома а свет традиционным способом не включается :)
     
  17. Alex19

    Alex19 Гуру

    Поясню код который написал.

    Запрос по схеме
    http://192.168.0.150/?cmd0=1
    После ? идет 3 символа (cmd), затем число индекса в массиве(0), с которым работаем, затем = и значение которое надо установить 0 или 1.

    Код (Text):
    int pins[]={6,7};
    Массив пинов, которые будут использоваться. В {} конкретные ноги на ардуине.
    Код (Text):
    #define pinsCount 2
    Кол-во пинов, в массиве.

    Если нам нужно добавить еще 3, то нужно просто изменить pins и pinsCount
    Код (Text):

    int pins[]={6,7,8,9,10};
    #define pinsCount 5
     
    Код (Text):

    for(int i=0;i<pinsCount;i++){
          pinMode(pins,OUTPUT);
    }
     
    Пробегаем по массиву и настраиваем все ноги указанные в массиве на выход.

    Код (Text):
     if (params = e.serviceRequest())
    Проверка есть ли запрос на сервер

    Код (Text):

    int paramsArrayCount = strlen(params); // Получаем длину запроса
    boolean beginParametr = false; // Переменная для указания, что в разборе начался параметр
    boolean beginValue = false; // Переменная для указания, что в разборе началось значение

    String paramsRequest; // Переменная для хранения параметра
    String valueRequest; // Переменная для хранения значения
     
    Код (Text):
    // Разбираем запрос
        for(int i=0;i<paramsArrayCount;i++)
        {
          // Если параметр не начался и он не равен =
          if (beginParametr && params[i] != '=')
          {
            // Добавляем по символьно, название параметра
            paramsRequest += params[i];
          }

          if (beginValue)
          {
            // Добавляем по символьно, значение параметра
            valueRequest += params[i];
          }

          // Если символ ? то после него идет параметр
          if (params[i] == '?')
          {
            beginParametr = true;
          }

          // Если символ = то после него идет значение
          if (params[i] == '=')
          {
            beginParametr = false;
            beginValue = true;
          }
        }
    Код (Text):

    int workPin = paramsRequest.substring(3).toInt(); // Получаем из названия параметра запроса номер в ноги массиве
    boolean value = valueRequest == "1"; // Если значение параметра 1, то true
     
    Код (Text):

    // Печатаем на страницу кнопки всех пинов
        for(int i=0;i<pinsCount;i++)
        {
          String btnText = "<A HREF='?cmd" + String(i) + "=" + GetStateBtn(i) + "'>Led" + String(i) + " " + GetStateBtnName(i) + "</A><BR/>";

          char charBuf[btnText.length()];
          btnText.toCharArray(charBuf, btnText.length());

          e.print(charBuf);

          //Serial.println(charBuf);
        }
     
    Код (Text):

    // Функция проверки коректности индекса в массиве
    bool IsValidPinNo(int pinIndex){ // возвращает true если индекс пина правильный.
      return pinIndex>=0 && pinIndex<pinsCount;
    }

    // Функция включения, отключения
    void SetRele(int outPinIndex, boolean valueRequest)
    {
      // Проверяем состояние и если отличное, от нужного задаем
      if (digitalRead(pins[outPinIndex]) != valueRequest)
      {
        digitalWrite(outPinIndex, valueRequest);
        //Serial.println(outPinIndex);
        //Serial.println(valueRequest);
      }
    }

    // Получение на основании состояния ноги, текст для кнопки
    String GetStateBtnName(int outPinIndex)
    {
      if (digitalRead(pins[outPinIndex]))
      {
        return "Off";
      }
      else
      {
        return "On";
      }
    }

    // Получение на основании состояния ноги, текст для ссылки
    String GetStateBtn(int outPinIndex)
    {
      if (digitalRead(pins[outPinIndex]))
      {
        return "0";
      }
      else
      {
        return "1";
      }
    }
    Можно его дополнить, доп проверками. Можно при разборке запроса выявлять индекс массива.

    Будут вопросы по коду спрашивайте.

    Интересное решение.

    :)
     
    Последнее редактирование: 21 мар 2014
    Megakoteyka нравится это.
  18. jks123

    jks123 Нерд

    как все сложно то
     
  19. Megakoteyka

    Megakoteyka Оракул Модератор

    Наоборот, так проще) Логика стала универсальной и применимой к любому количеству входов.
     
  20. Megakoteyka

    Megakoteyka Оракул Модератор

    Это лишнее, достаточно написать просто digitalWrite(outPinIndex, valueRequest);
    Если нужно переключить выход - он переключится (1 => 0). Если он уже в нужном состоянии - ничего не произойдет (1 => 1).