Spočiatku bol termostat vyrobený jednoducho ako teplomer na reguláciu teploty mimo okna. Potom, počas mrazov, zemiaky začali zamrznúť v podzemí a pridala sa funkčnosť na kontrolu mikroklímy. Pasové údaje spínacieho relé - 250 V a 10 A (2,5 kW). Pretože teplo v podzemí nie je potrebné, stačí desať na kilowatth.
Potrebné materiály a náradie:krabica na ošetrovanie obuvi
-USB nabíjanie telefónu (ľubovoľné, najmenej 0,7 A)
-
Arduino-Pro-Mini
2-riadkový 8-znakový displej (WH0802A-NGA-CT je kompaktnejší)
Enkodér s tlačidlom (dá sa kúpiť v ľubovoľnom rádiovom magazíne, tlačidlo nie je možné zabudovať)
-Školka s 5 V relé (kúpil som si veľa čínskych relé bez optickej izolácie súčasne, takže som potreboval ďalší Optocoupler PC817 a 470 Ohmový rezistor. Ak máte optickú izoláciu na štítku, môžete pripojiť štítok priamo k portu arduino)
USB konektor
-2 predlžovací kábel USB s dĺžkou 3 metre (jeden pre napájací kábel, do druhého sme spájkovali DS1820)
- DS1820 (s akýmkoľvek písmenom)
spájkovačka
lepiaca pištoľ
Typový štítok FTDI232
Krok 1: Najprv musíme arduino blesknúť, pretože mám Pro Mini (ide to bez prevodníka USB-RS232), musím na arduino pripájať pravítko s kolíkmi. Zo strany, kde sú odvodené DTR, TXD, RXD, VCC, GND, GND. Teraz pripájame FTDI232 DTR na DTR, VCC na VCC, GND na GND, TXD na RXD, RXD na TXD. Spustite arduino IDE, stiahnite náčrt a blesknite (náčrt na konci).
Krok 2: Teraz sa postaráme o trup. Špongiu roztrhneme na „FUKS“, všetko dobre odmasťujeme, hlboká časť škatule sa dá preosiať šmirgľovou handrou (niečo by sa lepilo lepšie). Označte otvor pre kodér, konektor USB (matka) a samotný displej. Prilepte relé na kryt skrinky. Musíme sa pokúsiť umiestniť relé ďalej od procesora a usporiadať komponenty tak, aby sa veko neskôr zavrelo (je tu dostatok miesta).
Krok 3: Teraz vezmeme predlžovací kábel USB, odpojte konektorovú zásuvku (matka). Odrezali sme koniec, vyvŕtajte otvor pre kábel do tela, vložte ho a kľúč zalepte pištoľou. Kábel je navyše červený, mínus čierny (len to skontrolujem), plus plus konektora, mínus mínus (nedám pinout konektoru - je na internete). Medzi kladom konektora a 2 médiom (mám ich zapojené) musí byť spájkovaný odpor 4,7 kOhm.
Krok 4: Berieme 2 predlžovacie káble USB, odrežeme konektor (matka) a odrežeme kábel. Len pre prípad, skontrolujeme, či sme všetci správne spájkovaní. Pripojíme napájací kábel s nabíjaním cez USB a do siete, zastrčený kábel vložte do konektora USB, pozrite sa na tester + červený - na čierny. Vyťahujeme kábel a spájkujeme DS1820: - na 1, + 3 zvyšné 2 drôty na 2. Potom nanesieme epoxidovú zmes (na opravu nádrží, radiátorov) a ponechám trochu krytu senzora smerom von, aby došlo k rýchlejšej reakcii na zmeny teploty.Inštaláciu robíme podľa schémy zapojenia (napájanie a uzemnenie dosky relé spájame so spoločnými obvodmi + a -).
Krok 5: Pripojené sú všetky súčasti obvodu. Pripojíme náš snímač (bez neho, displej zostane čierny), pripojíme napájanie. V prvom riadku - teplota, v 2, ak je “*” - relé je zapnuté, nie - vypnuté. Teraz skúste nastaviť limity spínania relé. Po stlačení hriadeľa snímača (alebo vášho tlačidla) sa objaví limitná hodnota, pri ktorej sa zapne relé otáčaním hriadeľa - hodnota sa zvyšuje alebo znižuje. Opätovným kliknutím na hriadeľ dosiahneme hornú hranicu (relé sa vypne), nastavíme hodnotu a znova stlačíme. Prístroj bude monitorovať teplotu, hodnota limitov sa zachová aj po vypnutí napájania. To je všetko.
#include
#include
#include
#define BUTTON_1_PIN 10 // výstupné číslo tlačidla 1 je 12
OneWire ds (12); // na kolíku 10 (je potrebný odpor 4,7 K)
// inicializuje knižnicu číslami kolíkov rozhrania
Tekutý kryštál lcd (3, 2, 4, 5, 6, 7);
dlhá doba bez podpisuTime;
const int pin_A = 8; // pin 12
const int pin_B = 9; // pin 11
unsigned char enc_A;
unsigned char enc_B;
unsigned char enc_A_prev = 0;
float n_pr = 24,1;
float b_pr = 26,2;
boolean priz = false;
Tlačidlo triedy {
public:
Tlačidlo (byte pin, byte timeButton); // popis konštruktora
boolean flagPress; // je teraz stlačené vlajkové tlačidlo
boolean flagClick; // bolo stlačené vlajkové tlačidlo (kliknutie)
void scanState (); // metóda kontroly stavu signálu
void setPinTime (byte pin, byte timeButton); // metóda nastavenia výstupného čísla a času potvrdenia (číslo)
private:
byte _buttonCount; // počítadlo potvrdenia stabilného stavu
byte _timeButton; // čas potvrdenia stavu tlačidla
byte _pin; // číslo PIN
};
Tlačidlo 1 (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 = digitalRead (pin_B);
if ((! enc_A) && (enc_A_prev)) {
if (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 = false;
lcd.clear ();
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;
} 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 = false;
if (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);
oneskorenie (300);
}
void setup (void) {
pinMode (11, VÝSTUP);
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;
ak (c == 'y') {
EEPROM.get (addr, n_pr);
addr + = sizeof (float);
EEPROM.get (addr, b_pr);
}
// Serialegegin (9600);
}
void loop (void) {
bajt i;
prítomný bajt = 0;
byte type_s;
bajtové údaje [12];
byte addr [8];
float celsius;
if (! ds.search (addr)) {
ds.reset_search ();
oneskorenie (250);
return;
}
if (OneWire :: crc8 (addr, 7)! = addr [7]) {
return;
}
// prvý bajt ROM označuje, ktorý čip
prepínač (addr [0]) {
prípad 0x10:
type_s = 1;
break;
prípad 0x28:
type_s = 0;
break;
prípad 0x22:
type_s = 0;
break;
default:
return;
}
ds.reset ();
ds.select (addr);
ds.write (0x44, 1); // začatie konverzie so zapnutým parazitom na konci
enc_A = digitalRead (pin_A);
enc_A_prev = enc_A;
currentTime = millis ();
while ((millis () - currentTime) <2000) {
button1.scanState ();
if (button1.flagClick == true) {
// kliknutie na tlačidlo
button1.flagClick = false; // reset click click attribute
knopka ();
}
}
// oneskorenie (1000); // Možno 750ms stačí, možno nie
// tu by sme mohli urobiť ds.depower (), ale reset sa o to postará.
present = ds.reset ();
ds.select (addr);
ds.write (0xBE); // Prečítajte si zápisník
pre (i = 0; i <9; i ++) {// potrebujeme 9 bajtov
údaje [i] = ds.read ();
}
// Prevod údajov na skutočnú teplotu
// pretože výsledkom je celé 16-bitové celé číslo so znamienkom, malo by byť
// byť uložený do typu „int16_t“, ktorý je vždy 16 bitov
// aj keď je kompilovaný na 32 bitovom procesore.
int16_t raw = (údaje [1] << 8) | údaje [0];
if (type_s) {
surový = surový << 3; // Predvolené rozlíšenie 9 bitov
if (data [7] == 0x10) {
// "count zostáva" dáva plné 12 bitové rozlíšenie
raw = (raw & 0xFFF0) + 12 - údaje [6];
}
} else {
byte cfg = (dáta [4] & 0x60);
// pri nižších rozlíšeniach sú nízke bity nedefinované, takže ich vynulujte
ak (cfg == 0x00) raw = raw & ~ 7; // 9 bitové rozlíšenie, 93,75 ms
inak ak (cfg == 0x20) raw = raw & ~ 3; // 10 bit res, 187,5 ms
inak ak (cfg == 0x40) raw = raw & ~ 1; // 11 bit res, 375 ms
//// predvolené je rozlíšenie 12 bitov, doba konverzie 750 ms
}
celsius = (float) raw / 16,0;
lcd.clear ();
lcd.setCursor (1,0);
lcdprint (celsius);
if (priz) {
lcd.setCursor (0,1);
lcd.print ('*');
}
if (n_pr! = b_pr) {
if (celsius b_pr) {
digitalWrite (11, LOW);
priz = false;
}
}
}
// metóda kontroly stavu tlačidla
// flagPress = true - kliklo sa
// flagPress = false - stlačené
// flagClick = true - kliklo sa (kliknutie)
void Button :: scanState () {
if (flagPress == (! digitalRead (_pin))) {
// stav signálu zostáva rovnaký
_buttonCount = 0; // vynuluje počítadlo stavu signálu
}
else {
// zmenil sa stav signálu
_buttonCount ++; // +1 k počítadlu stavu signálu
if (_buttonCount> = _timeButton) {
// signálny stav nezmenil určený čas
// stav signálu sa stal stabilným
flagPress =! flagPress; // inverzia indikátora stavu
_buttonCount = 0; // vynuluje počítadlo stavu signálu
if (flagPress == true) flagClick = true; // znamenie kliknutia na kliknutie
}
}
}
// metóda na nastavenie výstupného čísla a času potvrdenia
void Button :: setPinTime (byte pin, byte timeButton) {
_pin = pin;
_timeButton = timeButton;
pinMode (_pin, INPUT_PULLUP); // definuje výstup ako vstup
}
// popis konštruktora triedy Button
Tlačidlo :: Tlačidlo (bajtový pin, bajtový časový spínač) {
_pin = pin;
_timeButton = timeButton;
pinMode (_pin, INPUT_PULLUP); // definuje výstup ako vstup
}