//#define DEBUG
#define NUMELEMENTS(x) (sizeof(x) / sizeof(x[0]))
//#define DEBUG
// logic anlyser pins for debugging
uint8_t laPins[] = {8, 9, 10, 11, 12, 13};
// timing in microseconds
uint32_t timerInterval = 2000;
//uint32_t onTime = 500;
uint8_t percentage = 25;
// struct pulse to make things work
struct Pulse
{
uint32_t startTime;
uint16_t pulseWidth;
bool isOn;
bool trigger;
};
// sterretje stripped down to 1 LED
Pulse Pulses [3] {
//{0, 1000, false, false},
{0, 1500, false, false},
//{0, 2000, false, false}
};
int leds[3] = {3, 5, 6};
void setup()
{
Serial.begin(115200);
Serial.println(F("Software PWM"));
for (uint8_t cnt = 0; cnt < 3; cnt++) {
pinMode(leds[cnt], OUTPUT);
}
for (uint8_t cnt = 0; cnt < NUMELEMENTS(laPins); cnt++) {
pinMode(laPins[cnt], OUTPUT);
}
}
void loop()
{
for (uint8_t cnt = 0; cnt < 3; cnt++) {
softPWM(cnt);
}
}
/*
softPWM
Create the timebase
In:
pulse width
*/
void softPWM(uint8_t index)
{
if (micros() - Pulses[index].startTime >= timerInterval)
{
digitalWrite(laPins[0], HIGH);
Pulses[index].startTime = micros();
pulse(index);
digitalWrite(laPins[0], LOW);
}
}
/*
Create a pulse
In:
index of pwm pin to control
*/
void pulse(uint8_t idx)
{
if (Pulses[idx].pulseWidth == 0)
{
digitalWrite(leds[idx], LOW);
// sterretje added
return;
}
if (Pulses[idx].isOn == false)
{
digitalWrite(laPins[1], HIGH);
digitalWrite(leds[idx], HIGH);
Pulses[idx].isOn = true;
Pulses[idx].startTime = micros();
digitalWrite(laPins[1], LOW);
return;
}
if (micros() - Pulses[idx].startTime >= Pulses[idx].pulseWidth)
{
digitalWrite(laPins[2], HIGH);
digitalWrite(leds[idx], LOW);
Pulses[idx].isOn = false;
digitalWrite(laPins[2], LOW);
return;
}
}