Étape 9: Faire les boutons faire quelque chose.
Chaque bouton correspond à assigner une fonction ou un objet. Dans notre cas, les boutons de la premières et la deuxième sont pour augmenter ou diminuer les boutons respectivement, et le troisième bouton est pour basculer entre courir ou maintenez mode. J’ai inclus une quatrième case, mais je ne sais pas si son besoin. Pour l’instant je vais laisser dedans, mais nous allons voir.
Le Code Final :
Aux fins de ce Instructable, c’est le code final
/ * / * C’est l’application que je vais utiliser pour contrôler la fournaise. Le concept est la suivante : J’ai 3 zones je surveillerai. Chaque zone aura au moins un amortisseur de la zone qui sera contrôlée par l’application de l’arduino. Chaque zone aura un seul thermomètre qui rendra compte au contrôleur. Selon la lecture du thermomètre et le réglage du thermostat, ouvrir ou fermer les amortisseurs et le fourneau central s’allume. Après avoir atteint une température acceptable dans toutes les zones, le four s’éteint. En plus des cycles de chauffage général, le système sera programmable. Pour l’instant, cependant, le cycle de programmation est traité ici, sans passer par le thermostat. Des cas de TEST IMPORTANT: (à ajouter que je pense d’eux / tomber sur eux * doivent s’assurer que le four est toujours éteint si tous les 3 amortisseurs sont fermés. * amortisseurs doivent être ouverts, à moins qu’ils doivent spécifiquement être fermés. * Si le système est définie sur « hold », toutes les zones sont définies pour l’ouvrir et la programmation ne pas exécuter. * Si le système est substituée, mais n’a pas tenu , la substitution s’arrête une fois que le prochain intervalle programmé arrive * peut seulement substituer aux limites explicites supérieures et inférieures. * / #include < LiquidCrystal.h > //This est une bibliothèque nécessaire pour le LCD affichage #include < OneWire.h > //This est une bibliothèque nécessaire pour le thermomètre lectures #include < DallasTemperature.h > //This est une bibliothèque de température #include < Wire.h > #include « RTClib.h » / / liens: / / rs (broche 4 de LCD) pour Arduino pin 12 / / rw (broche 5 de LCD) pour Arduino pin 11 / / enable (broche LCD 6) sur la broche 10 de Arduino / / LCD pin 15 à goupille de Arduino 13 / / LCD pins d4 , d5, d6, d7 à Arduino épingle 5, 4, 3, 2 lcd innovente (12, 11, 10, 5, 4, 3, 2) ; deg octet [8] = {B01000, B10100, B01000, B00111, B00100, B00110, B00100, B00100} ; const int rétroéclairage = 13 ; contrôles rétro-éclairage #define THERM_BUS 6 / / toutes les lectures de température viennent via cette broche unique. OneWire oneWire(THERM_BUS) ; Capteurs DallasTemperature (& oneWire) ; DeviceAddress zone1Therm = {0 x 28, 0 x 48, 0 x 39, 0 x 11, 0 x 04, 0 x 00, 0 x 00, 0x94} ; DeviceAddress zone2Therm = {0 x 28, 0xF2, 0x1F, 0 x 11, 0 x 04, 0 x 00, 0 x 00, 0 x 38} ; DeviceAddress zone3Therm = {0 x 28, 0xBA, 0xF3, 0 x 10, 0 x 04, 0 x 00, 0 x 00, 0x98} ; RTC_DS1307 CCF ; DÉBUT de programmation / / temps sont 6 AM, 08:00, 15:00 et 21:00 int * PROGRAMMED_VALUES [7] ; int SUNDAY_VALUES [4] = {67, 67, 67, 60} ; int MONDAY_VALUES [4] = {67, 67, 67, 60} ; int TUESDAY_VALUES [4] = {67, 67, 67, 60} ; int WEDNESDAY_VALUES [4] = {67, 67, 67, 60} ; int THURSDAY_VALUES [4] = {67, 67, 67, 60} ; int FRIDAY_VALUES [4] = {67, 67, 90, 75} ; int SATURDAY_VALUES [4] = {67, 67, 67, 60} ; FIN de programmation float zone1Temp = 0 ; float zone2Temp = 0 ; float zone3Temp = 0 ; Boolean z1Check = 0 ; Boolean z2Check = 0 ; Boolean z3Check = 0 ; isOverridden booléen = false ; furnaceState booléen = false ; avec furnaceState, false signifie qu’il est actuellement désactivé, true signifie son actuellement. String thermState = « exécuter » ; int overrideValue = 0 ; currentMode int = 0 ; const int furnacePin = 7 ; int zoneCounter = 0 ; int a = 0 ; int loopCounter = 0 ; int z1Pin = 8 ; int z2Pin = 9 ; int z3Pin = 13 ; nettoyage de broche de rétro-éclairage pour z3 void setup() {Serial.begin(57600); / / cela relie l’arduino vers l’ordinateur //TEMPERATURE capteur SETUP sensors.begin() ; sensors.setResolution (zone1Therm, 10); lcd.createChar (0, deg); / / CCF SETUP. Wire.Begin() ; RTC.begin() ; if (!. RTC.isrunning()) {Journal (« ERROR », "RTC n'est pas en cours d’exécution!"); //RTC.adjust (DateTime (__DATE__, __TIME__)); //THIS seulement a besoin pour être DÉCOMMENTÉ si vous sont réglage vers le haut votre RTC pour la première fois ! UNE FOIS QU’IL EST DÉFINI, IL DOIT ÊTRE DÉSACTIVÉ! } //SETUP sorties pinMode (furnacePin, sortie) ; pinMode (z1Pin, sortie) ; pinMode (z2Pin, sortie) ; pinMode (z3Pin, sortie) ; finalement intègrent contrôle du rétro-éclairage arrière arduino. Pour l’instant nous allons juste affectez-lui la constante. digitalWrite (rétro-éclairage, HIGH) ; ENTRÉES de configuration pinMode (A0, INPUT_PULLUP) ; MISE EN PLACE DE LA PROGRAMMED_VALUES DE PROGRAMME HEBDOMADAIRE [0] = SUNDAY_VALUES ; PROGRAMMED_VALUES [1] = MONDAY_VALUES ; PROGRAMMED_VALUES [2] = TUESDAY_VALUES ; PROGRAMMED_VALUES [3] = WEDNESDAY_VALUES ; PROGRAMMED_VALUES [4] = THURSDAY_VALUES ; PROGRAMMED_VALUES [5] = FRIDAY_VALUES ; PROGRAMMED_VALUES [6] = SATURDAY_VALUES ; } / / Cela va la loop() Sub boucle continue {delay(100) ; //DELAY actuellement fixé à.1 secondes. S’ajuster au besoin //DATE/TIME logique / / if (loopCounter % 2 == 0) {/ / log ("TIME", « Boucle ouverte à » + getDateAndTime()) ; } //TEMPERATURE logique / / logTemperatureData() ; Si (loopCounter 30 % == 0) {log ("info", loopCounter (String)); //changes sortie chaque outputToScreen() de 3 secondes;} / / ce qui suit nous permet de seulement Vérifier état du four toutes les 60 secondes tout en lisant le bouton se transforme en temps réel efficace si (loopCounter % 60 == 0) {log ("info", loopCounter (String)); sensors.requestTemperatures() ; zone1Temp = getTemperature(zone1Therm) ; zone2Temp = getTemperature(zone2Therm) ; zone3Temp = getTemperature(zone3Therm) ; z1Check = checkZoneTemp(zone1Temp) ; z2Check = checkZoneTemp(zone2Temp) ; z3Check = checkZoneTemp(zone3Temp) ; loopCounter = 0; if (z1Check || z2Check || z3Check) {startFurnace();} else {stopFurnace();} si (z1Check & & furnaceState) {closeDamper(z1Pin);} else {openDamper(z1Pin);} Si (z2Check & & furnaceState) {closeDamper(z2Pin);} else {openDamper(z2Pin);} si (z3Check & & furnaceState) {closeDamper(z3Pin);} else {openDamper(z3Pin);}} un = analogRead(0) ; CES NUMÉROS CHANGENT SELON VOS RÉSISTANCES. int targetTemp = getProgrammedTargetTemperature() ; if(a < 20) {//This signifie température jusqu'à isOverridden = true ; if (overrideValue! = targetTemp & & overrideValue! = 0) {overrideValue ++;} else {overrideValue = targetTemp + 1;} if(overrideValue > 80) {overrideValue = 80;} Journal ("info", "température jusqu'à" + (String) overrideValue) ; loopCounter = -1 ; CE RÉINITIALISE le compteur de boucle, sens tout va être exécuté à nouveau} si (un < 30 & & a > 20) {//This signifie température down. isOverridden = true ; if (overrideValue! = targetTemp & & overrideValue > 0) {overrideValue--;} else {overrideValue = targetTemp - 1;} if(overrideValue < 50) {overrideValue = 50;} Journal ("info", "température descendre à" + (String) overrideValue) ; loopCounter = -1 ; CE RÉINITIALISE le compteur de boucle, sens tout va être exécuté à nouveau} si (un 45 < & & a > 30) {//This est un cabillot pour cale/exécuter si (thermState == "hold") {thermState = "run"; isOverridden = false ; Journal ("info", "réglage thermState à exécuter");} autre {thermState = "hold"; isOverridden = true ; Journal ("info", "réglage thermState de tenir");} isOverridden = true ; loopCounter = -1 ; //THIS RÉINITIALISE le compteur de boucle, sens tout va être exécuté à nouveau} si (un < 60 & & a > 45) {//DO j’ai besoin d’un quatrième BOUTON ? } loopCounter ++ ; } boolean checkZoneTemp (int température) {int temp = getTargetTemperature() ; if(temperature > temp) {return false;} retourne true;} void logTemperatureData() {Journal ("Zone1Temp", (String)(int)zone1Temp) ; Journal ("Zone2Temp", (String)(int)zone2Temp) ; Journal ("Zone3Temp", (String)(int)zone3Temp);} void outputToScreen() {zoneCounter ++; if(zoneCounter == 1) {String val = "Zone1:" + (String) (int) zone1Temp ; Val += "(" + (String)getTargetTemperature() ; Val = (String) ")" ; toScreen (val, « Mode: "+ getModeString());} ElseIf (zoneCounter == 2) {String val = "Zone2:" + (String) (int) zone2Temp ; Val += "(" + (String)getTargetTemperature() ; Val = (String) ")" ; toScreen (val, "four:" + getFurnaceState());} else {zoneCounter = 0 ; String val = "Zone3:" + (String) (int) zone3Temp ; Val += "(" + (String)getTargetTemperature() ; Val = (String) ")" ; toScreen (val, "Open:" + getActiveZonesForScreen());}} void checkMode() {int mode = getMode() ; if (mode! = currentMode) {currentMode = mode ; if(isOverridden) {si (thermState == « run ») {//This logique simplement la valeur de remplacement en cas de renversement et reprend le programme si le thermstate ne tient pas. Dans le cas contraire, l’overrideValue est utilisé. isOverridden = false ; getTargetTemperature() int}}}} {checkMode() ; if(isOverridden) {return overrideValue;} else {return getProgrammedTargetTemperature();}} int getProgrammedTargetTemperature() {int mode = getMode() ; DateTime maintenant = RTC.now() ; date de l’int = now.dayOfWeek() ; valeurs d’int = {0} ; valeurs = PROGRAMMED_VALUES [date] ; Journal (« info », "avoir programmé la température cible:" + (String)values[mode]) ; retournent des valeurs [mode] ; } String getActiveZonesForScreen() {String retVal = "" ; Si (z1Check & &! furnaceState) {retVal = « 1 »;} si (z2Check & &! furnaceState) {retVal = « 2 »;} if(z3Check && ! furnaceState) {retVal = "3";} if(retVal.length() == 0) {retVal = "None";} return retVal ; } String getFurnaceState() {if(furnaceState) {return « On »;} else {return « Off »;}} String getModeString() {if(isOverridden) {si (thermState == « run ») {return "Override";} d’autre {return "HOLD";}} int mode = getMode() ; switch (mode) {case 0: retourner « Wake »; case 1: return « Away »; case 2: retourner « Home »; case 3: retourner « Sleep »; case -1 : retour "Error", valeur par défaut : retourne « N/a »;}} int getMode() {DateTime maintenant = RTC.now() ; int heure = now.hour() ; if (heure < 6 || heure > = 21) {return 3;} si (heure > = 6 & & heure < 8) {return 0;} si (heure > = 8 & & heure < 15) {return 1;} Si (h > = 15 & & heure < 21) {return 2;} return -1 ; } float getTemperature (DeviceAddress deviceAddress) {float NC = sensors.getTempC(deviceAddress); / / Serial.println(tempC) ; if (NC == -127) {Serial.println ("ERROR getting température.");} return DallasTemperature::toFahrenheit(tempC);} function //convenience. Gère tous le passe-partout pour l’écriture de la toScreen void LCDScreen (String line1Value, String line2Value) {lcd.begin(16,2) ; lcd.clear() ; lcd.setCursor(0,0) ; lcd.print(line1Value) ; lcd.setCursor(0,1) ; lcd.print(line2Value);} String getDateAndTime() {DateTime maintenant = RTC.now() ; return String(now.year()) + « / » + String(now.month()) + « / » + String(now.day()) + "" + String(now.hour()) + ":" + String(now.minute()) + ":" + String(now.second());} void openDamper (int amortisseur) {si (amortisseur == z1Pin || amortisseur == z2Pin || amortisseur == z3Pin) {digitalWrite (amortisseur, HIGH); / / log (« info », « Ouverture clapet » + amortisseur);} else {Journal ("error", "Registre de problème ouverture. Amortisseur introuvable. S’attendait à 1, 2 ou 3. Eu "+ amortisseur);}} void closeDamper (int amortisseur) {si (amortisseur == z1Pin || amortisseur == z2Pin || amortisseur == z3Pin) {digitalWrite (amortisseur, LOW); / / log (« info », « Clapet de fermeture » + amortisseur);} else {Journal ("error", "amortisseur de fermeture de problème. Amortisseur introuvable. S’attendait à 1, 2 ou 3. Eu "+ amortisseur);}} fonction d’enregistrement des messages dans la console. Finalement l’intention d’écrire dans le fichier journal sur RPi Sub log (String code, String message) {Serial.println (code + ":" + message);} void recordData (String type, objet String, String value) {/ / TODO - sortie de base de données IPD} void startFurnace() {//Send signal approprié dans le four démarre if(!furnaceState) {furnaceState =! furnaceState ; log ("INFO", « À partir de four »); digitalWrite (furnacePin, HIGH);}} void stopFurnace() {//Send signal approprié dans le four pour arrêter if(furnaceState) {furnaceState =! furnaceState ; log ("INFO", « Arrêt four »); digitalWrite (furnacePin, basse);}}