// Code from https://forum.arduino.cc/t/do-loop-running-over-rtc-comparison/1362838?u=davex
// Wokwi setup
// from https://wokwi.com/projects/305979285237137984
// from https://docs.wokwi.com/parts/wokwi-ds1307
#include <Wire.h>
#include <RTClib.h>
RTC_DS1307 rtc;
//Inputs & Outputs
int Dirty=5; //Pressure Transducer N/O
int Filter=9; //Filter Motor Advance Output
//Time Vars
DateTime Now; //Current time read in
DateTime FilterAdv; //Time to stop advancing filter (calculated)
//Filter advance time in seconds
int FilterAdd = 30;
//showDate necessary only for output to Serial for checking code
// use: ex. [showDate("dt", dt);] to see calculated time in unix
void showDate(const char* txt, const DateTime& dt) {
Serial.print(txt);
Serial.print(' ');
Serial.print(dt.year(), DEC);
Serial.print('/');
Serial.print(dt.month(), DEC);
Serial.print('/');
Serial.print(dt.day(), DEC);
Serial.print(' ');
Serial.print(dt.hour(), DEC);
Serial.print(':');
Serial.print(dt.minute(), DEC);
Serial.print(':');
Serial.print(dt.second(), DEC);
Serial.print(" = ");
Serial.print(dt.unixtime());
Serial.print("s / ");
Serial.print(dt.unixtime() / 86400L);
Serial.print("d since 1970");
Serial.println();
}
void setup()
{
pinMode(Dirty, INPUT_PULLUP);
pinMode(Filter, OUTPUT);
digitalWrite(Filter, LOW);
Serial.begin(9600);
//Initialize DS3231 clock
rtc.begin();
}
void loop()
{
if (digitalRead(Dirty) == LOW)
{
Serial.println("Advance Paper");
AdvancePaper();
}
}
void AdvancePaper()
{
Now = rtc.now();
FilterAdv = (Now.unixtime() + FilterAdd);
showDate("Now", Now.unixtime());
showDate("FilterAdv", FilterAdv.unixtime());
do
{
//Serial.println("Looping");
digitalWrite(Filter, HIGH);
Now = rtc.now();
} while (Now.unixtime() < FilterAdv.unixtime());
Serial.println("Leave While Loop");
digitalWrite(Filter, LOW);
showDate("Now", Now.unixtime());
}