#include <Wire.h>
#include <ArduinoJson.h>
#include <LiquidCrystal.h> //to use LCD function download this library from arduino site
LiquidCrystal lcd(2,3,4,5,6,7); //create an object for LCD
int redLightPin = 13;
void setup() {
Wire.begin(8); /* join i2c bus with address 8 */
Wire.onReceive(receiveEvent); /* register receive event */
Serial.begin(115200); /* start serial for debug */
lcd.begin(16,2); //initialize LCD
lcd.print("hello!");
pinMode(redLightPin, OUTPUT);
}
void loop() {
delay(100);
}
// function that executes when data is received from master
void receiveEvent(int numBytes) {
String data="";
while (0 <Wire.available()) {
char c = Wire.read(); /* receive byte as a character */
data += c;
}
Serial.println(data); /* print the request data */
processCall(data); /* to newline */
}
void processCall(String command){
DynamicJsonDocument jsonDoc(1024);
auto error = deserializeJson(jsonDoc, command);
if (error) {
Serial.print(F("deserializeJson() failed with code "));
Serial.println(error.c_str());
return;
}
else
{
if (jsonDoc.containsKey("redlight")) {
int state = jsonDoc["redlight"];
Serial.println(state);
digitalWrite(redLightPin, state);
} else if (jsonDoc.containsKey("timer")) {
int durationInSeconds = jsonDoc["timer"];
Serial.println(durationInSeconds);
writeTimerToLCD(durationInSeconds);
}
}
}
void writeTimerToLCD(int durationInSeconds) {
unsigned long lastTime = 0;
lastTime = millis();
Serial.println(lastTime);
lcd.clear();
String s = "Timer: ";
lcd.print(s+String(durationInSeconds));
while (durationInSeconds > 0)
{
Serial.println(millis());
if (millis() - lastTime >= 1000)
{
lastTime=millis();
--durationInSeconds;
lcd.clear();
lcd.print(s+String(durationInSeconds));
}
}
lcd.clear();
lcd.print("Timer is up");
}
I have my arduino to receive a json to set the timer in the lcd by calling method writeTimerToLCD(int durationInSeconds). However, it seems that millis() is the same in side writeTimerToLCD