Atmega Thermostat Program in C

How to write a C Program Atmega Thermostat in C Programming Language ?


  1. #include <DS1307RTC.h>
  2. #include <Wire.h>
  3. #include <Time.h>
  4. #include <EEPROM.h>
  5. #define OFFSET 3
  6. #define READINGS 10
  7. #define ADDRESS 0
  8. #define EVENINGADDRESS 10
  9. #define NIGHTADDRESS 20
  10. int upPin = 4;
  11. int downPin = 5;
  12. int menuPin = 2;
  13. int exitPin = 3;
  14. int tempPin = 0;
  15. int heaterPin = 8;
  16. int ledPin = 13;
  17. time_t timeNow = 0;
  18. time_t lastCheck = 0;
  19. time_t timeset = 0;
  20. time_t switchTime = 0;
  21. time_t screenTimer = 0;
  22. int total = 0;
  23. int average = 0;
  24. int reading = 0;
  25. float tempC = 0.00F;
  26. float tempF = 0.00F;
  27. float tempReading = 0.00F;
  28. int tempSetting = 65;
  29. int state = 0;
  30. int check = 0;
  31. int firstTime = 0;
  32. int menuLevel = 0;
  33. int initial = 0;
  34. int manualSet = 0;
  35. int manualRun = 0;
  36. int manualOff = 0;
  37. int runTime = 1;
  38. int menuMode = 0;
  39. int stepMenu = 0;
  40. int eveningTemp = 0;
  41. int nightTemp = 0;
  42. TimeElements timeSetting;
  43. void setup()
  44. {
  45.   Serial.begin(9600);
  46.   while (!Serial) {
  47.     ;
  48.   }
  49.   setSyncProvider(RTC.get);   // the function to get the time from the RTC
  50.   setSyncInterval(10);
  51.   if (timeStatus() != timeSet) {
  52.     Serial.print("Unable to sync with the RTC");
  53.   }
  54.   delay(100);
  55.   Serial.write(12);
  56.   Serial.write(17);
  57.   delay(5);
  58.   Serial.print("Initalizing...");
  59.   delay(1000);
  60.   EEPROM.get(ADDRESS, tempSetting);
  61.   EEPROM.get(EVENINGADDRESS, eveningTemp);
  62.   EEPROM.get(NIGHTADDRESS, nightTemp);
  63.   printScreen("Retrieving Temp", "From EEPROM");
  64.   delay(1000);
  65.   printTempInfo();
  66.   timeNow = now();
  67.   screenTimer = now();
  68.   printClock();
  69.   pinMode(upPin, INPUT);
  70.   pinMode(downPin, INPUT);
  71.   pinMode(heaterPin, OUTPUT);
  72.   pinMode(exitPin, INPUT);
  73.   pinMode(menuPin, INPUT);
  74. }
  75. void loop()
  76. {
  77.   timeNow = now();
  78.   if (digitalRead(menuPin) == HIGH) {
  79.     Serial.write(17);
  80.     if (menuMode == 0) {
  81.       menuMode = 1;
  82.       menuLevel = 0;
  83.       stepMenu = 0;
  84.       delay(250);
  85.     } else {
  86.       stepMenu = 1;
  87.       delay(250);
  88.     }
  89.   }
  90.   if (digitalRead(exitPin) == HIGH) {
  91.     Serial.write(17);
  92.     if (menuMode == 0) {
  93.       manualSet = 1;
  94.       initial = 0;
  95.     } else {
  96.       exitMenu();
  97.     }
  98.     delay(250);
  99.   }
  100.   if (manualSet == 1) {
  101.     if (state == 1) {
  102.       if (initial == 0) {
  103.         printScreen("Turn Off For", String(runTime) + "  minutes");
  104.         initial = 1;
  105.       } else {
  106.         Serial.write(148);
  107.         if (runTime < 10) {
  108.           Serial.print("0");
  109.         }
  110.         Serial.print(String(runTime));
  111.         delay(20);
  112.       }
  113.       runTime = varChange(runTime, 60, 1);
  114.       if (digitalRead(exitPin) == HIGH) {
  115.         manualSet = 0;
  116.         initial = 0;
  117.         runTime = 1;
  118.         manualOff = 0;
  119.       }
  120.       if (digitalRead(menuPin) == HIGH) {
  121.         printScreen("Turning Off...", "");
  122.         delay(500);
  123.         switchTime = now() + (runTime * 60);
  124.         state = 0;
  125.         manualOff = 1;
  126.         manualSet = 0;
  127.         runTime = 1;
  128.         initial = 0;
  129.         delay(1000);
  130.         lastCheck = now() - 20;
  131.       }
  132.     } else {
  133.       if (initial == 0) {
  134.         printScreen("Turn On For", String(runTime) + "  minutes");
  135.         initial = 1;
  136.       } else {
  137.         Serial.write(148);
  138.         if (runTime < 10) {
  139.           Serial.print("0");
  140.         }
  141.         Serial.print(String(runTime));
  142.         delay(20);
  143.       }
  144.       runTime = varChange(runTime, 60, 1);
  145.       if (digitalRead(exitPin) == HIGH) {
  146.         manualSet = 0;
  147.         initial = 0;
  148.         runTime = 1;
  149.         manualRun = 0;
  150.       }
  151.       if (digitalRead(menuPin) == HIGH) {
  152.         printScreen("Turning On...", "");
  153.         delay(500);
  154.         switchTime = now() + (runTime * 60);
  155.         state = 1;
  156.         manualRun = 1;
  157.         manualSet = 0;
  158.         runTime = 1;
  159.         initial = 0;
  160.         delay(1000);
  161.         lastCheck = now() - 20;
  162.       }
  163.     }
  164.   } else if (menuMode != 0) {
  165.     if (stepMenu == 1) {
  166.       menuLevel = menuLevel + 1;
  167.       stepMenu = 0;
  168.       initial = 0;
  169.       delay(250);
  170.     }
  171.     if (firstTime == 0) {
  172.       printScreen("Entering", "Menu Mode...");
  173.       timeSetting.Year = year() - 1970;
  174.       timeSetting.Month = month();
  175.       timeSetting.Day = day();
  176.       timeSetting.Hour = hour();
  177.       timeSetting.Minute = minute();
  178.       EEPROM.get(EVENINGADDRESS, eveningTemp);
  179.       EEPROM.get(NIGHTADDRESS, nightTemp);
  180.       delay(2000);
  181.       firstTime = 1;
  182.     }
  183.     if (menuLevel == 0) {
  184.       printSettingPage("Temp", tempSetting);
  185.       tempSetting = varChange(tempSetting, 80, 40);
  186.     } else if (menuLevel == 1) {
  187.       printSettingPage("Year", timeSetting.Year);
  188.       timeSetting.Year = varChange(timeSetting.Year, 99, 0);
  189.     } else if (menuLevel == 2) {
  190.       printSettingPage("Month", timeSetting.Month);
  191.       timeSetting.Month = varChange(timeSetting.Month, 12, 1);
  192.     } else if (menuLevel == 3) {
  193.       printSettingPage("Day", timeSetting.Day);
  194.       timeSetting.Day = varChange(timeSetting.Day, 31, 1);
  195.     } else if (menuLevel == 4) {
  196.       printSettingPage("Hour", timeSetting.Hour);
  197.       timeSetting.Hour = varChange(timeSetting.Hour, 23, 0);
  198.     } else if (menuLevel == 5) {
  199.       printSettingPage("Minute", timeSetting.Minute);
  200.       timeSetting.Minute = varChange(timeSetting.Minute, 60, 0);
  201.     } else if (menuLevel == 6) {
  202.       printSettingPage("Evening", eveningTemp);
  203.       eveningTemp = varChange(eveningTemp, 80, 40);
  204.     } else if (menuLevel == 7) {
  205.       printSettingPage("Night", nightTemp);
  206.       nightTemp = varChange(nightTemp, 80, 40);
  207.      
  208.     }
  209.   } else {
  210.     timeNow = now();
  211.     if (timeNow > screenTimer + 30) {
  212.       Serial.write(18);
  213.     }
  214.     if (digitalRead(upPin) == HIGH || digitalRead(downPin) == HIGH) {
  215.       Serial.write(17);
  216.       screenTimer = now();
  217.     }
  218.     printClock();
  219.     if (switchTime <= timeNow) {
  220.       manualRun = 0;
  221.     }
  222.     if (timeNow >= lastCheck + 10) {
  223.       if (hour() == 18 && minute() == 00) {
  224.         EEPROM.get(EVENINGADDRESS, tempSetting);
  225.       } else if (hour() == 21 && minute() == 00) {
  226.         EEPROM.get(NIGHTADDRESS, tempSetting);
  227.       } else if (hour() == 05 && minute() == 00) {
  228.         EEPROM.get(ADDRESS, tempSetting);
  229.       }
  230.       tempReading = readTemp();
  231.       printTempInfo();
  232.       if (manualRun == 0) {
  233.         if (tempReading <= tempSetting - OFFSET) {
  234.           state = 1;
  235.         }
  236.         if (tempReading >= tempSetting + OFFSET) {
  237.           state = 0;
  238.         }
  239.       }
  240.       lastCheck = now();
  241.     }
  242.     runHeater();
  243.   }
  244. }
  245. float readTemp()
  246. {
  247.   for (int thisReading = 0; thisReading < READINGS; thisReading++) {
  248.     reading = analogRead(tempPin);
  249.     total += reading;
  250.   }
  251.   average = total / READINGS;
  252.   total = 0;
  253.   tempC = ((float(average) * (5000.0 / 1024.0)) - 500.0) / 10.0;
  254.   tempF = (tempC * 9.0 / 5.0) + 32.0;
  255.   return tempF;
  256. }
  257. void printClock()
  258. {
  259.   if (manualRun == 0) {
  260.     String clockHour = "";
  261.     String clockMinute = "";
  262.     Serial.write(158);
  263.     if (hour() < 10) {
  264.       clockHour = "0" + String(hour());
  265.     } else {
  266.       clockHour = String(hour());
  267.     }
  268.     if (minute() < 10) {
  269.       clockMinute = "0" + String(minute());
  270.     } else {
  271.       clockMinute = String(minute());
  272.     }
  273.     Serial.print(clockHour + ":" + clockMinute);
  274.   } else {
  275.     Serial.write(141);
  276.     Serial.print("man");
  277.     Serial.write(158);
  278.     if (switchTime - timeNow > 60) {
  279.       if ((((switchTime - timeNow) / 60) + 1) < 10) {
  280.         Serial.print(0);
  281.       }
  282.       Serial.print(String(((switchTime - timeNow) / 60) + 1));
  283.       Serial.write(161);
  284.       Serial.print("min");
  285.     } else if (switchTime - timeNow == 60) {
  286.       Serial.print(String(01));
  287.       Serial.write(161);
  288.       Serial.print("min");
  289.     } else {
  290.       if ((switchTime - timeNow) < 10) {
  291.         Serial.print(0);
  292.       }
  293.       Serial.print(String(switchTime - timeNow));
  294.       Serial.write(161);
  295.       Serial.print("sec");
  296.     }
  297.   }
  298. }
  299. void exitMenu()
  300. {
  301.   menuMode = 0;
  302.   menuLevel = 0;
  303.   firstTime = 0;
  304.   initial = 0;
  305.   Serial.write(12);
  306.   Serial.print("Writing Vars");
  307.   EEPROM.put(EVENINGADDRESS, eveningTemp);
  308.   EEPROM.put(NIGHTADDRESS, nightTemp);
  309.   if (hour() >= 18 && hour() < 21) {
  310.     EEPROM.put(EVENINGADDRESS, tempSetting);
  311.   } else if (hour() >= 21) {
  312.     EEPROM.put(NIGHTADDRESS, tempSetting);
  313.   } else if (hour() < 5) {
  314.     EEPROM.put(NIGHTADDRESS, tempSetting);
  315.   } else {
  316.     EEPROM.put(ADDRESS, tempSetting);
  317.   }
  318.   setTime(makeTime(timeSetting));
  319.   delay(10);
  320.   timeset = now();
  321.   RTC.set(timeset);
  322.   Serial.write(13);
  323.   Serial.print("Leaving Menu");
  324.   timeNow = now();
  325.   lastCheck = now() - 20;
  326.   delay(1000);
  327. }
  328. void runHeater()
  329. {
  330.   Serial.write(138);
  331.   if (state == 1) {
  332.     Serial.print("ON");
  333.     digitalWrite(heaterPin, HIGH);
  334.     digitalWrite(ledPin, HIGH);
  335.   } else {
  336.     Serial.print("OFF");
  337.     digitalWrite(heaterPin, LOW);
  338.     digitalWrite(ledPin, LOW);
  339.   }
  340. }
  341. void printTempInfo()
  342. {
  343.   Serial.write(12);
  344.   delay(5);
  345.   Serial.print("Temp: " + String(int(tempReading)));
  346.   Serial.write(148);
  347.   Serial.print("Set:  " + String(int(tempSetting)));
  348. }
  349. int varChange(int var, int maximum, int minimum)
  350. {
  351.   if (digitalRead(upPin) == HIGH) {
  352.     var++;
  353.     delay(200);
  354.   }
  355.   if (digitalRead(downPin) == HIGH) {
  356.     var--;
  357.     delay(200);
  358.   }
  359.   if (var > maximum) {
  360.     var = minimum;
  361.   } else if (var < minimum) {
  362.     var = maximum;
  363.   }
  364.   return var;
  365. }
  366. void printSettingPage(String text, int var)
  367. {
  368.   if (text == "Year") {
  369.     var = var + 1970;
  370.   }
  371.   if (initial == 0) {
  372.     Serial.write(12);
  373.     Serial.print("Set " + text + ": ");
  374.     initial = 1;
  375.   } else {
  376.     Serial.write(140);
  377.     if (var < 10) {
  378.       Serial.print(0);
  379.     }
  380.     Serial.print(String(var));
  381.     delay(20);
  382.   }
  383. }
  384. void printScreen(String line1, String line2)
  385. {
  386.   Serial.write(12);
  387.   delay(5);
  388.   Serial.print(line1);
  389.   Serial.write(148);
  390.   Serial.print(line2);
  391. }


Learn More :