Arduino Powered 3-zone termostat (3 / 10 steg)
Steg 3: Dra programmet tillsammans
Det första steget i att göra programmet faktiskt fungera var att få temp sensorer arbetar. De är kärnan i termostaten, och utan dem, ugnen vet inte när du ska aktivera eller inaktivera.
Dags att införa ett par bibliotek.
Temperaturgivaren är ganska cool eftersom det använder en enda tråd för att skicka data tillbaka till Arduino. Dessutom, har varje sensor en adress, ett unikt nummer som identifierar sensorn. Detta är riktigt spännande eftersom det innebär att du kan ha flera sensorer skickar sina ingångar till samma pin på Arduino (en stor sak när du börjar titta på vad som krävs för att koppla in 16 x 2 LCD-skärmen. PIN utrymme är knapp!).
För att göra detta, kommer vi att ringa på några bibliotek som redan finns - utan att behöva uppfinna hjulet på nytt. De två biblioteken är OneWire och DallasTemperature. Båda är fritt tillgängliga och kommer komma till nytta när vi går vidare. Att vara obekanta med något av dessa bibliotek, jag igen avses interwebs och hittade en ganska intressant tutorial på just denna sak. Allt jag behövde göra var att modifiera den för att passa mina behov.
I går igenom den hacktronics läraren, nämndes det att DS18B20 Temp sensorerna är adresserbara - det vill säga, att de representeras av en specifik adress. Detta är vad tillåter flera sensorer att rida in i Arduino på samma stift. Så när vi går framåt, måste vi hitta adresserna temperatur sensor. Hacktronics erbjuder en annan handledning som beskriver hur man hittar dessa adresser, också.
OneWire bibliotek
DallasTemperature bibliotek
Code hittills: (en hel del grejer är kommenterade ut eftersom det finns fortfarande en hel del antaganden och okända, men det tycker jag är hur koden kommer så småningom att spela ut. Vi får se)
/*
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.
*/
#include //This är ett bibliotek som behövs för LCD-skärmen
#include //This är ett bibliotek som behövs för avläsningarna som termometer
#include //This är en temperatur bibliotek
#include
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);
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};
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, 67, 60};
int SATURDAY_VALUES [4] = {67 67, 67, 60};
SLUTET PROGRAMMERING
flyta zone1Temp = 0;
flyta zone2Temp = 0;
flyta zone3Temp = 0;
booleska isOverrideHeld = false;
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.
int overrideValue = 0;
CONST int furnacePin = 1;
void setup() {
Serial.BEGIN(9600); Detta ansluter arduino till RPi
sensors.BEGIN();
sensors.setResolution (zone1Therm, 10);
SETUP UTGÅNGAR
pinMode (furnacePin, produktionen);
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(1000);
log ("000", "Att få temperatur");
sensors.requestTemperatures();
zone1Temp = getTemperature(zone1Therm);
log ("001", (String)(int)zone1Temp);
om (c1 || c2 || c3) {
IF(!furnaceState) {
startFurnace();
// }
TODO - BESTÄMMA RÄTT STIFT FÖR DÄMPARNA. BLIR DÄMPARNA DIGITAL ELLER ANALOG?
IF(C1) {
openDamper(1);
// }
IF(C2) {
openDamper(2);
// }
IF(C3) {
openDamper(3);
// }
// }
annat {
IF(furnaceState) {
stopFurnace();
// }
// }
IF(!C1) {
closeDamper(damper1Pin);
// }
IF(!C2) {
closeDamper(damper2Pin);
// }
IF(!C3) {
closeDamper(damper3Pin);
// }
}
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);
}
int getTime() {
återvända -1;
}
void openDamper (int spjäll) {
om (spjäll == damper1Pin || spjäll == damper2Pin || spjäll == damper3Pin) {
digitalWrite (spjäll, hög);
} annat {
log ("Problem med att öppna spjället. Spjället hittades inte. Väntade 1, 2 eller 3. Fick "+ dämpare);
// }
}
void closeDamper (int spjäll) {
om (spjäll == damper1Pin || spjäll == damper2Pin || spjäll == damper3Pin) {
digitalWrite (spjäll, låg);
} annat {
log ("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
om (furnaceState! = 0) {
digitalWrite (furnacePin, hög);
}
}
void stopFurnace() {
Lämplig signal till ugnen att stoppa
IF(furnaceState == 1) {
digitalWrite (furnacePin, låg);
}
}