Задержка по времени для сервы

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

положение крана можно приблизительно выставлять в заданное положение ( измерив время хода от закрыт до открыт ) импульсом питания определённой длительности.... ( в теории, а на практике придётся импульсом 6 сек ( если полный ход 6 сек ) гарантированно закрыть кран, потом подав импульс на 3 сек считать, что кран в среднем положении, открыть на 0,75 - 6 сек для закрытия, 4 сек на открытие... кататак :)     ( проходное сечение крана от угла поворота штока-шара - НЕ линейная зависимость )

повторюсь - один кран нарушает циркуляцию, циркнасос работает зря, "слабые" места под угрозой разморозки....

два крана по схеме трёхходового крана - обеспечат ПОСТОЯННУЮ ЦИРКУЛЯЦИЮ

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012
trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Слишком примитивно. Циркуляция должна идти постоянно и с большим протоком, а вот горячую воду, сколько нужно, надо подмешивать в этот контур из контура котла с помощью трёхходовика, можно капиллярного, как у меня дома, а можно и электрического.

Алгоритм управления простой: Приоткрыли, подождали, померяли температуру на выходе, сравнили с надобной и приоткрыли или призакрыли.

И не покупайте 5-ти Вольтовые, куча минусов: бОльшие токи, два блока питания на 5 Вольт.

Ставьте 12-ти Вольтовые: одноамперник 12 В это совсем не проблемма, 5 Вольт из него-же стэпдауном, захотели- любой аккумулятор от сигналок 12 В 7Ач нетрудно подцепить.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

и я про тоже - циркуляция или мимо котла, или через котёл - в зависимости от t обратки или от t воздуха в помещении

ссылку дал просто для картинки, а автоматику лучше да, на 12 V ( или на 24 V - смотря какие комплектующие )

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Там у меня схема феншуйная и мне достаточно обычного крана с моторчиком, а не 3х-ходового. Благодарю за совет про 12-ти вольтовые вместо 5-ти! Про КПД скажу, что низкотемпературное отопление это очень хорошо, но в случае с котлом Стропува конденсат уже при 55 градусах в подаче ведрами течет и поэтому приходится 60 держать. Все на сей день прекрасно работает, но вот растопка и вывод котла в рабочий режим требует постоянного контроля, поэтому мною было решено заардуинить все нафиг. Еще огромный минус в этот процесс вносят противопожарные нормы, которые требуют, чтобы дверь в котельную была одна и с улицы только, а это значит нужно выходить в любую непогоду несколько раз для контроля и бла бла, что, согласитесь, не очень удобно... Я вот приобрел на дня "эзернет шилд W5100", для того, чтобы прям с офиса смотреть температуру и крутить серву, но никак не разберусь с кодом там... Простецкие "шилдики" из уроков Дмитрия Осипова были куда проще, но нагнулись по неизвестной причине))).

Кстати, хотел спросить: а есть здесь на форуме какой-нибудь раздельчик, в котором "тупые" вопросы по программингу можно задавать, чтобы желающие могли отвечать на них? А то вы мне уже итак здорово помогли и грузить херней никого не хочется)) 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

есть, но лучше уже здесь всё спрашивать - уже прикормлено, задача и ваш уровень известны - так лучше, чем плодить кучу тем :)

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Ну тут в процессе изучения у меня возникают вопросы не по теме или же косвенно ее касающие. А именно один из них: в чем разница между операторами if-else и switch-case? Из опытов я пока увидел, что switch-case не умеет работать с интервалами, но в свою очередь if-else умеет делать все то же самое, что и switch-case... Это просто дело вкуса, как, к примеру, писать float или double или же есть у каждого из них свои прелести?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Тип double поддерживается в Arduino для совместимости кода с другими платформами.

у if в скобках выражение должно быть типа boolean - true или false , 0 или 1 ( 2,3,1000,65535 - это всё воспримется как 1 )

у switch - перечислимый тип данных byte, int, объявленные как enum 

несколько if могут заменить switch , наоборот - нет

....добавлено

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012
SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

у if-else - два исхода , у  switch-case - сколько сможете case прописать

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Спасибо)))) Можно всю оставшуюся жизнь теперь в свободное время изучать))) А такой вопросик, если можно: в чем принципиальная разница между несколькими операторами if и if-else if-else? Она вроде как есть, но я не понял пока в чем проявляется..

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

из ифа два пути, а если надо больше ? на три -

иф1 вых1

эльзе1

     иф2 вых2

     эльзе2 вых3

иф2 со своим эльзе2 - встроен в эльзе1

в эльзе2 снова можно вставить очередной иф - выходов будет 4, ифами можно построить и более сложные алгоритмы анализа - лишь не запутаться :)

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Угу... Вроде понятно... Надо будет парочку опытов с лампочками поставить и все будет в ажуре думаю. Благодарю Вас! А сейчас я уже вишу час в изучении http://arduino.ua/ru/prog/Ethernet . Лишь бы башка не взорвалась))) Все ж хочется очень ардуинкой управлять с любого места)

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

при хорошо написанной программе ОНА должна управлять всем, её нужно только контролировать....

ищите готовый пример браузер-W5100-ардуина - по нему и изучайте, просто изучать W5100 - точно взорвётесь :)

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012
Andrey-S
Offline
Зарегистрирован: 02.01.2015

Похоже уже взорвался... Висок заболел..  Хреново изучать все с нулевым знанием языка Си..

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

вот попроще - передача в браузер 6-ти значений с аналоговых выходов, управления ардуиной здесь не прописано

http://arduino.cc/en/Tutorial/WebServer

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Да, попали вы с котлом, давно читал про эти "устройства" длительного горения... Даже закладки про это чудо гдето есть...Борьба со смолами забивающими дымоход за два месяца и дёгтем вытекающем снизу.... Говорят надо топить или очень-очень сухими дровами или углёмю. И действительно нельзя допускать конденсата.  А тогда какой смысл греть по полной и выбрасывать тепло в трубу?

Нашёл закладку. Познавательный форум. Почитайте http://forum.vashdom.ru/threads/pech-bulerjan-problema-s-kondensatom-kak...

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Ссылку прочитал. В ней говорится о конденсате в дымоходе в основном, а такой проблемы у меня нет, т.к. все трубы из сендвичей. Конденсат появляется как я понял из-за "жарко" в камере сгорания и "холодно" через стенку в емкости с водой... И эта температура воды (видимо из таблицы точки росы) как раз градусов 55 где-то. Смолистыми породами стараемся не топить:-) В целом, за неимения газа (а точнее за отказ платить 500тысяч рублей за прокладку газа от трубы, что в 30метрах) вариант неплохой, но муторный.

Andrey-S
Offline
Зарегистрирован: 02.01.2015

SU-27-16 пишет:

вот попроще - передача в браузер 6-ти значений с аналоговых выходов, управления ардуиной здесь не прописано

http://arduino.cc/en/Tutorial/WebServer

Это я уже читал... Простая передача аналоговых значений... Теперь бы умудриться переправить (или добавить) их так, чтобы можно было светодиодикаи или релюшечкой управлять))) А для этого надо вот изучать комнды этого шилда как я понял. А вот тут http://robocraft.ru/blog/238.html у меня эксперимент удался!

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

ну, вот канал управления http://zelectro.cc/Ethernet_shield_W5100

Andrey-S
Offline
Зарегистрирован: 02.01.2015

SU-27-16 пишет:

ну, вот канал управления http://zelectro.cc/Ethernet_shield_W5100

Воо. Огромное спасибо в очередной раз!)) Это уже вещь! Теперь можно сравнив несколько таких скетчей вычислить где там и что править))

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Все... 50 опытов прошли полуудачно... Уже язык HTML успел немного изучить даже... Зафигачил из ссылки выше себе канал управления из 4х реле... Вот его скетч 

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // Мак адрес
byte ip[] = { 192, 168, 1, 111 }; // IP адрес (В броузере вводим 192.168.0.2)
EthernetServer server(80);

int numPins = 4;
int pins[] = { 2, 3, 4, 5 };    // Пины для реле
int pinState[] = {0, 0, 0, 0};  // Состояние пинов

void setup()
{
  // Изначально выключаем все реле
  for (int i = 0; i < numPins; i++)
  {
    pinMode(pins[i], OUTPUT);
    digitalWrite(pins[i], 1);
  }
  
  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;
               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("<html>");
      client.println("<head>");
      client.println("<title>Zelectro. Relay + Ethernet shield.</title>");
      client.println("</head>");
      client.println("<body>");
      client.println("<h3>Zelectro. Relay + Ethernet shield.</h3>");
      client.println("<form method='post'>");
      client.print("<div>Relay 1 <input type='checkbox' ");
      if (pinState[0] == 1)
        client.print("checked");
      client.println(" name='r0'></div>");
      client.print("<div>Relay 2 <input type='checkbox' ");
      if (pinState[1] == 1)
        client.print("checked");
      client.println(" name='r1'></div>");
      client.print("<div>Relay 3 <input type='checkbox' ");
      if (pinState[2] == 1)
        client.print("checked");
      client.println(" name='r2'></div>");
      client.print("<div>Relay 4 <input type='checkbox' ");
      if (pinState[3] == 1)
        client.print("checked");
      client.println(" name='r3'></div>");
      client.println("<input type='submit' value='Refresh'>");
      client.println("</form>");
      client.println("</body>");
      client.println("</html>");
      client.stop(); 
    }
  }
}

Все прекрасно работает... Но я ж так просто не сдаюсь! Мне захотелось 5ю реле самому зафигачить туда... Зафигачил, все работает, кроме одного момента: инвертированное положение для пина. Тобишь после загрузки скетча мой вновь добавленный пин принимает сразу HIGH, хотя галочку в браузере я еще не поставил. Вот код: 

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // Мак адрес
byte ip[] = { 192, 168, 1, 111 }; // IP адрес (В броузере вводим 192.168.0.2)
EthernetServer server(80);

int numPins = 5;
int pins[] = { 2, 3, 4, 5, 6};    // Пины для реле
int pinState[] = {0, 0, 0, 0, 0};  // Состояние пинов

void setup()
{ 
  // Изначально выключаем все реле
  for (int i = 0; i < numPins; i++)
  {
    pinMode(pins[i], OUTPUT);
    digitalWrite(pins[i], 1);
  }
  
  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;
               pinState[1] = 0;
               pinState[2] = 0;
               pinState[3] = 0;
               pinState[4] = 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;
                pinState[4] = 0;
               
             }
          }
        }
      }
      
      // В соответствие с переданными данными включаем реле
      for (int i = 0; i < 5; i++)
      {
         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>Zelectro. Relay + Ethernet shield.</title>");
      client.println("</head>");
      client.println("<body>");
      client.println("<h3>Zelectro. Relay + Ethernet shield.</h3>");
      client.println("<form method='post'>");
      client.print("<div>Rele 1 <input type='checkbox' ");
      if (pinState[0] == 1)
        client.print("checked");
      client.println(" name='r0'></div>");
      client.print("<div>Rele 2 <input type='checkbox' ");
      if (pinState[1] == 1)
        client.print("checked");
      client.println(" name='r1'></div>");
      client.print("<div>Rele 3 <input type='checkbox' ");
      if (pinState[2] == 1)
        client.print("checked");
      client.println(" name='r2'></div>");
      client.print("<div>Rele 4 <input type='checkbox' ");
      if (pinState[3] == 1)
        client.print("checked");
      client.println(" name='r3'></div>");
      client.print("<div>Rele 5 <input type='checkbox' ");
      if (pinState[4] == 1)
        client.print("checked");
      client.println(" name='r4'></div>");
      client.println("<input type='submit' value='Refresh'>");
      client.println("</form>");
      client.println("</body>");
      client.println("</html>");
      client.stop(); 
    }
  }
}



SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

не забывайте про чекбокс "свернуть код" :)

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

дык, чо ? нрмально работает ?

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Про чекбокс не догнал)) Я понял, что чекбокс это просто галочка... Радио - точка ну и т.п... У меня проблема в том, что мой пин со старта сразу HIGH принимает.. Как сделать, чтоб он как все был?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

неее, анализ мине уже заказан - завтра днюха :) 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

при загрузке кода поставте галочку на допстранице - "свернуть" ! результат - короткое сообщение ( код свёрнут ), кому интерессно - развернут...

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

главные галочки в допе - свернуть и нумерация....

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Ну если у Вас днюха, то поздравляю от всей души! И желаю, чтоб прожили долго и счастливо, ибо хороших людей надо побольше на этой планете))) А если не у Вас, то имениннику того же))) Завтра выхожу на работу из отпуска и начинаю закладывать провода под ардуинку к котлу))

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Andrey-S пишет:

Про чекбокс не догнал)) Я понял, что чекбокс это просто галочка... Радио - точка ну и т.п... У меня проблема в том, что мой пин со старта сразу HIGH принимает.. Как сделать, чтоб он как все был?

про чекбокс и радибуттон - можно позже ? :)

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Andrey-S пишет:

Ну если у Вас днюха, то поздравляю от всей души! И желаю, чтоб прожили долго и счастливо, ибо хороших людей надо побольше на этой планете))) А если не у Вас, то имениннику того же))) Завтра выхожу на работу из отпуска и начинаю закладывать провода под ардуинку к котлу))

спасибо ! но завтра :)

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

заложите проводов нужное количество х 2...3 - пригодится позжееееее

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

строки 8, 9, 17, 18 - пины на реле 2 3 4 5 6 - в цикле проходимся по пинам 0 1 2 3 4

for (int i = 0; i < numPins; i++)      >>>>>>>>>>>>>>>>>>>>>>>>>>>>     for (byte i = 2; i < (numPins + 2); i++)

{

  pinMode(pins[i], OUTPUT);

  digitalWrite(pins[i], 1);

}

всё это можно заменить на 

DDRD=DDRD | B01111100;

PORTD=B01111100;

http://arduino.ru/Tutorial/Upravlenie_portami_cherez_registry

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

блок чекбоксов - галочки можно ставить в любом порядке и количестве ( похоже на иф )

блок радиокнопок - кружочек можно поставить только один ( похоже на свич-казе )

Andrey-S
Offline
Зарегистрирован: 02.01.2015

SU-27-16 пишет:

строки 8, 9, 17, 18 - пины на реле 2 3 4 5 6 - в цикле проходимся по пинам 0 1 2 3 4

for (int i = 0; i < numPins; i++)      >>>>>>>>>>>>>>>>>>>>>>>>>>>>     for (byte i = 2; i < (numPins + 2); i++)

{

  pinMode(pins[i], OUTPUT);

  digitalWrite(pins[i], 1);

}

всё это можно заменить на 

DDRD=DDRD | B01111100;

PORTD=B01111100;

http://arduino.ru/Tutorial/Upravlenie_portami_cherez_registry

)))))) Походу это фаталити для моей головы)))

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

строку 70 скопируйте в 71 и 85 в 86

Andrey-S
Offline
Зарегистрирован: 02.01.2015

SU-27-16 пишет:

строку 70 скопируйте в 71 и 85 в 86

Сделал. Только после этого галочки в браузере стало нельзя ставить толпой и там вообще хаос начался))) Диод на 6 пине горит со старта один фиг.  заливал это: 

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // Мак адрес
byte ip[] = { 192, 168, 1, 111 }; // IP адрес (В броузере вводим 192.168.0.2)
EthernetServer server(80);

int numPins = 5;
int pins[] = { 2, 3, 4, 5, 6};    // Пины для реле
int pinState[] = {0, 0, 0, 0, 0};  // Состояние пинов

void setup()
{
  // Изначально выключаем все реле
  for (byte i = 2; i < (numPins + 2); i++)

{

  pinMode(pins[i], OUTPUT);

  digitalWrite(pins[i], 1);

}
  
  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;
               pinState[1] = 0;
               pinState[2] = 0;
               pinState[3] = 0;
               pinState[4] = 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();
                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();
                   relayNum = client.read();
               }
             } else
             {
                // Если не было передано данных, то выключаем все реле
                pinState[0] = 0;
                pinState[1] = 0;
                pinState[2] = 0;
                pinState[3] = 0;
                pinState[4] = 0;
             }
          }
        }
      }
      
      // В соответствие с переданными данными включаем реле
      for (int i = 0; i < 5; i++)
      {
         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>Zelectro. Relay + Ethernet shield.</title>");
      client.println("</head>");
      client.println("<body>");
      client.println("<h3>Zelectro. Relay + Ethernet shield.</h3>");
      client.println("<form method='post'>");
      client.print("<div>Relay 1 <input type='checkbox' ");
      if (pinState[0] == 1)
        client.print("checked");
      client.println(" name='r0'></div>");
      client.print("<div>Relay 2 <input type='checkbox' ");
      
      if (pinState[1] == 1)
        client.print("checked");
      client.println(" name='r1'></div>");
      client.print("<div>Relay 4 <input type='checkbox' ");
      if (pinState[2] == 1)
        client.print("checked");
      client.println(" name='r2'></div>");
      client.print("<div>Relay 5 <input type='checkbox' ");
      if (pinState[3] == 1)
        client.print("checked");
      client.println(" name='r3'></div>");
      client.print("<div>Relay 3 <input type='checkbox' ");
      if (pinState[4] == 1)
        client.print("checked");
      client.println(" name='r4'></div>");
      client.println("<input type='submit' value='Refresh'>");
      client.println("</form>");
      client.println("</body>");
      client.println("</html>");
      client.stop(); 
    }
  }
}

 

Andrey-S
Offline
Зарегистрирован: 02.01.2015

А вот теперь я крепко подвис... Ситуация следующая.. Залил скетч этот же самый, только подправленный на 8 реле отсюда http://pastebin.com/2NjEgcEf  с небольшими корректировками по ип и отображением названий в браузере... Работает все как оказалось идеально, но объясните мне такой факт: почему подключая в одном и том же состоянии пина реле и светодиод к нему получаем, что реле-разомкнуто, а светодиод-горит! Получается все пины стоят HIGH, а реле работает, когда на пинах LOW? Я слышал что-то про реле, управляемых положительным и отрицательным потенциалом....

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

блоки реле +5 V с оптроном на входе управления могут управляться от 0 или от 5 - как производитель сделает

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

на плату подаётся GND и 5 V, третий контакт - управление.

если оптрон подключен третий пин и GND - то включается HIGHом

если оптрон подключен третий пин и 5 V- то включается LOWом

в чём неудобство-то ? если программа написана для ловных реле, а есть хигные - правим код и всё :)

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Неудобств нет))) Было отсутствие знаний по этому делу и я весь мозг сломал почему у меня инвертированное значение пина... А оказывается все прекрасно!))) Сегодня заказал себе на али 8-ми модульное реле и 2 ENC Ethernet модуля - будет праздник!) Спасибо Вам в очередной раз! А, кстати, у Вас есть опыт подключения/работы с GSM модулем?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

#138 - значит я не прав :)

код на 8 релюшек не зажимайте :) - ему тут место

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Опачки... Не заходит.... Вот рабочий код на 8 реле: 

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // Мак адрес
byte ip[] = { 192, 168, 1, 111 }; // IP адрес (В броузере вводим 192.168.0.2)
EthernetServer server(80);

int numPins = 8;
int pins[] = { 2, 3, 4, 5, 6, 7, 8, 9 };    // Пины для реле
int pinState[] = { 0, 0, 0, 0, 0, 0, 0, 0 };  // Состояние пинов

void setup()
{
  // Изначально выключаем все реле
  for (int i = 0; i < numPins; i++)
  {
    pinMode(pins[i], OUTPUT);
    digitalWrite(pins[i], 1);
  }
  
  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;
               pinState[1] = 0;
               pinState[2] = 0;
               pinState[3] = 0;
               pinState[4] = 0;
               pinState[5] = 0;
               pinState[6] = 0;
               pinState[7] = 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;
                pinState[4] = 0;
                pinState[5] = 0;
                pinState[6] = 0;
                pinState[7] = 0;
             }
          }
        }
      }
      
      // В соответствие с переданными данными включаем реле
      for (int i = 0; i < 8; i++)
      {
         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>Zelectro. Relay + Ethernet shield.</title>");
      client.println("</head>");
      client.println("<body>");
      client.println("<h3>Zelectro. Relay + Ethernet shield.</h3>");
      client.println("<form method='post'>");
      
      client.print("<div>Relay 1 <input type='checkbox' ");      
      if (pinState[0] == 1)
        client.print("checked");
      client.println(" name='r0'></div>");
      
      client.print("<div>Relay 2 <input type='checkbox' ");
      if (pinState[1] == 1)
        client.print("checked");
      client.println(" name='r1'></div>");
      
      client.print("<div>Relay 3 <input type='checkbox' ");
      if (pinState[2] == 1)
        client.print("checked");
      client.println(" name='r2'></div>");
      
      client.print("<div>Relay 4 <input type='checkbox' ");
      if (pinState[3] == 1)
        client.print("checked");
      client.println(" name='r3'></div>");
      
      client.print("<div>Relay 5 <input type='checkbox' ");
      if (pinState[4] == 1)
        client.print("checked");
      client.println(" name='r4'></div>");  
      
      client.print("<div>Relay 6 <input type='checkbox' ");
      if (pinState[5] == 1)
        client.print("checked");
      client.println(" name='r5'></div>");  
      
      client.print("<div>Rele 7 <input type='checkbox' ");
      if (pinState[6] == 1)
        client.print("checked");
      client.println(" name='r6'></div>"); 
      
      
      client.print("<div>Rele 8 <input type='checkbox' "); 
      if (pinState[7] == 1)
        client.print("checked");
      client.println(" name='r7'></div>"); 
      
            
      client.println("<input type='submit' value='Refresh'>");
      client.println("</form>");
      client.println("</body>");
      client.println("</html>");
      client.stop(); 
    }
  }
}

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

рано праздник вам !!!!!! :)-

вот я сегодня - сам себе праздник, а вам нужно сделать код приёма в браузер значения хотя бы 6-ти аналоговых пинов И управления по 8-ми каналам :)

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

ничё не понял.... на 4 - сделали, на 5 - глючит 5-ое реле, на 8 - всё отлично ? так где глючево-то пр 5-ти реле ?

Andrey-S
Offline
Зарегистрирован: 02.01.2015

SU-27-16 пишет:

рано праздник вам !!!!!! :)-

вот я сегодня - сам себе праздник, а вам нужно сделать код приёма в браузер значения хотя бы 6-ти аналоговых пинов И управления по 8-ми каналам :)

Вас, кстати, с наступившим! Это вееерно... Аналоговые пины.... Тут в стандартной библиотеке есть пример, который значения аналоовых портов передает... Думаю, несколько часов скрежета зубами по граниту дадут хоть какой то результат!))

Andrey-S
Offline
Зарегистрирован: 02.01.2015

SU-27-16 пишет:

ничё не понял.... на 4 - сделали, на 5 - глючит 5-ое реле, на 8 - всё отлично ? так где глючево-то пр 5-ти реле ?

Это я - дурак...5ым "реле" я подключил светодиод, думая, что он сигнализирует работу реле... А оказалось то наоборот))

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

спасибо :) далеко от Питера ? а то заходи если чо....

да, надо скрестить #117 и #144

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012