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