Arduino Powered 3-zone termostat (9 / 10 steg)

Steg 9: Göra knapparna göra något.

Varje knapp har tilldelas en funktion eller syfte. I vårt fall, den första och andra knappen är för att öka eller minska knapparna respektive, och den tredje knappen är för växling mellan kör eller håll läge. Jag har bifogat en fjärde knapp, men jag vet inte om det behövs. För nu jag lämnar det i, men vi får se.

Den Final koden:

För att detta Instructable är detta den sista koden

/*
/*
Detta är det program som jag kommer att använda till kontroll den
ugnen. Konceptet är detta: Jag har 3 zoner jag kommer att följa.
Varje zon kommer att ha minst en zon spjäll som kommer att
kontrolleras av arduino ansökan.
Varje zon har en enda termometer som kommer att rapportera
tillbaka till registeransvarige. Beroende på den termometer behandlingen och
termostatinställningen, dämparna kommer att öppna eller stänga och den
centrala ugnen kommer att vara påslagen. En gång en godtagbar temperatur
har uppnåtts i alla zoner, ugnen stängs av.

Utöver de allmänna uppvärmning cykler, kommer systemet att
programmerbar. Vid denna tid, dock kommer programcykeln att hanteras här, inte via termostaten.

VIKTIGT TESTFALL: (som ska läggas till som jag tänker på dem / kommit över dem.

* Måste se till att ugnen är alltid off om alla 3 spjäll är stängda.
* stötdämpare ska vara öppen om de inte uttryckligen behöver stängas.
* om systemet är inställt på "hold", alla zoner är inställda på att öppna och programplaneringen körs inte.
* om systemet är åsidosatta men inte höll, avbryts åsidosättningen när nästa inprogrammerade intervall kommer upp
* kan endast omställning till uttrycklig övre och nedre gränser.
*/

#include < LiquidCrystal.h > //This är ett bibliotek som behövs för LCD-skärmen
#include < OneWire.h > //This är ett bibliotek som behövs för avläsningarna som termometer
#include < DallasTemperature.h > //This är en temperatur bibliotek
#include < Wire.h >
#include "RTClib.h"

Anslutningar:
rs (LCD stift 4) till Arduino stift 12
RW (LCD pin 5) till Arduino stift 11
Aktivera (LCD stift 6) till Arduino stift 10
LCD stift 15 till Arduino stift 13
LCD stift d4, d5, d6 och d7 till Arduino stift 5, 4, 3, 2
LiquidCrystal lcd (12, 11, 10, 5, 4, 3, 2);

byte deg [8] = {
B01000,
B10100,
B01000,
B00111,
B00100,
B00110,
B00100,
B00100
};
CONST int bakgrundsbelysning = 13. kontroller bakgrundsbelysning

#define THERM_BUS 6 / / alla temperaturavläsningar kommer via detta enda stift.

OneWire oneWire(THERM_BUS);
DallasTemperature sensorer (& oneWire);

DeviceAddress zone1Therm = {
0x28, 0x48, 0x39, 0x11, 0x04, 0x00, 0x00, 0x94};
DeviceAddress zone2Therm = {
0x28, 0xF2, 0x1F, 0x11, 0x04, 0x00, 0x00, 0x38};
DeviceAddress zone3Therm = {
0x28, 0xBA, 0xF3, 0x10, 0x04, 0x00, 0x00, 0x98};

RTC_DS1307 RTC;

BÖRJA PROGRAMMERA
Tiderna är 6 AM, 8 AM, 3: 00 och 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};
SLUTET PROGRAMMERING

flyta zone1Temp = 0;
flyta zone2Temp = 0;
flyta zone3Temp = 0;
booleska z1Check = 0;
booleska z2Check = 0;
booleska z3Check = 0;
booleska isOverridden = false;
booleska furnaceState = false; med furnaceState, true false betyder att det är för närvarande avstängd, innebär dess närvarande.
String thermState = "kör";
int overrideValue = 0;
int currentMode = 0;

CONST int furnacePin = 7.
int zoneCounter = 0;
int en = 0;
int loopCounter = 0;
int z1Pin = 8;
int z2Pin = 9;
int z3Pin = 13. rensnings bakgrundsbelysning pin för z3
void setup() {
Serial.BEGIN(57600); Detta ansluter arduino till datorn
TEMPERATUR SENSOR SETUP
sensors.BEGIN();
sensors.setResolution (zone1Therm, 10);
lcd.createChar (0, deg);
RTC SETUP.
Wire.BEGIN();
RTC.begin();
IF (!. RTC.isrunning()) {
log ("Fel", "RTC körs inte!");
RTC.adjust (DateTime (__DATE__, __TIME__)); DETTA MÅSTE BARA VARA OKOMMENTERADE OM DU STÄLLER IN DIN RTC FÖR FÖRSTA GÅNGEN! NÄR DEN ÄR INSTÄLLD, MÅSTE DETTA INAKTIVERAS!
}

SETUP UTGÅNGAR
pinMode (furnacePin, produktionen);
pinMode (z1Pin, produktionen);
pinMode (z2Pin, produktionen);
pinMode (z3Pin, produktionen);
så småningom passar bakgrundsbelysning kontroll tillbaka till arduino. För nu ska vi bara ställa in den till konstant.
digitalWrite (bakgrundsbelysning, hög);

SETUP INGÅNGAR
pinMode (A0, INPUT_PULLUP);
STÄLLA IN VECKOPROGRAMMET
PROGRAMMED_VALUES [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;
}

Detta går en kontinuerlig slinga
void loop() {
Delay(100); DRÖJSMÅL INSTÄLLT TILL 1 SEKUNDER. KOMMER ATT JUSTERA EFTER BEHOV
DATUM/TID LOGIK
om (loopCounter % 2 == 0) {
log ("TIME", "Loop initieras på" + getDateAndTime());
// }
TEMPERATUREN LOGIK
logTemperatureData();
om (loopCounter % 30 == 0) {
log ("info", loopCounter (sträng));
förändringar utgång var 3 sekunder
outputToScreen();
}

Följande tillåter oss att bara kontrollera ugnen var 60 sekunder medan du läser knappen förändringarna i effektiv realtime
om (loopCounter % 60 == 0) {
log ("info", loopCounter (sträng));
sensors.requestTemperatures();
zone1Temp = getTemperature(zone1Therm);
zone2Temp = getTemperature(zone2Therm);
zone3Temp = getTemperature(zone3Therm);
z1Check = checkZoneTemp(zone1Temp);
z2Check = checkZoneTemp(zone2Temp);
z3Check = checkZoneTemp(zone3Temp);
loopCounter = 0;
om (z1Check || z2Check || z3Check) {
startFurnace();
} annat {
stopFurnace();
}
om (z1Check & & furnaceState) {
closeDamper(z1Pin);
} annat {
openDamper(z1Pin);
}
om (z2Check & & furnaceState) {
closeDamper(z2Pin);
} annat {
openDamper(z2Pin);
}
om (z3Check & & furnaceState) {
closeDamper(z3Pin);
} annat {
openDamper(z3Pin);
}
}
en = analogRead(0);
DESSA SIFFROR ÄNDRAS BEROENDE PÅ DIN MOTSTÅND.
int targetTemp = getProgrammedTargetTemperature();
IF(a < 20) {
Detta innebär att temperaturen upp.
isOverridden = sant;
om (overrideValue! = targetTemp & & overrideValue! = 0) {
overrideValue ++;
} annat {
overrideValue = targetTemp + 1.
}
om (overrideValue > 80) {
overrideValue = 80.
}
log ("info", "temperatur upp till" + overrideValue (sträng));
loopCounter = -1; DETTA ÅTERSTÄLLER RÄKNAREN LOOP, VILKET BETYDER ATT ALLT KOMMER ATT KÖRAS IGEN
}
om (en < 30 & & a > 20) {
Detta innebär att temperaturen ner.
isOverridden = sant;
om (overrideValue! = targetTemp & & overrideValue > 0) {
overrideValue--;
} annat {
overrideValue = targetTemp - 1;
}
om (overrideValue < 50) {
overrideValue = 50;
}
log ("info", "temperatur ner till" + overrideValue (sträng));
loopCounter = -1; DETTA ÅTERSTÄLLER RÄKNAREN LOOP, VILKET BETYDER ATT ALLT KOMMER ATT KÖRAS IGEN
}
om (en < 45 & & a > 30) {
Detta är ett växlingsobjekt för hold/run
om (thermState == "hold") {
thermState = "kör";
isOverridden = false;
log ("info", "ställa in thermState att köra");
} annat {
thermState = "Håll";
isOverridden = sant;
log ("info", "ställa in thermState att hålla");
}
isOverridden = sant;
loopCounter = -1; DETTA ÅTERSTÄLLER RÄKNAREN LOOP, VILKET BETYDER ATT ALLT KOMMER ATT KÖRAS IGEN
}
om (en < 60 & & a > 45) {
JAG BEHÖVER EN FJÄRDE KNAPPEN?
}
loopCounter ++;
}
booleska checkZoneTemp (int temperatur) {
int temp = getTargetTemperature();
IF(temperature > Temp) {
returnera false;
}
return true;
}
void logTemperatureData() {
log ("Zone1Temp", (String)(int)zone1Temp);
log ("Zone2Temp", (String)(int)zone2Temp);
log ("Zone3Temp", (String)(int)zone3Temp);
}
void outputToScreen() {
zoneCounter ++;
IF(zoneCounter == 1) {
Sträng val = "Zone1:" + (sträng) (int) zone1Temp;
val += "(" + (String)getTargetTemperature();
val += (sträng) ")";
toScreen (val, "läge:" + getModeString());
}
annat if (zoneCounter == 2) {
Sträng val = "zon†2:" + (sträng) (int) zone2Temp;
val += "(" + (String)getTargetTemperature();
val += (sträng) ")";
toScreen (val, "ugnen:" + getFurnaceState());
}
annat {
zoneCounter = 0;
Sträng val = "3:" + (sträng) (int) zone3Temp;
val += "(" + (String)getTargetTemperature();
val += (sträng) ")";
toScreen (val, "Open:" + getActiveZonesForScreen());
}
}
void checkMode() {
int läge = getMode();
om (läge! = currentMode) {
currentMode = läge;
IF(isOverridden) {
om (thermState == "kör") {
Denna logik helt enkelt välter Åsidosätt värdet och återupptas programmet om thermstate inte hålls. Annars används overrideValue.
isOverridden = false;
}
}
}
}
int getTargetTemperature() {
checkMode();
IF(isOverridden) {
återvända overrideValue;
} annat {
återvända getProgrammedTargetTemperature();
}
}
int getProgrammedTargetTemperature() {
int läge = getMode();
DateTime nu = RTC.now();
int datum = now.dayOfWeek();
int-värden = {0};
värden = PROGRAMMED_VALUES [datum];
log ("info", "att få programmerade mål temp:" + (String)values[mode]);
returnera värden [mode];
}
Sträng getActiveZonesForScreen() {
Sträng retVal = "";
om (z1Check & &! furnaceState) {
retVal += "1";
}
om (z2Check & &! furnaceState) {
retVal += "2";
}
om (z3Check & &! furnaceState) {
retVal += "3".
}
IF(retVal.length() == 0) {
retVal += "Ingen";
}
returnera retVal;
}

Sträng getFurnaceState() {
IF(furnaceState) {
returnera "På";
}
annat {
returnera "Off";
}
}
Sträng getModeString() {
IF(isOverridden) {
om (thermState == "kör") {
returnera "Override";
} annat {
returnera "HOLD";
}
}
int läge = getMode();
Växla (läge) {
fall 0:
returnera "Vakna";
fall 1:
returnera "Away";
fall 2:
återvända "Hem";
fall 3:
returnera "Sova";
fall -1:
"fel";
standard:
returnera "N/A";
}
}
int getMode() {
DateTime nu = RTC.now();
int timme = now.hour();
om (timme < 6 || timme > = 21) {
returnera 3.
}
om (timme > = 6 & & timme < 8) {
Return 0;
}
om (timme > = 8 & & timme < 15) {
tillbaka 1.
}
om (timme > = 15 & & timme < 21) {
returnera 2.
}
återvända -1;
}
flyta getTemperature(DeviceAddress deviceAddress) {
flyta tempC = sensors.getTempC(deviceAddress);
Serial.println(tempC);
om (tempC ==-127) {
Serial.println ("fel få temperatur.");
}
återvända DallasTemperature::toFahrenheit(tempC);
}
bekvämlighet funktion. Hanterar alla standardtext för att skriva till LCDScreen
void toScreen (sträng line1Value, sträng line2Value) {
LCD.BEGIN(16,2);
LCD.Clear();
lcd.setCursor(0,0);
LCD.Print(line1Value);
lcd.setCursor(0,1);
LCD.Print(line2Value);
}

Sträng getDateAndTime() {
DateTime nu = RTC.now();
Return String(now.year()) + "/" + String(now.month()) + "/" + String(now.day()) + "" + String(now.hour()) + ":" + String(now.minute()) + ":" + String(now.second());
}
void openDamper (int spjäll) {
om (spjäll == z1Pin || spjäll == z2Pin || spjäll == z3Pin) {
digitalWrite (spjäll, hög);
log ("info", "Öppna spjället" + dämpare);
} annat {
log ("fel", "Problem öppna spjället. Spjället hittades inte. Väntade 1, 2 eller 3. Fick "+ dämpare);
}
}
void closeDamper (int spjäll) {
om (spjäll == z1Pin || spjäll == z2Pin || spjäll == z3Pin) {
digitalWrite (spjäll, låg);
log ("info", "Stänga spjället" + dämpare);
} annat {
log ("fel", "Problem stänger spjället. Spjället hittades inte. Väntade 1, 2 eller 3. Fick "+ dämpare);
}
}

funktion för loggningsmeddelanden till konsolen.
Så småningom tänker skriva till loggfilen på RPi
Tom log (sträng kod, sträng meddelande) {
Serial.println (kod + ":" + meddelande);
}
void recordData (String typ, String objekt, strängvärde) {
TODO - utgång till RPi databas
}
void startFurnace() {
Lämplig signal till ugnen att starta upp
IF(!furnaceState) {
furnaceState =! furnaceState;
log ("INFO", "Starta ugnen");
digitalWrite (furnacePin, hög);
}
}
void stopFurnace() {
Lämplig signal till ugnen att stoppa
IF(furnaceState) {
furnaceState =! furnaceState;
log ("INFO", "Stoppa ugnen");
digitalWrite (furnacePin, låg);
}
}

Se Steg
Relaterade Ämnen

Ett trådlöst kontrollerade, Arduino-Powered anslagstavla

bygga själv en trådlöst styrd, Arduino-powered anslagstavla!Här är ett enkelt projekt som skapar en trådlöst programmerbart anslagstavla. XBee moduler använder för att ge en trådlös seriell länk mellan datorn och enheten. Du interagerar med den via e...

Arduino-Powered binära termometer

jag nyligen förvärvat en Arduino Uno och letade efter en cool "komma igång" projekt. Jag beslöt att göra en termometer, som satsen har jag haft alla nödvändiga delar (termistor, sladdar, motstånd, lysdioder). Genom ett par iterationer, jag äntli...

Arduino Powered infraröd sak

Hej, detta är min första instructible. Jag kommer att visa dig hur man gör en arduino powered analog sensor läsare (jag kommer att använda en infraröd fotodiod).Steg 1: delar Du behöver flera saker att göra detta:1. någon form av fallet eller låda2....

Arduino Powered uppvärmd handske Liners

Arduino Powered uppvärmda handskarDetta projekt är om hur att göra världens smartaste uppvärmd handske liners för extremt kalla förhållanden som de i Minnesota eller människor som har Raynauds syndrome(like me). Dessa handskar kommer förses du med ti...

Arduino-powered LED klocka

En rolig, enkel LED-klocka, som ger dig tiden till den närmaste halvtimmen med hjälp av enfärgade lysdioder. Delar som behövs är följande:Arduino Nano400 tie-punkt skärbrädaBandkabelDS1307 RTC IC32.768 kHz Crystal(12) 10mm lysdioder(12) 180 Ohm motst...

Arduino powered Halloween pumpa med rörelsedetektor

Hejdetta Instructable visar dig hur man gör några Halloween dekorationer inklusive arduino powered Halloween pumpa med rörelsedetektor.Steg 1: Göra Halloween pumpa Material:Rund ballongGamla tidningarSmidig mjölVattenTemperaModellering leraSuperlimVe...

Acrylic fisk Tank med Arduino-Powered mataren

Har du någonsin velat ett mer händer på känsla när får en fisk? Eller ville ha något annat än de genomsnittliga akvarier finns i butiker? Denna fisk tank är helt anpassad och kan ändras för att passa din storlek behov och har en Arduino powered feede...

Arduino Powered RGB LED Vodka hylla

detta instructable kommer du igång att göra ditt eget arduino powered röd grön och blå LED-projekt. Det behöver inte ens vara en hylla! Vodka flaskor råkar bara lysa upp fint så det är vad jag valde att göra.I detta projekt använder vi varje stift på...

Att göra en Arduino Powered gardin Automation

I den här videon börja jag arbeta på visar dig hur man gör en Arduino Powered enhet som kommer att öppna och stänga gardiner!Med hjälp av några rep och en kontinuerlig rotation servo jag kan skapa en trissa system som fungerar som stamnät till rörels...

3 kanal arduino Powered Christmas Light Controller!

För julen i år, jag ville göra ett riktigt häftigt projekt men inte riktigt vet vad man ska göra. Som jag fick julen ljus ut att dekorera, var det en gammal trasig Christmas light timer. Jag tog isär och tittade på lågspänning kretsen. Innan detta ha...

Solar-orienterade, Arduino-Powered klockan

detta är en klocka för att hålla exakt tid (oberoende av atom eller GPS), Visa lokala soluppgång, solnedgång och solar, och även justera sig för sommartid.Jag ville ha klockan för att vara lätt att använda och vara flexibel. Funktionerna som inställn...

Arduino Powered raket styrsystemet

detta är min första Instructable så bär med mig.Detta är en Arduino Powered raket vägledning System. Jag skickade in detta för Google Global Science Fair. Min science projekt är på https://sites.google.com/site/arduinorocket/ . Det tog mig tre månade...

Arduino Powered Gainclone (förstärkare)

för er som inte vet (och jag inte förrän nyligen), en Gainclone är en förstärkare som är en klon av den ursprungliga utformningen av en förstärkare av 47 Labs kallas en Gaincard och är baserade på enkel flisa förstärkare av National Semiconductor - n...

Arduino powered RC tank

detta är min första instructable så snälla ha tålamod med mig. Mitt namn är Stanley Deakins och jag har spelat med elektronik ganska länge, men det var år sedan. På grund av min senaste anställning har jag återuppväcka denna passion. Jag har fått min...

Nattliga utsläpp: Min Arduino Powered Internet aktiverat dröm Generator

måste vi alla drömmer mer så jag har skapat denna Arduino Powered "dream generator" för att plantera frön för några stora tänkande galenskap. När du närmar dig generatorn en Maxbotix ultrasonic sensor utlöser ljus och musik som drar du i så du k...

Arduino Powered RGB humör lampa plus Simon

detta är grunden en arduino powered RGB humör lampa plus simon says spel, två i ett.Hur man använder: Enheten börjar med RGB humör lampa standardprogram, när du trycker på någon av de fyra knapparna längst ner, säger Simon spelet startar. När du tryc...

Hur man bygger en Arduino Powered Chess spela Robot

att döma av det stora antalet schack relaterade Instructables, jag tycker det är säkert att säga gemenskapen åtnjuter spelet. Det kan dock vara svårt, att hitta någon som spelar på samma nivå som du gör. Att lösa detta dilemma, och att öka min spela...

Arduino-Powered fyra bokstäver Word Generator

bygga en Arduino-drivna versionen av de "fyra bokstäver Word Generator" (FLW). Denna version genererar "ord" i farten - det använder inte en lista. Den "ursprungliga" versionen från 1970-talet använde B7971 nixie alfanumerisk...

Arduino-Powered pumpa

denna Halloween projektet använder en Arduino med en rörelsesensor och en massa lysdioder för att hälsa gästerna utanför dörren.Steg 1: Programmera Arduino och koppla in den Koden för detta är baserad på ett exempel från Tom Igoe att göra saker Talk....