manhoosbilli1

Final code V2

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