Zpočátku byl termostat vyroben jednoduše jako teploměr pro regulaci teploty mimo okno. Poté, během mrazů, brambory začaly mrazit pod zemí a byla přidána funkčnost pro kontrolu mikroklima. Pasová data spínacího relé - 250V a 10A (2,5kW). Protože teplo v podzemí není potřeba, stačí deset na kilowatt.
Potřebné materiály a nářadí:krabice na péči o boty
-USB-nabíjení telefonu (libovolné, nejméně 0,7A)
-
Arduino-Pro-Mini
2řádkový 8-znakový displej (WH0802A-NGA-CT je kompaktnější)
Enkodér s tlačítkem (lze zakoupit v jakémkoli rádiovém zásobníku, tlačítko nelze zabudovat)
-Školka s 5V relé (koupil jsem spoustu čínských relé bez optické izolace najednou, takže jsem potřeboval další Optocoupler PC817 a 470 Ohmový rezistor. Pokud máte optickou izolaci na typovém štítku, můžete připojit jmenovku přímo k portu arduino)
USB konektor
-2 prodlužovací kabel USB 3 metry (jeden pro napájecí kabel, do druhého jsme pájeli DS1820)
- DS1820 (s jakýmkoli písmenem)
páječka
lepicí pistole
Typový štítek FTDI232
Krok 1: Nejprve musíme arduino flashovat, protože mám Pro Mini (jde to bez převaděče USB-RS232), musím pájet pravítko s kolíky na arduino. Ze strany, kde jsou odvozeny DTR, TXD, RXD, VCC, GND, GND. Nyní připojujeme FTDI232 DTR k DTR, VCC k VCC, GND k GND, TXD k RXD, RXD k TXD. Spusťte arduino IDE, stáhněte si skicu a proveďte flash (skica na konci).
Krok 2: Nyní se postaráme o trup. Odtrhneme houbu na „FUKS“, všechno dobře odmastíme, hlubokou část krabice lze přenést smirkovým hadříkem (něco by se lepilo lépe). Označte otvor pro kodér, konektor USB (matka) a samotný displej. Přilepte relé na kryt krabice. Musíme se pokusit umístit relé pryč od procesoru a uspořádat komponenty tak, aby se víko později zavřelo (je zde dostatek místa).
Krok 3: Nyní vezmeme prodlužovací kabel USB, odpojte konektorovou zásuvku (matka). Odřízneme konec řezu, vyvrtáme otvor pro kabel do těla, vložíme ho a klíč zalepíme pistolí. Kabel má navíc červenou, minus černou (jen to zkontroluji) plus plus konektoru, mínus mínus (nedám pinout konektoru - je na internetu). Mezi plusem konektoru a 2 médiem (musím je připojit) musí být pájen odpor 4,7 kOhm.
Krok 4: Vezmeme 2 prodlužovací kabely USB, odřízneme konektor (matka) a odřízneme kabel. Jen pro případ, zkontrolujeme, zda jsme všichni správně pájení. Připojíme napájecí kabel s nabíjením USB a do sítě, zasuneme přerušený kabel do konektoru USB, podívejte se na tester + na červenou - na černou. Vytáhneme kabel a pájíme DS1820: - na 1, + na 3 zbývající 2 dráty na 2. Poté nanesu epoxidovou směs (na opravu nádrží, radiátorů) a ponechám trochu krytu senzoru směrem ven, aby došlo k rychlejší reakci na změny teploty.Instalaci provádíme podle schématu zapojení (propojíme výkon a kostru reléové desky s běžnými + a - obvody).
Krok 5: Jsou připojeny všechny součásti obvodu. Připojíme náš senzor (bez něj, displej zůstane černý), připojíme napájení. V prvním řádku - hodnota teploty, ve 2, pokud je „*“ - relé je zapnuto, ne - vypnuto. Nyní zkusme nastavit meze spínání relé. Stiskněte hřídel enkodéru (nebo tlačítko), objeví se mezní hodnota, při které se relé sepne otáčením hřídele - hodnota se zvýší nebo sníží. Opětovným kliknutím na hřídel - dostaneme horní limit (relé se vypne), nastavíme hodnotu a znovu stiskneme. Zařízení bude sledovat teplotu, hodnota limitů je zachována i po vypnutí napájení. To je vše.
#include
#include
#include
#define BUTTON_1_PIN 10 // výstupní číslo tlačítka 1 je 12
OneWire ds (12); // na pinu 10 (je nutný rezistor 4,7 K)
// inicializuje knihovnu pomocí čísel kolíků rozhraní
Tekutý krystal lcd (3, 2, 4, 5, 6, 7);
nepodepsaný dlouhý proudTime;
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čítko třídy {
veřejnost:
Tlačítko (byte pin, byte timeButton); // popis konstruktoru
boolean flagPress; // je nyní stisknuto tlačítko příznaku
boolean flagClick; // bylo stisknuto tlačítko příznaku (klikněte)
void scanState (); // metoda pro kontrolu stavu signálu
void setPinTime (byte pin, byte timeButton); // metoda pro nastavení výstupního čísla a času potvrzení (číslo)
soukromé:
byte _buttonCount; // čítač potvrzení stavu
byte _timeButton; // čas potvrzení stavu tlačítka
byte _pin; // číslo PIN
};
Tlačítko button1 (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;
} jinde {
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;
} jinde {
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);
zpoždění (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;
if (c == 'y') {
EEPROM.get (addr, n_pr);
addr + = sizeof (float);
EEPROM.get (addr, b_pr);
}
// Serial.egegin (9600);
}
void loop (void) {
byte i;
byte present = 0;
byte type_s;
bajtová data [12];
byte addr [8];
float celsius;
if (! ds.search (addr)) {
ds.reset_search ();
zpoždění (250);
návrat
}
if (OneWire :: crc8 (addr, 7)! = addr [7]) {
návrat
}
// první ROM bajt označuje, který čip
switch (addr [0]) {
případ 0x10:
type_s = 1;
rozbít;
případ 0x28:
type_s = 0;
rozbít;
případ 0x22:
type_s = 0;
rozbít;
výchozí:
návrat
}
ds.reset ();
ds.select (addr);
ds.write (0x44, 1); // zahájit konverzi, na konci se zapne parazit
enc_A = digitalRead (pin_A);
enc_A_prev = enc_A;
currentTime = millis ();
while ((millis () - currentTime) <2000) {
button1.scanState ();
if (button1.flagClick == true) {
// došlo k kliknutí na tlačítko
button1.flagClick = false; // reset click click attribute
knopka ();
}
}
// zpoždění (1000); // možná 750ms stačí, možná ne
// můžeme zde provést ds.depower (), ale reset se o to postará.
present = ds.reset ();
ds.select (addr);
ds.write (0xBE); // Přečtěte si zápisník
pro (i = 0; i <9; i ++) {// potřebujeme 9 bytů
data [i] = ds.read ();
}
// Převeďte data na skutečnou teplotu
// protože výsledkem je 16 bitové celé číslo se znaménkem, mělo by
// být uložen do typu "int16_t", což je vždy 16 bitů
// i když je kompilován na 32bitovém procesoru.
int16_t raw = (data [1] << 8) | data [0];
if (type_s) {
raw = raw << 3; // 9 bitové rozlišení výchozí
if (data [7] == 0x10) {
// "count zůstane" dává plné 12 bitové rozlišení
raw = (raw & 0xFFF0) + 12 - data [6];
}
} jinde {
byte cfg = (data [4] & 0x60);
// při nižším rozlišení jsou nízké bity nedefinované, takže je vynulovejte
pokud (cfg == 0x00) raw = raw & ~ 7; // 9 bitové rozlišení, 93,75 ms
jinak pokud (cfg == 0x20) raw = raw & ~ 3; // 10 bit res, 187,5 ms
jinak pokud (cfg == 0x40) raw = raw & ~ 1; // 11 bit res, 375 ms
//// výchozí je rozlišení 12 bitů, doba převodu 750 ms
}
celsius = (float) raw / 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 = false;
}
}
}
// metoda kontroly stavu tlačítka
// flagPress = true - kliknutí
// flagPress = false - stisknuto
// flagClick = true - bylo kliknuto (kliknout)
void Button :: scanState () {
if (flagPress == (! digitalRead (_pin))) {
// stav signálu zůstává stejný
_buttonCount = 0; // reset čítače stavu signálu
}
jinde {
// změnil se stav signálu
_buttonCount ++; // +1 k čítači stavu signálu
if (_buttonCount> = _timeButton) {
// stav signálu nezměnil určený čas
// stav signálu se stal stabilním
flagPress =! flagPress; // inverzní stavový indikátor
_buttonCount = 0; // reset čítače stavu signálu
if (flagPress == true) flagClick = true; // znamení kliknutí na kliknutí
}
}
}
// metoda pro nastavení výstupního čísla a času potvrzení
void Button :: setPinTime (byte pin, byte timeButton) {
_pin = pin;
_timeButton = timeButton;
pinMode (_pin, INPUT_PULLUP); // definuje výstup jako vstup
}
// popis konstruktoru třídy Button
Button :: Button (byte pin, byte timeButton) {
_pin = pin;
_timeButton = timeButton;
pinMode (_pin, INPUT_PULLUP); // definuje výstup jako vstup
}