вопрос по езернет шилду

volk0001
Offline
Зарегистрирован: 04.04.2014

в настоящий момент у меня имеется ардуина с подключенными к ней релюшками и выключателями. управляется все это хозяйство вот таким вот простеньким скетчем:

int flag_1=0;
int flag_2=0;
int flag_3=0;
int flag_4=0;
int flag_5=0;
int flag_6=0; // переменные для освещения
void setup() {   
  pinMode(29, OUTPUT); // свет большая комната 1
  pinMode(28, OUTPUT); // свет большая комната 2
  pinMode(27, OUTPUT); // свет маленькая комната
  pinMode(26, OUTPUT); // свет корридор
  pinMode(25, OUTPUT); // свет уборная
  // реле на пине 24 зарезервированно под вытяжку
  pinMode(23, OUTPUT); // свет кухня
  pinMode(33, INPUT);  // выключатель большая комната 1
  pinMode(37, INPUT);  // выключатель большая комната 2
  pinMode(41, INPUT);  // выключатель маленькая комната
  pinMode(45, INPUT);  // выключатель корридор
  pinMode(49, INPUT);  // выключатель уборная
  pinMode(53, INPUT);  // выключатель кухня
  
  digitalWrite(33, HIGH); 
  digitalWrite(37, HIGH);
  digitalWrite(41, HIGH);
  digitalWrite(45, HIGH);
  digitalWrite(49, HIGH);
  digitalWrite(53, HIGH);// подтягивающие резисторы
}
void loop()
{ 
  svet_1();
  svet_2();
  svet_3();
  svet_4();
  svet_5();
  svet_6();
}  
void svet_1()
     {
         if (digitalRead(33)==HIGH&&flag_1==0)//если кнопка нажата   
     // и перемення flag равна 0 , то ... 
     { 
          
        
       flag_1=1; 
        //это нужно для того что бы с каждым нажатием кнопки 
        //происходило только одно действие 
        // плюс защита от "дребезга"  100% 
       
     } 
       
      if (digitalRead(33)==LOW&&flag_1==1)//если кнопка НЕ нажата 
     //и переменная flag равна - 1 ,то ... 
     { 
         digitalWrite(29,!digitalRead(29)); 
        flag_1=0;//обнуляем переменную flag 
     } 
}     
void svet_2()
     {

         if (digitalRead(37)==HIGH&&flag_2==0)
     { 
       flag_2=1; 
     } 
      if (digitalRead(37)==LOW&&flag_2==1)
     { 
         digitalWrite(28,!digitalRead(28)); 
        flag_2=0;
     } 
}    
void svet_3()
    {
      if (digitalRead(41)==HIGH&&flag_3==0)
     { 
          flag_3=1; 
     } 
      if (digitalRead(41)==LOW&&flag_3==1)
     { 
         digitalWrite(27,!digitalRead(27)); 
        flag_3=0;
     }
}
void svet_4()
{
      if (digitalRead(45)==HIGH&&flag_4==0)
     { 
          flag_4=1; 
     } 
      if (digitalRead(45)==LOW&&flag_4==1)
     { 
         digitalWrite(26,!digitalRead(26)); 
        flag_4=0;
     }
}
void svet_5()
{
      if (digitalRead(49)==HIGH&&flag_5==0)
     { 
          flag_5=1; 
     } 
      if (digitalRead(49)==LOW&&flag_5==1)
     { 
         digitalWrite(25,!digitalRead(25)); 
        flag_5=0;
     }
}
void svet_6()
{
      if (digitalRead(53)==HIGH&&flag_6==0)

     { 
          flag_6=1; 
     } 
      if (digitalRead(53)==LOW&&flag_6==1)
     { 
         digitalWrite(23,!digitalRead(23)); 
        flag_6=0;
     }     
} 

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

Грубо говоря,  необходим простой и красивый метод дублировать через сеть выключатели.

примерно вот так

/*
 
 Включение и отключение светодиода в зависимости от переданого URL
 
 Включить:
 
http://ВАШ-IP-АДРЕС/$1
 
 Выключить:
 
http://ВАШ-IP-АДРЕС/$2
 
 Цепь:
 * Ethernet shield подключен к пинам 10, 11, 12, 13
 * Плюс светодиода к пину D2, минус через резистор 220 Ом к земле
 
 */
 
#include <SPI.h>
#include <Ethernet.h>
 
boolean incoming = 0;
 
// Введите MAC-адрес и IP-адрес вашего контроллера
// IP-адрес должен соответствовать вашей локальной сети
byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDA, 0x02 };
IPAddress ip(191,11,1,1); //<<< IP-АДРЕС ВВОДИТЬ СЮДА!!!
 
// Инициализация библиотеки Ethernet server
// с тем IP-адресом и портом который мы хотим использовать
// (порт 80 по умолчанию используется для HTTP):
EthernetServer server(80);
 
void setup()
{
  pinMode(2, OUTPUT);
 
  // запускаем Ethernet соединение и сервер:
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.begin(9600);
}
 
void loop()
{
  // ожидание подключения клиентов
  EthernetClient client = server.available();
  if (client) {
    // Запрос HTTP заканчивается пустой строкой
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        // Если будет получен символ переноса строки и
    // сама строка при этом пустая, значит
    // HTTP-запрос закончился, можно отвечать
 
    // считываем URL с символа "$" до первого пробела
        if(incoming && c == ' '){
          incoming = 0;
        }
        if(c == '$'){
          incoming = 1;
        }
 
        // Определяем что было в URL: $1 или $2
        if(incoming == 1){
          Serial.println(c);
 
          if(c == '1'){
            Serial.println("ON");
            digitalWrite(2, HIGH);
          }
          if(c == '2'){
            Serial.println("OFF");
            digitalWrite(2, LOW);
          }
 
        }
 
        if (c == '\n') {
          // началась новая строка
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          // в текущей строке ещё есть символы
          currentLineIsBlank = false;
        }
      }
    }
    // даём время браузеру для получения данных
    delay(1);
    // закрываем соединение
    client.stop();
  }
}

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

 

заранее благодарен там кто направит на путь истинный

Демьян
Offline
Зарегистрирован: 10.07.2013

Можешь глянуть мой скетч в теме "Запись на сервер", его можно подправить под свои нужды.

volk0001
Offline
Зарегистрирован: 04.04.2014

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

управляется все это дело шестью вот такими циклами (у каждого цикла своя переменная):

void svet_2()
     {

         if (digitalRead(37)==HIGH&&flag_2==0)
     { 
       flag_2=1; 
     } 
      if (digitalRead(37)==LOW&&flag_2==1)
     { 
         digitalWrite(28,!digitalRead(28)); 
        flag_2=0;
     } 
}    

скетч целиком :

int flag_1=0;
int flag_2=0;
int flag_3=0;
int flag_4=0;
int flag_5=0;
int flag_6=0; // переменные для освещения
void setup() {   
  pinMode(29, OUTPUT); // свет большая комната 1
  pinMode(28, OUTPUT); // свет большая комната 2
  pinMode(27, OUTPUT); // свет маленькая комната
  pinMode(26, OUTPUT); // свет корридор
  pinMode(25, OUTPUT); // свет уборная
  // реле на пине 24 зарезервированно под вытяжку
  pinMode(23, OUTPUT); // свет кухня
  pinMode(33, INPUT);  // выключатель большая комната 1
  pinMode(37, INPUT);  // выключатель большая комната 2
  pinMode(41, INPUT);  // выключатель маленькая комната
  pinMode(45, INPUT);  // выключатель корридор
  pinMode(49, INPUT);  // выключатель уборная
  pinMode(53, INPUT);  // выключатель кухня
  
  digitalWrite(33, HIGH); 
  digitalWrite(37, HIGH);
  digitalWrite(41, HIGH);
  digitalWrite(45, HIGH);
  digitalWrite(49, HIGH);
  digitalWrite(53, HIGH);// подтягивающие резисторы
}
void loop()
{ 
  svet_1();
  svet_2();
  svet_3();
  svet_4();
  svet_5();
  svet_6();
}  
void svet_1()
     {
         if (digitalRead(33)==HIGH&&flag_1==0)//если кнопка нажата   
     // и перемення flag равна 0 , то ... 
     { 
          
        
       flag_1=1; 
        //это нужно для того что бы с каждым нажатием кнопки 
        //происходило только одно действие 
        // плюс защита от "дребезга"  100% 
       
     } 
       
      if (digitalRead(33)==LOW&&flag_1==1)//если кнопка НЕ нажата 
     //и переменная flag равна - 1 ,то ... 
     { 
         digitalWrite(29,!digitalRead(29)); 
        flag_1=0;//обнуляем переменную flag 
     } 
}     
void svet_2()
     {

         if (digitalRead(37)==HIGH&&flag_2==0)
     { 
       flag_2=1; 
     } 
      if (digitalRead(37)==LOW&&flag_2==1)
     { 
         digitalWrite(28,!digitalRead(28)); 
        flag_2=0;
     } 
}    
void svet_3()
    {
      if (digitalRead(41)==HIGH&&flag_3==0)
     { 
          flag_3=1; 
     } 
      if (digitalRead(41)==LOW&&flag_3==1)
     { 
         digitalWrite(27,!digitalRead(27)); 
        flag_3=0;
     }
}
void svet_4()
{
      if (digitalRead(45)==HIGH&&flag_4==0)
     { 
          flag_4=1; 
     } 
      if (digitalRead(45)==LOW&&flag_4==1)
     { 
         digitalWrite(26,!digitalRead(26)); 
        flag_4=0;
     }
}
void svet_5()
{
      if (digitalRead(49)==HIGH&&flag_5==0)
     { 
          flag_5=1; 
     } 
      if (digitalRead(49)==LOW&&flag_5==1)
     { 
         digitalWrite(25,!digitalRead(25)); 
        flag_5=0;
     }
}
void svet_6()
{
      if (digitalRead(53)==HIGH&&flag_6==0)

     { 
          flag_6=1; 
     } 
      if (digitalRead(53)==LOW&&flag_6==1)
     { 
         digitalWrite(23,!digitalRead(23)); 
        flag_6=0;
     }     
} 

задача: прикрутить к этому делу езернет шилд наиболее простым и красивым способом, дабы управление через локалку дублировало выключатели

мои попытки решения: пытался интегрировать в это дело готовый скетч для управления светодиодами с этого форума, получилось следующее:

int flag_1=0;
int flag_2=0;
int flag_3=0;
int flag_4=0;
int flag_5=0;
int flag_6=0; // переменные для освещения

#include <SPI.h>
#include <Ethernet.h>
 
boolean incoming = 0;
 

byte mac[] = { 0x00, 0xAC, 0xAB, 0xCC, 0xDA, 0x02 };
IPAddress ip(192,168,1,4); 
 
EthernetServer server(80);// Инициализация библиотеки Ethernet server

void setup() {   
  pinMode(29, OUTPUT); // свет большая комната 1
  pinMode(28, OUTPUT); // свет большая комната 2
  pinMode(27, OUTPUT); // свет маленькая комната
  pinMode(26, OUTPUT); // свет корридор
  pinMode(25, OUTPUT); // свет уборная
  // реле на пине 24 зарезервированно под вытяжку
  pinMode(23, OUTPUT); // свет кухня
  pinMode(33, INPUT);  // выключатель большая комната 1
  pinMode(37, INPUT);  // выключатель большая комната 2
  pinMode(41, INPUT);  // выключатель маленькая комната
  pinMode(45, INPUT);  // выключатель корридор
  pinMode(49, INPUT);  // выключатель уборная
  pinMode(53, INPUT);  // выключатель кухня
  
  digitalWrite(33, HIGH); 
  digitalWrite(37, HIGH);
  digitalWrite(41, HIGH);
  digitalWrite(45, HIGH);
  digitalWrite(49, HIGH);
  digitalWrite(53, HIGH);// подтягивающие резисторы
  
 
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.begin(9600);// запускаем Ethernet соединение и сервер:

  
}
void loop()
{ 
  svet_1();
  svet_2();
  svet_3();
  svet_4();
  svet_5();
  svet_6();
  ethernet();
}

void svet_1()
     {
         if (digitalRead(33)==HIGH&&flag_1==0)//если кнопка нажата   
     // и перемення flag равна 0 , то ... 
     { 
          
        
       flag_1=1; 
        //это нужно для того что бы с каждым нажатием кнопки 
        //происходило только одно действие 
        // плюс защита от "дребезга"  100% 
       
     } 
       
      if (digitalRead(33)==LOW&&flag_1==1)//если кнопка НЕ нажата 
     //и переменная flag равна - 1 ,то ... 
     { 
         digitalWrite(29,!digitalRead(29)); 
        flag_1=0;//обнуляем переменную flag 
     } 
}     
void svet_2()
     {

         if (digitalRead(37)==HIGH&&flag_2==0)
     { 
       flag_2=1; 
     } 
      if (digitalRead(37)==LOW&&flag_2==1)
     { 
         digitalWrite(28,!digitalRead(28)); 
        flag_2=0;
     } 
}    
void svet_3()
    {
      if (digitalRead(41)==HIGH&&flag_3==0)
     { 
          flag_3=1; 
     } 
      if (digitalRead(41)==LOW&&flag_3==1)
     { 
         digitalWrite(27,!digitalRead(27)); 
        flag_3=0;
     }
}
void svet_4()
{
      if (digitalRead(45)==HIGH&&flag_4==0)
     { 
          flag_4=1; 
     } 
      if (digitalRead(45)==LOW&&flag_4==1)
     { 
         digitalWrite(26,!digitalRead(26)); 
        flag_4=0;
     }
}
void svet_5()
{
      if (digitalRead(49)==HIGH&&flag_5==0)
     { 
          flag_5=1; 
     } 
      if (digitalRead(49)==LOW&&flag_5==1)
     { 
         digitalWrite(25,!digitalRead(25)); 
        flag_5=0;
     }
}
void svet_6()
{
      if (digitalRead(53)==HIGH&&flag_6==0)

     { 
          flag_6=1; 
     } 
      if (digitalRead(53)==LOW&&flag_6==1)
     { 
         digitalWrite(23,!digitalRead(23)); 
        flag_6=0;
     }     
}
void ethernet()
{
  // ожидание подключения клиентов
  EthernetClient client = server.available();
  if (client) {
    // Запрос HTTP заканчивается пустой строкой
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        // Если будет получен символ переноса строки и
    // сама строка при этом пустая, значит
    // HTTP-запрос закончился, можно отвечать
 
    // считываем URL с символа "$" до первого пробела
        if(incoming && c == ' '){
          incoming = 0;
        }
        if(c == '$'){
          incoming = 1;
        }
 
        // Определяем что было в URL: $1 или $2
        if(incoming == 1){
          Serial.println(c);
 
          if(c == '1'){
            flag_1=1;
          }
          if(c == '2'){
            flag_1=0;
          }
 
        }
 
        if (c == '\n') {
          // началась новая строка
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          // в текущей строке ещё есть символы
          currentLineIsBlank = false;
        }
      }
    }
    // даём время браузеру для получения данных
    delay(1);
    // закрываем соединение
    client.stop();
  }
}

проблема первая, оно не работает. при запросе 192.168.1.4/$1 хромиум тупо сбрасывает соединение по таймауту. браузер на телефоне ведет себя аналогично, хотя пинг на 192.168.1.4 идет. (с этим, думаю, я разберусь и сам в праздники)

проблема вторая, я абсолютно не понимаю как работает вот это:

 // считываем URL с символа "$" до первого пробела
        if(incoming && c == ' '){
          incoming = 0;
        }
        if(c == '$'){
          incoming = 1;
        }
 
        // Определяем что было в URL: $1 или $2
        if(incoming == 1){
          Serial.println(c);
 
          if(c == '1'){
            flag_1=1;
          }
          if(c == '2'){
            flag_1=0;
          }

мне надобно определять не только $1 и $2, но и $3, $4...$6. вопрос в том, как это устроить