Project 11 of the Arduino starter kit is a digital 8-ball. Give the system a shake and it gives a yes/no type answer on the LCD screen. So far, mine hasn’t been wrong even once.
On start-up, the screen shows a message to ask a question. Once shaken, it waits until the shaking is done and then shows a message. However, if left alone it does nothing. After showing a message, it will continue to show the message until shaken again, where it will show a new message. I decided to have it reset after 5 seconds of inactivity and show the intro question.
To achieve this, I used the milli() function shown in project 8, the digital hourglass.
At the top of the program, I defined some variables to keep track of activity, the time, and the interval between resets.
int activity; unsigned long previousTime = 0; long interval = 5000;
The setup function has the starting message and sets up the LCD screen, nothing fancy. The loop function has a few modifications, utilizing the variables above to keep track of system status.
void loop() { unsigned long currentTime = millis(); //Get the current time activity=0; //Assume that there is no activity switchState = digitalRead(switchPin); //Get the status of the level sensor if(switchState != prevSwitchState){ //If the tilt sensor feels movement if(switchState == LOW){ activity = 1; //There is activity so change the status reply = random(10); //Choose a message lcd.clear(); //Clear the screen lcd.setCursor(0,0); //Set the cursor to the first column, first row lcd.print("The ball says:"); //Print to first line lcd.setCursor(0,1); //Set the cursor to the first column, second row switch(reply){ //All of the possible answers } } } if(activity == 0){ //If there is no activity in this cycle if(currentTime - previousTime > interval){ //If more than the desired time has passed lcd.clear(); //Reset the screen lcd.setCursor(0,0); //Set cursor to first column, first row. lcd.print("Ask the"); //Print lcd.setCursor(0,1); //Set cursor to first column, second row. lcd.print("Crystal ball!"); //Print previousTime = currentTime; //Reset the timer } } else if(activity = 1){ //If there is activity this cycle previousTime = currentTime; //Reset the timer } prevSwitchState = switchState; //Keep track of the switch }
The gist of the modification is the variable activity
acts as a flag. If there is activity, defined by the the tilt sensor feeling movement, the variable previousTime
is reset to the current time, setting back the interval. If there is no activity, the program then checks if enough time has passed. If so, we clear the screen, reset the message, and reset the timer. As written, the screen will continue to reset every 5 seconds, but it’s not noticeable so if it ain’t broke, don’t fix it. If the timer is not reset alongside the message, the Arduino will try to reset the screen with each cycle, which doesn’t look very nice.
Also, I learned the Arduino editor has a “Copy text as HTML option” so that’s pretty convenient.