Kezdetben a termosztátot egyszerűen hőmérőként állították elő, hogy az ablakon kívül hőmérsékletet vezessenek. Aztán a fagyok alatt a burgonya a föld alatt fagyni kezdett, és funkcionalitással bővítették a mikroklímát. A kapcsolórelé útlevéladatai - 250 V és 10A (2,5 kW). Mivel a föld alatti melegen nincs szükség, elegendő egy tíz kilowatt.
Szükséges anyagok és eszközök:cipőápolási doboz
-USB-díj a telefon számára (bármilyen, legalább 0,7A)
-
ArduinoPro- Mini
-2 soros 8 karakterű kijelző (a WH0802A-NGA-CT sokkal kompaktabb)
Kódoló gombbal (megvásárolható bármilyen rádióban, a gomb nem lehet beépítve)
-gyermek egy 5 V-os relével (egy csomó kínai relét vásároltam egyszerre optikai szigetelés nélkül, tehát szükségem volt egy másik Optocoupler PC817-re és egy 470 Ohm ellenállásra. Ha optikai szigetelés van az adattáblán, akkor az adattáblát közvetlenül az arduino porthoz csatlakoztathatja)
USB csatlakozó
-2 3 méteres USB hosszabbító kábel (az egyik a tápkábelhez, a másodikhoz a DS1820 forrasztása)
- DS1820 (bármilyen betűvel)
forrasztópáka
- ragasztópisztoly
Típustábla FTDI232
1. lépés: Mindenekelőtt meg kell villannia az arduino-t, mivel van egy Pro Mini (USB-RS232 konverter nélkül működik), be kell forrasztanom egy vonalzót csapokkal az arduino-hoz. Azon az oldalon, ahonnan a DTR, TXD, RXD, VCC, GND, GND származik. Most csatlakoztassa az FTDI232 DTR-t a DTR-hez, a VCC-t a VCC-hez, a GND-t a GND-hez, a TXD-t az RXD-hez, az RXD-t a TXD-hez. Futtassa az arduino IDE-t, töltse le a vázlatot, és vakuzzon meg (vázlat a végén).
2. lépés: Most vigyázzunk a házra. Távolítsuk el a szivacsot a „FUKS” -nál, mindent jól zsírtalanítsunk, a doboz mélyebb részét csiszolókendővel lehet átvinni (valami jobban tapadna). Jelölje meg a jeladó, az USB-csatlakozó (anya) és a kijelző lyukat. Ragasztja a relét a doboz fedeléhez. Meg kell próbálnunk a relét elhelyezni a processzortól és elrendezni az alkatrészeket úgy, hogy a fedél később bezáródjon (rengeteg hely van).
3. lépés: Most vesszük az USB hosszabbító kábelt, vágjuk le a csatlakozóaljzatot (anya). Vágjuk le a vágott végét, fúrunk egy lyukat a kábel számára a testben, dugjuk be és ragasszuk a kulcsot pisztollyal. Plusz, a kábel vörös, mínusz fekete (csak ellenőriztem), plusz a csatlakozó plusz mínusz (nem adom meg a csatlakozó csúcsát - az az interneten van). A csatlakozó plusz és a 2 közeg között (összekapcsoltam őket) ki kell oldani a 4,7 kt ohm ellenállást.
4. lépés: Vegye ki 2 USB hosszabbító kábelt, vágja le a csatlakozót (anya), vágja le a kábelt. Csak arra az esetre, ha megvizsgáljuk, vajon mindegyikünk forrasztotta-e megfelelően. A tápkábelt csatlakoztatjuk az USB töltéssel és a hálózathoz, ragasszuk a kivágott kábelt az USB-csatlakozóba, nézzük a teszter + vörösre - feketére. Húzzuk ki a kábelt és forrasztjuk a DS1820-at: - 1-re, + 3-ra a fennmaradó 2 vezetéket 2-re. Majd bevonom az epoxi-vegyületet (tartályok, radiátorok javításához), az érzékelőház egy kis részét hagyva kifelé, hogy gyorsabban reagáljon a hőmérsékleti változásokra.Nos, a telepítést az áramköri ábra szerint hajtjuk végre (a relélemez teljesítményét és talaját a közös + és - áramkörökhöz kapcsoljuk).
5. lépés: Az összes áramköri alkatrész csatlakozik. Csatlakozunk az érzékelőnkhöz (nélküle a kijelző fekete marad), tápfeszültséget használunk. Az első sorban - a hőmérsékleti érték, 2-ben, ha a „*” be van kapcsolva - a relé be van kapcsolva, nincs ki. Most próbáljuk meg beállítani a relé kapcsolási korlátait. Nyomja meg a kódoló tengelyét (vagy a gombot), megjelenik a határérték, amelyen a relé a tengely forgatásával bekapcsol - az érték növekszik vagy csökken. Ha ismét rákattint a tengelyre - megkapjuk a felső határértéket (a relé kikapcsol), állítsuk be az értéket és nyomjuk meg újra. A készülék figyeli a hőmérsékletet, a határértékek értékét a készülék kikapcsolásakor fenntartják. Ez minden.
#include
# beletartozik a
# beletartozik a
#define BUTTON_1_PIN 10 // az 1. gomb kimeneti száma 12
OneWire ds (12); // a 10. tűn (4,7K ellenállás szükséges)
// inicializálja a könyvtárat az interfész tűinek számával
Folyadékkristályos LCD (3, 2, 4, 5, 6, 7);
alá nem írt hosszú currentTime;
const int pin_A = 8; // 12. tű
const int pin_B = 9; // 11. tű
aláíratlan char enc_A;
aláíratlan char enc_B;
alá nem írt char enc_A_prev = 0;
úszó n_pr = 24,1;
úszó b_pr = 26,2;
logikai priz = false;
osztály gomb {
nyilvános:
Gomb (byte pin, byte timeButton); // konstruktor leírás
boolean flagPress; // megnyomja a zászló gombot
boolean flagClick; // megnyomta a zászlógombot (kattintás)
void scanState (); // módszer a jel állapotának ellenőrzésére
void setPinTime (byte pin, byte timeButton); // módszer a kimeneti szám és a megerősítési idő beállításához (szám)
private:
byte _buttonCount; // stabil állapot megerősítő számláló
byte _timeButton; // gomb állapotának megerősítési ideje
bájt _pin; // pin szám
};
Button button1 (BUTTON_1_PIN, 30);
semmis knopka () {
lcd.clear ();
lcd.setCursor (1,0);
lcd.print (n_pr);
// button1.scanState ();
míg (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;
} egyéb {
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 = false;
lcd.clear ();
lcd.setCursor (1,0);
lcd.print (b_pr);
míg (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;
} egyéb {
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 = false;
if (n_pr> b_pr) {
úszó 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 + = méret (úszó);
EEPROM.put (addr, b_pr);
késleltetés (300);
}
érvénytelen beállítás (érvénytelen) {
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 + = méret (úszó);
EEPROM.get (addr, b_pr);
}
// Serial.begin (9600);
}
void loop (void) {
i bájt;
jelen lévő byte = 0;
byte type_s;
bájt adatok [12];
byte addr [8];
úszó celsius;
if (! ds.search (addr)) {
ds.reset_search ();
késleltetés (250);
return;
}
if (OneWire :: crc8 (addr, 7)! = addr [7]) {
return;
}
// az első ROM bájt jelzi, melyik chipet használja
kapcsoló (addr [0]) {
0x10 eset:
type_s = 1;
break;
0x28 eset:
type_s = 0;
break;
0x22 eset:
type_s = 0;
break;
alapértelmezett:
return;
}
ds.reset ();
ds.select (addr);
dswrite (0x44, 1); // kezdje meg az átalakítást, miközben a végén be van kapcsolva a parazita
enc_A = digitalRead (pin_A);
enc_A_prev = enc_A;
currentTime = millis ();
míg ((millis () - currentTime) <2000) {
button1.scanState ();
if (button1.flagClick == true) {
// gombra kattintás történt
button1.flagClick = false; // kattintási attribútum visszaállítása
knopka ();
}
}
// késleltetés (1000); // talán 750 ms elég, talán nem
// itt elvégezhetjük a ds.depower () parancsot, de a visszaállítás gondoskodik róla.
jelen = ds.reset ();
ds.select (addr);
ds.írás (0xBE); // Olvassa el a Scratchpadot
mert (i = 0; i <9; i ++) {// 9 bájtra van szükségünk
adatok [i] = ds.read ();
}
// Konvertálja az adatokat a tényleges hőmérsékletre
// mivel az eredmény egy 16 bites aláírt egész szám, akkor kell
// "int16_t" típusú, amely mindig 16 bit
// még 32 bites processzoron történő fordításkor is.
int16_t raw = (adatok [1] << 8) | adatok [0];
if (type_s) {
nyers = nyers << 3; // 9 bites felbontás alapértelmezett
if (adatok [7] == 0x10) {
// A "szám marad" teljes 12 bites felbontást ad
nyers = (nyers és 0xFFF0) + 12 - adatok [6];
}
} egyéb {
cfg byte = (adatok [4] és 0x60);
// alacsonyabb felbontásnál az alacsony bitek nincs meghatározva, tehát nullázjuk őket
if (cfg == 0x00) nyers = nyers & ~ 7; // 9 bites felbontás, 93,75 ms
egyébként, ha (cfg == 0x20) raw = raw & ~ 3; // 10 bites res, 187,5 ms
egyébként, ha (cfg == 0x40) nyers = nyers & ~ 1; // 11 bites res, 375 ms
//// Az alapértelmezett beállítás 12 bites felbontás, 750 ms átalakítási idő
}
celsius = (úszó) nyers / 16,0;
lcd.clear ();
lcd.setCursor (1,0);
lcd.print (celsius);
if (priz) {
lcd.setCursor (0,1);
lcd.print ('*');
}
if (n_pr! = b_pr) {
if (celsius b_pr) {
digitalWrite (11, LOW);
priz = hamis;
}
}
}
// gomb állapot ellenőrzési módszer
// flagPress = true - kattintva
// flagPress = false - megnyomva
// flagClick = true - kattintottak (kattintás)
void Button :: scanState () {
if (flagPress == (! digitalRead (_pin))) {
// a jel állapota változatlan marad
_buttonCount = 0; // állítsa alaphelyzetbe a jelállapot-számlálót
}
egyéb {
// a jel állapota megváltozott
_buttonCount ++; // +1 a jelállapot-számlálóhoz
if (_buttonCount> = _timeButton) {
// A jel állapota nem változtatta meg a megadott időt
// a jel állapota stabil lett
flagPress =! flagPress; // az állapotjelző fordított értéke
_buttonCount = 0; // állítsa alaphelyzetbe a jelállapot számlálót
if (flagPress == true) flagClick = true; // a kattintás jele
}
}
}
// módszer a kimeneti szám és a megerősítési idő beállítására
void Button :: setPinTime (byte pin, byte timeButton) {
_pin = tű;
_timeButton = timeButton;
pinMode (_pin, INPUT_PULLUP); // definiálja a kimenetet bemenetként
}
// a Button osztály építőjének leírása
Gomb :: Gomb (byte pin, byte timeButton) {
_pin = tű;
_timeButton = timeButton;
pinMode (_pin, INPUT_PULLUP); // definiálja a kimenetet bemenetként
}