Управление группой диодов через for

vetrinus
Offline
Зарегистрирован: 15.08.2015

Здравствуйте! Подскажите пожалуйста, каким образом можно последовательно && с паузами вежду включением и выключением диодов && и невозможностью повторного включения/выключения диодов в течение определенного временного интервала.

Конструкции с delay не годятся. Подскажите, пожалуйста. Буду очень благодарен.

vetrinus
Offline
Зарегистрирован: 15.08.2015

Мне нужно при подаче 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);
}
}

Но сделать так, чтобы диоды при смене сигнала продолжали гореть/не гореть в течении определенного времени я не могу.

Я просто решил, что объяснить задачу полностью  будет правильней. А вообще, мои мысли по поводу решения витают в области первого поста темы. Подскажите, мб я и не там рою вообще.

bwn
Offline
Зарегистрирован: 25.08.2014

Мигаем без delay , а дальше и почитать не грех. Хотя бы форум.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Я что-то так и не понял, а почему "через for". For-то чем провинился?

vetrinus
Offline
Зарегистрирован: 15.08.2015

нет, в общем-то. Просто в момент написания темы я был в начале пути. Сейчас проблема решена вот таким способом. 

#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

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

И что работает? Без глюков? Ну, это до первого глюка :) Пока не вставите описание другой переменной между строками 5 и 7.

Дело в том, что, цикл в строке 40 пропашет весь массив pinLed и ... остановится, если Вам повезёт и сразу после массива в памяти будет ноль. А вот если там будет другое число, то он включит и этот пин, если и следующее число не 0, то он и тот включит, ну и так далее.

Поставьте нормальное условие цикла, иначе будете ловить необъяснимые и неповторяющиеся фантомные глюки.

vetrinus
Offline
Зарегистрирован: 15.08.2015
for(byte i =0; i < 10; i++) {pinMode (pinLed[i], OUTPUT);}

 

vetrinus
Offline
Зарегистрирован: 15.08.2015

Я начал осваивать программирование около полутора недель назад. Мне и это-то неимоверно сложно