Advertisement
Kar27

bell.ino

Apr 22nd, 2017
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.73 KB | None | 0 0
  1. #include <LiquidCrystal.h>
  2. #include <Arduino.h>
  3. #include <Wire.h>
  4. #include <Thread.h>
  5. #include <StaticThreadController.h>
  6. #include "RTClib.h"
  7.  
  8. RTC_DS3231 rtc;
  9. LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
  10.  
  11. // define some values used by the panel and buttons
  12. int lcd_key     = 0;
  13. int adc_key_in  = 0;
  14. #define btnRIGHT  0
  15. #define btnUP     1
  16. #define btnDOWN   2
  17. #define btnLEFT   3
  18. #define btnSELECT 4
  19. #define btnNONE   5
  20.  
  21. #define relayPin  A1
  22.  
  23. int mode = 1;
  24. int selection = 0;
  25. int lastTime = 0;
  26.  
  27. void lcdUpdate() {
  28.   lcd_key = read_LCD_buttons();
  29.   switch (mode) {
  30.     case 0: {
  31.       //Do nothing
  32.       if(lcd_key != btnNONE) {
  33.         mode = 1;
  34.       }
  35.     }  
  36.     case 1: {
  37.       DateTime now = rtc.now();
  38.       lcd.setCursor(0,0);
  39.       lcd.print(now.year());
  40.       lcd.print('-');
  41.       lcd.print(formatint(now.month()));
  42.       lcd.print('-');
  43.       lcd.print(formatint(now.day()));
  44.       lcd.setCursor(0,1);
  45.       lcd.print(formatint(now.hour()));
  46.       lcd.print(':');
  47.       lcd.print(formatint(now.minute()));
  48.       lcd.print(':');
  49.       lcd.print(formatint(now.second()));
  50.       switch (lcd_key) {
  51.         case btnSELECT: {
  52.           mode = 3;
  53.           selection = 0;
  54.           delay(300);
  55.           lcd.clear();
  56.           break;
  57.         }
  58.       }
  59.       break;
  60.     }
  61.     case 2: {
  62.       DateTime now = rtc.now();
  63.       lcd.setCursor(0,0);
  64.       lcd.print(now.year());
  65.       lcd.print('-');
  66.       lcd.print(formatint(now.month()));
  67.       lcd.print('-');
  68.       lcd.print(formatint(now.day()));
  69.       lcd.setCursor(0,1);
  70.       lcd.print(formatint(now.hour()));
  71.       lcd.print(':');
  72.       lcd.print(formatint(now.minute()));
  73.       lcd.print(':');
  74.       lcd.print(formatint(now.second()));
  75.  
  76.       if((millis() - lastTime > 400) && btnNONE == lcd_key) {
  77.         if(millis() - lastTime > 600) {
  78.           lastTime = millis();
  79.         }
  80.         switch (selection) {
  81.           case 0: {
  82.             lcd.setCursor(0, 0);
  83.             lcd.print("    ");
  84.             break;
  85.           }
  86.           case 1: {
  87.             lcd.setCursor(4 + 1, 0);
  88.             lcd.print("  ");
  89.             break;
  90.           }
  91.           case 2: {
  92.             lcd.setCursor(4 + 1 + 2 + 1, 0);
  93.             lcd.print("  ");
  94.             break;
  95.           }
  96.           case 3: {
  97.             lcd.setCursor(0,1);
  98.             lcd.print("  ");
  99.             break;
  100.           }
  101.           case 4: {
  102.             lcd.setCursor(2 + 1, 1);
  103.             lcd.print("  ");
  104.             break;
  105.           }
  106.           case 5: {
  107.             lcd.setCursor(2 + 1 + 2 + 1, 1);
  108.             lcd.print("  ");
  109.             break;
  110.           }
  111.         }
  112.       }
  113.       switch (lcd_key) {
  114.         case btnSELECT: {
  115.           lcd.clear();
  116.           lcd.setCursor(0,0);
  117.           lcd.print("Exiting Setup.");
  118.           mode = 3;
  119.           selection = 0;
  120.           delay(1000);
  121.           lcd.clear();
  122.           break;
  123.         }
  124.         case btnLEFT: {
  125.           selection -= 1;
  126.           if(selection < 0){
  127.             selection = 0;
  128.           }
  129.           delay(200);
  130.           break;
  131.         }
  132.         case btnRIGHT: {
  133.           selection += 1;
  134.           if(selection > 5){
  135.             selection = 5;
  136.           }
  137.           delay(200);
  138.           break;
  139.         }
  140.         case btnUP: {
  141.           switch (selection) {
  142.             case 0: {
  143.               rtc.adjust(DateTime(now.year() + 1, now.month(), now.day(), now.hour(), now.minute(), now.second()));
  144.               break;
  145.             }
  146.             case 1: {
  147.               rtc.adjust(DateTime(now.year(), now.month() + 1, now.day(), now.hour(), now.minute(), now.second()));
  148.               break;
  149.             }
  150.             case 2: {
  151.               rtc.adjust(DateTime(now.year(), now.month(), now.day() + 1, now.hour(), now.minute(), now.second()));
  152.               break;
  153.             }
  154.             case 3: {
  155.               rtc.adjust(DateTime(now.year(), now.month(), now.day(), now.hour() + 1 , now.minute(), now.second()));
  156.               break;
  157.             }
  158.             case 4: {
  159.               rtc.adjust(DateTime(now.year(), now.month(), now.day(), now.hour(), now.minute() + 1, now.second()));
  160.               break;
  161.             }
  162.             case 5: {
  163.               rtc.adjust(DateTime(now.year(), now.month(), now.day(), now.hour(), now.minute(), now.second() + 1));
  164.               break;
  165.             }
  166.           }
  167.          
  168.           delay(200);
  169.           return;
  170.           break;
  171.         }
  172.         case btnDOWN: {
  173.           switch (selection) {
  174.             case 0: {
  175.               rtc.adjust(DateTime(now.year() - 1, now.month(), now.day(), now.hour(), now.minute(), now.second()));
  176.               break;
  177.             }
  178.             case 1: {
  179.               rtc.adjust(DateTime(now.year(), now.month() - 1, now.day(), now.hour(), now.minute(), now.second()));
  180.               break;
  181.             }
  182.             case 2: {
  183.               rtc.adjust(DateTime(now.year(), now.month(), now.day() - 1, now.hour(), now.minute(), now.second()));
  184.               break;
  185.             }
  186.             case 3: {
  187.               rtc.adjust(DateTime(now.year(), now.month(), now.day(), now.hour() - 1, now.minute(), now.second()));
  188.               break;
  189.             }
  190.             case 4: {
  191.               rtc.adjust(DateTime(now.year(), now.month(), now.day(), now.hour(), now.minute() - 1, now.second()));
  192.               break;
  193.             }
  194.             case 5: {
  195.               rtc.adjust(DateTime(now.year(), now.month(), now.day(), now.hour(), now.minute(), now.second() - 1));
  196.               break;
  197.             }
  198.           }
  199.           delay(100);
  200.           return;
  201.           break;
  202.         }
  203.       }
  204.       break;
  205.     }
  206.     case 3: {
  207.       lcd.setCursor(0,0);
  208.       lcd.print("MENU");
  209.       switch (selection) {
  210.         case 0: {
  211.           lcd.setCursor(0,1);
  212.           lcd.print("Clock        ");
  213.           break;
  214.         }
  215.         case 1: {
  216.           lcd.setCursor(0,1);
  217.           lcd.print("Setup        ");
  218.           break;
  219.         }
  220.         case 2: {
  221.           lcd.setCursor(0,1);
  222.           lcd.print("Test bell        ");
  223.           break;
  224.         }
  225.       }
  226.       switch (lcd_key) {
  227.         case btnSELECT: {
  228.           switch (selection) {
  229.             case 0: {
  230.               mode = 1;
  231.               selection = 0;
  232.               break;
  233.             }
  234.             case 1: {
  235.               mode = 2;
  236.               selection = 0;
  237.               break;
  238.             }
  239.             case 2: {
  240.               lcd.clear();
  241.               lcd.setCursor(0,0);
  242.               lcd.print("TESTING...");
  243.               bellOnFor(1000);
  244.               break;
  245.             }
  246.           }
  247.           delay(300);
  248.           lcd.clear();
  249.           break;
  250.         }
  251.         case btnUP: {
  252.           selection -= 1;
  253.           if(selection < 0){
  254.             selection = 0;
  255.           }
  256.           delay(200);
  257.           lcd.clear();
  258.           break;
  259.         }
  260.         case btnDOWN: {
  261.           selection += 1;
  262.           if(selection > 2){
  263.             selection = 2;
  264.           }
  265.           delay(200);
  266.           lcd.clear();
  267.           break;
  268.         }
  269.       }
  270.       break;
  271.     }
  272.   }
  273. }
  274.  
  275. void bellCheck() {
  276.   DateTime now = rtc.now();
  277.   int h = now.hour();
  278.   int m = now.minute();
  279.   int s = now.second();
  280.   if(s == 0) {
  281.     switch(h) {
  282.       case 7: {
  283.         if(m == 59) {
  284.           bellOnFor(1000);
  285.         }
  286.         break;
  287.       }
  288.       case 8: {
  289.         if(m == 0) {
  290.           bellOnFor(2000);
  291.         } else if (m == 45) {
  292.           bellOnFor(2000);
  293.         } else if (m == 54) {
  294.           bellOnFor(1000);
  295.         } else if (m == 55) {
  296.           bellOnFor(2000);
  297.         }
  298.         break;
  299.       }
  300.       case 9: {
  301.         if(m == 40) {
  302.           bellOnFor(2000);
  303.         } else if (m == 49) {
  304.           bellOnFor(1000);
  305.         } else if (m == 50) {
  306.           bellOnFor(2000);
  307.         }
  308.         break;
  309.       }
  310.       case 10: {
  311.         if(m == 35) {
  312.           bellOnFor(3000);
  313.         } else if (m == 54) {
  314.           bellOnFor(1000);
  315.         } else if (m == 55) {
  316.           bellOnFor(2000);
  317.         }
  318.         break;
  319.       }
  320.       case 11: {
  321.         if(m == 40) {
  322.           bellOnFor(3000);
  323.         } else if (m == 59) {
  324.           bellOnFor(1000);
  325.         }
  326.         break;
  327.       }
  328.       case 12: {
  329.         if(m == 0) {
  330.           bellOnFor(2000);
  331.         } else if (m == 45) {
  332.           bellOnFor(2000);
  333.         } else if (m == 54) {
  334.           bellOnFor(1000);
  335.         } else if (m == 55) {
  336.           bellOnFor(2000);
  337.         }
  338.         break;
  339.       }
  340.       case 13: {
  341.         if(m == 40) {
  342.           bellOnFor(2000);
  343.         } else if (m == 49) {
  344.           bellOnFor(1000);
  345.         } else if (m == 50) {
  346.           bellOnFor(2000);
  347.         }
  348.         break;
  349.       }
  350.       case 14: {
  351.         if(m == 35) {
  352.           bellOnFor(2000);
  353.         } else if (m == 44) {
  354.           bellOnFor(100);
  355.         } else if (m == 45) {
  356.           bellOnFor(2000);
  357.         }
  358.         break;
  359.       }
  360.       case 15: {
  361.         if(m == 30) {
  362.           bellOnFor(2000);
  363.         } else if (m == 39) {
  364.           bellOnFor(1000);
  365.         } else if (m == 40) {
  366.           bellOnFor(2000);
  367.         }
  368.         break;
  369.       }
  370.       case 16: {
  371.         if(m == 25) {
  372.           bellOnFor(2000);
  373.         }
  374.         break;
  375.       }
  376.     }
  377.   }
  378. }
  379.  
  380. Thread* TimeThread = new Thread(bellCheck);
  381.  
  382. Thread* MenuThread = new Thread(lcdUpdate);
  383.  
  384. StaticThreadController<2> controll (MenuThread, TimeThread);
  385.  
  386. void setup() {
  387.   pinMode(13, OUTPUT);
  388.   digitalWrite(13, LOW);
  389.   pinMode(relayPin, OUTPUT);
  390.   digitalWrite(relayPin, HIGH);
  391.   lcd.begin(16, 2);
  392.   lcd.setCursor(0,0);
  393.   lcd.print("1");
  394.   delay(500);
  395.   digitalWrite(13, HIGH);
  396.   if (!rtc.begin()) {
  397.     lcd.setCursor(0,0);
  398.     lcd.print("CLOCK NOT");
  399.     lcd.setCursor(0,1);
  400.     lcd.print("FOUND");
  401.     while(true) {
  402.       delay(1000);
  403.     }
  404.   }
  405.   lcd.print("2");
  406.   delay(500);
  407.   digitalWrite(13, LOW);
  408.   if (rtc.lostPower()) {
  409.     lcd.setCursor(0,0);
  410.     lcd.print("RTC LOST");
  411.     lcd.setCursor(0,1);
  412.     lcd.print("POWER");
  413.     rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  414.     delay(2000);
  415.   }
  416.   lcd.print("3");
  417.   digitalWrite(13, HIGH);
  418.   delay(500);
  419.   MenuThread->setInterval(80);
  420.   TimeThread->setInterval(500);
  421.   lcd.print("4");
  422.   delay(500);
  423.   digitalWrite(13, LOW);
  424. }
  425.  
  426. void loop() {
  427.   controll.run();
  428. }
  429.  
  430. String formatint(int i) {
  431.   if(i < 10) {
  432.     return String("0") + String(i);
  433.   } else {
  434.     return String(i);
  435.   }
  436. }
  437.  
  438. int read_LCD_buttons()
  439. {
  440.  adc_key_in = analogRead(0);      // read the value from the sensor
  441.  // my buttons when read are centered at these valies: 0, 144, 329, 504, 741
  442.  // we add approx 50 to those values and check to see if we are close
  443.  if (adc_key_in > 1000) return btnNONE; // We make this the 1st option for speed reasons since it will be the most likely result
  444.  // For V1.1 us this threshold
  445.  if (adc_key_in < 50)   return btnRIGHT;  
  446.  if (adc_key_in < 250)  return btnUP;
  447.  if (adc_key_in < 450)  return btnDOWN;
  448.  if (adc_key_in < 650)  return btnLEFT;
  449.  if (adc_key_in < 850)  return btnSELECT;  
  450.  
  451.  // For V1.0 comment the other threshold and use the one below:
  452. /*
  453.  if (adc_key_in < 50)   return btnRIGHT;  
  454.  if (adc_key_in < 195)  return btnUP;
  455.  if (adc_key_in < 380)  return btnDOWN;
  456.  if (adc_key_in < 555)  return btnLEFT;
  457.  if (adc_key_in < 790)  return btnSELECT;  
  458. */
  459.  
  460.  
  461.  return btnNONE;  // when all others fail, return this...
  462. }
  463.  
  464. int bellOnFor(int t) {
  465.   float ts = float(t) / 1000;
  466.   lcd.setCursor(0,0);
  467.   lcd.clear();
  468.   lcd.print("FIRING BELL FOR");
  469.   lcd.setCursor(0,1);
  470.   lcd.print(ts);
  471.   digitalWrite(relayPin, LOW);
  472.   delay(t);
  473.   digitalWrite(relayPin, HIGH);
  474.   lcd.clear();
  475.   //delay(t);
  476.   //digitalWrite(52, LOW);
  477.   //delay(50);
  478.   //digitalWrite(52, HIGH);
  479. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement