// reset modem by pressing and holding the button for 5 sec
// once reset initiated cannot reset for next 1 minute
unsigned long previousMillis = 0;
unsigned long currentMillis = 0;
unsigned long resetStart = 0;
unsigned long resetHold = 0;
unsigned long resetStartedAt = 0;
bool rebooting = 0;
#define BLINK_INTERVAL 1000
#define RESET_TIME 5000 // 5 SEC RESET time
#define RESET_SWITCH 23
#define RESET_LED 26
#define RESET_BUTTON_PRESS 27
#define RESET_DISABLE_TIME 60000
void setup() {
Serial.begin(9600);
pinMode(RESET_BUTTON_PRESS, OUTPUT);
pinMode(RESET_LED, OUTPUT);
pinMode(RESET_SWITCH, INPUT);
}
void loop() {
currentMillis = millis();
if(digitalRead(RESET_SWITCH)==HIGH)
{
digitalWrite(RESET_BUTTON_PRESS, HIGH);
}
else{
digitalWrite(RESET_BUTTON_PRESS, LOW);
}
checkReset();
reset5Sec();
}
void checkReset(){
// check if button is pressed for 5 sec
if(digitalRead(RESET_SWITCH)==HIGH && resetStartedAt == 0)
{
if(resetStart == 0){resetStart = millis();}
resetHold = millis();
if(resetHold-resetStart >= RESET_TIME)
{
resetStartedAt = millis();
Serial.println("Reset started");
digitalWrite(RESET_LED, HIGH);
}
}
else{
resetStart = 0;
resetHold = 0;
}
}
void reset5Sec()
{
if(resetStartedAt > 0)
{
if(millis() - resetStartedAt>=RESET_TIME && !rebooting)
{
digitalWrite(RESET_LED, LOW);
Serial.println("Reset Done");
rebooting = 1;
}
// clear reset
if(millis() - resetStartedAt>=RESET_DISABLE_TIME)
{
resetStartedAt = 0;
Serial.println("Reset clear");
rebooting = 0;
}
}
}