manhoosbilli1

final code V3

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