Iš pradžių termostatas buvo gaminamas tiesiog kaip termometras temperatūrai už lango kontroliuoti. Tuomet, per šalnas, bulvės pradėjo šalti po žeme ir buvo pridėta funkcionalumo mikroklimatui kontroliuoti. Perjungimo relės paso duomenys - 250 V ir 10 A (2,5 kW). Kadangi šiluma požemiuose nereikalinga, užtenka dešimties už kilovatą.
Būtinos medžiagos ir įrankiai:batų priežiūros dėžutė
-USB įkrovimas už telefoną (bet koks, ne mažesnis kaip 0,7A)
-
Arduino-Pro-Mini
-2 eilutės 8 simbolių ekranas (WH0802A-NGA-CT yra kompaktiškesnis)
Koderis su mygtuku (galima įsigyti bet kuriame radijo bangoje, mygtukas negali būti įmontuotas)
vaikas su 5 V relė (vienu metu įsigijau krūvą kiniškų relių be optinės izoliacijos, taigi man reikėjo kito Optocoupler PC817 ir 470 omų rezistoriaus. Jei vardinėje plokštelėje turite optinę izoliaciją, vardinę plokštelę galite prijungti tiesiai prie arduino prievado).
USB jungtis
-2 3 metrų ilgio USB prailginimo laidas (vienas skirtas maitinimo laidui, o antrasis mes lituoklį DS1820)
- DS1820 (su bet kokia raide)
lituoklis
-klijų pistoletas
Duomenų lentelė FTDI232
1 žingsnis: Visų pirma, turime mirksėti „arduino“, nes aš turiu „Pro Mini“ (jis veikia be USB-RS232 keitiklio), todėl aš turiu lituoti liniuotę su kaiščiais prie arduino. Iš tos pusės, iš kur gaunami DTR, TXD, RXD, VCC, GND, GND. Dabar FTDI232 DTR jungiame prie DTR, VCC prie VCC, GND prie GND, TXD prie RXD, RXD prie TXD. Paleiskite „arduino IDE“, atsisiųskite eskizą ir mirksėkite (eskizas pabaigoje).
2 žingsnis: Dabar pasirūpinkime korpusu. Nuplėšime kempinę prie „FUKS“, gerai nuriebaliname, gilioji dėžutės dalis gali būti perduota švitriniu audiniu (kažkas geriau priliptų). Pažymėkite kodavimo angos, USB jungties (pagrindinės) ir paties ekrano skylę. Klijuokite relę prie dėžutės dangtelio. Mes turime pabandyti išdėstyti relę toliau nuo procesoriaus ir išdėstyti komponentus taip, kad dangtelis vėliau užsidarytų (yra daug vietos).
3 žingsnis: Dabar mes paimame USB prailginimo laidą, nupjaukite jungties lizdą (motina). Mes nupjauname supjaustytą galą, gręžkite skylę kabeliui kūne, įdėkite ją ir klijuokite raktą pistoletu. Be to, laidas yra raudonas, minusas juodas (aš jį tik patikrinau), taip pat jungties pliusas, atėmus minusą (aš neduodu jungties užrašo - jis yra internete). Tarp jungties pliuso ir 2 terpės (aš juos sujungiau) reikia išlydyti 4,7kOhm varžą.
4 žingsnis: Mes paimame 2 USB prailginimo laidus, nupjaukite jungtį (motiną), supjaustykite laidą. Tik tuo atveju patikrinsime, ar teisingai litavome. Mes prijungiame maitinimo laidą su USB įkrovimu ir prie tinklo, įkiškite supjaustytą laidą į USB jungtį, pažvelkime į testerį + raudonai - juodai. Mes ištraukiame laidą ir lydome DS1820: - iki 1, + iki 3 likusių 2 laidų iki 2. Tada padengiu epoksidiniu junginiu (rezervuarų, radiatorių remontui), paliekant šiek tiek jutiklio korpuso į išorę, kad greičiau būtų reaguojama į temperatūros pokyčius.Na, mes atliekame montavimą pagal grandinės schemą (mes atitinkamai sujungiame relės plokštės galią ir žemę su jungtimis + ir -).
5 žingsnis: Visi grandinės komponentai yra prijungti. Mes prijungiame savo jutiklį (be jo ekranas liks juodas), maitiname. Pirmoje eilutėje - temperatūros reikšmė, 2 dalyje, jei įjungtas „*“ - relė įjungta, ne - neišjungta. Dabar pabandykime nustatyti relės perjungimo ribas. Paspauskite kodavimo veleną (arba savo mygtuką) pasirodys ribinė vertė, kurią relė įsijungs sukant veleną - vertė padidėja arba sumažėja. Dar kartą spustelėdami veleną - gauname viršutinę ribą (relė išsijungs), nustatykite vertę ir dar kartą paspauskite. Įrenginys stebės temperatūrą, išjungus energiją, palaikoma ribų vertė. Tai viskas.
# įtraukite
# įtraukite
# įtraukti
#define BUTTON_1_PIN 10 // 1 mygtuko išvesties numeris yra 12
„OneWire“ ds (12); // ant 10 kaiščio (reikalingas 4,7K rezistorius)
// inicijuokite biblioteką sąsajos kaiščių numeriais
Skystųjų kristalų LCD (3, 2, 4, 5, 6, 7);
nepasirašytas ilgas dabartinis laikas;
const int pin_A = 8; // 12 kaištis
const int pin_B = 9; // 11 kaištis
neparašytas char enc_A;
neparašytas char enc_B;
nepasirašytas char enc_A_prev = 0;
plūdės n_pr = 24,1;
plūdės b_pr = 26,2;
boolean priz = false;
klasės mygtukas {
viešas:
Mygtukas (baito kaištis, baito laiko mygtukas); // konstruktoriaus aprašymas
boolean flagPress; // vėliavos mygtukas yra paspaustas
boolean flagClick; // buvo paspaustas vėliavos mygtukas (spustelėkite)
void scanState (); // signalo būklės tikrinimo metodas
void setPinTime (baito kaištis, baito laiko mygtukas); // išvesties numerio ir patvirtinimo laiko (skaičiaus) nustatymo metodas
privatus:
baitas _buttonCount; // stabilios būsenos patvirtinimo skaitiklis
baitas _timeButton; // mygtuko būsenos patvirtinimo laikas
baitas _pin; // PIN numeris
};
Mygtuko mygtukas1 (BUTTON_1_PIN, 30);
tuščia knopka () {
lcd.clear ();
„lcd.setCursor“ (1,0);
lcd.print (n_pr);
// mygtukas1.scanState ();
tuo tarpu (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;
} dar {
n_pr = n_pr + 0,1;
}
lcd.clear ();
„lcd.setCursor“ (1,0);
lcd.print (n_pr);
}
enc_A_prev = enc_A;
mygtukas1.scanState ();
}
button1.flagClick = klaidinga;
lcd.clear ();
„lcd.setCursor“ (1,0);
lcd.print (b_pr);
tuo tarpu (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;
} dar {
b_pr = b_pr + 0,1;
}
lcd.clear ();
„lcd.setCursor“ (1,0);
lcd.print (b_pr);
}
enc_A_prev = enc_A;
mygtukas1.scanState ();
}
button1.flagClick = klaidinga;
if (n_pr> b_pr) {
plūdė 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 + = dydis (plūduriuojantis);
EEPROM.put (addr, b_pr);
vėlavimas (300);
}
negaliojanti sąranka (negaliojanti) {
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 + = dydis (plūduriuojantis);
EEPROM.get (addr, b_pr);
}
// Serial.begin (9600);
}
tuščia kilpa (negaliojanti) {
i baitas;
dabartinis baitas = 0;
baitų tipas_s;
baitų duomenys [12];
baitų pridėtojas [8];
plūduriuojantis Celsijus;
if (! ds.search (addr)) {
ds.reset_search ();
vėlavimas (250);
grįžti
}
if (OneWire :: crc8 (addr, 7)! = addr [7]) {
grįžti
}
// pirmasis ROM baitas nurodo, kuri mikroschema
jungiklis (addr [0]) {
atvejis 0x10:
tipas_s = 1;
pertrauka;
0x28 atvejis:
tipas_s = 0;
pertrauka;
atvejis 0x22:
tipas_s = 0;
pertrauka;
numatytasis:
grįžti
}
ds.reset ();
ds.select (addr);
dswrite (0x44, 1); // pradėkite konversiją, kai parazito galia įjungta
enc_A = digitalRead (pin_A);
enc_A_prev = enc_A;
currentTime = milis ();
tuo tarpu ((milis () - currentTime) <2000) {
mygtukas1.scanState ();
if (button1.flagClick == true) {
// buvo mygtuko paspaudimas
button1.flagClick = klaidinga; // atstatyti paspaudimo atributą
knopka ();
}
}
// vėlavimas (1000); // gal pakanka 750ms, gal ne
// Mes čia galime padaryti ds.depower (), bet atstatymas pasirūpins tuo.
dabartinis = ds.reset ();
ds.select (addr);
dswrite (0xBE); // Skaitykite „Scratchpad“
už (i = 0; i <9; i ++) {// mums reikia 9 baitų
duomenys [i] = ds.read ();
}
// Konvertuokite duomenis į faktinę temperatūrą
// nes rezultatas yra 16 bitų pasirašytas sveikasis skaičius, jis turėtų
// saugomi „int16_t“ tipo, kuris visada yra 16 bitų
// net kai sudaroma 32 bitų procesoriuje.
int16_t raw = (duomenys [1] << 8) | duomenys [0];
if (type_s) {
raw = raw << 3; // Numatytoji 9 bitų skiriamoji geba
if (duomenys [7] == 0x10) {
// "skaičius lieka" suteikia visą 12 bitų skiriamąją gebą
raw = (raw & 0xFFF0) + 12 - duomenys [6];
}
} dar {
baitas cfg = (duomenys [4] ir 0x60);
// esant mažesnei daliai, žemieji bitai yra neapibrėžti, todėl nuliuokime juos
if (cfg == 0x00) raw = raw & ~ 7; // 9 bitų skiriamoji geba, 93,75 ms
dar jei (cfg == 0x20) raw = raw & ~ 3; // 10 bitų res, 187,5 ms
dar jei (cfg == 0x40) raw = raw & ~ 1; // 11 bitų res, 375 ms
//// numatytoji reikšmė yra 12 bitų skiriamoji geba, 750 ms konvertavimo laikas
}
Celsijaus = (plūduriuojantis) neapdorotas / 16,0;
lcd.clear ();
„lcd.setCursor“ (1,0);
lcd.print (celsius);
if (prizas) {
lcd.setCursor (0,1);
lcd.print ('*');
}
if (n_pr! = b_pr) {
if (Celsijaus b_pr) {
„digitalWrite“ (11, LOW);
priz = klaidinga;
}
}
}
// mygtuko būsenos tikrinimo metodas
// flagPress = true - spustelėta
// flagPress = false - paspaustas
// flagClick = true - buvo spustelėta (spustelėkite)
negaliojantis mygtukas :: scanState () {
if (flagPress == (! digitalRead (_pin))) {
// signalo būsena išlieka ta pati
_buttonCount = 0; // iš naujo nustatyti signalo būsenos skaitiklį
}
dar {
// signalo būsena pasikeitė
_buttonCount ++; // +1 prie signalo būsenos skaitiklio
if (_buttonCount> = _timeButton) {
// signalo būsena nepasikeitė nurodytu laiku
// signalo būsena tapo stabili
flagPress =! flagPress; // būsenos indikatoriaus atvirkštinė dalis
_buttonCount = 0; // iš naujo nustatyti signalo būsenos skaitiklį
if (flagPress == true) flagClick = true; // paspaudimo paspaudimo ženklas
}
}
}
// išvesties numerio ir patvirtinimo laiko nustatymo metodas
negaliojantis mygtukas :: setPinTime (baito PIN kodas, baito laiko juosta) {
_pin = kaištis;
_timeButton = laiko mygtukas;
pinMode (_pin, INPUT_PULLUP); // apibrėžkite išvestį kaip įvestį
}
// Button klasės konstruktoriaus aprašymas
Mygtukas :: Mygtukas (baito kaištis, baito laiko mygtukas) {
_pin = kaištis;
_timeButton = laiko mygtukas;
pinMode (_pin, INPUT_PULLUP); // apibrėžkite išvestį kaip įvestį
}