Pada mulanya, termostat dibuat hanya sebagai termometer untuk mengawal suhu di luar tingkap. Kemudian, semasa beku, kentang mula membekukan bawah tanah dan fungsi telah ditambah untuk mengawal mikroiklim. Data pasport geganti pensuisan - 250V dan 10A (2.5kW). Oleh kerana haba di bawah tanah tidak diperlukan, sepuluh kilowatt cukup.
Bahan dan alat yang diperlukan:kotak penjagaan kasut
-USB-pengisian untuk telefon (mana-mana, sekurang-kurangnya 0.7A)
-
Arduino-Pro-Mini
-2-line 8 paparan aksara (WH0802A-NGA-CT lebih padat)
Pengekod dengan butang (boleh dibeli di mana-mana radio radio, butang itu tidak boleh dibina)
-Semua dengan relay 5V (Saya membeli sekelip relay Cina tanpa pengasingan optik pada satu masa, jadi saya memerlukan satu lagi Optocoupler PC817 dan 470 Ohm perintang.Jika anda mempunyai pengasingan optik pada papan nama, anda boleh menyambung papan nama terus ke pelabuhan arduino)
Penyambung USB
-2 kabel sambungan USB 3-meter (satu untuk kord kuasa, untuk kedua kami solder DS1820)
- DS1820 (dengan mana-mana surat)
besi pematerian
-glue gun
Namakan FTDI232
Langkah 1: Pertama sekali, kita perlu menghidupkan arduino, kerana saya mempunyai Pro Mini (ia tidak menggunakan penukar USB-RS232), saya perlu menyeberang penguasa dengan pin ke arduino. Dari sisi di mana DTR, TXD, RXD, VCC, GND, GND diperolehi. Kini kami menyambungkan FTDI232 DTR ke DTR, VCC ke VCC, GND ke GND, TXD ke RXD, RXD ke TXD. Jalankan IDE arduino, muat turun lakaran dan gambarkannya (lakaran di hujung).
Langkah 2: Sekarang mari kita menjaga badan. Kami merobek span di "FUKS", meresap semuanya dengan baik, bahagian dalam kotak boleh dilepaskan dengan kain emerg (sesuatu yang akan menjadi lebih baik). Tanda lubang untuk encoder, penyambung USB (ibu) dan paparan itu sendiri. Letakkan relay ke penutup kotak. Kita harus cuba meletakkan relay lebih jauh dari pemproses dan mengatur komponen supaya tudung ditutup kemudian (terdapat banyak ruang).
Langkah 3: Sekarang kita mengambil kabel sambungan USB, memotong soket penyambung (ibu). Kami memotong hujung putar, menggerudi lubang untuk kabel di dalam badan, memasukkannya dan lem kunci dengan pistol. Selain itu, kabel itu mempunyai warna merah, tolak hitam (saya cuma menyemaknya), ditambah tambah penyambung, tolak tolaknya (saya tidak memberi pinout penyambung - itu di Internet). Antara tambah penyambung dan 2 medium (saya mempunyai sambungan), sebuah perintang 4.7kOhm mesti dipateri.
Langkah 4: Kami mengambil 2 kabel sambungan USB, memotong penyambung (ibu), memotong kabel. Sekiranya, kami akan memeriksa sama ada kami semua dipateri dengan betul. Kami menyambungkan kabel kuasa dengan pengecasan USB dan ke rangkaian, melekatkan kabel potong ke penyambung USB, lihat penguji + pada warna merah hitam. Kami mengeluarkan kabel dan solder DS1820: - hingga 1, + 3 baki 2 wayar ke 2. Saya kemudian melekatkan sebatian epoksi (untuk pembaikan tangki, radiator), meninggalkan sedikit perumahan sensor ke luar, supaya akan ada tindak balas yang lebih cepat terhadap perubahan suhu.Nah, kami melakukan pemasangan mengikut gambarajah litar (kami menyambung kuasa dan tanah plat relay dengan litar biasa + dan -) masing-masing).
Langkah 5: Semua komponen litar disambungkan. Kami menyambung sensor kami (tanpa ia, paparan akan kekal hitam), menggunakan kuasa. Dalam baris pertama - nilai suhu, dalam 2 jika "*" dihidupkan - geganti dihidupkan, tidak dimatikan. Sekarang mari kita cuba untuk menetapkan had beralih geganti. Tekan aci pengekod (atau butang anda) nilai had muncul di mana geganti akan dihidupkan dengan berputar aci - peningkatan atau penurunan nilai. Dengan mengklik pada batang sekali lagi - kami mendapat had atas (geganti akan dimatikan), tetapkan nilai dan tekan lagi. Peranti akan memantau suhu, nilai had dikekalkan apabila kuasa dimatikan. Itu sahaja.
#include
#include
#include
#define BUTTON_1_PIN 10 // bilangan output butang 1 adalah 12
OneWire ds (12); // pada pin 10 (perintang 4.7K diperlukan)
// mulakan pustaka dengan bilangan pin antaramuka
Lcd kristal cecair (3, 2, 4, 5, 6, 7);
semasa semasa yang tidak ditandatangani;
int int pin_A = 8; // pin 12
int int pin_B = 9; // pin 11
char unsigned enc_A;
charign tidak cek enc_B;
char unsigned enc_A_prev = 0;
terapung n_pr = 24.1;
float b_pr = 26.2;
boolean priz = false;
kelas Button {
awam:
Butang (pin byte, byte timeButton); // penerangan pembina
bendera boolean; // butang bendera kini ditekan
bendera booleanKlik; // butang bendera ditekan (klik)
void scanState (); // kaedah untuk memeriksa keadaan isyarat
tidak sah setPinTime (pin byte, byte timeButton); // kaedah untuk menetapkan nombor output dan masa pengesahan (nombor)
peribadi:
byte _buttonCount; // kaunter pengesahan negeri yang stabil
byte _timeButton; // butang masa pengesahan negeri
byte _pin; // nombor pin
};
Butang butang1 (BUTTON_1_PIN, 30);
batal knopka () {
lcd.clear ();
lcd.setCursor (1,0);
lcd.print (n_pr);
// button1.scanState ();
sementara (button1.flagClick == false) {
enc_A = digitalRead (pin_A);
enc_B = digitalRead (pin_B);
jika ((enc_A) && (enc_A_prev)) {
jika (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);
sementara (button1.flagClick == false) {
enc_A = digitalRead (pin_A);
enc_B = digitalRead (pin_B);
jika ((enc_A) && (enc_A_prev)) {
jika (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;
jika (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);
kelewatan (300);
}
void setup (void) {
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;
jika (c == 'y') {
EEPROM.get (addr, n_pr);
addr + = sizeof (float);
EEPROM.get (addr, b_pr);
}
// Serial.begin (9600);
}
kekosongan gelung (batal) {
byte i;
byte present = 0;
type_s byte;
data bait [12];
tambah bait [8];
float celsius;
jika (! ds.search (addr)) {
ds.reset_search ();
kelewatan (250);
kembali
}
jika (OneWire :: crc8 (addr, 7)! = addr [7]) {
kembali
}
/ // ROM pertama byte menunjukkan cip yang mana
suis (addr [0]) {
kes 0x10:
type_s = 1;
pecah;
kes 0x28:
type_s = 0;
pecah;
kes 0x22:
type_s = 0;
pecah;
lalai:
kembali
}
ds.reset ();
ds.select (addr);
ds.write (0x44, 1); // penukaran mula, dengan kuasa parasit pada akhir
enc_A = digitalRead (pin_A);
enc_A_prev = enc_A;
currentTime = millis ();
sementara ((millis () - currentTime) <2000) {
button1.scanState ();
jika (button1.flagClick == true) {
// terdapat klik butang
button1.flagClick = false; // reset atribut klik
knopka ();
}
}
/ // delay (1000); / Mungkin 750ms cukup, mungkin tidak
/ / kami mungkin melakukan ds.depower () di sini, tetapi tetapan semula akan mengurusnya.
sekarang = ds.reset ();
ds.select (addr);
ds.write (0xBE); // Baca Scratchpad
untuk (i = 0; i <9; i ++) {// kita memerlukan 9 bait
data [i] = ds.read ();
}
// Mengkonversi data ke suhu sebenar
// kerana hasilnya adalah integer ditandatangani 16 bit, ia sepatutnya
/ / disimpan ke jenis "int16_t", yang sentiasa 16 bit
// walaupun dikompilasi pada pemproses 32 bit.
int16_t raw = (data [1] << 8) | data [0];
jika (type_s) {
mentah = mentah << 3; / // 9 lalai resolusi lalai
jika (data [7] == 0x10) {
// "kiraan kekal" memberikan resolusi 12 bit penuh
mentah = (mentah & 0xFFF0) + 12 - data [6];
}
} else {
byte cfg = (data [4] & 0x60);
/ / pada res yang rendah, bit rendah tidak ditentukan, jadi mari sifar mereka
jika (cfg == 0x00) mentah = mentah & ~ 7; @ // 9 bit resolution, 93.75 ms
lain jika (cfg == 0x20) mentah = mentah & ~ 3; // 10 bit res, 187.5 ms
lain jika (cfg == 0x40) mentah = mentah & ~ 1; / / 11 bit res, 375 ms
//// lalai ialah resolusi 12 bit, masa penukaran 750 ms
}
celsius = (terapung) mentah / 16.0;
lcd.clear ();
lcd.setCursor (1,0);
lcd.print (celsius);
jika (priz) {
lcd.setCursor (0,1);
lcd.print ('*');
}
jika (n_pr! = b_pr) {
jika (celsius b_pr) {
digitalWrite (11, LOW);
priz = false;
}
}
}
// kaedah pemeriksaan negeri butang
// flagPress = true - clicked
// flagPress = false - pressed
// flagClick = true - diklik (klik)
Kekosongan Butang :: scanState () {
jika (flagPress == (! digitalRead (_pin))) {
// negeri isyarat tetap sama
_buttonCount = 0; / / reset kaunter status isyarat
}
lain {
// negeri isyarat telah berubah
_buttonCount ++; // +1 ke kaunter keadaan isyarat
jika (_buttonCount> = _timeButton) {
// negeri isyarat tidak mengubah masa yang ditetapkan
// negeri isyarat telah menjadi stabil
flagPress =! flagPress; // songsang penunjuk status
_buttonCount = 0; / / reset kaunter status isyarat
jika (flagPress == true) flagClick = true; // tanda klik pada klik
}
}
}
// kaedah untuk menetapkan nombor output dan masa pengesahan
Kekosongan Butang :: setPinTime (pin byte, byte timeButton) {
_pin = pin;
_timeButton = timeButton;
pinMode (_pin, INPUT_PULLUP); / / menentukan output sebagai input
}
/ description of the constructor of the Button class
Butang :: Butang (pin byte, byte timeButton) {
_pin = pin;
_timeButton = timeButton;
pinMode (_pin, INPUT_PULLUP); / / menentukan output sebagai input
}