Moin ihr lieben,
mal eine kleine Spielerei von meiner Flugzeugbeleuchtung:
//Plane_Lights v0a UnoArduSim
/******** preprocessor ********/
/******** pin config ********/
const uint8_t PPM_pin = 2;
//4=bnc, 5-6=strobe wing, 7-8=nav, 9=land, 10=strobe tail
const uint8_t Light_pins[7] = {4, 5, 6, 7, 8, 9, 10};
/******** global constants ********/
//switch states 1000 - 2000us (+100/-100 safety space)
const uint32_t Beacon_PPM = 1100, Strobe_PPM = 1300, Nav_PPM = 1500;
const uint32_t Landing_PPM = 1700, Landing_only_PPM = 1900;
/******** global variables ********/
volatile uint32_t PPM_start = 0, PPM_stop = 0, PPM_us = 0;
/******** functions ********/
void get_PPM()
{
if (digitalRead(PPM_pin))
//if (bitRead(PIND, PD2)) //Pin 2 UNO
{
PPM_start = micros();
} else {
PPM_stop = micros();
}
if (PPM_start < PPM_stop) PPM_us = PPM_stop - PPM_start;
}//void get_PPM() END [ISR]
/******** function prototypes ********/
void setup()
{
for (uint8_t id = 0; id < sizeof(Light_pins); id++)
{
pinMode(Light_pins[id], OUTPUT);
}
//attachInterrupt(digitalPinToInterrupt(PPM_pin), get_PPM, CHANGE);
attachInterrupt(0, get_PPM, CHANGE);
}//void setup() END
void loop()
{
static uint32_t total_interval_ms;
uint32_t interval_ms, act_ms = millis();
//interval update
if (act_ms - total_interval_ms >= 2000) total_interval_ms = act_ms;
interval_ms = act_ms - total_interval_ms;
//Nav
if (PPM_us >= Nav_PPM && PPM_us < Landing_only_PPM)
{
digitalWrite(Light_pins[3], HIGH);
digitalWrite(Light_pins[4], HIGH);
//bitSet(PORTD, PD7);
//bitSet(PORTB, PB0);
} else {
digitalWrite(Light_pins[3], LOW);
digitalWrite(Light_pins[4], LOW);
//bitClear(PORTD, PD7);
//bitClear(PORTB, PB0);
}
//Landing
if (PPM_us >= Landing_PPM)
{
digitalWrite(Light_pins[5], HIGH);
//bitSet(PORTB, PB1);
} else {
digitalWrite(Light_pins[5], LOW);
//bitClear(PORTB, PB1);
}
//Strobe:
if (PPM_us >= Strobe_PPM && PPM_us < Landing_only_PPM)
{
//Strobe wing
if ((interval_ms > 0 && interval_ms < 50) ||
(interval_ms >= 100 && interval_ms < 150))
{
digitalWrite(Light_pins[1], HIGH);
digitalWrite(Light_pins[2], HIGH);
//bitSet(PORTD, PD5);
//bitSet(PORTD, PD6);
} else {
digitalWrite(Light_pins[1], LOW);
digitalWrite(Light_pins[2], LOW);
//bitClear(PORTD, PD5);
//bitClear(PORTD, PD6);
}
//Strobe tail
if (interval_ms > 0 && interval_ms < 100)
{
digitalWrite(Light_pins[6], HIGH);
//bitSet(PORTB, PB2);
} else {
digitalWrite(Light_pins[6], LOW);
//bitSet(PORTB, PB2);
}
}
//Beacon
if (((interval_ms >= 500 && interval_ms < 600) ||
(interval_ms >= 1500 && interval_ms < 1600)) &&
(PPM_us >= Beacon_PPM && PPM_us < Landing_only_PPM))
{
digitalWrite(Light_pins[0], HIGH);
//bitSet(PORTD, PD4);
} else {
digitalWrite(Light_pins[0], LOW);
//bitClear(PORTD, PD4);
}
}//void loop() END
UAS_IO.txt (1.15 KB)