Alun perin termostaatti tehtiin yksinkertaisesti lämpömittariksi lämpötilan säätämiseksi ikkunan ulkopuolella. Sitten, pakkasten aikana, perunat alkoivat jäätyä maan alla ja toimintoja lisättiin mikroilmaston hallitsemiseksi. Kytkentäreleen passitiedot - 250 V ja 10A (2,5 kW). Koska maanalaista lämpöä ei tarvita, riittää kymmenen kilowattia kohden.
Tarvittavat materiaalit ja työkalut:kenkähoitolaatikko
-USB-lataus puhelimelle (mikä tahansa, vähintään 0.7A)
-
TyöläsPro-Mini
-2-rivinen 8-merkkinen näyttö (WH0802A-NGA-CT on pienempi)
Kooderi painikkeella (voi ostaa mistä tahansa radiosta, painike ei voi olla sisäänrakennettu)
-lapsella 5 V: n releellä (ostin joukon kiinalaisia releitä ilman optista eristystä kerralla, joten tarvitsin toisen Optocoupler PC817: n ja 470 ohmin vastus. Jos sinulla on optinen eristys tyyppikilvessä, voit kytkeä tyyppikilven suoraan arduino-porttiin)
USB-liitin
-2 3 metrin USB-jatkojohto (yksi virtajohdolle, toiseen juottamme DS1820: n)
- DS1820 (millä tahansa kirjaimella)
juotin
-liima-ase
Tyyppikilpi FTDI232
Vaihe 1: Ensinnäkin, meidän täytyy salata arduino, koska minulla on Pro Mini (se menee ilman USB-RS232 -muunninta), minun täytyy juottaa viivain nastat arduinoon. Sivulta, jolta DTR, TXD, RXD, VCC, GND, GND johdetaan. Kytke nyt FTDI232 DTR DTR, VCC VCC, GND GND, TXD RXD, RXD TXD. Suorita arduino IDE, lataa luonnos ja salama se (luonnos lopussa).
Vaihe 2: Nyt huolehditaan rungosta. Revitään sieni FUKS-kohdasta, rasvattaa kaikki hyvin, rasian syvä osa voidaan kuluttaa hiomakankaalla (joku tarttuisi paremmin). Merkitse anturin, USB-liittimen (äiti) ja itse näytön reikä. Liimaa rele kotelon kanteen. Meidän on yritettävä sijoittaa rele pois prosessorista ja järjestää komponentit siten, että kansi sulkeutuu myöhemmin (tilaa on paljon).
Vaihe 3: Nyt otamme USB-jatkojohdon, katkaise liitinkappale (äiti). Me katkaisimme leikatun pään, poraa reikä kaapelia varten rungossa, aseta se ja liimaa avain aseella. Lisäksi kaapelissa on punainen, miinus musta (tarkistan sen vain), plus liittimen plus, miinus miinus (en anna liittimen pinoutia - se on Internetissä). Liittimen plus ja 2 väliaineen välillä (minulla on ne kytketty), on juotettava 4,7 ktOmm-vastus.
Vaihe 4: Otetaan 2 USB-jatkojohtoa, katkaistaan liitin (äiti), katkaistaan kaapeli. Joka tapauksessa tarkistamme, juotimmeko kaikki oikein. Yhdistämme virtajohdon USB-latauksella ja verkkoon, kiinnitä leikattu kaapeli USB-liittimeen, katso testeri + punaisella - mustalla. Vedämme kaapelin pois ja juotamme DS1820: n - 1, + 3 loput 2 johtoa 2: een. Päällystän sitten epoksiyhdisteen (säiliöiden, lämpöpatterien korjaamiseksi), jättäen vähän anturin kotelosta ulospäin, jotta lämpötilan muutokset reagoivat nopeammin.Suoritamme asennuksen kytkentäkaavion mukaisesti (liitämme relelevyn virta ja maa vastaavasti yhteisiin + ja - piireihin).
Vaihe 5: Kaikki piirikomponentit on kytketty. Yhdistämme anturimme (ilman sitä näyttö pysyy mustana), käytä virtaa. Ensimmäisellä rivillä - lämpötila-arvo, 2: ssa, jos ”*” on päällä - rele on päällä, ei - pois päältä. Yritetään nyt asettaa releen kytkentärajat. Paina kooderin akselia (tai painiketta), raja-arvo, jona rele kytkeytyy päälle kääntämällä akselia - arvo kasvaa tai laskee. Napsauttamalla akselia uudelleen - saat ylärajan (rele sammuu), aseta arvo ja paina uudelleen. Laite tarkkailee lämpötilaa. Rajojen arvo säilyy, kun virta katkaistaan. Siinä kaikki.
# Sisällytä
# sisällytä
# sisällytä
#define BUTTON_1_PIN 10 // painikkeen 1 ulostulonumero on 12
OneWire-ds (12); // nastalla 10 (4,7K: n vastus tarvitaan)
// alusta kirjasto liitäntätappien numeroilla
Nestekidenäyttö LCD (3, 2, 4, 5, 6, 7);
allekirjoittamaton pitkä nykyinen aika;
const int pin_A = 8; // nasta 12
const int pin_B = 9; // nasta 11
allekirjoittamaton char enc_A;
allekirjoittamaton char enc_B;
allekirjoittamaton char enc_A_prev = 0;
kellua n_pr = 24,1;
kellua b_pr = 26,2;
boolean priz = false;
luokan painike {
julkinen:
Painike (tavun pin, tavun aikapainike); // rakentajan kuvaus
boolean flagPress; // lippupainiketta on nyt painettu
boolean flagClick; // lippupainiketta painettiin (napsauta)
tyhjä scanState (); // menetelmä signaalin tilan tarkistamiseksi
void setPinTime (tavun pin, tavun aikapainike); // menetelmä lähtönumeron ja vahvistusajan (lukumäärän) asettamiseksi
yksityinen:
tavu _buttonCount; // vakaan tilan vahvistuslaskuri
tavu _timeButton; // painikkeen tilan vahvistusaika
tavu _pin; // nasta numero
};
Painike-painike1 (BUTTON_1_PIN, 30);
tyhjä knopka () {
lcd.selkeä ();
lcd.setCursor (1,0);
lcd.print (n_pr);
// button1.scanState ();
while (button1.flagClick == false) {
enc_A = digitalRead (pin_A);
enc_B = digitalRead (pin_B);
if ((! enc_A) && (enc_A_prev)) {
if (enc_B) {
n_pr = n_pr-0,1;
} muuta {
n_pr = n_pr + 0,1;
}
lcd.selkeä ();
lcd.setCursor (1,0);
lcd.print (n_pr);
}
enc_A_prev = enc_A;
painike1.scanState ();
}
button1.flagClick = false;
lcd.selkeä ();
lcd.setCursor (1,0);
lcd.print (b_pr);
while (button1.flagClick == false) {
enc_A = digitalRead (pin_A);
enc_B = digitalRead (pin_B);
if ((! enc_A) && (enc_A_prev)) {
if (enc_B) {
b_pr = b_pr-0,1;
} muuta {
b_pr = b_pr + 0,1;
}
lcd.selkeä ();
lcd.setCursor (1,0);
lcd.print (b_pr);
}
enc_A_prev = enc_A;
painike1.scanState ();
}
button1.flagClick = false;
if (n_pr> b_pr) {
kellua 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 + = koon (kelluva);
EEPROM.put (addr, b_pr);
viive (300);
}
tyhjä asennus (tyhjä) {
pinMode (11, OUTPUT);
pinMode (pin_A, INPUT_PULLUP);
pinMode (pin_B, INPUT_PULLUP);
lcdbegin (8.2);
int addr = 0;
char c = EEPROM.luku (addr);
addr = addr + 1;
if (c == 'y') {
EEPROM.get (addr, n_pr);
addr + = koon (kelluva);
EEPROM.get (addr, b_pr);
}
// Serial.begin (9600);
}
tyhjä silmukka (tyhjä) {
tavu i;
läsnä oleva tavu = 0;
tavutyypit_;
tavutiedot [12];
tavun addr [8];
kelluva celsius;
if (! ds.search (addr)) {
ds.reset_search ();
viive (250);
palata;
}
if (OneWire :: crc8 (addr, 7)! = addr [7]) {
palata;
}
// ensimmäinen ROM-tavu osoittaa minkä sirun
kytkin (addr [0]) {
tapaus 0x10:
tyyppi_s = 1;
break;
tapaus 0x28:
tyyppi_s = 0;
break;
tapaus 0x22:
tyyppi_s = 0;
break;
oletus:
palata;
}
ds.reset ();
ds.select (addr);
dswrite (0x44, 1); // aloita muuntaminen, loisen virta päällä lopussa
enc_A = digitalRead (pin_A);
enc_A_prev = enc_A;
currentTime = millis ();
while ((millis () - currentTime) <2000) {
painike1.scanState ();
if (button1.flagClick == true) {
// oli painike napsautettu
button1.flagClick = false; // nollaa napsautusominaisuus
knopka ();
}
}
// viive (1000); // Ehkä 750 ms riittää, ehkä ei
// saatamme tehdä ds.depower () täällä, mutta nollaus huolehtii siitä.
läsnä = ds.reset ();
ds.select (addr);
dswrite (0xBE); // Lue Scratchpad
varten (i = 0; i <9; i ++) {// tarvitsemme 9 tavua
data [i] = ds.read ();
}
// Muunna tiedot todelliseen lämpötilaan
// koska tulos on 16-bittinen allekirjoitettu kokonaisluku, sen pitäisi olla
// tallennetaan tyyppiin "int16_t", joka on aina 16 bittiä
// jopa käännettynä 32-bittiselle prosessorille
int16_t raw = (tiedot [1] << 8) | tiedot [0];
if (type_s) {
raaka = raaka << 3; // 9-bittinen tarkkuus oletus
if (tiedot [7] == 0x10) {
// "count pysyy" antaa täyden 12 bitin tarkkuuden
raa'at = (raa'at ja 0xFFF0) + 12 - tiedot [6];
}
} muuta {
tavu cfg = (tiedot [4] ja 0x60);
// alempana, pieniä bittejä ei ole määritelty, joten nollataan ne
if (cfg == 0x00) raw = raw & ~ 7; // 9-bittinen resoluutio, 93,75 ms
muuten, jos (cfg == 0x20) raw = raw & ~ 3; // 10 bitin res., 187,5 ms
muuten, jos (cfg == 0x40) raw = raw & ~ 1; // 11 bitin res, 375 ms
//// oletus on 12-bittinen resoluutio, 750 ms: n muuntamisaika
}
celsius = (kelluva) raaka / 16,0;
lcd.selkeä ();
lcd.setCursor (1,0);
lcd-painos (celsius);
if (priz) {
lcd.setCursor (0,1);
lcd.print ('*');
}
if (n_pr! = b_pr) {
if (celsius b_pr) {
digitalWrite (11, LOW);
priz = väärä;
}
}
}
// painikkeen tilan tarkistusmenetelmä
// flagPress = true - napsautettu
// flagPress = false - painetaan
// flagClick = true - napsautettiin (napsauta)
tyhjä painike :: scanState () {
if (flagPress == (! digitalRead (_pin))) {
// signaalin tila pysyy samana
_buttonCount = 0; // nollaa signaalin tilanlaskuri
}
muuten {
// signaalin tila on muuttunut
_buttonCount ++; // +1 signaalitilalaskuriin
if (_buttonCount> = _timeButton) {
// signaalin tila ei muuttanut määritettyä aikaa
// signaalin tila on vakaa
flagPress =! flagPress; // tilaindikaattorin käänteinen
_buttonCount = 0; // nollaa signaalin tilanlaskuri
if (flagPress == true) flagClick = true; // napsautuksen merkki
}
}
}
// menetelmä lähtönumeron ja vahvistusajan asettamiseksi
tyhjä painike :: setPinTime (tavun pin, tavu aikaButton) {
_pin = nasta;
_timeButton = timeButton;
pinMode (_pin, INPUT_PULLUP); // määritä lähtö tulona
}
// Button-luokan rakentajan kuvaus
Button :: Button (tavun pin, byte timeButton) {
_pin = nasta;
_timeButton = timeButton;
pinMode (_pin, INPUT_PULLUP); // määritä lähtö tulona
}