/*
Arhx Aircraft Project
Discord | Wokwi | questions
Nov 15 2023
AnonEngineering
*/
const int RUNWAY_INTERVAL = 200;
const int STROBE_INTERVAL = 250;
const int NAV_INTERVAL = 1000;
const int TRIG_PIN = 7;
const int ECHO_PIN = 6;
const int RUNWAY_PINS[] = {A3, A2, A1, A0};
const int RANGE_PINS[] = {5, 4, 3, 2};
const int NAV_PINS[] = {9, 8};
const int STROBE_PINS[] = {12, 11, 10};
int getRange() {
float duration_us;
float distance_cm;
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
duration_us = pulseIn(ECHO_PIN, HIGH);
distance_cm = (0.0343 * duration_us) / 2;
int roundDistance = (int) (distance_cm + 0.5);
// print the value to Serial Monitor
Serial.print("Range: ");
Serial.print(roundDistance);
Serial.println(" cm");
return roundDistance;
}
void showRange(int distance) {
if (distance > 1 && distance <= 30 ) {
digitalWrite(RANGE_PINS[0], HIGH);
digitalWrite(RANGE_PINS[1], HIGH);
digitalWrite(RANGE_PINS[2], LOW);
digitalWrite(RANGE_PINS[3], LOW);
}
if (distance >= 31 && distance <= 40) {
digitalWrite(RANGE_PINS[0], LOW);
digitalWrite(RANGE_PINS[1], HIGH);
digitalWrite(RANGE_PINS[2], HIGH);
digitalWrite(RANGE_PINS[3], LOW);
}
if (distance >= 41 && distance <= 60) {
digitalWrite(RANGE_PINS[0], LOW);
digitalWrite(RANGE_PINS[1], LOW);
digitalWrite(RANGE_PINS[2], HIGH);
digitalWrite(RANGE_PINS[3], HIGH);
}
if (distance > 60) {
digitalWrite(RANGE_PINS[0], LOW);
digitalWrite(RANGE_PINS[1], LOW);
digitalWrite(RANGE_PINS[2], LOW);
digitalWrite(RANGE_PINS[3], LOW);
}
}
void showRunway() {
static unsigned long lastRunway = 0;
static int nextRunway = 0;
if (millis() - lastRunway >= RUNWAY_INTERVAL) {
lastRunway = millis();
for (int i = 0; i < 4; i++) {
digitalWrite(RUNWAY_PINS[i], LOW);
}
digitalWrite(RUNWAY_PINS[nextRunway], HIGH);
nextRunway++;
if (nextRunway >= 4) nextRunway = 0;
}
}
void showNav() {
static unsigned long lastNav = 0;
static bool navState = false;
if (millis() - lastNav >= NAV_INTERVAL) {
lastNav = millis();
navState = !navState;
}
digitalWrite(NAV_PINS[0], navState);
digitalWrite(NAV_PINS[1], !navState);
}
void showStrobe() {
static unsigned long lastStrobe = 0;
static bool strobeState = false;
if (millis() - lastStrobe >= STROBE_INTERVAL) {
lastStrobe = millis();
strobeState = !strobeState;
}
digitalWrite(STROBE_PINS[0], strobeState);
digitalWrite(STROBE_PINS[1], strobeState);
digitalWrite(STROBE_PINS[2], strobeState);
}
void setup() {
Serial.begin(115200);
pinMode(ECHO_PIN, INPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(NAV_PINS[0], OUTPUT);
pinMode(NAV_PINS[1], OUTPUT);
for (int i = 0; i < 3; i++) {
pinMode(STROBE_PINS[i], OUTPUT);
}
for (int i = 0; i < 4; i++) {
pinMode(RANGE_PINS[i], OUTPUT);
}
for (int i = 0; i < 4; i++) {
pinMode(RUNWAY_PINS[i], OUTPUT);
}
}
void loop() {
delay(10); // improves sim performance
int distance = getRange();
showRange(distance);
showRunway();
showNav();
showStrobe();
}
Plane
Range
Runway