// https://wokwi.com/projects/368931699398868993
// https://forum.arduino.cc/t/programming-a-laser/1143111
// unsigned long interval[] = {600000, 100}; // [10 minutes, 100 millisecond frequency]
unsigned long interval[] = {5000, 100}; // for SIMULATION, interval is shortened
unsigned long previousTime[] = {0, 0}; // clear two event timers
unsigned long currentTime; // use for all intervals
bool intervalOccurred[2]; // interval occurred flags
int LASERpin = 3;
int LASERstate = LOW; // LASER off
int pulseCount = 0; // count 10 LASER pulses
void setup() {
Serial.begin(115200);
welcome();
pinMode(LASERpin, OUTPUT);
}
void loop() {
unsigned long currentTime = millis(); // update "now" time for all intervals
if (currentTime - previousTime[0] >= interval[0]) { // 10 minutes interval
intervalOccurred[0] = true; // this interval occurred
previousTime[0] = currentTime; // establish new start time for this interval
}
if (intervalOccurred[0]) { // at 10 minutes interval
if (currentTime - previousTime[1] >= interval[1] / 2) { // 50% duty cycle of 10hz/100ms
previousTime[1] = currentTime; // interval occurred, establish new start time for this interval
LASERstate = !LASERstate; // if on turn off, if off turn on
digitalWrite(LASERpin, LASERstate); // turn LASER ON or OFF
Serial.print(LASERstate); // printing LASER ON and OFF
if (pulseCount++ == 9) { // count 10 pulses
Serial.println(" <-- 10Hz (50% duty) 1 = LASER ON 0 = LASER OFF");
pulseCount = 0; // reset pulse count
LASERstate = 0; // reset LASER state so first pulse is ON
intervalOccurred[0] = 0; // clear 10 minutes interval flag after 10 LASER pulses
}
}
}
}
void welcome() {
Serial.print("Every 10 minutes pulse a LASER at 10hz for 1 second. ");
Serial.print("For this simulation, interval is set to ");
Serial.print(interval[0] / 1000);
Serial.print(" seconds.");
Serial.println();
}