вопрос по езернет шилду
- Войдите на сайт для отправки комментариев
в настоящий момент у меня имеется ардуина с подключенными к ней релюшками и выключателями. управляется все это хозяйство вот таким вот простеньким скетчем:
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 и так далее. кроме того, хотелось бы сразу оставить задел под будущие датчики движения.
заранее благодарен там кто направит на путь истинный
Можешь глянуть мой скетч в теме "Запись на сервер", его можно подправить под свои нужды.
попробую повторить вопрос. итак, имеется ардуина мега, шесть реле с подключенными к ним лампочками и шесть выключателей.
управляется все это дело шестью вот такими циклами (у каждого цикла своя переменная):
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. вопрос в том, как это устроить