Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <LiquidCrystal.h>
- #include <Arduino.h>
- #include <Wire.h>
- #include <Thread.h>
- #include <StaticThreadController.h>
- #include "RTClib.h"
- RTC_DS3231 rtc;
- LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
- // define some values used by the panel and buttons
- int lcd_key = 0;
- int adc_key_in = 0;
- #define btnRIGHT 0
- #define btnUP 1
- #define btnDOWN 2
- #define btnLEFT 3
- #define btnSELECT 4
- #define btnNONE 5
- #define relayPin A1
- int mode = 1;
- int selection = 0;
- int lastTime = 0;
- void lcdUpdate() {
- lcd_key = read_LCD_buttons();
- switch (mode) {
- case 0: {
- //Do nothing
- if(lcd_key != btnNONE) {
- mode = 1;
- }
- }
- case 1: {
- DateTime now = rtc.now();
- lcd.setCursor(0,0);
- lcd.print(now.year());
- lcd.print('-');
- lcd.print(formatint(now.month()));
- lcd.print('-');
- lcd.print(formatint(now.day()));
- lcd.setCursor(0,1);
- lcd.print(formatint(now.hour()));
- lcd.print(':');
- lcd.print(formatint(now.minute()));
- lcd.print(':');
- lcd.print(formatint(now.second()));
- switch (lcd_key) {
- case btnSELECT: {
- mode = 3;
- selection = 0;
- delay(300);
- lcd.clear();
- break;
- }
- }
- break;
- }
- case 2: {
- DateTime now = rtc.now();
- lcd.setCursor(0,0);
- lcd.print(now.year());
- lcd.print('-');
- lcd.print(formatint(now.month()));
- lcd.print('-');
- lcd.print(formatint(now.day()));
- lcd.setCursor(0,1);
- lcd.print(formatint(now.hour()));
- lcd.print(':');
- lcd.print(formatint(now.minute()));
- lcd.print(':');
- lcd.print(formatint(now.second()));
- if((millis() - lastTime > 400) && btnNONE == lcd_key) {
- if(millis() - lastTime > 600) {
- lastTime = millis();
- }
- switch (selection) {
- case 0: {
- lcd.setCursor(0, 0);
- lcd.print(" ");
- break;
- }
- case 1: {
- lcd.setCursor(4 + 1, 0);
- lcd.print(" ");
- break;
- }
- case 2: {
- lcd.setCursor(4 + 1 + 2 + 1, 0);
- lcd.print(" ");
- break;
- }
- case 3: {
- lcd.setCursor(0,1);
- lcd.print(" ");
- break;
- }
- case 4: {
- lcd.setCursor(2 + 1, 1);
- lcd.print(" ");
- break;
- }
- case 5: {
- lcd.setCursor(2 + 1 + 2 + 1, 1);
- lcd.print(" ");
- break;
- }
- }
- }
- switch (lcd_key) {
- case btnSELECT: {
- lcd.clear();
- lcd.setCursor(0,0);
- lcd.print("Exiting Setup.");
- mode = 3;
- selection = 0;
- delay(1000);
- lcd.clear();
- break;
- }
- case btnLEFT: {
- selection -= 1;
- if(selection < 0){
- selection = 0;
- }
- delay(200);
- break;
- }
- case btnRIGHT: {
- selection += 1;
- if(selection > 5){
- selection = 5;
- }
- delay(200);
- break;
- }
- case btnUP: {
- switch (selection) {
- case 0: {
- rtc.adjust(DateTime(now.year() + 1, now.month(), now.day(), now.hour(), now.minute(), now.second()));
- break;
- }
- case 1: {
- rtc.adjust(DateTime(now.year(), now.month() + 1, now.day(), now.hour(), now.minute(), now.second()));
- break;
- }
- case 2: {
- rtc.adjust(DateTime(now.year(), now.month(), now.day() + 1, now.hour(), now.minute(), now.second()));
- break;
- }
- case 3: {
- rtc.adjust(DateTime(now.year(), now.month(), now.day(), now.hour() + 1 , now.minute(), now.second()));
- break;
- }
- case 4: {
- rtc.adjust(DateTime(now.year(), now.month(), now.day(), now.hour(), now.minute() + 1, now.second()));
- break;
- }
- case 5: {
- rtc.adjust(DateTime(now.year(), now.month(), now.day(), now.hour(), now.minute(), now.second() + 1));
- break;
- }
- }
- delay(200);
- return;
- break;
- }
- case btnDOWN: {
- switch (selection) {
- case 0: {
- rtc.adjust(DateTime(now.year() - 1, now.month(), now.day(), now.hour(), now.minute(), now.second()));
- break;
- }
- case 1: {
- rtc.adjust(DateTime(now.year(), now.month() - 1, now.day(), now.hour(), now.minute(), now.second()));
- break;
- }
- case 2: {
- rtc.adjust(DateTime(now.year(), now.month(), now.day() - 1, now.hour(), now.minute(), now.second()));
- break;
- }
- case 3: {
- rtc.adjust(DateTime(now.year(), now.month(), now.day(), now.hour() - 1, now.minute(), now.second()));
- break;
- }
- case 4: {
- rtc.adjust(DateTime(now.year(), now.month(), now.day(), now.hour(), now.minute() - 1, now.second()));
- break;
- }
- case 5: {
- rtc.adjust(DateTime(now.year(), now.month(), now.day(), now.hour(), now.minute(), now.second() - 1));
- break;
- }
- }
- delay(100);
- return;
- break;
- }
- }
- break;
- }
- case 3: {
- lcd.setCursor(0,0);
- lcd.print("MENU");
- switch (selection) {
- case 0: {
- lcd.setCursor(0,1);
- lcd.print("Clock ");
- break;
- }
- case 1: {
- lcd.setCursor(0,1);
- lcd.print("Setup ");
- break;
- }
- case 2: {
- lcd.setCursor(0,1);
- lcd.print("Test bell ");
- break;
- }
- }
- switch (lcd_key) {
- case btnSELECT: {
- switch (selection) {
- case 0: {
- mode = 1;
- selection = 0;
- break;
- }
- case 1: {
- mode = 2;
- selection = 0;
- break;
- }
- case 2: {
- lcd.clear();
- lcd.setCursor(0,0);
- lcd.print("TESTING...");
- bellOnFor(1000);
- break;
- }
- }
- delay(300);
- lcd.clear();
- break;
- }
- case btnUP: {
- selection -= 1;
- if(selection < 0){
- selection = 0;
- }
- delay(200);
- lcd.clear();
- break;
- }
- case btnDOWN: {
- selection += 1;
- if(selection > 2){
- selection = 2;
- }
- delay(200);
- lcd.clear();
- break;
- }
- }
- break;
- }
- }
- }
- void bellCheck() {
- DateTime now = rtc.now();
- int h = now.hour();
- int m = now.minute();
- int s = now.second();
- if(s == 0) {
- switch(h) {
- case 7: {
- if(m == 59) {
- bellOnFor(1000);
- }
- break;
- }
- case 8: {
- if(m == 0) {
- bellOnFor(2000);
- } else if (m == 45) {
- bellOnFor(2000);
- } else if (m == 54) {
- bellOnFor(1000);
- } else if (m == 55) {
- bellOnFor(2000);
- }
- break;
- }
- case 9: {
- if(m == 40) {
- bellOnFor(2000);
- } else if (m == 49) {
- bellOnFor(1000);
- } else if (m == 50) {
- bellOnFor(2000);
- }
- break;
- }
- case 10: {
- if(m == 35) {
- bellOnFor(3000);
- } else if (m == 54) {
- bellOnFor(1000);
- } else if (m == 55) {
- bellOnFor(2000);
- }
- break;
- }
- case 11: {
- if(m == 40) {
- bellOnFor(3000);
- } else if (m == 59) {
- bellOnFor(1000);
- }
- break;
- }
- case 12: {
- if(m == 0) {
- bellOnFor(2000);
- } else if (m == 45) {
- bellOnFor(2000);
- } else if (m == 54) {
- bellOnFor(1000);
- } else if (m == 55) {
- bellOnFor(2000);
- }
- break;
- }
- case 13: {
- if(m == 40) {
- bellOnFor(2000);
- } else if (m == 49) {
- bellOnFor(1000);
- } else if (m == 50) {
- bellOnFor(2000);
- }
- break;
- }
- case 14: {
- if(m == 35) {
- bellOnFor(2000);
- } else if (m == 44) {
- bellOnFor(100);
- } else if (m == 45) {
- bellOnFor(2000);
- }
- break;
- }
- case 15: {
- if(m == 30) {
- bellOnFor(2000);
- } else if (m == 39) {
- bellOnFor(1000);
- } else if (m == 40) {
- bellOnFor(2000);
- }
- break;
- }
- case 16: {
- if(m == 25) {
- bellOnFor(2000);
- }
- break;
- }
- }
- }
- }
- Thread* TimeThread = new Thread(bellCheck);
- Thread* MenuThread = new Thread(lcdUpdate);
- StaticThreadController<2> controll (MenuThread, TimeThread);
- void setup() {
- pinMode(13, OUTPUT);
- digitalWrite(13, LOW);
- pinMode(relayPin, OUTPUT);
- digitalWrite(relayPin, HIGH);
- lcd.begin(16, 2);
- lcd.setCursor(0,0);
- lcd.print("1");
- delay(500);
- digitalWrite(13, HIGH);
- if (!rtc.begin()) {
- lcd.setCursor(0,0);
- lcd.print("CLOCK NOT");
- lcd.setCursor(0,1);
- lcd.print("FOUND");
- while(true) {
- delay(1000);
- }
- }
- lcd.print("2");
- delay(500);
- digitalWrite(13, LOW);
- if (rtc.lostPower()) {
- lcd.setCursor(0,0);
- lcd.print("RTC LOST");
- lcd.setCursor(0,1);
- lcd.print("POWER");
- rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
- delay(2000);
- }
- lcd.print("3");
- digitalWrite(13, HIGH);
- delay(500);
- MenuThread->setInterval(80);
- TimeThread->setInterval(500);
- lcd.print("4");
- delay(500);
- digitalWrite(13, LOW);
- }
- void loop() {
- controll.run();
- }
- String formatint(int i) {
- if(i < 10) {
- return String("0") + String(i);
- } else {
- return String(i);
- }
- }
- int read_LCD_buttons()
- {
- adc_key_in = analogRead(0); // read the value from the sensor
- // my buttons when read are centered at these valies: 0, 144, 329, 504, 741
- // we add approx 50 to those values and check to see if we are close
- if (adc_key_in > 1000) return btnNONE; // We make this the 1st option for speed reasons since it will be the most likely result
- // For V1.1 us this threshold
- if (adc_key_in < 50) return btnRIGHT;
- if (adc_key_in < 250) return btnUP;
- if (adc_key_in < 450) return btnDOWN;
- if (adc_key_in < 650) return btnLEFT;
- if (adc_key_in < 850) return btnSELECT;
- // For V1.0 comment the other threshold and use the one below:
- /*
- if (adc_key_in < 50) return btnRIGHT;
- if (adc_key_in < 195) return btnUP;
- if (adc_key_in < 380) return btnDOWN;
- if (adc_key_in < 555) return btnLEFT;
- if (adc_key_in < 790) return btnSELECT;
- */
- return btnNONE; // when all others fail, return this...
- }
- int bellOnFor(int t) {
- float ts = float(t) / 1000;
- lcd.setCursor(0,0);
- lcd.clear();
- lcd.print("FIRING BELL FOR");
- lcd.setCursor(0,1);
- lcd.print(ts);
- digitalWrite(relayPin, LOW);
- delay(t);
- digitalWrite(relayPin, HIGH);
- lcd.clear();
- //delay(t);
- //digitalWrite(52, LOW);
- //delay(50);
- //digitalWrite(52, HIGH);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement