Управление группой диодов через for
- Войдите на сайт для отправки комментариев
Сб, 15/08/2015 - 17:37
Здравствуйте! Подскажите пожалуйста, каким образом можно последовательно && с паузами вежду включением и выключением диодов && и невозможностью повторного включения/выключения диодов в течение определенного временного интервала.
Конструкции с delay не годятся. Подскажите, пожалуйста. Буду очень благодарен.
Мне нужно при подаче 4х напряжений на аналоговый вход зажигать определенную группу диодов.
Вот, как я это реализовал.
#define PIN13 13 #define PIN12 12 #define PIN11 11 #define PIN10 10 #define PIN9 9 #define Control A0 #define PIN7 7 #define PIN6 6 #define PIN5 5 #define PIN4 4 #define PIN3 3 //float V1 = 1.68; //float V2 = 2.05; //float V3 = 2.79; //float V4 = 5.0; void setup () { pinMode (PIN13, OUTPUT); pinMode (PIN12, OUTPUT); pinMode (PIN11, OUTPUT); pinMode (PIN10, OUTPUT); pinMode (PIN9, OUTPUT); pinMode (Control, INPUT); pinMode (PIN7, OUTPUT); pinMode (PIN6, OUTPUT); pinMode (PIN5, OUTPUT); pinMode (PIN4, OUTPUT); pinMode (PIN3, OUTPUT); } void loop(){ int SensorValue = analogRead (Control); float voltage = SensorValue * (5.0/1024.0); if (voltage>4.9 && voltage<5.1) { digitalWrite (PIN13, LOW); delay (1000); digitalWrite (PIN12, LOW); delay (1000); digitalWrite (PIN11, LOW); delay (1000); digitalWrite (PIN10, LOW); delay (1000); digitalWrite (PIN9, LOW); delay (1000); digitalWrite (PIN7, LOW); delay (1000); digitalWrite (PIN6, LOW); delay (1000); digitalWrite (PIN5, LOW); delay (1000); digitalWrite (PIN4, LOW); delay (1000); digitalWrite (PIN3, LOW); } if (voltage >2.7 && voltage <2.9) { digitalWrite (PIN13, HIGH); delay (1000); digitalWrite (PIN12, HIGH); delay (1000); digitalWrite (PIN11, HIGH); delay (1000); digitalWrite (PIN10, HIGH); delay (1000); digitalWrite (PIN9, HIGH); delay (1000); digitalWrite (PIN7, LOW); delay (1000); digitalWrite (PIN6, LOW); delay (1000); digitalWrite (PIN5, LOW); delay (1000); digitalWrite (PIN4, LOW); delay (1000); digitalWrite (PIN3, LOW); } if (voltage >=1.9 && voltage <2.2) { digitalWrite (PIN13, LOW); delay (1000); digitalWrite (PIN12, LOW); delay (1000); digitalWrite (PIN11, LOW); delay (1000); digitalWrite (PIN10, LOW); delay (1000); digitalWrite (PIN9, LOW); delay (1000); digitalWrite (PIN7, HIGH); delay (1000); digitalWrite (PIN6, HIGH); delay (1000); digitalWrite (PIN5, HIGH); delay (1000); digitalWrite (PIN4, HIGH); delay (1000); digitalWrite (PIN3, HIGH); } if (voltage >1.5 && voltage <1.8) { digitalWrite (PIN13, HIGH); delay (1000); digitalWrite (PIN12, HIGH); delay (1000); digitalWrite (PIN11, HIGH); delay (1000); digitalWrite (PIN10, HIGH); delay (1000); digitalWrite (PIN9, HIGH); delay (1000); digitalWrite (PIN7, HIGH); delay (1000); digitalWrite (PIN6, HIGH); delay (1000); digitalWrite (PIN5, HIGH); delay (1000); digitalWrite (PIN4, HIGH); delay (1000); digitalWrite (PIN3, HIGH); } }Но сделать так, чтобы диоды при смене сигнала продолжали гореть/не гореть в течении определенного времени я не могу.
Я просто решил, что объяснить задачу полностью будет правильней. А вообще, мои мысли по поводу решения витают в области первого поста темы. Подскажите, мб я и не там рою вообще.
Мигаем без delay , а дальше и почитать не грех. Хотя бы форум.
Я что-то так и не понял, а почему "через for". For-то чем провинился?
нет, в общем-то. Просто в момент написания темы я был в начале пути. Сейчас проблема решена вот таким способом.
#define PAUSE_LED 10000 // пауза между зажиганием LED, мсек #define PAUSE_MES 600000 // пауза между измерениями, мсекмсек #define CONTROL A0 const byte pinLed[10] = {13,12,11,10,9,7,6,5,4,3}; // массив с адресами пинов для LED const bool stateLed[4][10] = { // маска состояний: ноль-LED выключен, единица-LED включен {0,0,0,0,0,0,0,0,0,0}, // для условия №1 {1,1,1,1,1,0,0,0,0,0}, // для условия №2 {0,0,0,0,0,1,1,1,1,1}, {1,1,1,1,1,1,1,1,1,1} }; void setup() { pinMode (CONTROL, INPUT); byte i = 0; while(pinLed[i]) pinMode(pinLed[i++], OUTPUT); // настраиваем все LED-пины на OUTPUT } // конец setup void loop() { int SensorValue = analogRead (CONTROL); float voltage = SensorValue * (5.0/1024.0); if (voltage>4.9 && voltage<5.1) ledOperate(1); // условие №1 - подаем на пины маску №1 else if (voltage >2.7 && voltage <2.9) ledOperate(2); else if (voltage >=1.9 && voltage <2.2) ledOperate(3); else if (voltage >1.5 && voltage <1.8) ledOperate(4); delay(PAUSE_MES); // задержка перед следующим измерением } // конец loop void ledOperate(byte state) // функция включения-отключения соответствующих LED по номеру условия { byte i = 0; while(pinLed[i]) { digitalWrite (pinLed[i], stateLed[state-1][i]); delay(PAUSE_LED); // задержка перед зажиганием следующего LED i++; } } // конец ledOperateИ что работает? Без глюков? Ну, это до первого глюка :) Пока не вставите описание другой переменной между строками 5 и 7.
Дело в том, что, цикл в строке 40 пропашет весь массив pinLed и ... остановится, если Вам повезёт и сразу после массива в памяти будет ноль. А вот если там будет другое число, то он включит и этот пин, если и следующее число не 0, то он и тот включит, ну и так далее.
Поставьте нормальное условие цикла, иначе будете ловить необъяснимые и неповторяющиеся фантомные глюки.
for(byte i =0; i < 10; i++) {pinMode (pinLed[i], OUTPUT);}Я начал осваивать программирование около полутора недель назад. Мне и это-то неимоверно сложно