Входные сигналы

polkiloqq
polkiloqq аватар
Offline
Зарегистрирован: 25.04.2015

Всем привет. Такая проблема. Есть два контакта,с которых приходят сигналы (1.HIGH LOW 2.LOW HIGH вот такими циклами). Мне нужно чтобы один цикл проходил мимо,а последующий выходил на пины. Написал код,но под руками только DigiSpark,а с нее что-то не работает,может проблема в коде?

 

int in1 = 2;
int in2 = 4;
int out1 = 0;
int out2 = 1;

void setup() {
  pinMode(in1,INPUT);
  pinMode(in2,INPUT);
  pinMode(out1,OUTPUT);
  pinMode(out2,OUTPUT);

}

void loop() {

  if(digitalRead(in1) == HIGH && digitalRead(in2) == LOW);
  {
    if(digitalRead(in1) == LOW && digitalRead(in2) == HIGH);
    {
      digitalWrite(out1,HIGH);
      digitalWrite(out2,LOW);
    }
  }
  if(digitalRead(in1) == HIGH && digitalRead(in2) == LOW);
  {
    if(digitalRead(in1) == LOW && digitalRead(in2) == HIGH);
    {
      digitalWrite(out2,HIGH);
      digitalWrite(out1,LOW);
    }
  }

}

 

Araris
Offline
Зарегистрирован: 09.11.2012

"Формат оператора if следующий:

if (someVariable > 50)
{
// выполнять действия

}

"

Точка с запятой после круглых скобок НЕ ставится. Цитата отсюда : http://arduino.ru/Reference/If

Ну и логика построения условий в строках 16,18 и 24,26 мне непонятна, если она там вообще присутствует. Попробуйте "проговорить" себе то, что там написано, условия вряд ли когда-нибудь будут выполняться, поскольку они взаимоисключающие.

polkiloqq
polkiloqq аватар
Offline
Зарегистрирован: 25.04.2015

Спасибо. Учел,что Вы написали,переосмыслил,почитал статьи и родил это,но что-то все равно не работает,где допускаю ошибку?
 

int IN1 = 2;
int IN2 = 3;
int OUT1 = 0;
int OUT2 = 1;
int InCounter = 0;   
void setup() {
  
  pinMode(IN1,INPUT);
  pinMode(IN2,INPUT);
  pinMode(OUT1,OUTPUT);
  pinMode(OUT2,OUTPUT);

}

void loop() {
  
if(digitalRead(IN1) == HIGH && digitalRead(IN2) == LOW)
{
  InCounter++;
}
if(digitalRead(IN2) == HIGH && digitalRead(IN1) == LOW)
{
  InCounter++;
}

if (InCounter % 2 == 0){
  
  digitalWrite(OUT1,HIGH);
  digitalWrite(OUT2,LOW);
}

if (InCounter % 4 == 0){
  
  digitalWrite(OUT2,HIGH);
  digitalWrite(OUT1,LOW);
}
}

и это...
 

int IN1 = 2;
int IN2 = 3;
int OUT1 = 0;
int OUT2 = 1;
int InCounter = 0;   
int InState = 0;     
int LastInState = 0;
int InState2 = 0;     
int LastInState2 = 0;
void setup() {
  
  pinMode(IN1,INPUT);
  pinMode(IN2,INPUT);
  pinMode(OUT1,OUTPUT);
  pinMode(OUT2,OUTPUT);

}

void loop() {

InState = digitalRead(IN1);

if (InState != LastInState) {

  if(InState == HIGH)
  {
    InCounter++;
  }
}

InState2 = digitalRead(IN2);

if (InState2 != LastInState2) {

  if(InState2 == HIGH)
  {
    InCounter++;
  }
}

if (InCounter % 2 == 0){
  
  digitalWrite(OUT1,HIGH);
  digitalWrite(OUT2,LOW);
}

if (InCounter % 4 == 0){
  
  digitalWrite(OUT2,HIGH);
  digitalWrite(OUT1,LOW);
}
}

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

определись с сигналами , и их цЫклами....
потом - обработка сигналов....
ОШИБКА - в восприятии сигналов , и их обработке....
...построй конечный аппарат , схему логическую - легчеееее будет

прощеее - напишите чё вы хотите ? конкретнее !
из темы - многозадачность получается.....

диаграмму , хотя бы....

polkiloqq
polkiloqq аватар
Offline
Зарегистрирован: 25.04.2015

Пишу проще. Есть два контакта,с которых поочередно приходит +5В. Мне нужно,чтобы два сигнала проходили мимо,а два шли дальше на пины ардуинки. 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

см. #3

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014
Не работает по причине того что сигнал на digitalRead(IN1)-(IN2) приходит не коротким импульсом а имеет некотурую продолжительность и в лооп - InCounter++; может 100 раз набрать ++. Исходя из этого Вам надо - получив 
if(InState == HIGH)
  {
    LastInState = 1;//Установить флаг чтобы больше не додавалось пока InState не станет LOW-это и бутет 1 сигнал
    InCounter++;
  }
if(InState == LOW) LastInState = 0; //А после этого будем ждать следующего сигнала