Выполнение условия в покое

Takosan
Offline
Зарегистрирован: 30.12.2017

Доброго времени суток всем форумчанам! Прошу тапками не закидывать и не пинать, но уже голову сломал как написать правильно код. Прошу помощи с кодом или в каком направлении мне копать?

Смысл таков. Имеем Arduino Micro Pro, к ней подключен 7-ми сегментный дисплей (на 2, 3, 4, 5, 6, 7 и 8-й пины соответственно) на выход, а так же 6 герконов на вход (10, 16, 14, 15, 18 и 19-й соответственно). Необходимо что бы в состоянии покоя (на герконах нет сигнала) крайние сегменты поочередно зажигались, но если на одном из герконов есть сигнал, то зажигать толшько определенные сегменты.

У меня получилось включать определенные сегменты при поступлении сигналов на определенные герконы, при этом если сигналов нет, то и дисплей пустой. Так же получилось прописать задачу, что бы крайние сегменты включались поочередно, но если эту задачу вставить вместо задачи выключенного дисплея, то при активации герконов не выполняется их код.

Объяснил сумбурно, добавлю два варианта кода (я знаю что оба страшные, но я только учусь).

По коду ниже: в покое дисплей пустой, при появлении сигнала на герконе включаются определенные элементы

int b = 2;
int a = 3; 
int f = 4;
int g = 5;
int e = 6;
int d = 7;
int c = 8;
int first = 10;
int two = 16;
int three = 14;
int four = 15;
int five = 18;
int rewind = 19;

void setup() {
pinMode(a, OUTPUT);
pinMode(b, OUTPUT);
pinMode(c, OUTPUT);
pinMode(d, OUTPUT);
pinMode(e, OUTPUT);
pinMode(f, OUTPUT);
pinMode(g, OUTPUT);
pinMode(first, INPUT); 
pinMode(two, INPUT);
pinMode(three, INPUT);
pinMode(four, INPUT);
pinMode(five, INPUT);
pinMode(rewind, INPUT);
}

void loop(){
if (digitalRead(first) == HIGH) { 
digitalWrite(a, LOW); 
digitalWrite(d, LOW); 
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
digitalWrite(b, HIGH); 
digitalWrite(c, HIGH);
} else {
if (digitalRead(two) == HIGH) { 
digitalWrite(a, HIGH); 
digitalWrite(d, HIGH); 
digitalWrite(e, HIGH);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
digitalWrite(b, HIGH); 
digitalWrite(c, LOW);
} else {
if (digitalRead(three) == HIGH) { 
digitalWrite(a, HIGH); 
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
} else {
if (digitalRead(four) == HIGH) {
digitalWrite(a, LOW); 
digitalWrite(d, LOW); 
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
digitalWrite(b, HIGH); 
digitalWrite(c, HIGH);
} else {
if (digitalRead(five) == HIGH) {
digitalWrite(a, HIGH); 
digitalWrite(d, HIGH); 
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
digitalWrite(b, LOW); 
digitalWrite(c, HIGH);
} else {
if (digitalRead(rewind) == HIGH) { 
digitalWrite(a, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, LOW);
} else {
digitalWrite(a, LOW); 
digitalWrite(d, LOW); 
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
digitalWrite(b, LOW); 
digitalWrite(c, LOW);
}
}
}
}
}
}
}

По коду ниже: в покое на дисплее включаются крайние сегменты поочередно, но при подаче сигнала на герконы ничего не происходит

// до 86-й строки то же самое, что и в первом коде, с 86-й код ниже
digitalWrite(g, LOW); 
digitalWrite(a, HIGH); 
delay (100);
digitalWrite(a, LOW); 
digitalWrite(f, HIGH);
delay (100);
digitalWrite(f, LOW);
digitalWrite(e, HIGH);
delay (100);
digitalWrite(e, LOW); 
digitalWrite(d, HIGH);
delay (100);
digitalWrite(d, LOW); 
digitalWrite(c, HIGH);
delay (100);
digitalWrite(c, LOW); 
digitalWrite(b, HIGH);
delay (100);
digitalWrite(b, LOW); 
}
}
}
}
}
}
}

И второй вариант: так же как и в первом случае

int b = 2; int a = 3; 
int f = 4; int g = 5;
int e = 6; int d = 7;
int c = 8;
int first = 10;
int two = 16;
int three = 14;
int four = 15;
int five = 18;
int rewind = 19;
int peredacha = 0;

void setup() {
Serial.begin(9600);
pinMode(a, OUTPUT); pinMode(b, OUTPUT);
pinMode(c, OUTPUT); pinMode(d, OUTPUT);
pinMode(e, OUTPUT); pinMode(f, OUTPUT);
pinMode(g, OUTPUT);
pinMode(first, INPUT); pinMode(two, INPUT);
pinMode(three, INPUT); pinMode(four, INPUT);
pinMode(five, INPUT); pinMode(rewind, INPUT);
digitalWrite(a, LOW); digitalWrite(b, LOW); 
digitalWrite(c, LOW); digitalWrite(d, LOW);
digitalWrite(e, LOW); digitalWrite(f, LOW); 
digitalWrite(g, LOW);
}

void loop(){
  peredacha = 0;
if (digitalRead(first) == HIGH){
  peredacha = first;}
if (digitalRead(two) == HIGH){
  peredacha = two;}
switch (peredacha)
{
case 10:
digitalWrite(a, LOW); digitalWrite(b, HIGH); 
digitalWrite(c, HIGH); digitalWrite(d, LOW);
digitalWrite(e, LOW); digitalWrite(f, LOW); 
digitalWrite(g, LOW);
break;
case 16:
digitalWrite(a, HIGH); digitalWrite(b, HIGH); 
digitalWrite(c, LOW); digitalWrite(d, HIGH);
digitalWrite(e, HIGH); digitalWrite(f, LOW); 
digitalWrite(g, HIGH); 
break;
default:
digitalWrite(a, LOW); digitalWrite(b, LOW); 
digitalWrite(c, LOW); digitalWrite(d, LOW);
digitalWrite(e, LOW); digitalWrite(f, LOW); 
digitalWrite(g, LOW);
}
}

второй вариант кода: так же как и во втором случае

// до 49-й строки то же самое, что и в первом коде, с 49-й код ниже
digitalWrite(g, LOW); 
digitalWrite(a, HIGH); 
delay (100);
digitalWrite(a, LOW); 
digitalWrite(f, HIGH);
delay (100);
digitalWrite(f, LOW);
digitalWrite(e, HIGH);
delay (100);
digitalWrite(e, LOW); 
digitalWrite(d, HIGH);
delay (100);
digitalWrite(d, LOW); 
digitalWrite(c, HIGH);
delay (100);
digitalWrite(c, LOW); 
digitalWrite(b, HIGH);
delay (100);
digitalWrite(b, LOW); 
}
}

Как код спрятать под спойлер не нашел что-то

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014
int b = 2;
int a = 3;
int f = 4;
int g = 5;
int e = 6;
int d = 7;
int c = 8;
int first = 10;
int two = 16;
int three = 14;
int four = 15;
int five = 18;
int rewind = 19;

void setup() {
  pinMode(a, OUTPUT);
  pinMode(b, OUTPUT);
  pinMode(c, OUTPUT);
  pinMode(d, OUTPUT);
  pinMode(e, OUTPUT);
  pinMode(f, OUTPUT);
  pinMode(g, OUTPUT);
  pinMode(first, INPUT);
  pinMode(two, INPUT);
  pinMode(three, INPUT);
  pinMode(four, INPUT);
  pinMode(five, INPUT);
  pinMode(rewind, INPUT);
}

void loop() {
  if (digitalRead(first) == HIGH) {
    digitalWrite(a, LOW);
    digitalWrite(d, LOW);
    digitalWrite(e, LOW);
    digitalWrite(f, LOW);
    digitalWrite(g, LOW);
    digitalWrite(b, HIGH);
    digitalWrite(c, HIGH);
  }
  else if (digitalRead(two) == HIGH) {
    digitalWrite(a, HIGH);
    digitalWrite(d, HIGH);
    digitalWrite(e, HIGH);
    digitalWrite(f, LOW);
    digitalWrite(g, HIGH);
    digitalWrite(b, HIGH);
    digitalWrite(c, LOW);
  }
  else if (digitalRead(three) == HIGH) {
    digitalWrite(a, HIGH);
    digitalWrite(d, HIGH);
    digitalWrite(e, LOW);
    digitalWrite(f, LOW);
    digitalWrite(g, HIGH);
    digitalWrite(b, HIGH);
    digitalWrite(c, HIGH);
  }
  else if (digitalRead(four) == HIGH) {
    digitalWrite(a, LOW);
    digitalWrite(d, LOW);
    digitalWrite(e, LOW);
    digitalWrite(f, HIGH);
    digitalWrite(g, HIGH);
    digitalWrite(b, HIGH);
    digitalWrite(c, HIGH);
  }
  else if (digitalRead(five) == HIGH) {
    digitalWrite(a, HIGH);
    digitalWrite(d, HIGH);
    digitalWrite(e, LOW);
    digitalWrite(f, HIGH);
    digitalWrite(g, HIGH);
    digitalWrite(b, LOW);
    digitalWrite(c, HIGH);
  }
  else if (digitalRead(rewind) == HIGH) {
    digitalWrite(a, HIGH);
    digitalWrite(d, LOW);
    digitalWrite(e, HIGH);
    digitalWrite(f, HIGH);
    digitalWrite(g, LOW);
    digitalWrite(b, HIGH);
    digitalWrite(c, LOW);
  }
  else { //От делай надо ибавляться  иначе будет тормозить
    digitalWrite(g, LOW);
    digitalWrite(a, HIGH);
    delay (100);
    digitalWrite(a, LOW);
    digitalWrite(f, HIGH);
    delay (100);
    digitalWrite(f, LOW);
    digitalWrite(e, HIGH);
    delay (100);
    digitalWrite(e, LOW);
    digitalWrite(d, HIGH);
    delay (100);
    digitalWrite(d, LOW);
    digitalWrite(c, HIGH);
    delay (100);
    digitalWrite(c, LOW);
    digitalWrite(b, HIGH);
    delay (100);
    digitalWrite(b, LOW);
  }
}

 

Takosan
Offline
Зарегистрирован: 30.12.2017

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

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Для начала - откатайте скетч на обычной тактовой кнопке, а не на герконе. Далее почитайте про "blink без delay". Ну и не забывайте, что вам нужна подтяжка кнопки/геркона (см. "подключение кнопки к Arduino"), иначе на индикаторе будете видеть дискотеку под радио "Маяк".

Takosan
Offline
Зарегистрирован: 30.12.2017

Про Blink без delay сейчас почитаю. Герконы подтянуты через резисторы в 10 кОм, а сегменты подтянуты через 220 Ом. Кнопка и геркон по сути это соеденение двух концов провода. Так вот если я даже на прямую замыкаю, то ничего не происходит, как бегали сегменты по кругу, так и бегают (либо же моргнет нужная индикация на долю секунды и дальше бегают сегменты)

sadman41
Offline
Зарегистрирован: 19.10.2016

100 ом - Вы не ошибаетесь? Не знаю, по какой схеме у вас там все соединено, но на мой дилетантский взгляд 100 ом - это маловато, я даже не представляю, что с ардуиной творится при замыкании кнопки через 100 ом. В классическом примере кнопка подтягивается через 10kOm. 

Кнопка == геркону, это так. Но случаи с трясущимся в руках магнитом бывали. Поэтому для начала - кнопка.

5N62V
Offline
Зарегистрирован: 25.02.2016

Я бы написал так:

int b = 2;
int a = 3;
int f = 4;
int g = 5;
int e = 6;
int d = 7;
int c = 8;
int first = 10;
int two = 16;
int three = 14;
int four = 15;
int five = 18;
int rewind = 19;
 

void setup() {
  
  pinMode(a, OUTPUT);
  pinMode(b, OUTPUT);
  pinMode(c, OUTPUT);
  pinMode(d, OUTPUT);
  pinMode(e, OUTPUT);
  pinMode(f, OUTPUT);
  pinMode(g, OUTPUT);}

void loop(){
allOff();
//опрашиваем все датчики
byte sample = digitalRead(first)<<5 | digitalRead(two)<<4 | digitalRead(three)<<3 | digitalRead(four)<<2 | digitalRead(five)<<1 | digitalRead(rewind) ;
если sample ==0  переходим в режим стандбай
if(!sample){standby(); return;} 
if(digitalRead(first))digitalWrite(a, HIGH);
if(digitalRead(two))digitalWrite(b, HIGH);
if(digitalRead(three))digitalWrite(c, HIGH);
if(digitalRead(four))digitalWrite(d, HIGH);
if(digitalRead(five))digitalWrite(e, HIGH);
if(digitalRead(rewind))digitalWrite(f, HIGH);
delay(100);
}

void standby(){
static byte counter = 0;
counter++;
if (counter>6)counter = 1;

switch (counter){
case 1: digitalWrite(a,HIGH); break;
case 2: digitalWrite(b,HIGH); break;
case 3: digitalWrite(c,HIGH); break;
case 4: digitalWrite(d,HIGH); break;
case 5: digitalWrite(e,HIGH); break;
case 6: digitalWrite(f,HIGH); break;
}
delay(100);

}




void allOff(){
digitalWrite(a,LOW);
digitalWrite(b,LOW);
digitalWrite(c,LOW);
digitalWrite(d,LOW);
digitalWrite(e,LOW);
digitalWrite(f,LOW);
}

Ошибки возможны, ибо код не компилировал.

Takosan
Offline
Зарегистрирован: 30.12.2017

Вы правы 10 кОм, чушь написал, исправил. По идее при замыкании на прямую двух проводов, должен же скетч отрабатывать?

sadman41
Offline
Зарегистрирован: 19.10.2016

Takosan пишет:

Вы правы 10 кОм, чушь написал, исправил. По идее при замыкании на прямую двух проводов, должен же скетч отрабатывать?

По идее он и отрабатывает. Вопрос только - так, как вы ожидаете или нет. Я не особо хочу сейчас разбираться в том, по какому кругу там мотает у вас там что, но могу дать еще один совет: на индикаторе пока не зацикливайтесь, повтыкайте в условиях Serial.println-ы с диагностическими сообщениями и смотрите в Serial Monitor-е - эти сообщения выводятся в соотвествии с вашими ожиданиями или нет. Т.е. составьте максимально короткий скетч, который будет работать, как требуется. Потому уже обвешивайте индикаторами.

Takosan
Offline
Зарегистрирован: 30.12.2017

Понял спасибо. Уже делал вывод в SerialMonitor, не отрабатывает. Как только я в своем скетче (точнее в скетче vosara) ставлю кусок кода, который включает и выключает сегменты последовательно, то Arduino перестает реагировать на входы, но если же заменить кусок кода с последовательным включением и выключением сегментов на код где все сегменты выключены, то Arduino реагирует на сигналы и показывает то что надо

Takosan
Offline
Зарегистрирован: 30.12.2017

Не совсем понял этот код. Я правильно понимаю, что там прописан перебор на сравнение через счетчик в +1 шаг?

sadman41
Offline
Зарегистрирован: 19.10.2016

Если вывод в Serial не отрабатывает, то или условие не выполняется или Serial.begin(..) забыли.

5N62V
Offline
Зарегистрирован: 25.02.2016

строка 29 - опрашиваются все герконы, и единицы(или нули)  складываются в переменную sample.  Если  sample равна нулю - на всех входах нули - переходим к веселому помигиванию сегментами.   Если хоть один вход выдал 1 - то соответсвующий сегмент загорается. 

Takosan
Offline
Зарегистрирован: 30.12.2017

Это понятно, что что-то не так ))) про Serial.begin(9600) не забыл. Про условие:

Посмотрите код из второго поста в этой теме. Если убрать кусок с 87-й по 105-ю строку и вставить туда код все выходы LOW, то все условия идеально отрабатываются.

Я так думаю причина все же в этих delay, про которые Вы и vosara сказали. Пошел курить тему про Blink без delay.

5N62V
Offline
Зарегистрирован: 25.02.2016

Takosan пишет:

Я так думаю причина все же в этих delay, про которые Вы и vosara сказали. Пошел курить тему про Blink без delay.

Мой код будет работать 100% , при подтяжке входов к земле.  Но курить всякие темы полезно!

Takosan
Offline
Зарегистрирован: 30.12.2017

Смотрю Вы и код подправили ))) проверил, работает, теперь дополню его. Курить темы все равно буду ))) Спасибо

5N62V
Offline
Зарегистрирован: 25.02.2016

там некорректность есть: два раза пины опрашиваются.

Лучше так  (со строчки 32) :


if(sample&32)digitalWrite(a, HIGH);
if(sample&16)digitalWrite(b, HIGH);
if(sample&8)digitalWrite(c, HIGH);
if(sample&4)digitalWrite(d, HIGH);
if(sample&2digitalWrite(e, HIGH);
if(sample&1)digitalWrite(f, HIGH);

 

Takosan
Offline
Зарегистрирован: 30.12.2017

Спасибо большое! Сейчас попробую

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Проверил на симуляторе, все четко работает

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

5N62V
Offline
Зарегистрирован: 25.02.2016

vosara пишет:

Проверил на симуляторе, все четко работает

А что за симулятор?

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011
andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

vosara, к каждому светодиоду нужен токоограничительный резистор.

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

andriano пишет:

vosara, к каждому светодиоду нужен токоограничительный резистор.

Да спасибо за подсказку, в натуральной схеме я так и делаю а в симуляторе - диоды сжечь нельзя, а загружать дополнительными параметрами процесор считаю не нужным.

Takosan
Offline
Зарегистрирован: 30.12.2017

К сожалению, по факту, скетч мой тормозил, и когда выполнялся код бегущих сегментов, то контроллер не реагировал больше ни на что. Помог только скетч 5N62V