Помогите разобраться в двух входах

sergeidd2018
Offline
Зарегистрирован: 27.05.2018

Добрый день всем.

С ардуиной всего пару дней так что не судите строго.

Включение реле 1,2 при сработке двух датчиков одновременно, если сработал только один датчик то включить реле 3,4. Все вроде работает но датчик 1 срабатывает очень быстро, а второй через время. Как сделать чтобы датчик ждал когда сработает считыватель.

int flag=0;
const int prx_pin2 = 2;
const int prx_pin3 = 3;
const int led_pin6 = 6;
const int led_pin5 = 5;
const int led_pin12 = 12;
const int led_pin4 = 4;
byte v;
byte v1;
 
 
 
void setup() 
{
    pinMode(prx_pin2, INPUT_PULLUP);
    pinMode(prx_pin3, INPUT_PULLUP);
    pinMode(led_pin4, OUTPUT);
    pinMode(led_pin5, OUTPUT);
    pinMode(led_pin6, OUTPUT);
    pinMode(led_pin12, OUTPUT);
}
 
void loop() {
    v1 = digitalRead( prx_pin3 ); // датчик
    v = digitalRead( prx_pin2 ); // считыватель
 
           
    if (v == LOW&&v1 == HIGH)
 
    {
 
        //delay(1000);
        digitalWrite( led_pin6, HIGH );
        digitalWrite( led_pin5, HIGH );
        digitalWrite( led_pin4, HIGH );
        //delay(2000);
        flag=1;
     }
     else
        if( v != LOW&&v1 == LOW)
     
      {
        delay(5000);
        digitalWrite( led_pin12, HIGH );
        digitalWrite( led_pin5, HIGH );
        delay(2000);
        flag=1;
        
        }     
          
     if( v == HIGH&&flag==1)    
     {
      flag=0;
      digitalWrite( led_pin5, LOW );
      flag=0;
      digitalWrite( led_pin6, LOW );
      flag=0;
      digitalWrite( led_pin12, LOW );
      flag=0;
      digitalWrite( led_pin4, LOW );
     } 
      
}
 
         
 
      
Focus
Offline
Зарегистрирован: 05.04.2015

Убрать Delay`и, там же перед включением пауза в 5 секунд стоит. Вместо делай используйте millis() , смотрите "штатный" пример использования blink without delay

sergeidd2018
Offline
Зарегистрирован: 27.05.2018

то пауза в 5 сек все правильно стоит. Это для второго алгоритма.

 Мне бы первый до ума довести.

мне нужно когда датчики оба выдают LOW.

Т.е. первое условие. У меня датчик срабатывает сразу, а считыватель через где то 1 сек.

 И условие не соблюдается.  И через 5 сек срабатывает алгоритм 2.

 

А там в первом условии LOW и v и v1. И когда они равны, то выполнять условие иначе алгоритм 2.

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

sergeidd2018, вы эту тему читали. Говорят что помогает в общении на этом форуме.http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii

Focus
Offline
Зарегистрирован: 05.04.2015

sergeidd2018 пишет:

...мне нужно когда датчики оба выдают LOW.

Т.е. первое условие....

В первом условии вроде  if (v == LOW&&v1 == HIGH), нипанятна...

sergeidd2018
Offline
Зарегистрирован: 27.05.2018

int flag=0;
const int prx_pin2 = 2;
const int prx_pin3 = 3;
const int led_pin6 = 6;
const int led_pin5 = 5;
const int led_pin12 = 12;
const int led_pin4 = 4;
byte v;
byte v1;



void setup() 
{
    pinMode(prx_pin2, INPUT_PULLUP);
    pinMode(prx_pin3, INPUT_PULLUP);
    pinMode(led_pin4, OUTPUT);
    pinMode(led_pin5, OUTPUT);
    pinMode(led_pin6, OUTPUT);
    pinMode(led_pin12, OUTPUT);
}

void loop() {
    v1 = digitalRead( prx_pin3 ); // датчик
    v = digitalRead( prx_pin2 ); // считыватель

           
    if (v == LOW&&v1 == LOW)

    {

        //delay(1000);
        digitalWrite( led_pin6, HIGH );
        digitalWrite( led_pin5, HIGH );
        digitalWrite( led_pin4, HIGH );
        //delay(2000);
        flag=1;
     }
     else
        if( v != LOW&&v1 == LOW)
     
      {
        delay(5000);
        digitalWrite( led_pin12, HIGH );
        digitalWrite( led_pin5, HIGH );
        delay(2000);
        flag=1;
        
        }     
          
     if( v == HIGH&&flag==1)    
     {
      flag=0;
      digitalWrite( led_pin5, LOW );
      flag=0;
      digitalWrite( led_pin6, LOW );
      flag=0;
      digitalWrite( led_pin12, LOW );
      flag=0;
      digitalWrite( led_pin4, LOW );
     } 
      
}

         

      
sergeidd2018
Offline
Зарегистрирован: 27.05.2018

Все сделал как надо:)

Подскажите по теме, что нужно дописать в программе.

Спасибо.

Focus
Offline
Зарегистрирован: 05.04.2015

В датчиках LOW обозначает сработку? у led_pin HIGH означает - включение релюшки?

led_pin5 присутствует и в первом и во втором условии - так задумано?

flag=0 в третьем условии достаточно один раз сбросить.

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

/**/
const int sens1Pin =/*пин*/2;// считыватель
const int sens2Pin =/*пин*/3;// датчик
const int led1Pin =/*пин*/ 6;
const int led2Pin =/*пин*/ 12;
const int led3Pin =/*пин*/ 5;
const int led4Pin =/*пин*/ 4;

bool led1, led2, led3, led4;
//------main()-----------------------------
void setup() {
  pinMode(sens1Pin, INPUT_PULLUP);
  pinMode(sens2Pin, INPUT_PULLUP);

  pinMode(led1Pin, OUTPUT);
  digitalWrite(led1Pin, led1 = LOW );
  pinMode(led2Pin, OUTPUT);
  digitalWrite(led2Pin, led2 = LOW );
  pinMode(led3Pin, OUTPUT);
  digitalWrite(led3Pin, led3 = LOW );
  pinMode(led4Pin, OUTPUT);
  digitalWrite(led4Pin, led4 = LOW );
}
void loop() {
  bool sens1 = digitalRead(sens1Pin ); // считыватель
  bool sens2 = digitalRead(sens2Pin ); // датчик
  /*Включение реле 1,2 при сработке двух датчиков одновременно*/
  if (!sens1 && !sens2) {
    digitalWrite(led1Pin, led1 = HIGH );
    digitalWrite(led2Pin, led2 = HIGH );
  }
  /*если сработал только один датчик то включить реле 3,4.*/
  if (sens1 && !sens2) {
    digitalWrite(led3Pin, led3 = HIGH );
    digitalWrite(led4Pin, led4 = HIGH );
  }
}
/**/

ПС: А если не так, то попытайтесь внятно описать техническую задачу.

sergeidd2018
Offline
Зарегистрирован: 27.05.2018

Да в датчиках LOW это сработка.

HIGH - включение релюшки. 5 реле тоже так нужно.

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

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

на сколько считыватель должен опаздать что было норм, а на сколько опаздать что уже поздно?

/**/
const int sens1Pin =/*пин*/2;// считыватель
const unsigned long  time1sec = 1000;
unsigned long past;
bool flag = 1;
const int sens2Pin =/*пин*/3;// датчик
const int led1Pin =/*пин*/ 6;
const int led2Pin =/*пин*/ 12;
const int led3Pin =/*пин*/ 5;
const int led4Pin =/*пин*/ 4;

bool led1, led2, led3, led4;
//------main()-----------------------------
void setup() {
  pinMode(sens1Pin, INPUT_PULLUP);
  past = millis();
  pinMode(sens2Pin, INPUT_PULLUP);

  pinMode(led1Pin, OUTPUT);
  digitalWrite(led1Pin, led1 = LOW );
  pinMode(led2Pin, OUTPUT);
  digitalWrite(led2Pin, led2 = LOW );
  pinMode(led3Pin, OUTPUT);
  digitalWrite(led3Pin, led3 = LOW );
  pinMode(led4Pin, OUTPUT);
  digitalWrite(led4Pin, led4 = LOW );

}
void loop() {
  bool sens1 = digitalRead(sens1Pin ); // считыватель
  if (flag && !sens1 && millis() - past >= time1sec) {
    flag = 0;
  }
  bool sens2 = digitalRead(sens2Pin ); // датчик
  /*Включение реле 1,2 при сработке двух датчиков одновременно*/
  if (!flag && !sens2) {
    digitalWrite(led1Pin, led1 = HIGH );
    digitalWrite(led2Pin, led2 = HIGH );
  }
  /*если сработал только один датчик то включить реле 3,4.*/
  if (flag && !sens2) {
    digitalWrite(led3Pin, led3 = HIGH );
    digitalWrite(led4Pin, led4 = HIGH );
  }
}
/**/

 

sergeidd2018
Offline
Зарегистрирован: 27.05.2018

"Даже немножечко чайная ложечка это уже хорошо":)

После сработки датчика нужно 1-2 секунды "подождать" сигнал от считывателя. Пока это так, а там методом тыка:).

работа устройсва такова:

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

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

Ну я показал как делать задержку. flag срабатывает с задержкой в 1 сек.

/**/
const int sens1Pin =/*пин*/2;// считыватель
const unsigned long  time1sec = 1000;
unsigned long past;
bool flag = 1;
const int sens2Pin =/*пин*/3;// датчик
const int led1Pin =/*пин*/ 6;
const int led2Pin =/*пин*/ 12;
const int led3Pin =/*пин*/ 5;
const int led4Pin =/*пин*/ 4;

//------main()-----------------------------
void setup() {
  pinMode(sens1Pin, INPUT_PULLUP);
  past = millis();
  pinMode(sens2Pin, INPUT_PULLUP);

  pinMode(led1Pin, OUTPUT);
  digitalWrite(led1Pin, LOW );
  pinMode(led2Pin, OUTPUT);
  digitalWrite(led2Pin, LOW );
  pinMode(led3Pin, OUTPUT);
  digitalWrite(led3Pin, LOW );
  pinMode(led4Pin, OUTPUT);
  digitalWrite(led4Pin, LOW );

}
void loop() {
  bool sens1 = digitalRead(sens1Pin ); // считыватель
  if (flag && !sens1 && millis() - past >= time1sec) {
    flag = 0;
  }
  bool sens2 = digitalRead(sens2Pin ); // датчик
  /*Включение реле 1,2 при сработке двух датчиков одновременно*/
  if (!flag && !sens2) {
    digitalWrite(led1Pin, HIGH );
    digitalWrite(led2Pin, HIGH );
  }
  /*если сработал только один датчик то включить реле 3,4.*/
  if (flag && !sens2) {
    digitalWrite(led3Pin, HIGH );
    digitalWrite(led4Pin, HIGH );
  }
}
/**/

 

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

sergeidd2018 пишет:

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

Нужен флаг запаздывания на датчик. А считыватель опаздает "свом ходом".

sergeidd2018
Offline
Зарегистрирован: 27.05.2018

Сейчас нет завершения команды? Все включилось и все

sergeidd2018
Offline
Зарегистрирован: 27.05.2018

А флаг один в программе может быть или несколько.

Программа которую Вы любезно предоставили не завершается, все реле включаются и всё.

нет заверщающего алгоритма.

Или я что то не так делаю.

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

sergeidd2018 пишет:
нет заверщающего алгоритма.Или я что то не так делаю.

  Вы получили тот алгоритм который сами и составили. И если программа не делает что-то завершающее, то потому что это завершающее вы и не составили.

 Или вы думаете, что если задача выполнится, то МК остановится и обесточится.

sergeidd2018
Offline
Зарегистрирован: 27.05.2018

Просто на моей программе все после отработки алгоритма переходит в начальные установки.

А Ваш скопировал все срабатывает, но не выключаеся.

sergeidd2018
Offline
Зарегистрирован: 27.05.2018

А без флага никак не добавить задержку?

sergeidd2018
Offline
Зарегистрирован: 27.05.2018

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

const int sens1Pin =/*пин*/2;// считыватель
const unsigned long  time1sec = 1000;
unsigned long past;
bool flag = 1;
const int sens2Pin =/*пин*/3;// датчик
const int led1Pin =/*пин*/ 6;// зеленый диод
const int led2Pin =/*пин*/ 12;// красный диод
const int led3Pin =/*пин*/ 5;// магнит
const int led4Pin =/*пин*/ 4;// турникет

bool led1, led2, led3, led4;
//------main()-----------------------------
void setup() {
  pinMode(sens1Pin, INPUT_PULLUP);
  past = millis();
  pinMode(sens2Pin, INPUT_PULLUP);

  pinMode(led1Pin, OUTPUT);
  digitalWrite(led1Pin, led1 = LOW );
  pinMode(led2Pin, OUTPUT);
  digitalWrite(led2Pin, led2 = LOW );
  pinMode(led3Pin, OUTPUT);
  digitalWrite(led3Pin, led3 = LOW );
  pinMode(led4Pin, OUTPUT);
  digitalWrite(led4Pin, led4 = LOW );

}
void loop() {
  bool sens1 = digitalRead(sens1Pin ); // считыватель
  if (flag && !sens1 && millis() - past >= time1sec) {
   flag = 0;
  }
  bool sens2 = digitalRead(sens2Pin ); // датчик
  /*Включение реле 1,2 при сработке двух датчиков одновременно*/
  if (!flag && !sens2) 
  {
    digitalWrite(led1Pin, led1 = HIGH );
    digitalWrite(led4Pin, led4 = HIGH );
    delay(1000);
    digitalWrite(led3Pin, led3 = HIGH );
    //flag=0;
  }
  else
     if (flag && !sens2)
     
     {
   delay(5000);
   digitalWrite( led2Pin, HIGH );
   digitalWrite( led3Pin, HIGH );
   delay(2000);
       
     }
  
  if( sens2 == HIGH)
   {
   digitalWrite(led1Pin, LOW );
   digitalWrite(led2Pin, LOW );
   digitalWrite(led3Pin, LOW );
   digitalWrite(led4Pin, LOW );
   }
  
}
/**/

 

b707
Offline
Зарегистрирован: 26.05.2017

в скетче 4 условия - которое из них первое, а какое второе?

И еще - не уверен. что это корень проблемы, но как минимум в условии

(flag && !sens1 && millis() - past >= time1sec)

надо бы расставить скобки вокпуг операндов

sergeidd2018
Offline
Зарегистрирован: 27.05.2018
[code]
int flag=0;
const int prx_pin2 = 2;// считыватель
const int prx_pin3 = 3;// датчик
const int led_pin6 = 6;// зеленый диод
const int led_pin5 = 5;// магнит
const int led_pin12 = 12;// красный диод
const int led_pin4 = 4;// турникет
byte v;
byte v1;



void setup() 
{
    pinMode(prx_pin2, INPUT_PULLUP);
    pinMode(prx_pin3, INPUT_PULLUP);
    pinMode(led_pin4, OUTPUT);
    pinMode(led_pin5, OUTPUT);
    pinMode(led_pin6, OUTPUT);
    pinMode(led_pin12, OUTPUT);
}

void loop() {
    v1 = digitalRead( prx_pin3 ); // датчик
    v = digitalRead( prx_pin2 ); // считыватель

    if (v1 == LOW)// датчик в сработке
   

    {      
     if (v == LOW&&v1 == LOW)//срабатывает считыватель

    {

      
        digitalWrite( led_pin6, HIGH );
        digitalWrite( led_pin4, HIGH );
        delay(1000);
        digitalWrite( led_pin5, HIGH );
        
        //delay(2000);
        //flag=1;
     }
   }
  else if (v1 == LOW)// датчик в сработке
      {
       if( v1 == LOW&&v != LOW)// нет сигнала от считывателя
       
      {
        delay(5000);
        digitalWrite( led_pin12, HIGH );
        digitalWrite( led_pin5, HIGH );
        delay(2000);
        //flag=1;
        
        }  
           }
           
         //}
     if( v == HIGH)    
     {
      
      digitalWrite( led_pin5, LOW );
      digitalWrite( led_pin6, LOW );
      digitalWrite( led_pin12, LOW );
      digitalWrite( led_pin4, LOW );
     } 
      
}

         

      
[/code]

 

sergeidd2018
Offline
Зарегистрирован: 27.05.2018

В такой компановке первые два условия отрабатывают четко. Но если нет сигнала от считывателя условия 4 и 5 не срабатывают.

Помогите уже голова пухнет.

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

sergeidd2018
Offline
Зарегистрирован: 27.05.2018

А кодом можно:)

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
/**/
unsigned long mill;
//-----------------------------
const byte Led1pin =/*пин*/2;
const byte Led2pin =/*пин*/3;
const byte Sens1pin =/*пин*/4;
const byte Sens2pin =/*пин*/5;
enum {sReady, sFire, sBang, sUp, sDown};
byte flag;
unsigned long past;
void DoReady() {
  digitalWrite(Led1pin, LOW);
  digitalWrite(Led2pin, LOW);
}
void DoUp() {
  digitalWrite(Led1pin, HIGH);
}
void DoDown() {
  digitalWrite(Led2pin, HIGH);
}

//------main-----------------------
void setup() {
  pinMode(Led1pin, OUTPUT);
  pinMode(Led2pin, OUTPUT);
  pinMode(Sens1pin, INPUT);
  pinMode(Sens2pin, INPUT);
  flag = sReady;
  DoReady();
}
void loop() {
  mill = millis();
  bool Sens1 = digitalRead(Sens1pin);
  bool Sens2 = digitalRead(Sens2pin);
  if (flag == sReady && Sens1 == LOW) {
    flag = sFire;
    past = mill;
  }
  if (flag == sFire && mill - past >= 2000) {
    if ( Sens2 == HIGH) {
      flag = sUp;
      past = mill;
      DoUp();
    }
    else {
      flag = sDown;
      past = mill;
      DoDown();
    }
  }
  if (flag == sUp && mill - past >= 20000) {
    flag =  sReady;
    DoReady();
  }
  if (flag == sDown && mill - past >= 20000) {
    flag =  sReady;
    DoReady();
  }
}
/*Скетч использует 1334 байт (4%) памяти устройства. Всего доступно 30720 байт.
  Глобальные переменные используют 18 байт (0%) динамической памяти, оставляя 2030 байт для локальных переменных. Максимум: 2048 байт.
*/

 

sergeidd2018
Offline
Зарегистрирован: 27.05.2018

Что совсем не то.

Устройство через две секунды включает само реле на 20 сек и все.

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

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

const int prx_pin2 = 2;// считыватель
const int prx_pin3 = 3;// датчик
const int led_pin6 = 6;// зеленый диод
const int led_pin5 = 5;// магнит
const int led_pin12 = 12;// красный диод
const int led_pin4 = 4;// турникет
bool datchik;
bool kluch;
bool fl_kluch;

void setup(){
  pinMode(prx_pin2, INPUT_PULLUP);
  pinMode(prx_pin3, INPUT_PULLUP);
  pinMode(led_pin4, OUTPUT);
  pinMode(led_pin5, OUTPUT);
  pinMode(led_pin6, OUTPUT);
  pinMode(led_pin12, OUTPUT);
}

void loop() {
  datchik = digitalRead( prx_pin3 ); // датчик
  kluch = digitalRead( prx_pin2 ); // считыватель

  if (datchik == LOW)// датчик в сработке
  {
    if (kluch == LOW) { //срабатывает считыватель
      digitalWrite( led_pin6, HIGH );
      digitalWrite( led_pin4, HIGH );
      delay(1000);
      digitalWrite( led_pin5, HIGH );
      fl_kluch = 1;
    }
    else {           //считыватель в не срабатке
      if (fl_kluch) {
        delay(5000);
        digitalWrite( led_pin12, HIGH );
        digitalWrite( led_pin5, HIGH );
        delay(2000);
        digitalWrite( led_pin5, LOW );
        digitalWrite( led_pin6, LOW );
        digitalWrite( led_pin12, LOW );
        digitalWrite( led_pin4, LOW );
        fl_kluch = 0;
      }
    }
  }
}
const int prx_pin2 = 2;// считыватель
const int prx_pin3 = 3;// датчик
const int led_pin6 = 6;// зеленый диод
const int led_pin5 = 5;// магнит
const int led_pin12 = 12;// красный диод
const int led_pin4 = 4;// турникет
bool datchik;
bool kluch;
bool fl_kluch;
bool flag;

void setup() {
  pinMode(prx_pin2, INPUT_PULLUP);
  pinMode(prx_pin3, INPUT_PULLUP);
  pinMode(led_pin4, OUTPUT);
  pinMode(led_pin5, OUTPUT);
  pinMode(led_pin6, OUTPUT);
  pinMode(led_pin12, OUTPUT);
}

void loop() {
  datchik = digitalRead( prx_pin3 ); // датчик
  kluch = digitalRead( prx_pin2 ); // считыватель
  if (datchik == LOW) flag = 1; // датчик в сработке
  if (flag) {
    if (kluch == LOW) { //срабатывает считыватель
      digitalWrite( led_pin6, HIGH );
      digitalWrite( led_pin4, HIGH );
      delay(1000);
      digitalWrite( led_pin5, HIGH );
      fl_kluch = 1;
      flag = 0;
    }
  }
  else {           //считыватель в не срабатке
    if (fl_kluch) {
      delay(5000);
      digitalWrite( led_pin12, HIGH );
      digitalWrite( led_pin5, HIGH );
      delay(2000);
      digitalWrite( led_pin5, LOW );
      digitalWrite( led_pin6, LOW );
      digitalWrite( led_pin12, LOW );
      digitalWrite( led_pin4, LOW );
      fl_kluch = 0;
    }
  }
}

 

sergeidd2018
Offline
Зарегистрирован: 27.05.2018

Добрый вечер.

Работа устройства такова:

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

Если падает карточка прописанная в контроллере имеем два входящих сигнала. Срабатывают три реле.

Этот алгоритм я сделал он работает.

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

Этот алгорит не проход. А если и проходит то без первого.

Датчик припятсвия работает через реле, т.е.  вход D3 коротится на землю. 

Ваш код первый алгорит делает правильно, а потом просто включает остальное реле и все.

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

sergeidd2018. Человек 1- может пройти без карточки 2- может пройти по неправильной карточке 3 может пройти по правильной карточке .4 человек тупо торчать перед датчиком препятствия. Система после этого покажет эти 4 варианта. Но сколько надо времени что бы система вернулась в состояние дежурства?? 

sergeidd2018
Offline
Зарегистрирован: 27.05.2018

Вариатна только два.

Это устройство забирает карту у человека.

Если она правильная (прописанная в контроллере), то турникет откроется. Карточка падает в корзину, загарается зеленая лампа.

Если карточка не правильная (или вообще проездной от метро:) ), то карточка просто падает в корзину и горит красная лампочка.

У меня сейчас я бросаю подряд почти сразу (это при правильной карте). То что на данный момент работает.

Получается сейчас программа не отрабатывает else. 

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

Уточнение:

1- сработал датчик - ждем правильность ключа и если ключ правильный срабатывает 3 реле(это вроде работает)

2-сработал датчик - ждем правильность ключа !сколько ждем? и если ключ не правильный сработает 2 реле.

Все упираетсе в вопрос сколько ждем?

sergeidd2018
Offline
Зарегистрирован: 27.05.2018

Первый датчик (припятсвия срабатывает всегда)

1. Сработал датчик припятсвия и есть сигнал от считывателя - срабатывают 3 реле.

2. Сработал датчик припятсвия, но нет сигнала от считывателя - срабатывают 2 реле.

В программе я поставил 5 секунд после сработки датчика припятствия сбросить карточку в корзину.

Эта часть тоже работает, но отдельно от первой:)

 

sergeidd2018
Offline
Зарегистрирован: 27.05.2018
[code]
const int prx_pin2 = 2;// считыватель
const int prx_pin3 = 3;// датчик
const int led_pin6 = 6;// зеленый диод
const int led_pin5 = 5;// магнит
const int led_pin12 = 12;// красный диод
const int led_pin4 = 4;// турникет
byte v;
byte v1;

void setup() 
{
    pinMode(prx_pin2, INPUT_PULLUP);
    pinMode(prx_pin3, INPUT_PULLUP);
    pinMode(led_pin4, OUTPUT);
    pinMode(led_pin5, OUTPUT);
    pinMode(led_pin6, OUTPUT);
    pinMode(led_pin12, OUTPUT);
}
void loop() {
    v1 = digitalRead( prx_pin3 ); // датчик
    v = digitalRead( prx_pin2 ); // считыватель
       
     if (v == LOW&&v1 == LOW)//срабатывает считыватель
    {
        digitalWrite( led_pin6, HIGH );
        digitalWrite( led_pin4, HIGH );
        delay(1000);
        digitalWrite( led_pin5, HIGH );
     }
   
   else if(v1 == LOW&&v != LOW)// нет сигнала от считывателя
       {
        delay(5000);
        digitalWrite( led_pin12, HIGH );
        digitalWrite( led_pin5, HIGH );
        delay(2000);
         }  
     if( v == HIGH)    
     {
      digitalWrite( led_pin5, LOW );
      digitalWrite( led_pin6, LOW );
      digitalWrite( led_pin12, LOW );
      digitalWrite( led_pin4, LOW );
     } 
 
}

         

  

 

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

Попробуйте так, я поставил секунду можете добавить

const int prx_pin2 = 2;// считыватель
const int prx_pin3 = 3;// датчик
const int led_pin6 = 6;// зеленый диод
const int led_pin5 = 5;// магнит
const int led_pin12 = 12;// красный диод
const int led_pin4 = 4;// турникет
bool datchik;
bool kluch;
bool fl_kluch;
bool flag;
uint32_t pausa;

void setup() {
  pinMode(prx_pin2, INPUT_PULLUP);
  pinMode(prx_pin3, INPUT_PULLUP);
  pinMode(led_pin4, OUTPUT);
  pinMode(led_pin5, OUTPUT);
  pinMode(led_pin6, OUTPUT);
  pinMode(led_pin12, OUTPUT);
}

void loop() {
  datchik = digitalRead( prx_pin3 ); // датчик
  kluch = digitalRead( prx_pin2 ); // считыватель
  if (datchik == LOW) {// датчик в сработке
    flag = 1; 
    pausa = millis();
  }
  if (flag) {
    if (kluch == LOW) { //срабатывает считыватель
      digitalWrite( led_pin6, HIGH );
      digitalWrite( led_pin4, HIGH );
      delay(1000);
      digitalWrite( led_pin5, HIGH );
      fl_kluch = 1;
     // flag = 0;
    }
  }
  if (flag && millis() - pausa >= 1000)
  {
    if (fl_kluch)
    {
      digitalWrite( led_pin5, LOW );
      digitalWrite( led_pin6, LOW );
      digitalWrite( led_pin12, LOW );
      digitalWrite( led_pin4, LOW );
      fl_kluch = 0;
    }
    else { //считыватель в не срабатке
      //  delay(5000);
      digitalWrite( led_pin12, HIGH );
      digitalWrite( led_pin5, HIGH );
      //delay(2000);
    }
   flag = 0;
  }
}

 

sergeidd2018
Offline
Зарегистрирован: 27.05.2018

Этот код работает все как нужно. Единстве датчик припятсвия в первом алгоритме срабатывает очень быстро и переходит ко второму алгоритму не успев дождаться сигнала от считывателя.

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

Имется ввиду мой код

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

Попрубуйте код из 34 поста

sergeidd2018
Offline
Зарегистрирован: 27.05.2018

Вопрос 1, а почему реле после отработки алгоритма не преходят в начальное сотояние?

И работа второй части не правильна. Я бросаю карточку и датчик переходит в состояние LOW и должно произойти действие, а тут пока не убрать карточку с датчика действие не проходит.

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

Посмотрите внимательно 36 строка (// flag = 0;) должна быть закоментированая

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

Вот так должен возвращаться

const int prx_pin2 = 2;// считыватель
const int prx_pin3 = 3;// датчик
const int led_pin6 = 6;// зеленый диод
const int led_pin5 = 5;// магнит
const int led_pin12 = 12;// красный диод
const int led_pin4 = 4;// турникет
bool datchik;
bool kluch;
bool fl_kluch;
bool flag;
uint32_t pausa;

void setup() {
  pinMode(prx_pin2, INPUT_PULLUP);
  pinMode(prx_pin3, INPUT_PULLUP);
  pinMode(led_pin4, OUTPUT);
  pinMode(led_pin5, OUTPUT);
  pinMode(led_pin6, OUTPUT);
  pinMode(led_pin12, OUTPUT);
}

void loop() {
  datchik = digitalRead( prx_pin3 ); // датчик
  kluch = digitalRead( prx_pin2 ); // считыватель
  if (datchik == LOW) {// датчик в сработке
    flag = 1;
    pausa = millis();
  }
  if (flag) {
    if (kluch == LOW) { //срабатывает считыватель
      digitalWrite( led_pin6, HIGH );
      digitalWrite( led_pin4, HIGH );
      delay(1000);
      digitalWrite( led_pin5, HIGH );
      fl_kluch = 1;
      //flag = 0;
    }
  }
  if (flag && millis() - pausa >= 1000)
  {
    if (fl_kluch)
    {
      digitalWrite( led_pin5, LOW );
      digitalWrite( led_pin6, LOW );
      digitalWrite( led_pin12, LOW );
      digitalWrite( led_pin4, LOW );
      fl_kluch = 0;
    }
    else { //считыватель в не срабатке
      //  delay(5000);
      digitalWrite( led_pin12, HIGH );
      digitalWrite( led_pin5, HIGH );
      delay(2000);
      digitalWrite( led_pin5, LOW );
      digitalWrite( led_pin6, LOW );
      digitalWrite( led_pin12, LOW );
      digitalWrite( led_pin4, LOW );
    }
    flag = 0;
  }
}

 

sergeidd2018
Offline
Зарегистрирован: 27.05.2018

Все уже возвращается.

Вот только работа второй части не правильна. Я бросаю карточку и датчик переходит в состояние LOW и должно произойти действие, а тут пока не убрать карточку с датчика действие не проходит. 

 

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

Проверяем

const int prx_pin2 = 2;// считыватель
const int prx_pin3 = 3;// датчик
const int led_pin6 = 6;// зеленый диод
const int led_pin5 = 5;// магнит
const int led_pin12 = 12;// красный диод
const int led_pin4 = 4;// турникет
bool datchik;
bool kluch;
//bool fl_kluch;
bool flag;
uint32_t pausa;

void OF(){
  digitalWrite( led_pin5, LOW );
  digitalWrite( led_pin6, LOW );
  digitalWrite( led_pin12, LOW );
  digitalWrite( led_pin4, LOW );
  flag = 0;
}

void setup() {
  pinMode(prx_pin2, INPUT_PULLUP);
  pinMode(prx_pin3, INPUT_PULLUP);
  pinMode(led_pin4, OUTPUT);
  pinMode(led_pin5, OUTPUT);
  pinMode(led_pin6, OUTPUT);
  pinMode(led_pin12, OUTPUT);
}

void loop() {
  kluch = digitalRead( prx_pin2 ); // считыватель
  datchik = digitalRead( prx_pin3 ); // датчик
  if (!flag && datchik == LOW) {// датчик в сработке
    flag = 1;
    pausa = millis();
  }
  if (flag) {
    if (!kluch) { //срабатывает считыватель
      digitalWrite( led_pin6, HIGH );
      digitalWrite( led_pin4, HIGH );
      delay(1000);
      digitalWrite( led_pin5, HIGH );
      delay(1000);
      OF();      
    }
    if (kluch && millis() - pausa >= 1000){
      //считыватель в не срабатке
      digitalWrite( led_pin12, HIGH );
      digitalWrite( led_pin5, HIGH );
      delay(2000);
      OF();
    }
  }
}

 

sergeidd2018
Offline
Зарегистрирован: 27.05.2018

Спасибо. работает. Задежку только добавил в 5 секунд когда считыватель не в сработке.