manhoosbilli1

Final code

Aug 5th, 2019
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.51 KB | None | 0 0
  1. #include <EEPROM.h>
  2. #include <LiquidCrystal_I2C.h>
  3. #include <TimeLib.h>
  4. #include <TimeAlarms.h>
  5. #include "RTClib.h"
  6. #include <JC_Button.h>
  7. #include "DHT.h"
  8. #define DHTPIN 2    // what pin we're connected to
  9. #define DHTTYPE DHT22   // DHT 22  (AM2302)
  10. #define btn_up 12
  11. #define btn_down  11
  12. #define btn_select 11
  13. #define lSw1 8 //l.sw2
  14. #define lSw2 9 // l.sw1
  15. #define m1 5
  16. #define m2 6
  17. #define relay 3
  18. #define buzzer A1
  19. #define deHumFan A3
  20.  
  21. bool showHatchDay = 0;
  22. bool needToShowTime = 0;
  23. bool updAlarm;
  24. bool turnOnce = false;
  25. float h;
  26. float t;
  27. int currentPage = 0;
  28. bool startMotor = false;
  29. unsigned long previousMillis = 0;
  30. unsigned int tDuration = 5000;
  31. unsigned int hatchYear;
  32. unsigned int hatchMonth;
  33. unsigned int hatchDay;
  34. unsigned int hatchHour;
  35. unsigned int hour_now;
  36. unsigned int minute_now;
  37. unsigned int second_now;
  38. unsigned int month_now;
  39. unsigned int year_now;
  40. unsigned int day_now;
  41.  
  42. RTC_DS3231 rtc;
  43. DHT dht(DHTPIN, DHTTYPE);
  44. LiquidCrystal_I2C lcd(0x27, 16, 2);
  45. AlarmId id;
  46. Button Up(btn_up);
  47. Button Select(btn_select);
  48. Button Down(btn_down);
  49. Button ls1(lSw1);
  50. Button ls2(lSw2);
  51.  
  52. void setup() {
  53.   // put your setup code here, to run once:
  54.   Alarm.timerRepeat(20, turnEggFlag);  //every 10 seconds
  55.   DateTime now = rtc.now();
  56.   Up.begin();
  57.   Down.begin();
  58.   Select.begin();
  59.   ls1.begin();
  60.   ls2.begin();
  61.   Serial.begin(9600);
  62.   lcd.begin();
  63.   lcd.backlight();
  64.   lcd.setCursor(0, 0);
  65.   lcd.print("   Incubator   ");
  66.   lcd.setCursor(0, 1);
  67.   lcd.print("   Starting   ");
  68.   EEPROM.get(0, hatchYear);
  69.   EEPROM.get(4, hatchMonth);
  70.   EEPROM.get(8, hatchDay);
  71.   hour_now = now.hour();
  72.   minute_now = now.minute();
  73.   second_now = now.second();
  74.   month_now = now.month();
  75.   year_now = now.year();
  76.   day_now = now.day();
  77.  
  78.   setTime(hour_now, minute_now, second_now, month_now, day_now, year_now);
  79.  
  80.   if (! rtc.begin()) {
  81.     Serial.println("Couldn't find RTC");
  82.     while (1);
  83.   }
  84.   if (rtc.lostPower()) {
  85.     Serial.println("RTC lost power");
  86.     // following line sets the RTC to the date & time this sketch was compiled
  87.     //rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  88.     // This line sets the RTC with an explicit date & time, for example to set
  89.     // January 21, 2014 at 3am you would call:
  90.     // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
  91.   }
  92.   pinMode(m1, OUTPUT);
  93.   pinMode(m2, OUTPUT);
  94.   lcd.setCursor(0,0);
  95.   lcd.print("Mtr Calibrating     ");
  96.   while (ls1.read() == LOW && ls2.read() == LOW) {
  97.     digitalWrite(m1, HIGH);
  98.     digitalWrite(m2, LOW);
  99.   }
  100.   lcd.print("Mtr calibrated");
  101.   digitalWrite(m1, LOW);
  102.   digitalWrite(m2, LOW);
  103.   Alarm.delay(2000);
  104. }
  105.  
  106. enum states {
  107.   STATE_IDLE,
  108.   STATE_MOVING_RIGHT,
  109.   STATE_MOVING_LEFT
  110. };
  111. int currentState = STATE_IDLE;
  112.  
  113. void loop() {
  114.  
  115.   Up.read();
  116.   Down.read();
  117.   Select.read();
  118.   ls1.read();
  119.   ls2.read();
  120.   DateTime now = rtc.now();
  121.   menu();
  122.   turn();
  123.  
  124. }
  125.  
  126. void turnEggFlag() {
  127.   Serial.println("Turned on the flag");
  128.   startMotor = true;
  129. }
  130.  
  131. void turn_once() {
  132.   bool turnOnce = true;
  133.   switch (currentState) {
  134.     case STATE_IDLE:
  135.       if (ls1.read() == false && ls2.read() == true) {
  136.         Serial.println("Moving right now");
  137.         digitalWrite(m1, HIGH);
  138.         digitalWrite(m2, LOW);
  139.         currentState = STATE_MOVING_RIGHT;
  140.       }
  141.       if (ls1.read() == true && ls2.read() == false) {
  142.         Serial.println("Moving left now");
  143.         digitalWrite(m1, LOW);
  144.         digitalWrite(m2, HIGH);
  145.         currentState = STATE_MOVING_LEFT;
  146.       }
  147.       break;
  148.  
  149.  
  150.     case STATE_MOVING_RIGHT:
  151.       if (ls1.read() == true && ls2.read() == false) {
  152.         Serial.println("Motor reached right. Motor stopping");
  153.         digitalWrite(m1, LOW);
  154.         digitalWrite(m2, LOW);
  155.         turnOnce = false;
  156.         currentState = STATE_IDLE;
  157.         break;
  158.       }
  159.       break;
  160.  
  161.     case STATE_MOVING_LEFT:
  162.       if (ls1.read() == false && ls2.read() == true) {
  163.         Serial.println("Motor has reached left. Motor stopping");
  164.         digitalWrite(m1, LOW);
  165.         digitalWrite(m2, LOW);
  166.         turnOnce = false;
  167.         currentState = STATE_IDLE;
  168.         break;
  169.       }
  170.       break;
  171.   }
  172. }
  173.  
  174.  
  175. void turn() {
  176.   if (startMotor) {
  177.     switch (currentState) {
  178.       case STATE_IDLE:
  179.         if (ls1.read() == false && ls2.read() == true) {
  180.           Serial.println("Moving right now");
  181.           digitalWrite(m1, HIGH);
  182.           digitalWrite(m2, LOW);
  183.           currentState = STATE_MOVING_RIGHT;
  184.         }
  185.         if (ls1.read() == true && ls2.read() == false) {
  186.           Serial.println("Moving left now");
  187.           digitalWrite(m1, LOW);
  188.           digitalWrite(m2, HIGH);
  189.           currentState = STATE_MOVING_LEFT;
  190.         }
  191.         break;
  192.  
  193.  
  194.       case STATE_MOVING_RIGHT:
  195.         if (ls1.read() == true && ls2.read() == false) {
  196.           Serial.println("Motor reached right. Motor stopping");
  197.           digitalWrite(m1, LOW);
  198.           digitalWrite(m2, LOW);
  199.           startMotor = false;
  200.           currentState = STATE_IDLE;
  201.           break;
  202.         }
  203.         break;
  204.  
  205.       case STATE_MOVING_LEFT:
  206.         if (ls1.read() == false && ls2.read() == true) {
  207.           Serial.println("Motor has reached left. Motor stopping");
  208.           digitalWrite(m1, LOW);
  209.           digitalWrite(m2, LOW);
  210.           startMotor = false;
  211.           currentState = STATE_IDLE;
  212.           break;
  213.         }
  214.         break;
  215.     }
  216.   }
  217. }
  218.  
  219. void menu() {
  220.   switch (currentPage) {
  221.     default:
  222.       Serial.println("in default");
  223.       break;
  224.  
  225.     case 0:
  226.       //show status day remaining for hatch
  227.       //show time remaining for next turn
  228.       lcd.setCursor(0, 0);
  229.       lcd.print("T: ");
  230.       lcd.print("38 C        ");
  231.       lcd.setCursor(0, 1);
  232.       lcd.print("H: ");
  233.       lcd.print("56%         ");
  234.  
  235.       //show humidity from sensor
  236.       if (Up.wasPressed()) {
  237.         currentPage += 1;
  238.       }
  239.       if (Down.wasPressed()) {
  240.         currentPage = 5;
  241.       }
  242.       break;
  243.  
  244.     case 1:
  245.       lcd.setCursor(0, 0);
  246.       lcd.print("Press Select To         ");
  247.       lcd.setCursor(0, 1);
  248.       lcd.print("Find HatchDay         ");
  249.       if (Up.wasPressed()) {
  250.         currentPage += 1;
  251.       }
  252.       if (Down.wasPressed()) {
  253.         currentPage -= 1;
  254.       }
  255.  
  256.       if (Select.wasPressed()) {
  257.         DateTime now = rtc.now();
  258.         DateTime future (now.unixtime() + 21 * 86400L + 30);
  259.         hatchYear = future.year();
  260.         hatchMonth = future.month();
  261.         hatchDay = future.day();
  262.         hatchHour = future.hour();
  263.         EEPROM.update(0, hatchYear);
  264.         EEPROM.update(4, hatchMonth);
  265.         EEPROM.update(8, hatchDay);
  266.         showHatchDay = true;
  267.         if (showHatchDay) {
  268.           previousMillis = millis();
  269.           while ((millis() - previousMillis) <= 3000) {
  270.             lcd.setCursor(0, 0);
  271.             lcd.print("   Hatch Day   ");
  272.             lcd.setCursor(0, 1);
  273.             lcd.print("   ");
  274.             lcd.print(future.year(), DEC);
  275.             lcd.print("/");
  276.             lcd.print(future.month(), DEC);
  277.             lcd.print("/");
  278.             lcd.print(future.day(), DEC);
  279.             lcd.print("       ");
  280.             delay(50);
  281.           }
  282.           showHatchDay = false;
  283.         }
  284.       }
  285.  
  286.       break;
  287.  
  288.     case 2:
  289.       lcd.setCursor(0, 0);
  290.       lcd.print("Press Select          ");
  291.       lcd.setCursor(0, 1);
  292.       lcd.print("To Turn Motor     ");
  293.       if (Up.wasPressed()) {
  294.         currentPage += 1;
  295.       }
  296.       if (Down.wasPressed()) {
  297.         currentPage -= 1;
  298.       }
  299.  
  300.       if (Select.wasPressed()) {
  301.         turnOnce = true;
  302.         if (turnOnce) {   //variable is true
  303.           turn_once();  // go to turn once function
  304.         }
  305.       }
  306.       break;
  307.  
  308.     case 3:
  309.       lcd.setCursor(0, 0);
  310.       lcd.print("Press Select       ");
  311.       lcd.setCursor(0, 1);
  312.       lcd.print("To Run Demo               ");
  313.       if (Up.wasPressed()) {
  314.         currentPage += 1;
  315.       }
  316.       if (Down.wasPressed()) {
  317.         currentPage -= 1;
  318.       }
  319.       if (Select.wasPressed()) {
  320.         turnOnce = true;
  321.         if (turnOnce) {   //variable is true
  322.           turn_once();  // go to turn once function
  323.         }
  324.         digitalWrite(buzzer, HIGH);
  325.         Alarm.delay(1000);
  326.         digitalWrite(buzzer, LOW);
  327.         digitalWrite(deHumFan, HIGH);
  328.         digitalWrite(relay, HIGH);
  329.         Alarm.delay(1000);
  330.         digitalWrite(relay, LOW);
  331.         digitalWrite(deHumFan, LOW);
  332.       }
  333.       break;
  334.  
  335.     case 4:
  336.       lcd.setCursor(0, 0);
  337.       lcd.print("Press Select          ");
  338.       lcd.setCursor(0, 1);
  339.       lcd.print("To Check Fan        ");
  340.       if (Up.wasPressed()) {
  341.         currentPage += 1;
  342.       }
  343.       if (Down.wasPressed()) {
  344.         currentPage -= 1;
  345.       }
  346.       if (Select.wasPressed()) {
  347.         digitalWrite(deHumFan, HIGH);
  348.         delay(3000);
  349.         digitalWrite(deHumFan, LOW);
  350.       }
  351.   break;
  352.  
  353.  
  354. case 5:
  355.   lcd.setCursor(0, 0);
  356.   lcd.print("Press Select         ");
  357.   lcd.setCursor(0, 1);
  358.   lcd.print("To Show Time         ");
  359.   if (Up.wasPressed()) {
  360.     currentPage = 0;
  361.   }
  362.   if (Down.wasPressed()) {
  363.     currentPage -= 1;
  364.   }
  365.   if (Select.wasPressed()) {
  366.     needToShowTime = true;
  367.     if ( needToShowTime ) {   //triggers a function which will print to lcd
  368.       previousMillis = millis();   //and wait for said time
  369.       while ((millis() - previousMillis) <= tDuration) //show for 5 seconds
  370.       {
  371.         showTime();
  372.         delay(50);       //to slow down arduino
  373.       }
  374.       needToShowTime = false;  //after we have shown the time for time we can go to normal
  375.     }
  376.   }
  377.   break;
  378.  
  379. }
  380. }
  381.  
  382.  
  383.  
  384. void showTime()
  385. {
  386.  
  387.   DateTime now = rtc.now();
  388.   lcd.setCursor(0, 0);
  389.   lcd.print("Date:  ");
  390.   lcd.setCursor(7, 0);
  391.   lcd.print(now.year(), DEC);
  392.   lcd.print('/');
  393.   lcd.print(now.month(), DEC);
  394.   lcd.print('/');
  395.   lcd.print(now.day(), DEC);
  396.   lcd.print("            ");
  397.   lcd.setCursor(0, 1);
  398.   lcd.print("Time:  ");
  399.   lcd.setCursor(7, 1);
  400.   lcd.print("");
  401.   lcd.print(now.hour(), DEC);
  402.   lcd.print(':');
  403.   lcd.print(now.minute(), DEC);
  404.   lcd.print(':');
  405.   lcd.print(now.second(), DEC);
  406.   lcd.print("          ");
  407.  
  408. }
  409.  
  410. void printTime() {
  411.   if ( needToShowTime ) {    //triggers a function which will print to lcd
  412.     previousMillis = millis();   //and wait for said time
  413.     while ((millis() - previousMillis) <= tDuration) //show for 5 seconds
  414.     {
  415.       showTime();
  416.       delay(50);       //to slow down arduino
  417.     }
  418.     needToShowTime = false;  //after we have shown the time for time we can go to normal
  419.   }
  420. }
Add Comment
Please, Sign In to add comment