Блок управления нагрузкой
- Войдите на сайт для отправки комментариев
Пт, 13/11/2015 - 19:29
Ребята, нужна небольшая помощь в написании прошивки для блока управления отоплением. Будут включаться обогреватели в разных помещениях через симисторы. На али заказана Pro Mini и разведена плата под нее.
При нажатии PIN13 Включаем PIN5,6
При повторном нажатии PIN13, выключаем PIN5,6 и включаем Pin3 с DELAY, все кнопки кроме PIN 13 не реагируют на нажатия
При нажатии PIN10 Включаем PIN7
При повторном нажатии PIN10, выключаем PIN7
При нажатии PIN11 Включаем PIN8
При повторном нажатии PIN11, выключаем PIN8
При нажатии PIN12 Включаем PIN9
При повторном нажатии PIN12, выключаем PIN9
Какими функциями это можно реализовать? Что-то ничего не приходит в голову кроме if..else. Може у кого-то есть рабочий пример который можно переделать?
Заранее спасибо!
Набросал из примеров код, скажите, будет работать? Плата приедет примерно через 2 недели, хотелось бы к тому времени иметь рабочий код. Теперь главное, как заставить контроллер реагировать только на PIN13, при выключеных PIN5,6
Грубо говоря включать эту "систему" только одной кнопкой, надеюсь обьяснил понятно :)
Как вставлять код под спойлер?
/* При нажатии PIN13 Включаем PIN5,6 (int=POW1;) При повторном нажатии PIN13, выключаем PIN5,6 и включаем Pin3 с DELAY, все кнопки кроме PIN 13 не реагируют на нажатия При нажатии PIN10 Включаем PIN7 (int=POW2;) При повторном нажатии PIN10, выключаем PIN7 При нажатии PIN11 Включаем PIN8 (int=POW3;) При повторном нажатии PIN11, выключаем PIN8 При нажатии PIN12 Включаем PIN9 (int=POW4;) При повторном нажатии PIN12, выключаем PIN9 */ int POW1 = 0; int POW2 = 0; int POW3 = 0; int POW4 = 0; int LED = 3; // вывод 3 int brightness = 0; // начальная яркость светодиода int fadeAmount = 5; // величина изменения яркости светодиода void setup() { pinMode(5, OUTPUT); pinMode(6, OUTPUT); pinMode(7, OUTPUT); pinMode(8, OUTPUT); pinMode(9, OUTPUT); pinMode(10, INPUT); pinMode(11, INPUT); pinMode(12, INPUT); pinMode(13, INPUT); digitalWrite(5, 0); digitalWrite(6, 0); digitalWrite(7, 0); digitalWrite(8, 0); digitalWrite(9, 0); } void loop() { if (digitalRead(13) == HIGH && POW1 == 0) //если кнопка нажата // и перемення POW1 равна 0 , то ... { digitalWrite(5, !digitalRead(5)); digitalWrite(6, !digitalRead(5)); POW1 = 1; //это нужно для того что бы с каждым нажатием кнопки //происходило только одно действие // плюс защита от "дребезга" 100% // устанавливаем яркость у светодиода у вывода 10 analogWrite(LED, brightness); // изменяем яркость в цикле, прибавляя заданную величину brightness = brightness + fadeAmount; // меняем порядок затухания на обратный при достижении минимальной или максимальной яркости if (brightness == 0 || brightness == 255) { fadeAmount = -fadeAmount ; } // делаем небольшую паузу для лучшего эффекта delay(30); } if (digitalRead(13) == LOW && POW1 == 1) //если кнопка НЕ нажата //и переменная POW равна - 1 ,то ... { POW1 = 0; //обнуляем переменную POW1 } if (digitalRead(10) == HIGH && POW1 == 0) //если кнопка нажата // и перемення POW2 равна 0 , то ... { digitalWrite(7, !digitalRead(7)); POW2 = 1; //это нужно для того что бы с каждым нажатием кнопки //происходило только одно действие // плюс защита от "дребезга" 100% } if (digitalRead(10) == LOW && POW2 == 1) //если кнопка НЕ нажата //и переменная POW2 равна - 1 ,то ... { POW2 = 0; //обнуляем переменную POW2 } if (digitalRead(11) == HIGH && POW3 == 0) //если кнопка нажата // и перемення POW3 равна 0 , то ... { digitalWrite(8, !digitalRead(8)); POW3 = 1; //это нужно для того что бы с каждым нажатием кнопки //происходило только одно действие // плюс защита от "дребезга" 100% } if (digitalRead(11) == LOW && POW3 == 1) //если кнопка НЕ нажата //и переменная POW32 равна - 1 ,то ... { POW3 = 0; //обнуляем переменную POW3 } if (digitalRead(12) == HIGH && POW4 == 0) //если кнопка нажата // и перемення POW3 равна 0 , то ... { digitalWrite(8, !digitalRead(8)); POW4 = 1; //это нужно для того что бы с каждым нажатием кнопки //происходило только одно действие // плюс защита от "дребезга" 100% } if (digitalRead(12) == LOW && POW4 == 1) //если кнопка НЕ нажата //и переменная POW4 равна - 1 ,то ... { POW4 = 0; //обнуляем переменную POW4 } }Как вставлять код под спойлер?
Вставка-редактирование кода / Дополнительно / Свернуть
В 76й строчке (
if(digitalRead(10) == HIGH && POW1 == 0))POW1 -сменитьPOW2 и еще, проверки данного условия (При повторном нажатии PIN13, выключаем PIN5,6 и включаем Pin3 с DELAY, все кнопки кроме PIN 13 не реагируют на нажатия) я не вижу. У Вас все кнопки, не зависимо от состояния PIN5,6 - будут работать хотя Вы пишете что при PIN5,6 LOW они не должны реагировать. Так что если я правильно Вас понял введите дополнительную проверку.Вот именно в этом самая большая загвоздка. Условно говоря я пришел на работу, включил прибор и дальше могу контроллировать остальные конматы.
Проверка должна выглядеть как "если пин5,6 == 0, то все остальные пины выключены" но как заставить ардуино игнорировать кнопки до достижения равенства pin5,6 == 1 ?
Вот так работает - проверил в протеусе
/* При нажатии PIN13 Включаем PIN5,6 (int=POW1;) При повторном нажатии PIN13, выключаем PIN5,6 и включаем Pin3 с DELAY, все кнопки кроме PIN 13 не реагируют на нажатия При нажатии PIN10 Включаем PIN7 (int=POW2;) При повторном нажатии PIN10, выключаем PIN7 При нажатии PIN11 Включаем PIN8 (int=POW3;) При повторном нажатии PIN11, выключаем PIN8 При нажатии PIN12 Включаем PIN9 (int=POW4;) При повторном нажатии PIN12, выключаем PIN9 */ int POW1 = 0; int POW2 = 0; int POW3 = 0; int POW4 = 0; int LED = 3; // вывод 3 int brightness = 0; // начальная яркость светодиода int fadeAmount = 5; // величина изменения яркости светодиода bool flag1 = 0; // Добавляем переменную которая мняет состояние вместе PIN5,6 void setup() { pinMode(5, OUTPUT); pinMode(6, OUTPUT); pinMode(7, OUTPUT); pinMode(8, OUTPUT); pinMode(9, OUTPUT); pinMode(10, INPUT); pinMode(11, INPUT); pinMode(12, INPUT); pinMode(13, INPUT); digitalWrite(5, 0); digitalWrite(6, 0); digitalWrite(7, 0); digitalWrite(8, 0); digitalWrite(9, 0); } void loop() { if (digitalRead(13) == HIGH && POW1 == 0) //если кнопка нажата // и перемення POW1 равна 0 , то ... { digitalWrite(5, !digitalRead(5)); digitalWrite(6, !digitalRead(6)); POW1 = 1; //это нужно для того что бы с каждым нажатием кнопки //происходило только одно действие // плюс защита от "дребезга" 100% // устанавливаем яркость у светодиода у вывода 10 if (digitalRead(5))flag1 = 1; // вот здесь она меняет состояние else flag1 =0; analogWrite(LED, brightness); // изменяем яркость в цикле, прибавляя заданную величину brightness = brightness + fadeAmount; // меняем порядок затухания на обратный при достижении минимальной или максимальной яркости if (brightness == 0 || brightness == 255) { fadeAmount = -fadeAmount ; } // делаем небольшую паузу для лучшего эффекта delay(30); } if (digitalRead(13) == LOW && POW1 == 1) //если кнопка НЕ нажата //и переменная POW равна - 1 ,то ... { POW1 = 0; //обнуляем переменную POW1 } if (digitalRead(10) == HIGH && POW2 == 0 && flag1 ==1) //если кнопка нажата // и перемення POW2 равна 0 , то ... { digitalWrite(7, !digitalRead(7)); POW2 = 1; //это нужно для того что бы с каждым нажатием кнопки //происходило только одно действие // плюс защита от "дребезга" 100% } if (digitalRead(10) == LOW && POW2 == 1) //если кнопка НЕ нажата //и переменная POW2 равна - 1 ,то ... { POW2 = 0; //обнуляем переменную POW2 } if (digitalRead(11) == HIGH && POW3 == 0 && flag1 ==1) //если кнопка нажата // и перемення POW3 равна 0 , то ... { digitalWrite(8, !digitalRead(8)); POW3 = 1; //это нужно для того что бы с каждым нажатием кнопки //происходило только одно действие // плюс защита от "дребезга" 100% } if (digitalRead(11) == LOW && POW3 == 1) //если кнопка НЕ нажата //и переменная POW32 равна - 1 ,то ... { POW3 = 0; //обнуляем переменную POW3 } if (digitalRead(12) == HIGH && POW4 == 0 && flag1 ==1) //если кнопка нажата // и перемення POW3 равна 0 , то ... { digitalWrite(8, !digitalRead(8)); POW4 = 1; //это нужно для того что бы с каждым нажатием кнопки //происходило только одно действие // плюс защита от "дребезга" 100% } if (digitalRead(12) == LOW && POW4 == 1) //если кнопка НЕ нажата //и переменная POW4 равна - 1 ,то ... { POW4 = 0; //обнуляем переменную POW4 } }Когда будете собирать ставте подтягивающее сопротивление на все кнопки
Там возникает еще одна проблема а может так и задумано? Если пин5-высокий то мы можем другими кнопками включить\выключать нагрузку на других пинах а когда мы кн13 отключили пин5, а на других пинах остался высокий потенциал, то он так и останется пока не активируем кнопки. Так что смотрите, если так задумано то нормально если нет надо исправлять.
Спасибо за доработаный код.
Нет, так быть не должно, если состояние пин5 изменилось на 0, то все остальные пины тоже дожды быть сброшены в 0.
Значит переменная flag должна отключать и все остальные пины, все верно?
Сейчас с телефона, не могу отредактировать код, вот только до компа доберусь и попробую :)
Кстати, не могли бы скинуть файл протеуса на мыло?
Да правильно а поповоду файла, там нечего скидывать, 1проц, 4 кнопки, 5 диодов
Подправил мелкие ошибки.
Собрал схему в протеусе, но работает не совсем так как я хочу. Когда "включаю" прибор нажаием на PIN13, на PIN5 появляеться 1, а на PIN6 - 0, хотя там тоже должна быть единица. Хоть убей не пойму почему, завтра попробую пошаманить еще.
Спасибо за помощь и наставления ;-)
Проверил в протеусе еще раз, все работает пин5 и пин6 вкл\вык. Вы сделали минусовую подтяжку к пинам (10,11,12,13) через сопротивление как я писал?
Без этой подтяжки работать будет не правильно. А вообще надо переписать программу и кнопки замыкать на минус, тогда подтяжку можно сделать програмно.