//#define DEBUG
// 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;
};
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);
}
}
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)
{
Pulses[index].startTime = micros();
Pulses[index].trigger = true;
}
if (Pulses[index].trigger == true) {
pulse(index);
}
}
/*
Create a pulse
In:
index of pwm pin to control
*/
void pulse(uint8_t idx)
{
if (Pulses[idx].pulseWidth == 0)
{
digitalWrite(leds[idx], LOW);
return;
}
if (Pulses[idx].isOn == false)
{
digitalWrite(leds[idx], HIGH);
Pulses[idx].isOn = true;
Pulses[idx].startTime = micros();
return;
}
if (micros() - Pulses[idx].startTime >= Pulses[idx].pulseWidth)
{
digitalWrite(leds[idx], LOW);
Pulses[idx].isOn = false;
return;
}
}