Stap 8: De thermostaat schets
Vereiste bibliotheken
De schets van de Arduino is aangesloten. U moet de volgende libraries geinstalleerd om te compileren en gebruiken:
- Privacy - gebruikt om te lezen de digitale waterbestendige Thermometer IP65
- LiquidCrystal_I2C - gebruikt voor de seriële LCD
Ik beveel het bouwen van een klein circuit en schetsen om te testen van elk onderdeel vóór de bouw van het grotere circuit, enkel voor het geval er iets veranderd en u een andere bibliotheek moet.
De Sketch-bestand
Als u wenst te gebruiken mijn schets als-is, het is aangesloten op deze stap als Thermostat.ino. Als u mijn circuit hebt gevolgd, moet het zonder veranderingen werken met uw Arduino Uno (of klonen).
Hoe het werkt...
De thermostaat is vrij eenvoudig, en niet in tegenstelling tot de thermostaat kunt u controle van de temperatuur in uw huis. De LCD geeft de huidige watertemperatuur in Fahrenheit en Celsius op de eerste regel, en de huidige instelling op de tweede regel. Wanneer de watertemperatuur hoger dan de instelling is, de pomp en chiller zijn ingeschakeld. Wanneer de temperatuur 1,75 F ° onder de instelling daalt, zal de chiller, pomp en fans alle afsluiten totdat de temperatuur weer boven de instelling stijgt.
Input Lockout
Vanwege de moeilijke op het krijgen van een schoon signaal uit de Arduino Interrupt-pinnen (misschien is dit is een probleem met mijn oude overdreven gebruikte Arduino Uno? Of misschien is het vanwege het lawaai van de rest van het circuit), ik heb een "Instelling Lock"-functie toegevoegd. Om te veranderen van de thermostaat de instelling die u moeten ingedrukt houden zowel de UP en DOWN knoppen gedurende 1 seconde. Wanneer dit is vastgesteld, het LCD-scherm verschijnt het bericht "---UNLOCKED---" op de bovenste regel en "Voer Temp:" op de tweede regel voor 3/4 van een seconde. Hoewel ontgrendeld, kan de knoppen omhoog en omlaag te verhogen of verlagen van de instelling van de thermostaat worden gebruikt. Als geen toetsen zijn ingedrukt gedurende 10 seconden, is de input vergrendeling hersteld. Als beide knoppen ingedrukt en overgedaan gelijktijdig voor 1 seconde de vergrendeling is ook hersteld, maar wees gewaarschuwd dat het moeilijk zijn kan om druk op beide knoppen tegelijkertijd zonder stuitert waardoor de temperatuur instelt op vergroten of verkleinen door één of twee. Voor die reden die u wilt mogelijk liever gewoon laat het systeem opnieuw te vergrendelen op eigen door verlaten de knoppen onaangeroerd gedurende 10 seconden.
Het lezen van de temperatuur
Gelieve te lezen via de schets voor alle details over hoe de code werkt. Ik zal hier alleen gedeelten van het markeren. In het bijzonder de TemperatureModule klasse maakt gebruik van de bibliotheek van de privacy 2 om te lezen van de temperatuur van de DS18B20 in de IP65 digitale waterdichte temperatuur sonde. De klasse TemperatureModule is gebaseerd op code in de DS18x20_Temperature, privacy 2 voorbeeld schets. Het biedt slechts twee methoden: Initialize() en ReadTemperatureF(). Initialize() moet worden aangeroepen voordat ReadTemperatureF wordt aangeroepen voor de eerste keer. ReadTemperatureF geeft de temperatuur in Fahrenheit en zal vervullen in een doorgegeven variabele met de temperatuur in Celsius. Een exemplaar van TemperatureModule wordt verklaard op lijn 171 van de schets, na de definitie van de klasse:
U zult opmerken ook g_lcd op lijn 172 - een exemplaar van LiquidCrystal_I2C. Beide van deze globale objecten maken gebruik van macro's die zijn gedefinieerd boven in het bestand. Deze macro's worden ook elke PIN van de Arduino gebruikt door de schets definiëren:
Setup
Regels 1 tot en met 3 bevatten de bibliotheken die worden gebruikt door deze schets. Op regel 3 ziet u het opnemen van EEPROM.h. Dit zal worden gebruikt tijdens setup, en nadat de instelling van de thermostaat wordt aangepast om op te slaan van de temperatuur in de Arduino de EEPROM zodat het is onthouden over het opnieuw instellen van macht. De temperatuur wordt opgeslagen als één byte en toegestaan temperatuur instellingen gaan vanaf 35° c tot 85° F. Dit lijkt een redelijk bereik voor onze doeleinden en met behulp van één byte de waarde op te slaan de dingen zijn vereenvoudigd.
De Setup-functie van de schets zal eerst een paar globale variabelen gebruikt om te debounce onze switches drukknop instellen. Nadat dit is zal de pens-modus voor elke pin ingesteld gebruiken we (lijnen 255 via 260):
Lijn 261, wij Stel op de Chiller aan de Off staat en op regel 263 via 269 de temperatuur instelling is lezen van de EEPROM en tot 56° F als de huidige waarde buiten het bereik valt. Lijnen 271 via 273 initialiseren I2C LCD-bibliotheek en omdat het duurt ongeveer een seconde voor het initialiseren van de TemperatureModule, de mededeling "Initialiseren..." op het LCD-scherm verschijnt totdat de temperatuursensor is gedetecteerd (lijnen 278 via 280). Een extra 1 seconde wachten wordt gedwongen op lijn 281--dit lijkt te worden verlangd door de privacy-bibliotheek voor het goed lezen van de temperatuursensor.
Met alles anders geïnitialiseerd we Interrupt 0 hechten aan de functie BumpSettingsUp op lijn 283, onderbreken van 1 tot en met BumpSettingsDown op lijn 284 en inschakelen interrupts (lijn 285).
De functies BumpSettingsUp en BumpSettingsDown controleren om te zien als de input is vergrendeld. Als het niet is, zal ze vergroten of verkleinen van de g_uiTemperatureSetting, zolang de interrupt (veroorzaakt door een push) voldoet aan de eisen van de tijd niet kwalificeren als een schakelaar bounce. Deze twee functies zorgen ook de instelling blijft tussen 35 en 85 graden.
Hier niet getoond, is BumpSettingsDown() die identiek aan BumpSettingsUp, is behalve dat het de waarde in g_uiTemperatureSettings daalt. Er zijn ook een paar andere functies gebruikt als helpers zoals OutputLCDLine() die een tekenreeks wordt weergegeven op de regel een of twee van de LCD. De functie TurnCoolingOnOrOff hieronder wordt gebruikt om in te stellen van alle 4 Relais naar de positie ON of OFF en naar record of dingen ON zijn of OFF in g_bCooling:
De functie ToggleInputMode wordt aangeroepen wanneer beide knoppen zijn ingedrukt gedurende één seconde of na 10 seconden geen toetsen worden ingedrukt terwijl input ontgrendeld wordt. Zoals u het zien kunt registreert een nieuwe instelling in de EEPROM-sleuf 0:
Deze dubbel-knooppers controle wordt gedaan door de helper functie CheckLockUnlock():
Dit alles leidt tot de hoofdlus:
In deze eerste helft is er een controle om te zien als de gebruiker is het ontsluiten van input. Als 10 seconden is verstreken sinds een knop heeft ingedrukt, terwijl input is ontgrendeld, kan de code op lijnen 373 via 379 zal ervoor zorgen dat de vergrendeling is hersteld.
Op regel 383 de huidige instelling van de thermostaat op de tweede regel van het LCD-scherm wordt weergegeven, en op lijn 387 de huidige temperatuur is lezen van de thermometer. Het wordt weergegeven op de eerste regel van het LCD, op regel 397. Omdat de instelling van de thermostaat is geconverteerd naar een float op regel 385 kan een eenvoudige vergelijking worden gedaan om te zien of de Chiller moet worden ingeschakeld:
Als de huidige temperatuur hoger dan de instelling van de thermostaat is de Chiller altijd aanstaat (lijn 406). Anders controleren we om te zien of de temperatuur 1,75 graden onder de instelling is, en zo ja de Chiller is uitgeschakeld.
Op lijn 418 per één seconde vertraging optreedt om tijd voor de thermometer correct opnieuw worden ingelezen en de lus opnieuw is ingevoerd.