Étape 8: Ajout de boutons analogiques
D'accord. Depuis que je suis assez maigre sur mes broches disponibles sur l’arduino (j’ai actuellement les 7, 8 et 9 broches numériques disponibles et j’ai encore besoin de brancher le four et les amortisseurs), je vais chercher un moyen d’utiliser les entrées analogiques disponibles (j’ai A0 à A3 disponible, A4 et A5 étant connectés au CCF) d’accepter l’entrée du bouton. Jolie quckly que j’ai trouver quelque chose qui est très prometteur - un tutoriel sur la façon d’accepter l’entrée de plusieurs boutons via un entrée analogique unique. Payer la saleté. C’est parfait, et tout ce qu’il exige, c’est quelques résistances supplémentaires. Aucun problème quel que soit. Nous allons aller au câblage.
(Voir ce tutoriel pour une partir du tutoriel de bouche de chevaux sur comment ça marche)
Le câblage pour c’est super simple. Courir un fil dans la broche analogique de votre choix (mon programme lit dans broches A0) et qui se connecter sur le côté du tableau bouton. L’autre côté du tableau bouton est reliée à la terre. A partir de là, les touches sont simplement chaînées ensemble via un réseau de résistance. Un fil supplémentaire est ajouté de chaque bouton sur la broche d’entrée analogique, donc chaque bouton possède un chemin direct vers l’analogique épingle (voir schéma).
En prenant les pièces pertinentes du code du didacticiel et modifiez-le pour nos propres besoins, nous obtenons ce qui suit :
/ * 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 * / #include //This est une bibliothèque nécessaire pour le LCD affichage #include //This est une bibliothèque nécessaire pour le thermomètre lectures #include //This est une bibliothèque de température #include #include « RTClib.h » / / connexions: / / 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 ; isOverrideHeld booléen = false ; 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 ; const int furnacePin = 1 ; int zoneCounter = 0 ; int a = 0 ; 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 (contre-jour, sortie) ; 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(3000) ; //DELAY actuellement définie à 10 secondes. AJUSTER au besoin //DATE/TIME logique enregistrera ("TIME", « Boucle ouverte à » + getDateAndTime()) ; Sensors.requestTemperatures() de température logique ; zone1Temp = getTemperature(zone1Therm) ; zone2Temp = getTemperature(zone2Therm) ; zone3Temp = getTemperature(zone3Therm) ; logTemperatureData() ; getScreenOutput() ; z1Check = checkZoneTemp(zone1Temp) ; z2Check = checkZoneTemp(zone2Temp) ; z3Check = checkZoneTemp(zone3Temp) ; Si (z1Check || z2Check || z3Check) {startFurnace();} else {stopFurnace();} si (z1Check & & furnaceState) {closeDamper(1);} else {openDamper(1);} si (z2Check & & furnaceState) {closeDamper(2);} else {openDamper(2);} si (z3Check & & furnaceState) {closeDamper(3);} else {openDamper(3);} un = analogRead(0) ; CES NUMÉROS CHANGENT SELON VOS RÉSISTANCES. if(a < 20) {//This signifie température jusqu'à isOverridden = true;} si (un < 30 & & a > 20) {//This signifie température down. isOverridden = true;} si (un 45 < & & a > 30) {//This est un cabillot pour cale/exécuter si (thermState == "hold") {thermState = "run"; isOverridden = false;} autre {thermState = "hold"; isOverridden = true;} isOverridden = true;} si (un < 60 & & a > 45) {//DO j’ai besoin d’un quatrième bouton?}} 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 getScreenOutput() {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());}} int getTargetTemperature() {int mode = getMode() ; DateTime maintenant = RTC.now() ; date de l’int = now.dayOfWeek() ; valeurs d’int = {0} ; log (« info », date (String)) ; valeurs = PROGRAMMED_VALUES [date] ; Journal (« info », "obtenir 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() {int mode = getMode() ; switch (mode) {case 0: retourner « Wake »; case 1: return « Away »; case 2: retourner « Home »; case 3: return « Sleep »; 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 (heure > = 15 & & heure < 21) {return 2;}} 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 == damper1Pin || amortisseur == damper2Pin || amortisseur == damper3Pin) {/ / digitalWrite (amortisseur, HIGH); / /} else {/ / log ("problème clapet d’ouverture. Amortisseur introuvable. S’attendait à 1, 2 ou 3. A obtenu "+ amortisseur) ; }} void closeDamper (int amortisseur) {/ / si (amortisseur == damper1Pin || amortisseur == damper2Pin || amortisseur == damper3Pin) {/ / digitalWrite (amortisseur, faible); / /} else {/ / log ("problème clapet de fermeture. Amortisseur introuvable. S’attendait à 1, 2 ou 3. A obtenu "+ amortisseur) ; //function}} pour l’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);}}