Étape 7: Ajouter à l’écran LCD
Alors avec notre horloge et nos capteurs de température de travail, Let's get une sortie vers le contrôleur LCD.
La première partie du présent consiste à déterminer ce que je veux lui dire. L’espace est quelque peu limitée, étant donné que je n’ai qu’un total de 32 caractères sur 2 lignes, donc la première question que je devais répondre était comment afficher tout ce dont j’ai besoin d’afficher au sein de ces 32 caractères.
Voici mon dernier afficheurs LCD :
Zone1: ()
Mode :
Zone2 : ()
Four :
Zone3 : ()
Ouvert : < 1,2,3 / NONE >
où T1 est la température pour la zone 1, TT est la température cible, MODE est le mode actuel il est en cours d’exécution (AWAKE, AWAY, domicile, sommeil, OVERRIDE ou HOLD.
Ouvert veut dire que des zones sont actuellement ouverte et récepteur de chaleur (si le four est en cours d’exécution).
C’était en fait assez simple. J’ai certains pensant pour faire dans la mesure où un symbole personnalisé est concerné, mais c’est assez loin vers le bas sur ma liste de priorité.
< Tt >< tt >< tt > / * 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. * / #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"/ / 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 aux broches de l’Arduino 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. int overrideValue = 0 ; const int furnacePin = 1 ; int zoneCounter = 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) ; 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);}} 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";} si (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) ; stopFurnace() Sub}} {//Send signal approprié dans le four pour arrêter if(furnaceState) {furnaceState =! furnaceState ; log ("INFO", "Arrêt Four"); digitalWrite (furnacePin, LOW);}} < /tt >< /tt >< /tt >