Вот етот код пашет только на три выхода, если использовать этот полностью то контроллер виснет даже пинга нет. Если 4 выхода использовать - то 3 кнопки есть но с глуками нажимаются и состояние выхода не показывают, 4 выход вкл. и выкл. только через адрес кнопки в вебе почему то нет. Вот где грабли!? Форумчане!
Здесь надо по другому. Если нужно более 2 выходов. Тогда надо получить работающий на 1 или 2 выходах. И потом использовать массивы. Не хотел их вводить, чтобы не усложнять код, ради 2 выходов. Побег, буду около 3 часов. UPD. Увы не выходит, ближе к вечеру.
Код (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(); } }
Разобрались, отлично. Глянул на код похож, видимо какая-то мелочь. В чем была проблема? UPD. Наконец-то разобрался со своей электроникой.
На три кнопки разобрался, а вот на 4-8 нет. модуль тупо виснет. Что за електроника дома? я тож ваяю. досталисть почти нашару раутавтоматик УДМ03 контроллеры . щас весь свет на них делаю
Воевал с прямо пропорциональным гидравлическим клапаном. Сам управлялся просто, а вот снимать показания возникли проблемы. Ход штока 10мм, а надо было получить 100 шагов, максимум с 1 % погрешности. Начинал с катушек, мало знаний., да и много сложностей, слишком много у меня разно мастных типов клапанов. Затем пошли в ход пром. датчики Balluff индуктивного перемещения, но дорогие, сейчас штангенциркуль . У меня пакет платок, от ардуины, больше 3-ков. Но в реально, использую только контролеры, реле, монитор и клавиатуру, дальше пром. электроника. Проектов не много, но в основном связанных со станочками, для производства. Сейчас, попробую накидать расширявшему схему, думал нужно только 2 реле.
Код можно сильно упростить, избавившись от от огромного количества условий. Попробуйте передавать параметры в виде 1 и 0 вместо on и off. Тогда нужно будет проанализировать строку вида "?ledX=Y", где X - номер пина, а Y - его состояние. Вместо сравнения строки со всеми возможными вариантами гораздо проще ее разобрать и выделить в отдельные переменные X и Y, которые можно непосредственно сунуть в digitalWrite(), предварительно преобразовав из строки в числа. Тогда программа получится простой и компактной. Кроме того, не придется вносить особых изменений в код для добавления новых входов - достаточно будет просто модифицировать код HTML-страницы, добавив ссылки с нужными параметрами.
Как-то так, проверьте работает ли. Специально оставил, ком порт, чтобы отлаживаться. Код (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 Выкл
С другом на 2-их покупаем, да и много идей умерло из-за отсутствия времени. А так сетевая, релюх, драйверов мотора, экранов, клав. мембраных, датчик лини, датчик цвета, ИК препятствий, датчиков препятствий, часы , датчик тока, температуры, акселерометр, гироскоп, барометр и компас и по мелочи. Что-то покупалось, что-то доставалось за даром, на барахолках. Как говорится, если, что откроем магазин Полагаю делаете умный дом с контролем. Не знаком, что это?
Согласен. на дом как обычно времени нет. все по немногу делаю, по мере поступления идей. это его новее брат http://www.raut-automatic.kiev.ua/snyato/udm-base-12-8.html
меня товарищь поддергивает по умному дому. когда жена дома а свет традиционным способом не включается
Поясню код который написал. Запрос по схеме 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"; } } Можно его дополнить, доп проверками. Можно при разборке запроса выявлять индекс массива. Будут вопросы по коду спрашивайте. Интересное решение.
Это лишнее, достаточно написать просто digitalWrite(outPinIndex, valueRequest); Если нужно переключить выход - он переключится (1 => 0). Если он уже в нужном состоянии - ничего не произойдет (1 => 1).