Oprindeligt blev termostaten fremstillet simpelthen som et termometer til at kontrollere temperaturen uden for vinduet. Derefter begyndte kartoflerne at fryse under jorden under frost, og funktionalitet blev tilføjet til at kontrollere mikroklimaet. Pasdata for koblingsrelæet - 250V og 10A (2,5kW). Da varmen i undergrunden ikke er nødvendig, er en ti per kilowatt nok.
Nødvendige materialer og værktøjer:skoplejeboks
-USB-opladning til telefonen (enhver, mindst 0,7A)
-
ArduinoPro-Mini
2-linjers bogstav med 8 tegn (WH0802A-NGA-CT det er mere kompakt)
Koder med en knap (kan købes i enhver radio mag, knappen kan ikke være indbygget)
-skild med et 5V-relæ (jeg købte en masse kinesiske relæer uden optisk isolering på en gang, så jeg havde brug for en anden Optocoupler PC817 og en 470 Ohm-modstand. Hvis du har optisk isolering på typeskiltet, kan du forbinde navneskilt direkte til arduino-porten)
USB-stik
-2 3-meters USB-forlængerledning (et til netledningen, til det andet lodder vi DS1820)
- DS1820 (med ethvert brev)
loddejern
-pistolen
Navneskilt FTDI232
Trin 1: Først og fremmest er vi nødt til at blinke arduino, fordi jeg har en Pro Mini (den går uden en USB-RS232-konverter), jeg har brug for at lodde en lineal med stifter til arduino. Fra den side, hvor DTR, TXD, RXD, VCC, GND, GND er afledt. Tilslut nu FTDI232 DTR til DTR, VCC til VCC, GND til GND, TXD til RXD, RXD til TXD. Kør arduino IDE, download skitsen og flash den (skitse i slutningen).
Trin 2: Lad os nu tage os af skroget. Vi river svampen af ved "FUKS", affedter alt godt, den dybe del af kassen kan ledes med en sød klud (noget klæber bedre). Marker hullet til koderen, USB-stikket (mor) og selve displayet. Lim relæet til kassedækslet. Vi skal forsøge at placere relæet længere væk fra processoren og arrangere komponenterne, så låget lukkes senere (der er nok plads).
Trin 3: Nu tager vi USB-forlængerkablet, skærer stikkontakten (mor) af. Vi skærer den afskårne ende af, borer et hul til kablet i kroppen, indsætter det og limer nøglen med en pistol. Plus, kablet har rødt, minus sort (jeg tjekker det bare), plus plusstikket på stikket, minus minus (jeg giver ikke pinout på stikket - det er på Internettet). Mellem stikkets plus og 2 medium (jeg har dem tilsluttet) skal en 4.7kOhm modstand loddes.
Trin 4: Vi tager 2 USB-forlængerkabler, skærer stikket af (mor), klipper kablet. Bare i tilfælde af, vil vi kontrollere, om vi alle loddes korrekt. Vi tilslutter strømkablet med USB-opladning og til netværket, sætter det afskårne kabel i USB-stikket, ser på testeren + på rød - på sort. Vi trækker kablet ud og lodder DS1820: - til 1, + til 3 de resterende 2 ledninger til 2. Jeg overtrækker derefter epoxyforbindelsen (for at reparere tanke, radiatorer) og efterlader lidt af sensorhuset udad, så der vil være en hurtigere reaktion på temperaturændringer.Nå, vi udfører installationen i henhold til kredsløbsdiagrammet (vi forbinder relæpladerens strøm og jord med henholdsvis de fælles + og - kredsløb).
Trin 5: Alle kredsløbskomponenter er tilsluttet. Vi tilslutter vores sensor (uden det forbliver displayet sort), bruger strøm. I den første linje - temperaturen i 2, hvis “*” er tændt - er relæet tændt, ingen - slukket. Lad os nu prøve at indstille relæskiftgrænser. Tryk på koderskaftet (eller din knap), grænseværdien vises, ved hvilken relæet tændes ved at dreje skaftet - værdien øges eller formindskes. Ved at klikke på skaftet igen - får vi den øverste grænse (relæet slukkes), indstil værdien og tryk igen. Enheden overvåger temperaturen, værdien af grænserne opretholdes, når strømmen er slukket. Det er alt.
#include
#include
#include
#definer BUTTON_1_PIN 10 // outputnummeret på knap 1 er 12
OneWire ds (12); // på pin 10 (en 4.7K modstand er nødvendig)
// initialiser biblioteket med numrene på interfacestifterne
Flydende krystal lcd (3, 2, 4, 5, 6, 7);
usigneret lang aktuelle tid;
const int pin_A = 8; // pin 12
const int pin_B = 9; // pin 11
usigneret char enc_A;
usigneret char enc_B;
usigneret char enc_A_prev = 0;
float n_pr = 24,1;
float b_pr = 26,2;
boolsk pris = falsk;
klasse knap {
offentligheden:
Knap (byte-pin, byte-tidButton); // konstruktørbeskrivelse
boolsk flagPress; // flag-knappen er nu trykket
boolsk flag Klik på; // knappen blev trykket på (klik)
void scanState (); // metode til kontrol af signaltilstanden
void setPinTime (byte pin, byte timeButton); // metode til indstilling af outputnummer og bekræftelsestid (nummer)
privat:
byte _buttonCount; // Kontroltæller for stabil tilstand
byte _timeButton; // Bekræftelsestid for knaptilstand
byte _pin; // pin nummer
};
Knapknap1 (BUTTON_1_PIN, 30);
void knopka () {
lcd.clear ();
lcd.setCursor (1,0);
lcd.print (n_pr);
// button1.scanState ();
while (button1.flagClick == false) {
enc_A = digitalRead (pin_A);
enc_B = digitallæs (pin_B);
hvis ((! enc_A) && (enc_A_prev)) {
hvis (enc_B) {
n_pr = n_pr-0,1;
} andet {
n_pr = n_pr + 0,1;
}
lcd.clear ();
lcd.setCursor (1,0);
lcd.print (n_pr);
}
enc_A_prev = enc_A;
button1.scanState ();
}
button1.flagClick = falsk;
lcd.clear ();
lcd.setCursor (1,0);
lcd.print (b_pr);
while (button1.flagClick == false) {
enc_A = digitalRead (pin_A);
enc_B = digitallæs (pin_B);
hvis ((! enc_A) && (enc_A_prev)) {
hvis (enc_B) {
b_pr = b_pr-0,1;
} andet {
b_pr = b_pr + 0,1;
}
lcd.clear ();
lcd.setCursor (1,0);
lcd.print (b_pr);
}
enc_A_prev = enc_A;
button1.scanState ();
}
button1.flagClick = falsk;
hvis (n_pr> b_pr) {
float wr = n_pr;
n_pr = b_pr;
b_pr = wr;
}
int addr = 0;
EEPROM.write (addr, 'y');
addr = 1;
EEPROM.put (addr, n_pr);
addr + = sizeof (float);
EEPROM.put (addr, b_pr);
forsinkelse (300);
}
tom opsætning (tom) {
pinMode (11, OUTPUT);
pinMode (pin_A, INPUT_PULLUP);
pinMode (pin_B, INPUT_PULLUP);
lcd.begin (8.2);
int addr = 0;
char c = EEPROM.read (addr);
addr = addr + 1;
if (c == 'y') {
EEPROM.get (addr, n_pr);
addr + = sizeof (float);
EEPROM.get (addr, b_pr);
}
// Serial.begin (9600);
}
void loop (void) {
byte i;
byte til stede = 0;
byte type_s;
byte data [12];
byte addr [8];
float celsius;
if (! ds.search (addr)) {
ds.reset_search ();
forsinkelse (250);
vende tilbage;
}
if (OneWire :: crc8 (addr, 7)! = addr [7]) {
vende tilbage;
}
// den første ROM-byte angiver hvilken chip
switch (addr [0]) {
sag 0x10:
type_s = 1;
break;
sag 0x28:
type_s = 0;
break;
sag 0x22:
type_s = 0;
break;
standard:
vende tilbage;
}
ds.reset ();
ds.select (addr);
ds.skriv (0x44, 1); // start konvertering, med parasit tændt i slutningen
enc_A = digitalRead (pin_A);
enc_A_prev = enc_A;
strømtid = millis ();
mens ((millis () - nuværende tid) <2000) {
button1.scanState ();
if (button1.flagClick == true) {
// der var et klikklik
button1.flagClick = falsk; // nulstil attribut for klik
knopka ();
}
}
// forsinkelse (1000); // måske er 750 ms nok, måske ikke
// vi laver måske en ds.depower () her, men nulstillingen vil tage sig af det.
nuværende = ds.reset ();
ds.select (addr);
ds.skriv (0xBE); // Læs Scratchpad
for (i = 0; i <9; i ++) {// vi har brug for 9 byte
data [i] = ds.read ();
}
// Konverter dataene til den faktiske temperatur
// fordi resultatet er et 16 bit signeret heltal, skal det
// gemmes i en "int16_t" type, som altid er 16 bit
// selv når den er kompileret på en 32 bit processor.
int16_t raw = (data [1] << 8) | data [0];
if (type_s) {
rå = rå << 3; // 9 bit opløsning standard
if (data [7] == 0x10) {
// "count count" giver fuld 12 bit opløsning
raw = (raw & 0xFFF0) + 12 - data [6];
}
} andet {
byte cfg = (data [4] & 0x60);
// ved lavere res er de lave bits ikke defineret, så lad os nul dem
if (cfg == 0x00) raw = raw & ~ 7; // 9 bit opløsning, 93,75 ms
ellers hvis (cfg == 0x20) raw = raw & ~ 3; // 10 bit res, 187,5 ms
ellers hvis (cfg == 0x40) raw = raw & ~ 1; // 11 bit res, 375 ms
//// standard er 12 bit opløsning, konverteringstid på 750 ms
}
celsius = (float) rå / 16,0;
lcd.clear ();
lcd.setCursor (1,0);
lcd.print (celsius);
hvis (pris) {
lcd.set markør (0,1);
lcd.print ('*');
}
hvis (n_pr! = b_pr) {
if (celsius b_pr) {
digitalWrite (11, LAV);
pris = falsk;
}
}
}
// knappen tilstand kontrol metode
// flagPress = sandt - klikket
// flagPress = falsk - trykket
// flagKlik = sandt - blev klikket (klik)
void Button :: scanState () {
if (flagPress == (! digitalRead (_pin))) {
// signaltilstand forbliver den samme
_buttonCount = 0; // nulstil signalstatistælleren
}
ellers {
// signaltilstand er ændret
_buttonCount ++; // +1 til signaltilstandstælleren
if (_buttonCount> = _timeButton) {
// signaltilstand ændrede ikke den specificerede tid
// signaltilstand er blevet stabil
flagPress =! flagPress; // invers af statusindikatoren
_buttonCount = 0; // nulstil signalstatistælleren
hvis (flagPress == sand) flagKlik = sand; // tegn på klik på klik
}
}
}
// metode til indstilling af outputnummer og bekræftelsestid
void Button :: setPinTime (byte pin, byte timeButton) {
_pin = pin;
_timeButton = timeButton;
pinMode (_pin, INPUT_PULLUP); // definere output som input
}
// beskrivelse af konstruktøren af knappen Button
Button :: Button (byte pin, byte timeButton) {
_pin = pin;
_timeButton = timeButton;
pinMode (_pin, INPUT_PULLUP); // definere output som input
}