One more question... I am trying to program the tubes to turn off overnight. As you can see, I added a method at the end called turnClockOff(), which works the same way as the methods to turn the digits on except it sends binary code that turns the tubes off. I put this in the void loop() method, right after the call to antipoison()
while (now.hour() >= 23){
turnClockOff();
}
If I set the time manually to 10:59:50, when it changes to 11 p.m., the method works and turns the tubes off. The problem is, they never come back on. If I manually set the time to 23:59:50, they should come back on in 10 seconds, since then the now.hour would flip to 0 and therefore, be less than 23, but that doesn't work. Any ideas?
Here's the complete code:
//clock libraries
#include <Wire.h>
#include <RTClib.h>
const int GNDPin = A2;
const int PowerPin = A3;
RTC_DS1307 rtc;
//Include shift register library
#include <ShiftRegister74HC595.h>
//Switch test
//Define switch to pin 12
const int buttonInput = 12;
//Define switch to pin 13
const int secondbuttoninput = 13;
//Set integer to see if clock is in program mode
int buttonState = 0;
//set integer to set second
//int secondbuttonstate = 0;
//Set mode for time insert
byte Mode = 0;
//Variable for cahode poision
//int PoisonCheck = 0;
//Set shift register
ShiftRegister74HC595<1> sr (2, 3, 4);
ShiftRegister74HC595<1> sr1(8, 9, 10);
ShiftRegister74HC595<1> sr2(5, 6, 7);
void setup() {
// put your setup code here, to run once:
pinMode(buttonInput, INPUT);
pinMode(secondbuttoninput, INPUT);
digitalWrite(secondbuttoninput, HIGH);
digitalWrite(buttonInput, HIGH);
Mode = 0;
//Cock stuff
pinMode(GNDPin, OUTPUT);
pinMode(PowerPin, OUTPUT);
digitalWrite(GNDPin, LOW);
digitalWrite(PowerPin, HIGH);
// int secondtimecount = 0;
Serial.begin(57600);
while (!Serial); // for Leonardo/Micro/Zero
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
if ( rtc.isrunning()) {
Serial.println("RTC is NOT running!");
// following line sets the RTC to the date & time this sketch was compiled
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// This line sets the RTC with an explicit date & time, for example to set
// January 21, 2014 at 3am you would call:
//rtc.adjust(DateTime(2024, 12, 25, 23, 59, 50));
}
}
void loop() {
buttonState = digitalRead(buttonInput);
if (buttonState == HIGH) {
delay(1000);
DateTime now = rtc.now();
if (now.second() == 0 && now.minute() % 10 == 0) {
Serial.println("HIT");
AntiPoison();
}
while (now.hour() >= 23){
turnClockOff();
}
Serial.print(now.hour());
Serial.print(":");
Serial.print(now.minute());
Serial.print(":");
Serial.println(now.second());
runseconds(now.second());
runhours(now.hour());
runminutes(now.minute());
}
}
///////////////////////////seconds///////////////////////////////
/////////////RIGHT//////////////////////
void TurnOnR9() {
sr.set(4, HIGH);
sr.set(5, LOW);
sr.set(6, LOW);
sr.set(7, HIGH);
}
void TurnOnR8() {
sr.set(4, LOW);
sr.set(5, LOW);
sr.set(6, LOW);
sr.set(7, HIGH);
}
void TurnOnR7() {
sr.set(4, HIGH);
sr.set(5, HIGH);
sr.set(6, HIGH);
sr.set(7, LOW);
}
void TurnOnR6() {
sr.set(4, LOW);
sr.set(5, HIGH);
sr.set(6, HIGH);
sr.set(7, LOW);
}
void TurnOnR5() {
sr.set(4, HIGH);
sr.set(5, LOW);
sr.set(6, HIGH);
sr.set(7, LOW);
}
void TurnOnR4() {
sr.set(4, LOW);
sr.set(5, LOW);
sr.set(6, HIGH);
sr.set(7, LOW);
}
void TurnOnR3() {
sr.set(4, HIGH);
sr.set(5, HIGH);
sr.set(6, LOW);
sr.set(7, LOW);
}
void TurnOnR2() {
sr.set(4, LOW);
sr.set(5, HIGH);
sr.set(6, LOW);
sr.set(7, LOW);
}
void TurnOnR1() {
sr.set(4, HIGH);
sr.set(5, LOW);
sr.set(6, LOW);
sr.set(7, LOW);
}
void TurnOnR0() {
sr.set(4, LOW);
sr.set(5, LOW);
sr.set(6, LOW);
sr.set(7, LOW);
}
void TurnOffR0() {
sr.set(4, LOW);
sr.set(5, HIGH);
sr.set(6, LOW);
sr.set(7, HIGH);
}
///////////////////////LEFT////////////////////////////
void TurnOnL9() {
sr.set(0, HIGH);
sr.set(1, LOW);
sr.set(2, LOW);
sr.set(3, HIGH);
}
void TurnOnL8() {
sr.set(0, LOW);
sr.set(1, LOW);
sr.set(2, LOW);
sr.set(3, HIGH);
}
void TurnOnL7() {
sr.set(0, HIGH);
sr.set(1, HIGH);
sr.set(2, HIGH);
sr.set(3, LOW);
}
void TurnOnL6() {
sr.set(0, LOW);
sr.set(1, HIGH);
sr.set(2, HIGH);
sr.set(3, LOW);
}
void TurnOnL5() {
sr.set(0, HIGH);
sr.set(1, LOW);
sr.set(2, HIGH);
sr.set(3, LOW);
}
void TurnOnL4() {
sr.set(0, LOW);
sr.set(1, LOW);
sr.set(2, HIGH);
sr.set(3, LOW);
}
void TurnOnL3() {
sr.set(0, HIGH);
sr.set(1, HIGH);
sr.set(2, LOW);
sr.set(3, LOW);
}
void TurnOnL2() {
sr.set(0, LOW);
sr.set(1, HIGH);
sr.set(2, LOW);
sr.set(3, LOW);
}
void TurnOnL1() {
sr.set(0, HIGH);
sr.set(1, LOW);
sr.set(2, LOW);
sr.set(3, LOW);
}
void TurnOnL0() {
sr.set(0, LOW);
sr.set(1, LOW);
sr.set(2, LOW);
sr.set(3, LOW);
}
void TurnOffL0() {
sr.set(0, LOW);
sr.set(1, HIGH);
sr.set(2, LOW);
sr.set(3, HIGH);
}
//////////////////////////////Minutes//////////////////////////
////////////////////////////RIGHT/////////////////////////////
void TurnOnMR9() {
sr2.set(4, HIGH);
sr2.set(5, LOW);
sr2.set(6, LOW);
sr2.set(7, HIGH);
}
void TurnOnMR8() {
sr2.set(4, LOW);
sr2.set(5, LOW);
sr2.set(6, LOW);
sr2.set(7, HIGH);
}
void TurnOnMR7() {
sr2.set(4, HIGH);
sr2.set(5, HIGH);
sr2.set(6, HIGH);
sr2.set(7, LOW);
}
void TurnOnMR6() {
sr2.set(4, LOW);
sr2.set(5, HIGH);
sr2.set(6, HIGH);
sr2.set(7, LOW);
}
void TurnOnMR5() {
sr2.set(4, HIGH);
sr2.set(5, LOW);
sr2.set(6, HIGH);
sr2.set(7, LOW);
}
void TurnOnMR4() {
sr2.set(4, LOW);
sr2.set(5, LOW);
sr2.set(6, HIGH);
sr2.set(7, LOW);
}
void TurnOnMR3() {
sr2.set(4, HIGH);
sr2.set(5, HIGH);
sr2.set(6, LOW);
sr2.set(7, LOW);
}
void TurnOnMR2() {
sr2.set(4, LOW);
sr2.set(5, HIGH);
sr2.set(6, LOW);
sr2.set(7, LOW);
}
void TurnOnMR1() {
sr2.set(4, HIGH);
sr2.set(5, LOW);
sr2.set(6, LOW);
sr2.set(7, LOW);
}
void TurnOnMR0() {
sr2.set(4, LOW);
sr2.set(5, LOW);
sr2.set(6, LOW);
sr2.set(7, LOW);
}
void TurnOffMR0() {
sr2.set(4, LOW);
sr2.set(5, HIGH);
sr2.set(6, LOW);
sr2.set(7, HIGH);
}
///////////////////////LEFT////////////////////////////
void TurnOnML9() {
sr2.set(0, HIGH);
sr2.set(1, LOW);
sr2.set(2, LOW);
sr2.set(3, HIGH);
}
void TurnOnML8() {
sr2.set(0, LOW);
sr2.set(1, LOW);
sr2.set(2, LOW);
sr2.set(3, HIGH);
}
void TurnOnML7() {
sr2.set(0, HIGH);
sr2.set(1, HIGH);
sr2.set(2, HIGH);
sr2.set(3, LOW);
}
void TurnOnML6() {
sr2.set(0, LOW);
sr2.set(1, HIGH);
sr2.set(2, HIGH);
sr2.set(3, LOW);
}
void TurnOnML5() {
sr2.set(0, HIGH);
sr2.set(1, LOW);
sr2.set(2, HIGH);
sr2.set(3, LOW);
}
void TurnOnML4() {
sr2.set(0, LOW);
sr2.set(1, LOW);
sr2.set(2, HIGH);
sr2.set(3, LOW);
}
void TurnOnML3() {
sr2.set(0, HIGH);
sr2.set(1, HIGH);
sr2.set(2, LOW);
sr2.set(3, LOW);
}
void TurnOnML2() {
sr2.set(0, LOW);
sr2.set(1, HIGH);
sr2.set(2, LOW);
sr2.set(3, LOW);
}
void TurnOnML1() {
sr2.set(0, HIGH);
sr2.set(1, LOW);
sr2.set(2, LOW);
sr2.set(3, LOW);
}
void TurnOnML0() {
sr2.set(0, LOW);
sr2.set(1, LOW);
sr2.set(2, LOW);
sr2.set(3, LOW);
}
void TurnOffML0() {
sr2.set(0, LOW);
sr2.set(1, HIGH);
sr2.set(2, LOW);
sr2.set(3, HIGH);
}
//////////////////////////////Hours//////////////////////////
/////////////////////////////RIGHT/////////////////////////////
void TurnOnHR9() {
sr1.set(4, HIGH);
sr1.set(5, LOW);
sr1.set(6, LOW);
sr1.set(7, HIGH);
}
void TurnOnHR8() {
sr1.set(4, LOW);
sr1.set(5, LOW);
sr1.set(6, LOW);
sr1.set(7, HIGH);
}
void TurnOnHR7() {
sr1.set(4, HIGH);
sr1.set(5, HIGH);
sr1.set(6, HIGH);
sr1.set(7, LOW);
}
void TurnOnHR6() {
sr1.set(4, LOW);
sr1.set(5, HIGH);
sr1.set(6, HIGH);
sr1.set(7, LOW);
}
void TurnOnHR5() {
sr1.set(4, HIGH);
sr1.set(5, LOW);
sr1.set(6, HIGH);
sr1.set(7, LOW);
}
void TurnOnHR4() {
sr1.set(4, LOW);
sr1.set(5, LOW);
sr1.set(6, HIGH);
sr1.set(7, LOW);
}
void TurnOnHR3() {
sr1.set(4, HIGH);
sr1.set(5, HIGH);
sr1.set(6, LOW);
sr1.set(7, LOW);
}
void TurnOnHR2() {
sr1.set(4, LOW);
sr1.set(5, HIGH);
sr1.set(6, LOW);
sr1.set(7, LOW);
}
void TurnOnHR1() {
sr1.set(4, HIGH);
sr1.set(5, LOW);
sr1.set(6, LOW);
sr1.set(7, LOW);
}
void TurnOnHR0() {
sr1.set(4, LOW);
sr1.set(5, LOW);
sr1.set(6, LOW);
sr1.set(7, LOW);
}
void TurnOffHR0() {
sr1.set(4, LOW);
sr1.set(5, HIGH);
sr1.set(6, LOW);
sr1.set(7, HIGH);
}
///////////////////////LEFT////////////////////////////
void TurnOnHL9() {
sr1.set(0, HIGH);
sr1.set(1, LOW);
sr1.set(2, LOW);
sr1.set(3, HIGH);
}
void TurnOnHL8() {
sr1.set(0, LOW);
sr1.set(1, LOW);
sr1.set(2, LOW);
sr1.set(3, HIGH);
}
void TurnOnHL7() {
sr1.set(0, HIGH);
sr1.set(1, HIGH);
sr1.set(2, HIGH);
sr1.set(3, LOW);
}
void TurnOnHL6() {
sr1.set(0, LOW);
sr1.set(1, HIGH);
sr1.set(2, HIGH);
sr1.set(3, LOW);
}
void TurnOnHL5() {
sr1.set(0, HIGH);
sr1.set(1, LOW);
sr1.set(2, HIGH);
sr1.set(3, LOW);
}
void TurnOnHL4() {
sr1.set(0, LOW);
sr1.set(1, LOW);
sr1.set(2, HIGH);
sr1.set(3, LOW);
}
void TurnOnHL3() {
sr1.set(0, HIGH);
sr1.set(1, HIGH);
sr1.set(2, LOW);
sr1.set(3, LOW);
}
void TurnOnHL2() {
sr1.set(0, LOW);
sr1.set(1, HIGH);
sr1.set(2, LOW);
sr1.set(3, LOW);
}
void TurnOnHL1() {
sr1.set(0, HIGH);
sr1.set(1, LOW);
sr1.set(2, LOW);
sr1.set(3, LOW);
}
void TurnOnHL0() {
sr1.set(0, LOW);
sr1.set(1, LOW);
sr1.set(2, LOW);
sr1.set(3, LOW);
}
void TurnOffHL0() {
sr1.set(0, LOW);
sr1.set(1, HIGH);
sr1.set(2, LOW);
sr1.set(3, HIGH);
}
/////////////////Run second///////////////////
void runseconds(int seconds) {
int tens = seconds / 10;
int digits = seconds % 10;
switch (tens) {
case 0: TurnOnL0(); break;
case 1: TurnOnL1(); break;
case 2: TurnOnL2(); break;
case 3: TurnOnL3(); break;
case 4: TurnOnL4(); break;
case 5: TurnOnL5(); break;
}
switch (digits) {
case 0: TurnOnR0(); break;
case 1: TurnOnR1(); break;
case 2: TurnOnR2(); break;
case 3: TurnOnR3(); break;
case 4: TurnOnR4(); break;
case 5: TurnOnR5(); break;
case 6: TurnOnR6(); break;
case 7: TurnOnR7(); break;
case 8: TurnOnR8(); break;
case 9: TurnOnR9(); break;
}
}
/////////////////////runhours////////////////////////
void runhours(int hour) {
// hour comes in 0..23 so convert to 12 hour format and make 0 be 12
if ( hour > 12 ) hour -= 12;
if ( hour == 0 ) hour = 12;
if ( hour > 9 ) {
TurnOnHL1();
}
else {
TurnOnHL0();
}
switch (hour) {
case 0: TurnOnHR0(); break;
case 1: TurnOnHR1(); break;
case 2: TurnOnHR2(); break;
case 3: TurnOnHR3(); break;
case 4: TurnOnHR4(); break;
case 5: TurnOnHR5(); break;
case 6: TurnOnHR6(); break;
case 7: TurnOnHR7(); break;
case 8: TurnOnHR8(); break;
case 9: TurnOnHR9(); break;
case 10: TurnOnHR0(); break;
case 11: TurnOnHR1(); break;
case 12: TurnOnHR2(); break;
}
}
/////////////////////////////Minutes///////////////////////////
void runminutes(int minutes) {
int tens = minutes / 10;
int digits = minutes % 10;
switch (tens) {
case 0: TurnOnML0(); break;
case 1: TurnOnML1(); break;
case 2: TurnOnML2(); break;
case 3: TurnOnML3(); break;
case 4: TurnOnML4(); break;
case 5: TurnOnML5(); break;
}
//////////Move by second, R////////////////
switch (digits) {
case 0: TurnOnMR0(); break;
case 1: TurnOnMR1(); break;
case 2: TurnOnMR2(); break;
case 3: TurnOnMR3(); break;
case 4: TurnOnMR4(); break;
case 5: TurnOnMR5(); break;
case 6: TurnOnMR6(); break;
case 7: TurnOnMR7(); break;
case 8: TurnOnMR8(); break;
case 9: TurnOnMR9(); break;
}
}
/////////Cycle and prevent poision/////////
void AntiPoison() {
//turn on 0 sequence
TurnOnR0();
TurnOnL0();
TurnOnMR0();
TurnOnML0();
TurnOnHR0();
TurnOnHL0();
delay(1000);
TurnOnR1();
TurnOnL1();
TurnOnMR1();
TurnOnML1();
TurnOnHR1();
TurnOnHL1();
delay(1000);
TurnOnR2();
TurnOnL2();
TurnOnMR2();
TurnOnML2();
TurnOnHR2();
TurnOnHL2();
delay(1000);
TurnOnR3();
TurnOnL3();
TurnOnMR3();
TurnOnML3();
TurnOnHR3();
TurnOnHL3();
delay(1000);
TurnOnR4();
TurnOnL4();
TurnOnMR4();
TurnOnML4();
TurnOnHR4();
TurnOnHL4();
delay(1000);
TurnOnR5();
TurnOnL5();
TurnOnMR5();
TurnOnML5();
TurnOnHR5();
TurnOnHL5();
delay(1000);
TurnOnR6();
TurnOnL6();
TurnOnMR6();
TurnOnML6();
TurnOnHR6();
TurnOnHL6();
delay(1000);
TurnOnR7();
TurnOnL7();
TurnOnMR7();
TurnOnML7();
TurnOnHR7();
TurnOnHL7();
delay(1000);
TurnOnR8();
TurnOnL8();
TurnOnMR8();
TurnOnML8();
TurnOnHR8();
TurnOnHL8();
delay(1000);
TurnOnR9();
TurnOnL9();
TurnOnMR9();
TurnOnML9();
TurnOnHR9();
TurnOnHL9();
delay(1000);
}
void turnClockOff() {
TurnOffR0();
TurnOffL0();
TurnOffMR0();
TurnOffML0();
TurnOffHR0();
TurnOffHL0();
}