// https://wokwi.com/projects/411583193783268353
// for https://forum.arduino.cc/t/a-very-efficent-zero-crossing-dimmer-direct-pin-control-from-timer/1310705
const int state = 6; // different modes of operation
const int potPin = A0;
const int anaSamplePin = A1;
const int digSamplePin = 2;
unsigned long count = 0;
unsigned long lastCheck;
unsigned long now = 0;
unsigned long interval = 1000000;
unsigned long sumDig = 0;
unsigned long sumAna = 0;
unsigned long ledOnUs = 500000;
bool armed = false;
struct LEDpins {
const int pin;
unsigned long trigger;
bool armed;
void begin() {
pinMode(pin, OUTPUT);
armed = false;
}
void arm() {
digitalWrite(pin, LOW);
armed = true;
}
void checkTrigger() {
if (armed && (now - lastCheck > trigger)) {
digitalWrite(pin, HIGH);
armed = false;
}
}
} ledPins[] = {
{ LED_BUILTIN, 100000 },
{ 12, 2000 },
{ 11, 500000 },
{ 10, 700000 },
{ 9, 999990 },
{ 8, 1500000 },
{ 7, 1600000 },
{ 6, 1700000 },
{ 5, 1800000 },
{ 4, 1900000 },
};
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
pinMode(digSamplePin, INPUT_PULLUP);
pinMode(LED_BUILTIN, OUTPUT);
for (auto &led : ledPins) {
// pinMode(led.pin, OUTPUT);
// led.armed = false;
led.begin();
}
}
void loop() {
now = micros();
// put your main code here, to run repeatedly:
if (now - lastCheck > interval) {
Serial.print(now);
Serial.print("us Count:");
Serial.print(count);
Serial.print(" loops in ");
Serial.print(interval);
Serial.print("us, at ");
Serial.print(double(interval) / count);
Serial.print("us/loop.");
if (sumDig || sumAna) {
Serial.print("aveDig:");
Serial.print(double(sumDig) / count, 4 );
Serial.print(" aveAna:");
Serial.print(double(sumAna) / count, 4 );
}
Serial.println();
interval = map(analogRead(A0), 0, 1023, 1000000, 2000000);
count = 0;
sumDig = 0;
sumAna = 0;
switch (state) {
case 4:
digitalWrite(LED_BUILTIN, LOW);
armed = true;
break;
case 5: // reset all ledPins
for (auto &led : ledPins) {
digitalWrite(led.pin, LOW);
led.armed = true;
}
break;
case 6: // reset all ledPins
for (auto &led : ledPins) {
led.arm();
}
break;
default:
;
}
now = micros();
lastCheck = now;
}
count = count + 1;
doStuff();
}
void doStuff() {
switch (state) {
case 0: sumDig += digitalRead(digSamplePin); break;
case 1: sumAna += analogRead(anaSamplePin); break;
case 2:
sumDig += digitalRead(digSamplePin);
sumAna += analogRead(anaSamplePin);
break;
case 3:
if (!(PIND & bit(2))) { // fast digital read
++sumDig;
}
break;
case 4:
if (armed && (now - lastCheck > ledOnUs)) {
digitalWrite(LED_BUILTIN, HIGH);
armed = false;
Serial.println();
Serial.print(now - lastCheck);
Serial.println('L');
}
break;
case 5:
for (auto &led : ledPins) {
if (led.armed && (now - lastCheck > led.trigger)) {
digitalWrite(led.pin, HIGH);
led.armed = false;
}
}
break;
case 6:
for (auto &led : ledPins) {
led.checkTrigger();
}
// sumDig += digitalRead(digSamplePin)==LOW;
// sumAna += analogRead(anaSamplePin);
break;
default:
;
}
}