U početku je termostat napravljen jednostavno kao termometar za kontrolu temperature izvan prozora. Tada se tijekom mraza krumpir počeo smrzavati pod zemljom i dodana je funkcionalnost za kontrolu mikroklime. Podaci o putovnici prekidača - 250 V i 10A (2,5kW). Kako toplina u podzemlju nije potrebna, dovoljno je deset po kilovatu.
Potrebni materijali i alati:kutija za njegu cipela
-USB punjenje za telefon (bilo koji, najmanje 0.7A)
-
TežakPro-mini
-2-linijski zaslon s 8 znakova (WH0802A-NGA-CT je kompaktniji)
Davač s gumbom (može se kupiti u bilo kojem radio mag, tipka ne može biti ugrađena)
- dijete s 5 V relejem (kupio sam odjednom gomilu kineskih releja bez optičke izolacije, tako da sam trebao drugi Optocoupler PC817 i otpornik 470 Ohm. Ako imate optičku izolaciju na tipskoj pločici, natpisnu pločicu možete spojiti izravno na arduino priključak)
USB priključak
-2 produžni kabel s 3 metra (jedan za kabel za napajanje, drugi za lemljenje DS1820)
- DS1820 (s bilo kojim slovom)
lemljenje željeza
pištolj za ljepilo
Natpisna pločica FTDI232
Korak 1: Prije svega, trebamo fleksirati arduino, jer imam Pro Mini (nema USB-RS232 pretvarač), moram lemiti ravnalo sa iglema na arduino. Sa strane na kojoj su izvedeni DTR, TXD, RXD, VCC, GND, GND. Sada povezujemo FTDI232 DTR u DTR, VCC na VCC, GND na GND, TXD na RXD, RXD na TXD. Pokrenite arduino IDE, preuzmite skicu i bljesnite je (skica na kraju).
Korak 2: Sada se pobrinimo za trup. Odvojimo spužvu na „FUKS“, dobro odmašćujemo, duboki dio kutije može se proći uz pomoć krpe (nešto će se čvršće zabiti). Označite otvor za davač, USB priključak (matični uređaj) i sam zaslon. Zalijepite relej na poklopac kutije. Moramo pokušati postaviti relej dalje od procesora i organizirati komponente tako da se poklopac kasnije zatvori (ima dovoljno prostora).
Korak 3: Sada uzimamo USB produžni kabel, odrežemo utikač utikača (matični). Izrezali smo rezni kraj, izbušili rupu za kabel u tijelu, umetnuli ga i pištoljem zalijepili ključ. Plus, kabel ima crvenu, minus crnu (samo to provjeravam), plus plus priključak, minus minus (ne dajem pinout konektora - to je na Internetu). Između plus konektora i 2 medija (imam ih spojenih) mora se lemiti otpornik od 4,7 kOhm.
Korak 4: Uzimamo 2 USB produžna kabela, odrežemo konektor (matični), izrežemo kabel. Za svaki slučaj ćemo provjeriti da li smo svi pravilno lemljeni. Kabel za napajanje povezujemo s USB punjenjem i na mrežu, lijepljeni rezani kabel stavimo u USB priključak, pogledamo tester + na crveno - na crno. Izvučemo kabel i lemimo DS1820: - na 1, + do 3 preostale 2 žice na 2. Zatim premažem epoksidni spoj (za popravak spremnika, radijatora), ostavljajući malo kućišta senzora prema van, kako bi došlo do brže reakcije na promjene temperature.Pa, radimo instalaciju prema shemi kruga (spajamo snagu i zemlju relejne ploče s zajedničkim + i - krugovima, respektivno).
Korak 5: Sve komponente kruga su spojene. Spajamo naš senzor (bez njega, zaslon će ostati crn), primjenjujemo napajanje. U prvom retku - vrijednost temperature, u 2 ako je uključeno „*“ - relej je uključen, bez isključenja. Pokušajmo sada postaviti granice uključivanja releja. Pritisnite osovinu davača (ili vašu tipku) pojavi se granična vrijednost pri kojoj će se relej uključiti okretanjem osovine - vrijednost se povećava ili smanjuje. Klikom ponovo na vratilo - dobivamo gornju granicu (relej će se isključiti), postavimo vrijednost i ponovo pritisnemo. Uređaj će pratiti temperaturu, održava se vrijednost ograničenja kada je napajanje isključeno. To je sve.
#include
#include
#include
#define BUTTON_1_PIN 10 // izlazni broj gumba 1 je 12
OneWire ds (12); // na pin 10 (potreban je 4,7K otpornik)
// inicijalizirati knjižnicu brojevima pinova sučelja
Tekući kristalni LCD (3, 2, 4, 5, 6, 7);
nepotpisana duga strujaTime;
const int pin_A = 8; // pin 12
const int pin_B = 9; // pin 11
nepotpisani char enc_A;
nepotpisani char enc_B;
nepotpisani char enc_A_prev = 0;
plutati n_pr = 24,1;
plutaj b_pr = 26,2;
boolov priz = false;
tipka klase {
javno:
Gumb (bajt pin, byte timeButton); // opis konstruktora
booleova zastavaPress; // gumb zastave je sada pritisnut
booleova zastavaClick; // tipka zastave pritisnuta (klik)
void scanState (); // metoda za provjeru stanja signala
void setPinTime (bajt pin, bajt vrijemeButton); // metoda za podešavanje izlaznog broja i vremena potvrde (broja)
privatna:
byte _buttonCount; // brojač stabilne potvrde stanja
byte _timeButton; // vrijeme potvrde stanja gumba
bajt _pin; // pin broj
};
Gumb gumb1 (BUTTON_1_PIN, 30);
void knopka () {
lcd.clear ();
lcd.setCursor (1,0);
lcd.print (n_pr);
// button1.scanState ();
dok je (button1.flagClick == false) {
enc_A = digitalno čitanje (pin_A);
enc_B = digitalno čitanje (pin_B);
ako je ((! enc_A) && (enc_A_prev)) {
ako (enc_B) {
n_pr = n_pr-0,1;
} else {
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 = netočno;
lcd.clear ();
lcd.setCursor (1,0);
lcd.print (b_pr);
dok je (button1.flagClick == false) {
enc_A = digitalno čitanje (pin_A);
enc_B = digitalno čitanje (pin_B);
ako je ((! enc_A) && (enc_A_prev)) {
ako (enc_B) {
b_pr = b_pr-0,1;
} else {
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 = netočno;
ako je (n_pr> b_pr) {
plutati 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);
kašnjenje (300);
}
postavljanje praznine (void) {
pinMode (11, IZLAZ);
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;
ako je (c == 'y') {
EEPROM.get (addr, n_pr);
addr + = sizeof (float);
EEPROM.get (addr, b_pr);
}
// Serijski.begin (9600);
}
void petlja (void) {
byte i;
bajt prisutan = 0;
byte type_s;
bajtni podaci [12];
dodatak bajtova [8];
pluta celzijus;
if (! ds.search (addr)) {
ds.reset_search ();
kašnjenje (250);
povratak;
}
if (OneWire :: crc8 (addr, 7)! = addr [7]) {
povratak;
}
// prvi bajt ROM-a označava koji čip
sklopka (addr [0]) {
kućište 0x10:
type_s = 1;
razbiti;
kućište 0x28:
type_s = 0;
razbiti;
kućište 0x22:
type_s = 0;
razbiti;
default:
povratak;
}
ds.reset ();
ds.select (addr);
ds.write (0x44, 1); // započeti pretvorbu, s parazitskim napajanjem na kraju
enc_A = digitalno čitanje (pin_A);
enc_A_prev = enc_A;
currentTime = millis ();
dok ((millis () - currentTime) <2000) {
button1.scanState ();
ako (button1.flagClick == istina) {
// bilo je klika na gumb
button1.flagClick = netočno; // resetiraj atribut klika
knopka ();
}
}
// kašnjenje (1000); // možda je 750ms dovoljno, možda nije
// mogli bismo ovdje napraviti ds.depower (), ali to će se pobrinuti za resetiranje.
prisutan = ds.reset ();
ds.select (addr);
ds.write (0xBE); // Pročitajte Scratchpad
za (i = 0; i <9; i ++) {// treba nam 9 bajtova
podaci [i] = ds.read ();
}
// Pretvaranje podataka u stvarnu temperaturu
// jer je rezultat 16-bitni cijeli broj, trebao bi
// biti spremljen u "int16_t" tip, koji je uvijek 16 bita
// čak i kada se kompilira na 32-bitnom procesoru.
int16_t raw = (podaci [1] << 8) | podaci [0];
ako je (type_s) {
sirovi = sirovi << 3; // zadana 9-bitna razlučivost
ako (podaci [7] == 0x10) {
// "count count остаće" daje punu 12-bitnu razlučivost
raw = (sirovi & 0xFFF0) + 12 - podaci [6];
}
} else {
byte cfg = (podaci [4] i 0x60);
// pri nižoj rezoluciji, niski bitovi su nedefinirani, pa ih nulajmo
ako je (cfg == 0x00) sirov = sirov & ~ 7; // 9-bitna razlučivost, 93,75 ms
drugo ako (cfg == 0x20) raw = raw & ~ 3; // 10-bitna res, 187,5 ms
drugo ako (cfg == 0x40) raw = raw & ~ 1; // 11-bitna res, 375 ms
//// zadana je 12-bitna razlučivost, vrijeme pretvorbe 750 ms
}
celsius = (pluta) sirov / 16.0;
lcd.clear ();
lcd.setCursor (1,0);
lcd.print (celzija);
ako (priz) {
lcd.setCursor (0,1);
lcd.print ('*');
}
ako je (n_pr! = b_pr) {
ako (celzijus b_pr) {
digitalWrite (11, NISKO);
priz = lažno;
}
}
}
// metoda provjere stanja gumba
// flagPress = istina - kliknuta
// flagPress = lažno - pritisnut
// flagClick = true - kliknuli su (klik)
void tipka: scanState () {
if (flagPress == (! digitalno čitanje (_pin))) {
// stanje signala ostaje isto
_buttonCount = 0; // resetiranje brojača statusa signala
}
drugo {
// stanje signala promijenjeno
_buttonCount ++; // +1 na brojaču stanja signala
ako je (_buttonCount> = _timeButton) {
// stanje signala nije promijenilo određeno vrijeme
// stanje signala postalo je stabilno
flagPress =! flagPress; // obrnuto od indikatora statusa
_buttonCount = 0; // resetiranje brojača statusa signala
if (flagPress == true) flagClick = istina; // znak klika na klik
}
}
}
// metoda za podešavanje izlaznog broja i vremena potvrde
void tipka: setPinTime (bajt pin, byte timeButton) {
_pin = pin;
_timeButton = timeButton;
pinMode (_pin, INPUT_PULLUP); // definirati izlaz kao ulaz
}
// opis konstruktora klase Button
Gumb :: Gumb (bajt pin, byte timeButton) {
_pin = pin;
_timeButton = timeButton;
pinMode (_pin, INPUT_PULLUP); // definirati izlaz kao ulaz
}