зависание через неопределенное время

aleksey19ru
Offline
Зарегистрирован: 23.06.2016

сделал скеч гирлянды, происходит зависание по прошествии некоторого времени, остается включен один пин. отключаю питание все опять работает. 1-2ч всегда по разному.


int Pot = A0;
int but1 = 2;
int led1 = 9;
int led2 = 10;
int led3 = 11;
int led4 = 12;
boolean lastButton = LOW;
boolean currentButton = LOW;
int set1 = 0;
int del;
void setup() {
  
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(Pot,INPUT);
pinMode(but1,INPUT);
}
boolean debounce(boolean last){
 boolean current = digitalRead(but1);
 if (last != current){
  delay(10);
  return current;
 }
}

void setMode(int mode) {
if (mode == 0) {
 digitalWrite(led1, HIGH);
 digitalWrite(led2, LOW);
 digitalWrite(led3, LOW);
 digitalWrite(led4, LOW);
 delay(del);
 digitalWrite(led1, LOW);
 digitalWrite(led2, LOW);
 digitalWrite(led3, LOW);
 digitalWrite(led4, HIGH);
 delay(del);
 digitalWrite(led1, LOW);
 digitalWrite(led2, HIGH);
 digitalWrite(led3, LOW);
 digitalWrite(led4, LOW);
 delay(del);
 digitalWrite(led1, LOW);
 digitalWrite(led2, LOW);
 digitalWrite(led3, HIGH);
 digitalWrite(led4, LOW);
 delay(del);
}
else if (mode ==1) {
 digitalWrite(led1, HIGH);
 digitalWrite(led2, HIGH);
 digitalWrite(led3, HIGH);
 digitalWrite(led4, LOW);
 delay(del);
 digitalWrite(led1, HIGH);
 digitalWrite(led2, HIGH);
 digitalWrite(led3, LOW);
 digitalWrite(led4, HIGH);
 delay(del);
 digitalWrite(led1, HIGH);
 digitalWrite(led2, LOW);
 digitalWrite(led3, HIGH);
 digitalWrite(led4, HIGH);
 delay(del);
 digitalWrite(led1, LOW);
 digitalWrite(led2, HIGH);
 digitalWrite(led3, HIGH);
 digitalWrite(led4, HIGH);
 delay(del);
}
else if (mode == 2) {
 digitalWrite(led1, HIGH);
 digitalWrite(led2, LOW);
 digitalWrite(led3, LOW);
 digitalWrite(led4, LOW);
 delay(del);
 digitalWrite(led1, LOW);
 digitalWrite(led2, HIGH);
 digitalWrite(led3, LOW);
 digitalWrite(led4, LOW);
 delay(del);
 digitalWrite(led1, LOW);
 digitalWrite(led2, LOW);
 digitalWrite(led3, HIGH);
 digitalWrite(led4, LOW);
 delay(del);
 digitalWrite(led1, LOW);
 digitalWrite(led2, LOW);
 digitalWrite(led3, LOW);
 digitalWrite(led4, HIGH);
 delay(del);
}
else if (mode == 3) {
 digitalWrite(led1, HIGH);
 digitalWrite(led2, HIGH);
 digitalWrite(led3, HIGH);
 digitalWrite(led4, HIGH);
 delay(del);
 digitalWrite(led1, HIGH);
 digitalWrite(led2, LOW);
 digitalWrite(led3, HIGH);
 digitalWrite(led4, LOW);
 delay(del);
 digitalWrite(led1, LOW);
 digitalWrite(led2, HIGH);
 digitalWrite(led3, LOW);
 digitalWrite(led4, HIGH);
 delay(del);
 digitalWrite(led1, HIGH);
 digitalWrite(led2, HIGH);
 digitalWrite(led3, HIGH);
 digitalWrite(led4, HIGH);
 delay(del);
 // analogWrite(led, 100);
}
}
void loop() {

  currentButton = debounce(lastButton);
  if (lastButton == LOW && currentButton == HIGH)
  { set1 ++; }
  lastButton; currentButton;
  if (set1 == 4)
   set1=0;
   setMode(set1);
 
  del=map(analogRead(Pot),0,1024,100,800);


}

 

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

1. что означает глубокомысленная запись в строке 124?

2. строка 17 - для аналогового чтения это бессмыслица - уберите

3. в функции setMode акстивно используется del. Чему она (del) равна при первом вызове setMode?

4. Где и когда изменяется переменная lastBuoon? Она у Вас всегда false.

aleksey19ru
Offline
Зарегистрирован: 23.06.2016

Спасибо понял! лишнее убрал, del - при первом запуске как неизвестная, переделал. буду пробовать.

aleksey19ru
Offline
Зарегистрирован: 23.06.2016

не понял что с 4 пунктом не так, но все работает, изучаю все по видио с ютуба, мож не правильно скеч написал поэтому.

 

inspiritus
Offline
Зарегистрирован: 17.12.2012

Вообще описанные Вами зависания встречаются из-за проблем с питанием. Имеет смысл опубликовать схему Вашего устройства.

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

aleksey19ru пишет:

не понял что с 4 пунктом не так, но все работает, изучаю все по видио с ютуба, мож не правильно скеч написал поэтому.

А чего там понимать? Попробуйте тупо ответить на мой вопрос.

Вы сравниваете что-то с этой переменной, но сама переменная НИКОГДА в программе не изменяется. Значит, здесь какая-то логическая ошибка.

Logik
Offline
Зарегистрирован: 05.08.2014

Отож наверно 124 строка предполагалась как lastButton= currentButton;. Просто пальцем не туда попали ;)