Подскажите пожалуйста, как решить проблему?

DenisMaltsev
Offline
Зарегистрирован: 19.01.2017

Работаю над собственным проектом. Сам только начал работать с ардуино. Задача состоит в следующем. Необходимо задать 3 режима работы Ардуино. В каждом режиме светодиоды горят поразному. Режимы переключаются с помощью кнопки. Если сделать запуск первого режима сразу при включении ардуино, то все работает хорошо. Если же сделать включение первого режима при нажатии кнопки, то светодиоды начинают глючить, тоже самое происходит при переходе с 3 режима на 1 при нажатии кнопки.

boolean lastButton=LOW;
boolean currentButton=LOW;
int val=0;
int rampa = LOW;// переменная устанавливающая состояние светодиода рампы
int nasos = LOW;// переменная устанавливающая состояние светодиода насоса
long previousMillisNasos = 0; // храним время последнего переключения светодиода насоса
long previousMillisRampa = 0;// храним время последнего переключения светодиода рампы
long previousMillisC = 0;// храним время последнего переключения светодиода 1 цилиндра
long intervalNasos = 500; // интервал между включение/выключением светодиода насоса
long intervalRampa = 500; // интервал между включением светодиодов рампы
void setup() 
{
pinMode (1, OUTPUT);//задаем режим работы пина
pinMode (2, OUTPUT);//задаем режим работы пина
pinMode (3, OUTPUT);//задаем режим работы пина
pinMode (4, OUTPUT);//задаем режим работы пина
pinMode (5, OUTPUT);//задаем режим работы пина
pinMode (6, OUTPUT);//задаем режим работы пина
pinMode (7, OUTPUT);//задаем режим работы пина
pinMode (8, OUTPUT);//задаем режим работы пина
pinMode (9, OUTPUT);//задаем режим работы пина
pinMode (10, OUTPUT);//задаем режим работы пина
pinMode (11, OUTPUT);//задаем режим работы пина
pinMode (12, OUTPUT);//задаем режим работы пина
pinMode (13, OUTPUT);//задаем режим работы пина
pinMode (A5, INPUT);//задаем режим работы пина
}
boolean debounce(boolean last)//вводим задержку для кнопки
  {
    boolean current=digitalRead(A5);
    if (last!=current)  
    {
    delay(5);
  current=digitalRead(A5);
  }
return current;
}
void loop() 
{// при нажатии кнопки должен преключатся режим val, а при нажатии кнопки на 3 режиме ардуино должен перейти в первоначальное состояние т. е. режим 1
currentButton=debounce(lastButton);
if (lastButton == LOW && currentButton == HIGH)
{ val=val+1;}
lastButton = currentButton;
if (val>3){val=0;}
  
  
  if (val==0)// режим 1
  {
  digitalWrite (13, HIGH);//включаем светодиод Б.У.
  unsigned long currentMillisNasos = millis();//начинаем отсчет времени для светодиода насоса
  if(currentMillisNasos - previousMillisNasos > intervalNasos)//если светодиод насоса горит дольше чем задержка, то
  {
    previousMillisNasos = currentMillisNasos;//записываем время последнего переключения светодиода
    if (nasos == LOW)//если светодиод был выключен, то
      nasos = HIGH;//включаем его
    else//если он был включен, то
      nasos = LOW;//выключаем его
      digitalWrite(1, nasos);//заставляем ардуино включить либо выключить светодиод насоса
      
      if (intervalNasos <=200)//если интервал включения/выключения светодиода меньше либо равно 200
      intervalNasos = 200;//то принимаем значение интервала равным 200 
      else//если интервал больше 200, то
      intervalNasos=intervalNasos-5;//уменьшаем интервал на 5
  }
  digitalWrite (6, HIGH);//включаем зеленый светодиод рампы
  unsigned long currentMillisRampa= millis();//начинаем отсчет времени для светодиода рампы
   
  if (currentMillisRampa > intervalRampa)//если время превысило заданный нами интервал
  {digitalWrite (5, HIGH);}//включаем 2-ой зеленый светодиод рампы
  if (currentMillisRampa > intervalRampa+500)//ждем еще
  {digitalWrite (4, HIGH);}//включаем 1-ый желтый светодиод
  if (currentMillisRampa > intervalRampa+1000)// ждем еще
  {digitalWrite (3, HIGH);}//включаем 2-ой желтый
  if (currentMillisRampa- previousMillisRampa > intervalRampa+1500)//ждем еще
   {
    previousMillisRampa = currentMillisRampa;//записываем время последнего переключения светодиода
    if (rampa == LOW)//если светодиод был выключен, то
      rampa = HIGH;//включаем его
    else//если он был включен, то
     rampa = LOW;//выключаем его
      digitalWrite(2, rampa);//заставляем ардуино включить либо выключить светодиод рампы
   }
 
  unsigned long currentMillisC = millis();//начинаем отсчет времени для светодиодов цилиндров
  if(currentMillisC == previousMillisC +100)//если светодиод горит дольше чем задержка, то
 {  digitalWrite (12,HIGH);digitalWrite (9,HIGH);}
 if(currentMillisC == previousMillisC + 200)//если светодиод горит дольше чем задержка, то
 {  digitalWrite (12,LOW);}
 if(currentMillisC == previousMillisC + 300)//если светодиод горит дольше чем задержка, то
 {  digitalWrite (12,HIGH);}
 if(currentMillisC == previousMillisC + 400)//если светодиод горит дольше чем задержка, то
 {  digitalWrite (12,LOW);digitalWrite (9,LOW);}
 if(currentMillisC == previousMillisC + 500)//если светодиод горит дольше чем задержка, то
 {  digitalWrite (12,HIGH); digitalWrite (8, HIGH);}
 if(currentMillisC == previousMillisC + 600)//если светодиод горит дольше чем задержка, то
 {  digitalWrite (8,LOW);}
 if(currentMillisC ==previousMillisC + 700)//если светодиод горит дольше чем задержка, то
 {  digitalWrite (8,HIGH);}
 if(currentMillisC ==previousMillisC + 800)//если светодиод горит дольше чем задержка, то
 {  digitalWrite (12,LOW);digitalWrite (8,LOW);}
 if(currentMillisC ==previousMillisC + 900)//если светодиод горит дольше чем задержка, то
 {  digitalWrite (8,HIGH); digitalWrite (10,HIGH);}
 if(currentMillisC ==previousMillisC + 1000)//если светодиод горит дольше чем задержка, то
 {  digitalWrite (10,LOW);} 
 if(currentMillisC ==previousMillisC + 1100)//если светодиод горит дольше чем задержка, то
 {  digitalWrite (10,HIGH);}
  if(currentMillisC ==previousMillisC + 1200)//если светодиод горит дольше чем задержка, то
 {  digitalWrite (10,LOW); digitalWrite (8,LOW);}
   if(currentMillisC ==previousMillisC + 1300)//если светодиод горит дольше чем задержка, то
 {  digitalWrite (10,HIGH); digitalWrite (7,HIGH);}
   if(currentMillisC ==previousMillisC + 1400)//если светодиод горит дольше чем задержка, то
 {  digitalWrite (7,LOW);}
   if(currentMillisC ==previousMillisC + 1500)//если светодиод горит дольше чем задержка, то
 {  digitalWrite (7,HIGH);}
  if(currentMillisC ==previousMillisC + 1600)//если светодиод горит дольше чем задержка, то
 {  digitalWrite (7,LOW);digitalWrite (10,LOW);}
  if(currentMillisC ==previousMillisC + 1700)//если светодиод горит дольше чем задержка, то
 {  digitalWrite (7,HIGH);digitalWrite (11,HIGH);}
  if(currentMillisC ==previousMillisC + 1800)//если светодиод горит дольше чем задержка, то
 {  digitalWrite (11,LOW);}
  if(currentMillisC ==previousMillisC + 1900)//если светодиод горит дольше чем задержка, то
 {  digitalWrite (11,HIGH);}
  if(currentMillisC ==previousMillisC + 2000)//если светодиод горит дольше чем задержка, то
 {  digitalWrite (7,LOW);digitalWrite (11,LOW);}
  if(currentMillisC ==previousMillisC + 2100)//если светодиод горит дольше чем задержка, то
 {  digitalWrite (11,HIGH);digitalWrite(9,HIGH);}
  if(currentMillisC ==previousMillisC + 2200)//если светодиод горит дольше чем задержка, то
 {  digitalWrite (9,LOW);}
  if(currentMillisC ==previousMillisC + 2300)//если светодиод горит дольше чем задержка, то
 {  digitalWrite (9,HIGH);}
  if(currentMillisC ==previousMillisC + 2400)//если светодиод горит дольше чем задержка, то
 {  digitalWrite (9,LOW);digitalWrite (11,LOW); previousMillisC = currentMillisC ;}
 }
 
if(val==1)
{
  digitalWrite (13, HIGH);//включаем светодиод Б.У.
  unsigned long currentMillisNasos = millis();//начинаем отсчет времени для светодиода насоса
  if(currentMillisNasos - previousMillisNasos > intervalNasos)//если светодиод насоса горит дольше чем задержка, то
  {
    previousMillisNasos = currentMillisNasos;//записываем время последнего переключения светодиода
    if (nasos == LOW)//если светодиод был выключен, то
      nasos = HIGH;//включаем его
    else//если он был включен, то
      nasos = LOW;//выключаем его
      digitalWrite(1, nasos);//заставляем ардуино включить либо выключить светодиод насоса
      
      if (intervalNasos <=100)//если интервал включения/выключения светодиода меньше либо равно 100
      intervalNasos = 100;//то принимаем значение интервала равным 100 
      else//если интервал больше 100, то
      intervalNasos=intervalNasos-5;//уменьшаем интервал на 5
  }
  digitalWrite (6, HIGH);//включаем зеленый светодиод рампы
  unsigned long currentMillisRampa= millis();//начинаем отсчет времени для светодиода рампы
   
  if (currentMillisRampa > intervalRampa)//если время превысило заданный нами интервал
  {digitalWrite (5, HIGH);}//включаем 2-ой зеленый светодиод рампы
  if (currentMillisRampa > intervalRampa+500)//ждем еще
  {digitalWrite (4, HIGH);}//включаем 1-ый желтый светодиод
  if (currentMillisRampa > intervalRampa+1000)// ждем еще
  {digitalWrite (3, HIGH);}//включаем 2-ой желтый
  if (currentMillisRampa- previousMillisRampa > intervalRampa+1500)//ждем еще
   {
    previousMillisRampa = currentMillisRampa;//записываем время последнего переключения светодиода
    if (rampa == LOW)//если светодиод был выключен, то
      rampa = HIGH;//включаем его
    else//если он был включен, то
     rampa = LOW;//выключаем его
      digitalWrite(2, rampa);//заставляем ардуино включить либо выключить светодиод рампы
   }
   unsigned long currentMillisC = millis();//начинаем отсчет времени для светодиодов цилиндров
  if(currentMillisC == previousMillisC +100)//если светодиод горит дольше чем задержка, то
 { digitalWrite (9,HIGH);}
 if(currentMillisC == previousMillisC + 300)//если светодиод горит дольше чем задержка, то
 {  digitalWrite (12,HIGH);}
 if(currentMillisC == previousMillisC + 400)//если светодиод горит дольше чем задержка, то
 {  digitalWrite (12,LOW);digitalWrite (9,LOW);}
 if(currentMillisC == previousMillisC + 500)//если светодиод горит дольше чем задержка, то
 {  digitalWrite (12,HIGH);}
 if(currentMillisC ==previousMillisC + 700)//если светодиод горит дольше чем задержка, то
 {  digitalWrite (8,HIGH);}
 if(currentMillisC ==previousMillisC + 800)//если светодиод горит дольше чем задержка, то
 {  digitalWrite (12,LOW);digitalWrite (8,LOW);}
 if(currentMillisC ==previousMillisC + 900)//если светодиод горит дольше чем задержка, то
 {  digitalWrite (8,HIGH); }
 if(currentMillisC ==previousMillisC + 1100)//если светодиод горит дольше чем задержка, то
 {  digitalWrite (10,HIGH);}
  if(currentMillisC ==previousMillisC + 1200)//если светодиод горит дольше чем задержка, то
 {  digitalWrite (10,LOW); digitalWrite (8,LOW);}
   if(currentMillisC ==previousMillisC + 1300)//если светодиод горит дольше чем задержка, то
 {  digitalWrite (10,HIGH); }
   if(currentMillisC ==previousMillisC + 1500)//если светодиод горит дольше чем задержка, то
 {  digitalWrite (7,HIGH);}
  if(currentMillisC ==previousMillisC + 1600)//если светодиод горит дольше чем задержка, то
 {  digitalWrite (7,LOW);digitalWrite (10,LOW);}
  if(currentMillisC ==previousMillisC + 1700)//если светодиод горит дольше чем задержка, то
 {  digitalWrite (7,HIGH);}
   if(currentMillisC ==previousMillisC + 1900)//если светодиод горит дольше чем задержка, то
 {  digitalWrite (11,HIGH);}
  if(currentMillisC ==previousMillisC + 2000)//если светодиод горит дольше чем задержка, то
 {  digitalWrite (7,LOW);digitalWrite (11,LOW);}
  if(currentMillisC ==previousMillisC + 2100)//если светодиод горит дольше чем задержка, то
 {  digitalWrite (11,HIGH);}
   if(currentMillisC ==previousMillisC + 2300)//если светодиод горит дольше чем задержка, то
 {  digitalWrite (9,HIGH);}
  if(currentMillisC ==previousMillisC + 2400)//если светодиод горит дольше чем задержка, то
 {  digitalWrite (9,LOW);digitalWrite (11,LOW); previousMillisC = currentMillisC ;}

  }
  if (val==2)//режим 2
      {
  digitalWrite (13, HIGH);//включаем светодиод Б.У.
  unsigned long currentMillisNasos = millis();//начинаем отсчет времени для светодиода насоса
  if(currentMillisNasos - previousMillisNasos > intervalNasos)//если светодиод насоса горит дольше чем задержка, то
  {
    previousMillisNasos = currentMillisNasos;//записываем время последнего переключения светодиода
    if (nasos == LOW)//если светодиод был выключен, то
      nasos = HIGH;//включаем его
    else//если он был включен, то
      nasos = LOW;//выключаем его
      digitalWrite(1, nasos);//заставляем ардуино включить либо выключить светодиод насоса
      
      if (intervalNasos <=100)//если интервал включения/выключения светодиода меньше либо равно 100
      intervalNasos = 100;//то принимаем значение интервала равным 100 
      else//если интервал больше 100, то
      intervalNasos=intervalNasos-5;//уменьшаем интервал на 5
  }
  digitalWrite (6, HIGH);//включаем зеленый светодиод рампы
  unsigned long currentMillisRampa= millis();//начинаем отсчет времени для светодиода рампы
   
  if (currentMillisRampa > intervalRampa)//если время превысило заданный нами интервал
  {digitalWrite (5, HIGH);}//включаем 2-ой зеленый светодиод рампы
  if (currentMillisRampa > intervalRampa+500)//ждем еще
  {digitalWrite (4, HIGH);}//включаем 1-ый желтый светодиод
  if (currentMillisRampa > intervalRampa+1000)// ждем еще
  {digitalWrite (3, HIGH);}//включаем 2-ой желтый
  if (currentMillisRampa- previousMillisRampa > intervalRampa+1500)//ждем еще
   {
    previousMillisRampa = currentMillisRampa;//записываем время последнего переключения светодиода
    if (rampa == LOW)//если светодиод был выключен, то
      rampa = HIGH;//включаем его
    else//если он был включен, то
     rampa = LOW;//выключаем его
      digitalWrite(2, rampa);//заставляем ардуино включить либо выключить светодиод рампы
   }
   unsigned long currentMillisC = millis();//начинаем отсчет времени для светодиодов цилиндров
  if(currentMillisC == previousMillisC )//если светодиод горит дольше чем задержка, то
 { digitalWrite (9,HIGH);}
  if(currentMillisC == previousMillisC + 400)//если светодиод горит дольше чем задержка, то
 {digitalWrite (9,LOW);digitalWrite (12,HIGH);}
 if(currentMillisC ==previousMillisC + 800)//если светодиод горит дольше чем задержка, то
 {  digitalWrite (12,LOW); digitalWrite (10,HIGH);}
   if(currentMillisC ==previousMillisC + 1200)//если светодиод горит дольше чем задержка, то
 {  digitalWrite (10,LOW); digitalWrite (8,HIGH);}
   if(currentMillisC ==previousMillisC + 1600)//если светодиод горит дольше чем задержка, то
 {  digitalWrite (8,LOW); digitalWrite (7,HIGH);}
    if(currentMillisC ==previousMillisC + 2000)//если светодиод горит дольше чем задержка, то
 {  digitalWrite (7,LOW);digitalWrite (11,HIGH);}
    if(currentMillisC ==previousMillisC + 2000)//если светодиод горит дольше чем задержка, то
 {  digitalWrite (11,LOW);previousMillisC = currentMillisC;}
 
     
  }
  if (val==3)// режим 3, выключаем все светодиоды.
  {digitalWrite(1,LOW);
  digitalWrite(2,LOW);
  digitalWrite(3,LOW);
  digitalWrite(4,LOW);
  digitalWrite(5,LOW);
  digitalWrite(6,LOW);
  digitalWrite(7,LOW);
  digitalWrite(8,LOW);
  digitalWrite(9,LOW);
  digitalWrite(10,LOW);
  digitalWrite(11,LOW);
  digitalWrite(12,LOW);
  digitalWrite(13,LOW);

 
  previousMillisNasos=0;
  previousMillisRampa=0; 
 
  previousMillisC=0;
}
     
  }

P.S. Буду очень признателен за помощь. Заранее пршу прощение за визуальное оформление кода. В процессе его написания постоянно, что то изменялось, подправлялось или удалялось.

korishkras
Offline
Зарегистрирован: 18.01.2017

Первое что сделал бы, поставил конструкцию switch case. Ибо код не очень сложный, но перегружен сильно. Ну и на вскидку заменил выключение циклом, много лишнего. Режимы переключаются последовательно? 1, затем 2 и третий? Или одно нажатие первый, два второй, три третий?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Почитай отсюда и ниже #959

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

И лишние комменты поубери. А то получился наглядный пример как комментариями можно полностью засрать код до нечитаемого состояния. :)

DenisMaltsev
Offline
Зарегистрирован: 19.01.2017

Последовательно

DenisMaltsev
Offline
Зарегистрирован: 19.01.2017

Arhat109-2 пишет:

И лишние комменты поубери. А то получился наглядный пример как комментариями можно полностью засрать код до нечитаемого состояния. :)

Да мне с ними как то проще ориентироваться в коде))) По крайней мере пока язык не освоил.

DenisMaltsev
Offline
Зарегистрирован: 19.01.2017

korishkras пишет:
Первое что сделал бы, поставил конструкцию switch case. Ибо код не очень сложный, но перегружен сильно. Ну и на вскидку заменил выключение циклом, много лишнего. Режимы переключаются последовательно? 1, затем 2 и третий? Или одно нажатие первый, два второй, три третий?

Спасибо за совет. Попробую Switch case.)

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

У вас структура программы напоминает карточный домик. Еще одна карта или ветерок и привет всей конструкции. Все же попробуйте с классами. В крайнем случает опишите , что у вас должно произойти в каждом из вариантов. Может смогу помочь. А так честно я в вашем коде заблудился. Я не притендую на распутывателя чужих кодов, так как чужой код это потемки.