Пример кода для ARDUINO имитация работы железнодорожного переезда

В примере для определения, детекции проезда поезда используется ультразвуковые датчики. Проезд поезда фиксируется в одну сторону, Фиксируется как короткие поезда, что не попадают сразу в работу двух датчиков так и длинные, когда сразу два датчика видят поезд. После того как система определила, что поезд проехал звуковая и световая индикация отключается.

Пример  кода  для ARDUINO имитация работы  железнодорожного переезда
/*
#AUTHOR Дмитрий Витальевич Мельник
#MAIL i.x.c.o.n@yandex.ru
#LICENSE Использование только для не коммерческих проектов, без упоминания автора. При использовании автор не несет ни какой отвественности, и не дает ни какой гарантии работы. Не ведет поддержку или исправление ошибок.
*/
#define PINECHOONE A1
#define PINTRIGONE A0

#define PINECHOTWO A3
#define PINTRIGTWO A2

#define PINZUMMER A4

#define PINLEDONE 4
#define PINLEDTWO 5

uint32_t timer = 0;
uint32_t timer1 = 0;
uint32_t timer2 = 0;
uint32_t timer3 = 0;

float DistanceONE = 0;
float DistanceTWO = 0;

float MinDistanceONE = 5.0;
float MinDistanceTWO = 5.0;

bool StatusRele = false;
bool StatusZummer = false;
bool StatusDistanceONE = false;
bool StatusDistanceTWO = false;
bool StatusBlinc = false;

//Analiz
bool StatusEchoONE = false;
bool StatusEchoTWO = false;
bool StatusPoezd = false;
int TimerSbros = 0;

void setup() {
Serial.begin(115200);
Serial.println("Start OK");
  PlayZummer();
  confing();

}

void loop() {
if(millis() - timer >= 250){
    timer = millis();
    PrintDistance();
    Control();
  }

if(millis() - timer1 >= 250){
    timer1 = millis();

  }

if(millis() - timer2 >= 500){
    timer2 = millis();
if(StatusBlinc){
      Blinc();
    }
else{
      BlincStop();
    }
if(StatusZummer){
tone(PINZUMMER, 1000, 250);
    }

  }

if(millis() - timer3 >= 1000){
    timer3 = millis();
if(StatusEchoONE && StatusEchoTWO  && !StatusDistanceONE && !StatusDistanceTWO){
      TimerSbros = TimerSbros + 1000;
Serial.println("Поезд проехал");
if((TimerSbros > 5000) && !StatusDistanceONE && !StatusDistanceTWO){
        StatusEchoONE = false;
        StatusEchoTWO = false;
        TimerSbros = 0;
Serial.println("Сброс таймера, поезд проехал");
      }
    }
  }
}

void confing(){
pinMode(PINECHOONE, INPUT);
pinMode(PINTRIGONE, OUTPUT);
pinMode(PINECHOTWO, INPUT);
pinMode(PINTRIGTWO, OUTPUT);
pinMode(PINLEDONE, OUTPUT);
pinMode(PINLEDTWO, OUTPUT);
pinMode(PINZUMMER, OUTPUT);
digitalWrite(PINZUMMER, LOW);

  StatusRele = false;
digitalWrite(PINLEDONE, HIGH);
digitalWrite(PINLEDTWO, HIGH);

}

float readDistanceCMONE(){
digitalWrite(PINTRIGONE, LOW);
delayMicroseconds(2);
digitalWrite(PINTRIGONE, HIGH);
delayMicroseconds(10);
digitalWrite(PINTRIGONE, LOW);
int duration = pulseIn(PINECHOONE, HIGH, 25000);
return duration * 0.034 / 2;
}

float readDistanceCMTWO(){
digitalWrite(PINTRIGTWO, LOW);
delayMicroseconds(2);
digitalWrite(PINTRIGTWO, HIGH);
delayMicroseconds(10);
digitalWrite(PINTRIGTWO, LOW);
int duration = pulseIn(PINECHOTWO, HIGH, 25000);
return duration * 0.034 / 2;
}

void PrintDistance(){
    DistanceONE = readDistanceCMONE();
    DistanceTWO = readDistanceCMTWO();
/*
    Serial.print("Дальномер 1: ");
    Serial.print(DistanceONE);
    Serial.println("см.");
    Serial.print("Дальномер 2: ");
    Serial.print(DistanceTWO);
    Serial.println("см.");
    */
}

void Control(){
if(MinDistanceONE > DistanceONE){
    StatusDistanceONE = true;
  }
else{
    StatusDistanceONE = false;
  }
if(MinDistanceTWO > DistanceTWO){
    StatusDistanceTWO = true;
  }
else{
    StatusDistanceTWO = false;
  }

if(!StatusEchoONE && StatusDistanceONE){
    StatusEchoONE = true;
Serial.println("Сработал первый датчик поезда");
}

if(!StatusEchoTWO && StatusDistanceTWO){
    StatusEchoTWO = true;
Serial.println("Сработал второй датчик  поезда");
}




if(StatusEchoONE || StatusEchoTWO){
    StatusPoezd = true;
  }
else{
    StatusPoezd = false;
  }

//StatusEchoONE
//StatusEchoTWO

if(StatusPoezd){
    StatusBlinc = true;
    StatusRele = true;
    StatusZummer = true;
  }
else{
    StatusBlinc = false;
    StatusRele = false;
    StatusZummer = false;
  }

}

void Blinc(){
if(digitalRead(PINLEDONE)){
digitalWrite(PINLEDONE, LOW);
digitalWrite(PINLEDTWO, HIGH);
  }
else{
digitalWrite(PINLEDONE, HIGH);
digitalWrite(PINLEDTWO, LOW);
  }
}

void BlincStop(){
digitalWrite(PINLEDONE, HIGH);
digitalWrite(PINLEDTWO, HIGH);
}

void PlayZummer(){
/*
  digitalWrite(PINZUMMER, HIGH);
  delay(300);
  digitalWrite(PINZUMMER, LOW);
  */
tone(PINZUMMER, 1000, 250);
}

//tone(PINTONE, 1000, 500);
//notone();

Информация на сайте не является публичной офертой, информацию уточняйте по электронной почте. Консультации и техническая поддержка осуществляется только по электроноой почте gpslife@yandex.ru; Материал (сайт/статьи) может содержать не точности, содержать тексты и материалы которые могут генерировать ИИ/нейронные сети. Ресурс (сайт) содержит рекламные материалы.