Eco-dusch: Hur man kan skära din vattenräkning om du har en tonårig dotter (3 / 4 steg)
Steg 3: Kod:
Eco-dusch Arduino kod
Julian Arnott & James Arnott 2014
//
Vi använder DS18B20 temperaturgivare monteras på röret varmvatten för dusch för att utlösa en 20 minuters timer.
När timern har gjort sitt, växlar den reläer som Bryt strömmen till pumpen dusch.
Medan röret temperatur överstiger trigger temperaturen, kommer reläer bo växlade
//
Kunde lägga krukor så förälder kan justera växlingtemperaturen och dusch tid.
byta temperatur mellan 20 och 80 grader använder A0 (PIN-kod 23)
dusch tid mellan 5 och 40 minuter användning A1 (PIN-kod 24)
#include
#include
#define ONE_WIRE_BUS 3 / / Data kabeln är ansluten till stift 3 på Arduino
OneWire oneWire(ONE_WIRE_BUS); Setup en oneWire instans att kommunicera med någon OneWire enheter
DallasTemperature sensorer (& oneWire); Passera vår oneWire referens till Dallas temperatur.
Tilldela adresser till din 1-Wire temp givare.
Se tutorial om hur man får dessa adresser: http://www.hacktronics.com/Tutorials/arduino-1-wire-address-finder.html
DeviceAddress termometer = {0x28, 0x16, 0xA3, 0x84, 0x04, 0x00, 0x00, 0xC3};
float tempC;
int ledRED = 5; D5 PIN-koden för led1
int ledGREEN = 6; D6 PIN-koden för led2
int relay1 = 7. D7 PIN-koden för relay1
int relay2 = 8; D8 PIN-koden för relay2
int tempPot = 0; ansluta 10K A-Kona (linjär) temperatur potentiometern till Analog ingång A0
int timePot = 1; ansluta 10K A taper timer (linjär) potentiometern till Analog ingång A1
int temperature_set;
int temperature_read;
int time_set;
int time_read;
int hasBeenSet = 0;
int delaytimer = 0;
void setup(void)
{
analogReference(EXTERNAL); Berätta för Arduino att använda Aref PIN-koden för Analog spänning, (5v)
Serial.BEGIN(9600); Starta serieport
sensors.BEGIN(); Starta upp biblioteket
sensors.setResolution (termometer, 10); Ställ in upplösningen till 10 bit (bra nog?)
pinMode (ledRED, produktionen); Ange en röd led stift (5)
pinMode (ledGREEN, produktionen); Ange en grön led stift (6)
pinMode (relay1, produktionen); Ange ett relä stift (7)
pinMode (relay2, produktionen); Ange ett relä stift (8)
digitalWrite (ledRED, låg);
digitalWrite (ledGREEN, låg);
digitalWrite (relay1, låg);
digitalWrite (relay2, låg);
temperature_read = analogRead(tempPot);
temperature_set = karta (temperature_read, 0, 1023, 20, 80); min temp 20 grader C - max temp-80 grader
time_read = analogRead(timePot);
time_set = karta (time_read, 0, 1023, 5, 40); min tid 5 minuter - max tid 40 minuter
}
void loop(void)
{
få temperatur
Serial.println ("Start 6 sekunders fördröjning");
Delay(6000); 6 sekunder
Serial.Print ("komma temperature...\n\r");
sensors.requestTemperatures();
Serial.Print ("temperaturen är:");
printTemperature(Thermometer);
Observera att kontrollerna för reläet återförs. dvs: låg och hög är
Detta beror på att det är omvänd relay styrelse
Serial.Print ("temp-inställning:");
Serial.println(temperature_set);
Serial.Print ("tidsinställning:");
Serial.println(time_set);
om (tempC > temperature_set) {
Serial.println ("*** Temp över begränsad ***");
om (hasBeenSet < 1) {
Serial.println ("Start Välj fördröjn");
digitalWrite (ledGREEN, hög); grön led för att visa att timern håller på att starta
medan (delaytimer < time_set) {
Serial.Print ("försening timer:"); Serial.Print(delaytimer); Serial.Print ("time_set:"); Serial.println(time_set);
Delay(60000);
delaytimer = ++ delaytimer;
}
delaytimer = 0;
hasBeenSet = ++ hasBeenSet; vill inte börja förseningen igen - det kommer att ta evigheter för röret att kyla som det är
Serial.println ("tur relä på"); under normal drift drivs reläet inte, så slår på den kommer Bryt strömmen till pumpen
digitalWrite (relay1, hög);
digitalWrite (relay2, hög);
digitalWrite (ledRED, hög); röd led för att Visa vi har klippt makt att pumpen
digitalWrite (ledGREEN, låg); kan återställa gröna nu
}
} annat {
Serial.println ("*** Temp under begränsad ***");
tillbaka till normal drift
Aktivera relä nu
Serial.println ("tur relä off");
digitalWrite (relay1, låg);
digitalWrite (relay2, låg);
digitalWrite (ledRED, låg);
digitalWrite (ledGREEN, låg);
nu behöver kontrollera temperaturen igen och vänta tills det faller under tröskeln - så gå tillbaka till början
långsam nedkylning av vattnet i röret bör ge tillräcklig försening här (i praktiken när ingången är inställd på 40 grader, tar den pipe 23 minuter svalna)
börja hela processen om igen
hasBeenSet = 0;
}
Serial.println("***");
}
void printTemperature(DeviceAddress deviceAddress)
{
tempC = sensors.getTempC(deviceAddress);
om (tempC ==-127.00) {
Serial.Print ("fel få temperatur");
} annat {
Serial.Print ("C:");
Serial.println(tempC);
}
}