/*Smartclock version 2 and extensions by BasementResearch
-first uploaded 9/17/18 (v 1.1)
-New time setting system 9/18/18 (v 1.2)
-New intro, states skipping, manual 9/19/18 (v 1.3)
-Stopwatch, Clock can set am or pm 9/19/18 (v 1.4)
-fixed major bug in date setting 9/20/18 (v 1.5)
-fixed home scrolling bug 9/20/18 (v 1.6)
-sd card functions added 9/21/18 (v 2.1)
-fixed bug in stopwatch 9/22/18 (v 2.2)
-added sd card save 9/26/18 (v 3.1)
-fixed bug in date setting 9/26/18 (v 3.2)
*/
/*LIBRARIES*/
#include <Keypad.h>
#include <LiquidCrystal.h>
#include <SimpleDHT.h>
#include <Wire.h>
#include <DS3231.h>
#include <SD.h>
/*END LIBS*/
/*LIB VARIABLES*/
//keypad
const byte ROWS = 4;
const byte COLS = 4;
char hexaKeys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {32, 31, 30, 29}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {28, 27, 26, 25};
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
//lcd screen
LiquidCrystal lcd(35, 36, 37, 38, 39, 40);
//thermometer
int pinDHT11 = 49;
SimpleDHT11 dht11;
byte temperature = 0;
byte humidity = 0;
byte data[40] = {0};
//clock
DS3231 clock;
RTCDateTime dt;
File myFile;
/*END LIB VARIABLES*/
/*PROGRAM VARIABLES*/
int pageLimit = 4;
int pageLimitN = 0;
int nestPage = 0;
int page = 0;
int ht = 0;
int ho = 0;
int mt = 0;
int mo = 0;
int st = 0;
int so = 0;
int dT = 0;
int dO = 0;
int mnt = 0;
int mno = 0;
int ytT = 0;
int yoO = 0;
int hr = 0;
int me = 0;
int sd = 0;
int md = 0;
int v = 0;
char* states[50] = {"Alabama","Alaska","Arizona","Arkansas","California","Colorado","Connecticut","Delaware","Florida","Georgia","Hawaii","Idaho","Illinois","Indiana","Iowa","Kansas","Kentucky"
,"Louisiana","Maine","Maryland","Massachusetts","Michigan","Minnesota","Mississippi","Missouri","Montana","Nebraska","Nevada","New Hampshire","New Jersey","New Mexico","New York","North Carolina"
,"North Dakota","Ohio","Oklahoma","Oregon","Pennsylvania","Rhode Island","South Carolina","South Dakota","Tennessee","Texas","Utah","Vermont","Virginia","Washington","West Virginia","Wisconsin","Wyoming"};
char stateChecks[50] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
char* settingPages[] = {"Time & Date"};
int nestPageSettings = 0;
int settingsPages = 0;
/*END PROGRAM VARIABLES*/
/*CODE REPEAT FUNCTIONS*/
void reset(){
lcd.clear();
lcd.setCursor(0,0);
}
void loading(){
reset();
lcd.print("loading...");
delay(1000);
reset();
}
/*END CODE REPEAT FUNCTIONS*/
/*INTRO AND HOME FUNCTIONS*/
void lcdintro(){
reset();
lcd.print(" Welcome to");
lcd.setCursor(0,1);
lcd.print("SmartClock V:3.2");
delay(3000);
reset();
delay(1000);
lcd.print("Press * to begin");
lcd.setCursor(0,1);
lcd.print("or # for manual");
int i = 0;
while(i != 1){
char customKey = customKeypad.getKey();
if(customKey){
if(customKey == '*'){
i = 1;
v = 0;
}
if(customKey == '#'){
i = 1;
v = 1;
}
}
}
while(v == 1){
reset();
lcd.print("* means enter,");
lcd.setCursor(0,1);
lcd.print("# means exit");
delay(3000);
reset();
lcd.print("A to go up,");
lcd.setCursor(0,1);
lcd.print("B to go down");
delay(3000);
reset();
lcd.print("* means seen,");
lcd.setCursor(0,1);
lcd.print("0 means not seen");
delay(3000);
v = 0;
}
reset();
lcd.print("loading...");
lcd.setCursor(0,1);
for(int i = 0; i < 16; i ++){
lcd.print("=");
delay(200);
}
}
void lcdSetpage(){
int b = 0;
while(b == 0){
char customKey = customKeypad.getKey();
if(customKey){
if(customKey == 'A'){
if(page < pageLimit){
page += 1;
}else{
page = pageLimitN;
}
b = 1;
}else if(customKey == 'B'){
if(page > pageLimitN){
page --;
}else{
page = pageLimit;
}
b = 1;
}else if(customKey == '*'){
nestPage = 1;
b = 1;
}
}
}
}
void lcdhomepage(){
page = 0;
nestPage = 0;
int a = 0;
while(a == 0){
if(page == 0){
if(nestPage == 1){
lcdNesting0();
}
reset();
lcd.print("Temperature &");
lcd.setCursor(0,1);
lcd.print("Humidity");
}
if(page == 1){
if(nestPage == 1){
lcdNesting1();
}
reset();
lcd.print("Time");
}
if(page == 2){
if(nestPage == 1){
lcdNesting2();
}
reset();
lcd.print("State Counter");
}
if(page == 3){
if(nestPage == 1){
lcdNesting4();
}
reset();
lcd.print("Stopwatch");
}
if(page == 4){
if(nestPage == 1){
lcdNesting3();
}
reset();
lcd.print("Settings");
}
lcdSetpage();
}
}
/*END INTRO AND HOME FUNCTIONS*/
/*TIMER FUNCTIONS*/
void lcdNesting1(){
reset();
lcd.print("loading...");
delay(1000);
while(nestPage == 1){
dt = clock.getDateTime();
reset();
lcd.print(clock.dateFormat("m/d/Y", dt));
lcd.setCursor(0,1);
lcd.print(clock.dateFormat("h:i:s a", dt));
for(int i = 0; i < 30000; i += 1){
char customKey = customKeypad.getKey();
if(customKey == '#'){
nestPage = 0;
}
}
for(int i = 0; i < 30000; i += 1){
char customKey = customKeypad.getKey();
if(customKey == '#'){
nestPage = 0;
}
}
for(int i = 0; i < 30000; i += 1){
char customKey = customKeypad.getKey();
if(customKey == '#'){
nestPage = 0;
}
}
}
}
/*END TIMER FUNCTIONS*/
/*THERMOMETER FUNCTIONS*/
void lcdNesting0(){
reset();
lcd.print("loading...");
delay(1000);
while(nestPage == 1){
reset();
if (dht11.read(pinDHT11, &temperature, &humidity, data)) {
reset();
lcd.print("Read = Null");
delay(500);
}
lcd.print((((int)temperature)*1.8+32));
lcd.print(" *F ");
lcd.print((int)temperature);
lcd.print(" *C");
lcd.setCursor(0,1);
lcd.print((int)humidity);
lcd.print(" humidity");
for(int i = 0; i < 30000; i += 1){
char customKey = customKeypad.getKey();
if(customKey == '#'){
nestPage = 0;
}
}
for(int i = 0; i < 30000; i += 1){
char customKey = customKeypad.getKey();
if(customKey == '#'){
nestPage = 0;
}
}for(int i = 0; i < 30000; i += 1){
char customKey = customKeypad.getKey();
if(customKey == '#'){
nestPage = 0;
}
}
}
}
/*END THERMOMETER FUNCTIONS*/
/*STATE CHECK FUNCTIONS*/
void lcdNesting2(){
int InnerPage = 0;
reset();
lcd.print("loading...");
delay(1000);
reset();
while(nestPage == 1){
reset();
lcd.print(states[InnerPage]);
if(stateChecks[InnerPage] == 0){
lcd.setCursor(0,1);
lcd.print("Not seen");
}if(stateChecks[InnerPage] == 1){
lcd.setCursor(0,1);
lcd.print("Seen");
}
for(int i = 0; i < 30000; i++){
char customKey = customKeypad.getKey();
if(customKey == 'A'){
if(InnerPage < 49){
InnerPage++;
}else{
InnerPage = 0;
}
}if(customKey == 'B'){
if(InnerPage > 0){
InnerPage--;
}else{
InnerPage = 49;
}
}if(customKey == '#'){
nestPage = 0;
}if(customKey == '*'){
stateChecks[InnerPage] = 1;
}if(customKey == '0'){
stateChecks[InnerPage] = 0;
}if(customKey == 'C'){
if((InnerPage+10) < 49){
InnerPage+=10;
}else if((InnerPage+10) > 49 || (InnerPage+10) == 49){
InnerPage = (InnerPage+10-49);
}
}if(customKey == 'D'){
if((InnerPage-10) > 0){
InnerPage-=10;
}else if((InnerPage-10) < 0 || (InnerPage-10) == 0){
InnerPage = (InnerPage-10+49);
}
}if(customKey == '1'){
reset();
lcd.print("Attempting to");
lcd.setCursor(0,1);
lcd.print("save data");
delay(1000);
myFile = SD.open("myFile.txt", FILE_WRITE);
if(myFile){
reset();
lcd.print("In File...");
delay(1000);
for(int i = 0; i < 49; i++){
if(stateChecks[i] == 1){
myFile.print(states[i]);
myFile.print(", ");
}
}dt = clock.getDateTime();
myFile.println(clock.dateFormat("m/d/y, h:i:s a", dt));
myFile.close();
reset();
lcd.print("Successfully");
lcd.setCursor(0,1);
lcd.print("saved data");
delay(1000);
}else if(!myFile){
reset();
lcd.print("Not successful");
delay(1000);
}
}
}
}
}
/*END STATE CHECK FUNCTIONS*/
/*STOPWATCH FUNCTIONS*/
void lcdNesting4(){
char customKey;
reset();
loading();
lcd.print("A to go,");
lcd.setCursor(0,1);
lcd.print("B to stop");
delay(2000);
reset();
lcd.print(hr);
lcd.print(":");
lcd.print(me);
lcd.print(":");
lcd.print(sd);
lcd.print(":");
lcd.print(md);
int xc = 0;
int bc = 1;
while(xc == 0){
while(bc == 0){
reset();
lcd.print(hr);
lcd.print(":");
lcd.print(me);
lcd.print(":");
lcd.print(sd);
lcd.print(":");
lcd.print(md);
delay(100);
md++;
if(md == 10){
md = 0;
sd ++;
}if(sd == 60){
sd = 0;
me ++;
}if(me == 60){
me = 0;
hr++;
}if(hr == 99){
hr = 0;
}customKey = customKeypad.getKey();
if(customKey == 'B'){
bc = 1;
}
}
customKey = customKeypad.getKey();
if(customKey == 'A'){
bc = 0;
}if(customKey == '#'){
nestPage = 0;
xc = 1;
}if(customKey == 'C'){
hr = 0;
me = 0;
sd = 0;
md = 0;
reset();
lcd.print(hr);
lcd.print(":");
lcd.print(me);
lcd.print(":");
lcd.print(sd);
lcd.print(":");
lcd.print(md);
}
}
}
/*END STOPWATCH FUNCTIONS*/
/*SETTINGS HOME FUNCTIONS*/
void lcdNesting3(){
reset();
lcd.print("Loading...");
delay(1000);
reset();
lcd.print("Choose setting");
lcd.setCursor(0,1);
lcd.print("and click enter");
delay(3000);
settingsPages = 0;
nestPageSettings = 0;
while(nestPage == 1){
reset();
lcd.print(settingPages[settingsPages]);
for(int i = 0; i < 30000; i++){
char customKey = customKeypad.getKey();
if(customKey == '#'){
nestPage = 0;
}if(customKey == '*'){
nestPageSettings = 1;
lcdNestingSettings0();
}
}
}
}
/*END SETTINGS HOME FUNCTIONS*/
/*VOID SETUP AND LOOP*/
void setup() {
clock.begin();
pinMode(53, OUTPUT);
lcd.begin(16, 2);
if(!SD.begin(53)){
reset();
lcd.print("sd not connected");
delay(1000);
}else{
myFile = SD.open("myFile.txt", FILE_WRITE);
myFile.println("Arduino Restarted!");
myFile.println(" ");
myFile.close();
}
lcdintro();
}
void loop(){
reset();
lcdhomepage();
}
/*END VOID SETUP AND LOOP*/
/*TIME SETTINGS*/
void lcdNestingSettings0(){
reset();
lcd.print("Push button for");
lcd.setCursor(0,1);
lcd.print("hour (tens side)");
int g = 0;
while(g == 0){
char customKey = customKeypad.getKey();
if(customKey == '1' || customKey == '0' || customKey == '2'){
if(customKey == '1'){
ht = 1;
}else if(customKey == '0'){
ht = 0;
}else if(customKey == '2'){
ht = 2;
}
g = 1;
}
}
reset();
lcd.print("Push button for");
lcd.setCursor(0,1);
lcd.print("hour (ones side)");
g = 0;
while(g == 0){
char customKey = customKeypad.getKey();
if(customKey != 'A' && customKey != 'B' && customKey != 'C' && customKey != 'D' && customKey != '#' && customKey != '*' && customKey){
if(customKey == '1'){
ho = 1;
}else if(customKey == '2'){
ho = 2;
}else if(customKey == '0'){
ho = 0;
}else if(customKey == '3'){
ho = 3;
}else if(customKey == '4'){
ho = 4;
}else if(customKey == '5'){
ho = 5;
}else if(customKey == '6'){
ho = 6;
}else if(customKey == '7'){
ho = 7;
}else if(customKey == '8'){
ho = 8;
}else if(customKey == '9'){
ho = 9;
}
g = 1;
}
}
reset();
lcd.print("Push button for");
lcd.setCursor(0,1);
lcd.print("min. (tens side)");
g = 0;
while(g == 0){
char customKey = customKeypad.getKey();
if(customKey != 'A' && customKey != 'B' && customKey != 'C' && customKey != 'D' && customKey != '#' && customKey != '*' && customKey){
if(customKey == '1'){
mt = 1;
}else if(customKey == '2'){
mt = 2;
}else if(customKey == '0'){
mt = 0;
}else if(customKey == '3'){
mt = 3;
}else if(customKey == '4'){
mt = 4;
}else if(customKey == '5'){
mt = 5;
}else if(customKey == '6'){
mt = 6;
}else if(customKey == '7'){
mt = 7;
}else if(customKey == '8'){
mt = 8;
}else if(customKey == '9'){
mt = 9;
}
g = 1;
}
}
reset();
lcd.print("Push button for");
lcd.setCursor(0,1);
lcd.print("min. (ones side)");
g = 0;
while(g == 0){
char customKey = customKeypad.getKey();
if(customKey != 'A' && customKey != 'B' && customKey != 'C' && customKey != 'D' && customKey != '#' && customKey != '*' && customKey){
if(customKey == '1'){
mo = 1;
}else if(customKey == '2'){
mo = 2;
}else if(customKey == '0'){
mo = 0;
}else if(customKey == '3'){
mo = 3;
}else if(customKey == '4'){
mo = 4;
}else if(customKey == '5'){
mo = 5;
}else if(customKey == '6'){
mo = 6;
}else if(customKey == '7'){
mo = 7;
}else if(customKey == '8'){
mo = 8;
}else if(customKey == '9'){
mo = 9;
}
g = 1;
}
}
reset();
lcd.print("Push button for");
lcd.setCursor(0,1);
lcd.print("sec. (tens side)");
g = 0;
while(g == 0){
char customKey = customKeypad.getKey();
if(customKey != 'A' && customKey != 'B' && customKey != 'C' && customKey != 'D' && customKey != '#' && customKey != '*' && customKey){
if(customKey == '1'){
st = 1;
}else if(customKey == '2'){
st = 2;
}else if(customKey == '0'){
st = 0;
}else if(customKey == '3'){
st = 3;
}else if(customKey == '4'){
st = 4;
}else if(customKey == '5'){
st = 5;
}else if(customKey == '6'){
st = 6;
}else if(customKey == '7'){
st = 7;
}else if(customKey == '8'){
st = 8;
}else if(customKey == '9'){
st = 9;
}
g = 1;
}
}
reset();
lcd.print("Push button for");
lcd.setCursor(0,1);
lcd.print("sec. (ones side)");
g = 0;
while(g == 0){
char customKey = customKeypad.getKey();
if(customKey != 'A' && customKey != 'B' && customKey != 'C' && customKey != 'D' && customKey != '#' && customKey != '*' && customKey){
if(customKey == '1'){
so = 1;
}else if(customKey == '2'){
so = 2;
}else if(customKey == '0'){
so = 0;
}else if(customKey == '3'){
so = 3;
}else if(customKey == '4'){
so = 4;
}else if(customKey == '5'){
so = 5;
}else if(customKey == '6'){
so = 6;
}else if(customKey == '7'){
so = 7;
}else if(customKey == '8'){
so = 8;
}else if(customKey == '9'){
so = 9;
}
g = 1;
}
}
reset();
lcd.print("Push button for");
lcd.setCursor(0,1);
lcd.print("y. (tens side)");
g = 0;
while(g == 0){
char customKey = customKeypad.getKey();
if(customKey != 'A' && customKey != 'B' && customKey != 'C' && customKey != 'D' && customKey != '#' && customKey != '*' && customKey){
if(customKey == '1'){
ytT = 1;
}else if(customKey == '2'){
ytT = 2;
}else if(customKey == '0'){
ytT = 0;
}else if(customKey == '3'){
ytT = 3;
}else if(customKey == '4'){
ytT = 4;
}else if(customKey == '5'){
ytT = 5;
}else if(customKey == '6'){
ytT = 6;
}else if(customKey == '7'){
ytT = 7;
}else if(customKey == '8'){
ytT = 8;
}else if(customKey == '9'){
ytT = 9;
}
g = 1;
}
}
reset();
lcd.print("Push button for");
lcd.setCursor(0,1);
lcd.print("y. (ones side)");
g = 0;
while(g == 0){
char customKey = customKeypad.getKey();
if(customKey != 'A' && customKey != 'B' && customKey != 'C' && customKey != 'D' && customKey != '#' && customKey != '*' && customKey){
if(customKey == '1'){
yoO = 1;
}else if(customKey == '2'){
yoO = 2;
}else if(customKey == '0'){
yoO = 0;
}else if(customKey == '3'){
yoO = 3;
}else if(customKey == '4'){
yoO = 4;
}else if(customKey == '5'){
yoO = 5;
}else if(customKey == '6'){
yoO = 6;
}else if(customKey == '7'){
yoO = 7;
}else if(customKey == '8'){
yoO = 8;
}else if(customKey == '9'){
yoO = 9;
}
g = 1;
}
}
reset();
lcd.print("Push button for");
lcd.setCursor(0,1);
lcd.print("m. (tens side)");
g = 0;
while(g == 0){
char customKey = customKeypad.getKey();
if(customKey != 'A' && customKey != 'B' && customKey != 'C' && customKey != 'D' && customKey != '#' && customKey != '*' && customKey){
if(customKey == '1'){
mnt = 1;
}else if(customKey == '2'){
mnt = 2;
}else if(customKey == '0'){
mnt = 0;
}else if(customKey == '3'){
mnt = 3;
}else if(customKey == '4'){
mnt = 4;
}else if(customKey == '5'){
mnt = 5;
}else if(customKey == '6'){
mnt = 6;
}else if(customKey == '7'){
mnt = 7;
}else if(customKey == '8'){
mnt = 8;
}else if(customKey == '9'){
mnt = 9;
}
g = 1;
}
}
reset();
lcd.print("Push button for");
lcd.setCursor(0,1);
lcd.print("m. (ones side)");
g = 0;
while(g == 0){
char customKey = customKeypad.getKey();
if(customKey != 'A' && customKey != 'B' && customKey != 'C' && customKey != 'D' && customKey != '#' && customKey != '*' && customKey){
if(customKey == '1'){
mno = 1;
}else if(customKey == '2'){
mno = 2;
}else if(customKey == '0'){
mno = 0;
}else if(customKey == '3'){
mno = 3;
}else if(customKey == '4'){
mno = 4;
}else if(customKey == '5'){
mno = 5;
}else if(customKey == '6'){
mno = 6;
}else if(customKey == '7'){
mno = 7;
}else if(customKey == '8'){
mno = 8;
}else if(customKey == '9'){
mno = 9;
}
g = 1;
}
}
reset();
lcd.print("Push button for");
lcd.setCursor(0,1);
lcd.print("days (tens side)");
g = 0;
while(g == 0){
char customKey = customKeypad.getKey();
if(customKey != 'A' && customKey != 'B' && customKey != 'C' && customKey != 'D' && customKey != '#' && customKey != '*' && customKey){
if(customKey == '1'){
dT = 1;
}else if(customKey == '2'){
dT = 2;
}else if(customKey == '0'){
dT = 0;
}else if(customKey == '3'){
dT = 3;
}else if(customKey == '4'){
dT = 4;
}else if(customKey == '5'){
dT = 5;
}else if(customKey == '6'){
dT = 6;
}else if(customKey == '7'){
dT = 7;
}else if(customKey == '8'){
dT = 8;
}else if(customKey == '9'){
dT = 9;
}
g = 1;
}
}
reset();
lcd.print("Push button for");
lcd.setCursor(0,1);
lcd.print("days (ones side)");
g = 0;
while(g == 0){
char customKey = customKeypad.getKey();
if(customKey != 'A' && customKey != 'B' && customKey != 'C' && customKey != 'D' && customKey != '#' && customKey != '*' && customKey){
if(customKey == '1'){
dO = 1;
}else if(customKey == '2'){
dO = 2;
}else if(customKey == '0'){
dO = 0;
}else if(customKey == '3'){
dO = 3;
}else if(customKey == '4'){
dO = 4;
}else if(customKey == '5'){
dO = 5;
}else if(customKey == '6'){
dO = 6;
}else if(customKey == '7'){
dO = 7;
}else if(customKey == '8'){
dO = 8;
}else if(customKey == '9'){
dO = 9;
}
g = 1;
}
}
reset();
lcd.print("loading...");
clock.setDateTime(((yoO+(ytT*10)-48)),(mno+(mnt*10)),(dO+(dT*10)),/*Date-Time**/(ho+(ht*10)),(mo+(mt*10)),(so+(st*10)));
}
/**END TIME SETTINGS*/
Comments