// Complex PWM with 2 pins
// https://forum.arduino.cc/t/complex-pwm-with-2-pins/1418185
const byte PinBlue = 10;
const byte PinYellow = 11;
const byte PotBluePin = A0;
const byte PotYellowPin = A1;
const unsigned long MsecPeriodMax = 50;
unsigned long msecPeriod;
unsigned long msecPeriodBlue;
unsigned long msecPeriodYellow;
unsigned long msec0;
unsigned long msec;
int state;
int maxDutyCycle = 50;
uint16_t prevPotBlue, prevPotYellow;
// -----------------------------------------------------------------------------
void lightTimer ()
{
if (msec - msec0 < msecPeriod)
return;
msec0 = msec;
switch (state) {
case 0:
digitalWrite (PinYellow, HIGH);
digitalWrite (PinBlue, LOW);
msecPeriod = msecPeriodBlue;
state++;
break;
case 1:
digitalWrite (PinYellow, LOW);
digitalWrite (PinBlue, HIGH);
msecPeriod = msecPeriodYellow;
state++;
break;
case 2:
digitalWrite (PinYellow, HIGH);
digitalWrite (PinBlue, HIGH);
msecPeriod = MsecPeriodMax - msecPeriodBlue - msecPeriodYellow;
state = 0;
break;
}
}
// -----------------------------------------------------------------------------
void writeStripDelay (
float dutyCycleBlue,
float dutyCycleYellow )
{
if (1 < (dutyCycleBlue + dutyCycleYellow)) {
Serial.println ("writeStripDelay: ERROR - dutyCycles > 1");
return;
}
msecPeriodBlue = MsecPeriodMax * dutyCycleBlue;
msecPeriodYellow = MsecPeriodMax * dutyCycleYellow;
}
// -----------------------------------------------------------------------------
void loop ()
{
msec = millis ();
bool updateVal = false;
uint16_t potBlue = analogRead(PotBluePin);
if (prevPotBlue != potBlue) {
prevPotBlue = potBlue;
updateVal = true;
}
uint16_t potYellow = analogRead(PotYellowPin);
if (prevPotYellow != potYellow) {
prevPotYellow = potYellow;
updateVal = true;
}
if (updateVal) {
writeStripDelay (potBlue / 2048.0, potYellow / 2048.0);
Serial.print("Pot Blue = ");
Serial.print(potBlue);
Serial.print(" Pot Yellow = ");
Serial.println(potYellow);
}
lightTimer ();
}
// -----------------------------------------------------------------------------
void setup ()
{
Serial.begin (115200);
while (!Serial) {}
Serial.println("System Ready");
pinMode (PinYellow, OUTPUT);
pinMode (PinBlue, OUTPUT);
prevPotBlue = analogRead(PotBluePin);
prevPotYellow = analogRead(PotYellowPin);
writeStripDelay (prevPotBlue / 2048.0, prevPotYellow / 2048.0);
Serial.print("Pot Blue = ");
Serial.print(prevPotBlue);
Serial.print(" Pot Yellow = ");
Serial.println(prevPotYellow);
}Blue
Yellow