Başlangıçta, termostat, pencerenin dışındaki sıcaklığı kontrol etmek için basitçe bir termometre olarak yapılmıştır. Daha sonra, donlar sırasında, patatesler yeraltında donmaya başladı ve mikro iklimi kontrol etmek için işlevsellik eklendi. Anahtarlama rölesinin pasaport verileri - 250V ve 10A (2.5kW). Yeraltındaki ısıya ihtiyaç olmadığından, kilowatt başına on yeterlidir.
Gerekli malzemeler ve aletler:ayakkabı bakım kutusu
-Telefon için USB şarjı (herhangi bir, en az 0.7A)
-
ArduinoPro-Mini
-2 satır 8 karakter ekran (WH0802A-NGA-CT daha kompakttır)
Bir düğme ile kodlayıcı (herhangi bir radyo mag'da satın alınabilir, düğme yerleşik olamaz)
-5V röle ile schild (bir kerede optik izolasyon olmadan bir grup Çin rölesi satın aldım, bu yüzden başka bir Optocoupler PC817 ve 470 Ohm direnç gerekiyordu. İsim plakasında optik izolasyon varsa, isim plakasını doğrudan arduino bağlantı noktasına bağlayabilirsiniz)
USB konektörü
-2 3 metrelik USB uzatma kablosu (biri güç kablosu için, DS1820'yi lehimledikten sonra)
- DS1820 (herhangi bir harfle)
havya
tutkal tabancası
Etiket FTDI232
Adım 1: Her şeyden önce, arduino'yu yanıp sönmeliyiz, çünkü bir Pro Mini (USB-RS232 dönüştürücü olmadan gider), arduino'ya pinli bir cetvel lehimlemem gerekiyor. DTR, TXD, RXD, VCC, GND, GND'nin türetildiği taraftan. Şimdi FTDI232 DTR'yi DTR, VCC'den VCC'ye, GND'den GND'ye, TXD'den RXD'ye, RXD'den TXD'ye bağlarız. Arduino IDE'yi çalıştırın, çizimi indirin ve flaşlayın (sonunda çizim).
Adım 2: Şimdi gövdeye bakalım. Süngeri “FUKS” da yırtıyoruz, her şeyi iyice yağdan arındırıyoruz, kutunun derin kısmı zımpara bezi ile geçirilebilir (bir şey daha sıkı sıkışır). Kodlayıcı, USB konektörü (ana) ve ekranın kendisi için deliği işaretleyin. Röleyi kutu kapağına yapıştırın. Röleyi işlemciden uzağa yerleştirmeye çalışmalı ve bileşenleri kapak daha sonra kapanacak şekilde ayarlamalıyız (yeterli alan var).
Adım 3: Şimdi USB uzatma kablosunu alıyoruz, konektör soketini (anne) kesin. Kesme ucunu kestik, vücuttaki kablo için bir delik deliyoruz, yerleştiriyoruz ve anahtarı bir tabanca ile yapıştırıyoruz. Artı, kablonun kırmızı, eksi siyah (sadece kontrol ediyorum), artı konektörün artı eksi eksi (Konektörün fişini vermiyorum - internette). Konnektörün artı ve 2 ortamı (onları bağladım) arasında bir 4.7kOhm direnç lehimlenmelidir.
Adım 4: 2 USB uzatma kablosu alıyoruz, konektörü (anne) kesiyoruz, kabloyu kesiyoruz. Her ihtimale karşı, hepimizin doğru şekilde lehimlenmiş olup olmadığını kontrol edeceğiz. Güç kablosunu USB şarjlı ve ağa bağlarız, kesik kabloyu USB konektörüne yapıştırırız, test cihazına + kırmızı - siyaha bakarız. Kabloyu çekip DS1820'yi lehimliyoruz: - kalan 2 kabloyu 2'ye 2, - 3'e kadar. Daha sonra epoksi bileşiğini (tankları, radyatörleri onarmak için) kaplayarak, sensör muhafazasının biraz dışına doğru bırakarak, sıcaklık değişikliklerine daha hızlı bir reaksiyon olacak.Montajı devre şemasına göre yapıyoruz (röle plakasının gücünü ve toprağını sırasıyla ortak + ve - devrelere bağlarız).
Adım 5: Tüm devre bileşenleri bağlıdır. Sensörümüzü bağlarız (onsuz, ekran siyah kalır), güç uygularız. İlk satırda - sıcaklık değeri, “*” açıksa 2'de - röle açık, yok - kapalı. Şimdi röle anahtarlama sınırlarını ayarlamaya çalışalım. Kodlayıcı şaftına (ya da düğmenize) basın, mili döndürerek rölenin açılacağı limit değeri görünür - değer artar ya da azalır. Mili tekrar tıklatarak - üst sınırı alırız (röle kapanır), değeri ayarlayın ve tekrar basın. Cihaz sıcaklığı izleyecektir, güç kapatıldığında sınırların değeri korunur. Hepsi bu.
#include
#include
#include
#define BUTTON_1_PIN 10 // 1 numaralı düğmenin çıkış sayısı 12'dir
OneWire ds (12); // pin 10'da (4.7K direnç gereklidir)
// kütüphaneyi arayüz pinlerinin numaralarıyla başlat
Likit Kristal lcd (3, 2, 4, 5, 6, 7);
imzasız uzun currentTime;
const int pin_A = 8; // pim 12
const int pin_B = 9; // pim 11
imzasız karakter enc_A;
imzasız karakter enc_B;
imzasız karakter enc_A_prev = 0;
şamandıra n_pr = 24.1;
şamandıra b_pr = 26.2;
boolean priz = yanlış;
sınıf Düğmesi {
kamu:
Düğme (bayt pin, bayt timeButton); // kurucu açıklaması
boolean flagBasın; // bayrak düğmesine artık basıldı
boole bayrağı tıklayın; // bayrak düğmesine basıldı (tıklayın)
void scanState (); // sinyal durumunu kontrol etme yöntemi
void setPinTime (bayt pin, bayt timeButton); // çıkış numarasını ve onay süresini (sayı) ayarlama yöntemi
özel:
bayt _buttonCount; // kararlı durum onay sayacı
bayt _zamanButton; // düğme durumu onay süresi
bayt _pin; // pin numarası
};
Düğme düğmesi1 (BUTTON_1_PIN, 30);
void knopka () {
lcd.clear ();
lcd.setCursor (1,0);
lcd.print (n_pr);
// button1.scanState ();
while (button1.flagClick == yanlış) {
enc_A = digitalRead (pin_A);
enc_B = digitalRead (pin_B);
if ((! enc_A) && (enc_A_prev)) {
eğer (enc_B) {
n_pr = n_pr-0.1;
} başka {
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 = yanlış;
lcd.clear ();
lcd.setCursor (1,0);
lcd.print (b_pr);
while (button1.flagClick == yanlış) {
enc_A = digitalRead (pin_A);
enc_B = digitalRead (pin_B);
if ((! enc_A) && (enc_A_prev)) {
eğer (enc_B) {
b_pr = b_pr-0.1;
} başka {
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 = yanlış;
eğer (n_pr> b_pr) {
şamandıra 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 (şamandıra);
EEPROM.put (addr, b_pr);
gecikme (300);
}
void kurulumu (void) {
pinMode (11, ÇIKIŞ);
pinMode (pin_A, INPUT_PULLUP);
pinMode (pin_B, INPUT_PULLUP);
lcd başlangıç (8.2);
int addr = 0;
char c = EEPROM.read (adres);
addr = addr + 1;
if (c == 'y') {
EEPROM.get (adres, n_pr);
addr + = sizeof (şamandıra);
EEPROM.get (addr, b_pr);
}
// Seri.başlangıç (9600);
}
void loop (void) {
bayt i;
bayt mevcut = 0;
bayt türü_;
bayt verileri [12];
bayt adresi [8];
şamandıra celsius;
if (! ds.search (addr)) {
ds.reset_search ();
gecikme (250);
return;
}
if (OneWire :: crc8 (adres, 7)! = adres [7]) {
return;
}
// ilk ROM baytı hangi çipi gösterir
switch (addr [0]) {
vaka 0x10:
type_s = 1;
break;
vaka 0x28:
type_s = 0;
break;
vaka 0x22:
type_s = 0;
break;
varsayılan:
return;
}
ds.reset ();
ds.sel (addr);
d.write (0x44, 1); // sonunda parazit gücü açıkken dönüşümü başlat
enc_A = digitalRead (pin_A);
enc_A_prev = enc_A;
currentTime = millis ();
while ((millis () - currentTime) <2000) {
button1.scanState ();
if (button1.flagClick == true) {
// bir düğme tıklaması vardı
button1.flagClick = yanlış; // tıklama özelliğini sıfırla
knopka ();
}
}
// gecikme (1000); // belki 750ms yeter, belki değil
// burada bir ds.depower () yapabiliriz, ancak sıfırlama bununla ilgilenecektir.
mevcut = ds.reset ();
ds.sel (addr);
ds.write (0xBE); // Scratchpad'i okuyun
(i = 0; i <9; i ++) {// 9 bayta ihtiyacımız var
veri [i] = ds.read ();
}
// Verileri gerçek sıcaklığa dönüştürün
// sonuç 16 bit işaretli bir tam sayı olduğu için,
// her zaman 16 bit olan bir "int16_t" türünde saklanmalıdır
// 32 bit işlemcide derlendiğinde bile.
int16_t raw = (veri [1] << 8) | veri [0];
if (type_s) {
ham = ham << 3; // 9 bit çözünürlük varsayılan
if (veri [7] == 0x10) {
// "sayım kalır" tam 12 bit çözünürlük verir
raw = (raw & 0xFFF0) + 12 - veri [6];
}
} başka {
bayt cfg = (veri [4] ve 0x60);
// düşük çözünürlükte düşük bitler tanımsızdır, bu yüzden onları sıfırlayalım
(cfg == 0x00) raw = raw & ~ 7; // 9 bit çözünürlük, 93,75 ms
başka (cfg == 0x20) raw = raw & ~ 3; // 10 bit çözünürlük, 187.5 ms
aksi halde (cfg == 0x40) raw = raw & ~ 1; // 11 bit çözünürlük, 375 ms
//// varsayılan 12 bit çözünürlük, 750 ms dönüştürme süresidir
}
celsius = (şamandıra) ham / 16.0;
lcd.clear ();
lcd.setCursor (1,0);
lcd.print (santigrat);
if (priz) {
lcd.setİmleç (0,1);
lcd.print ('*');
}
eğer (n_pr! = b_pr) {
eğer (celsius b_pr) {
digitalWrite (11, DÜŞÜK);
priz = yanlış;
}
}
}
// düğme durumu kontrol yöntemi
// flagPress = true - tıklandı
// flagPress = false - basıldı
// flagClick = true - tıklandı (tıklayın)
void Düğmesi :: scanState () {
if (flagPress == (! digitalRead (_pin))) {
// sinyal durumu aynı kalır
_buttonCount = 0; // sinyal durum sayacını sıfırla
}
başka {
// sinyal durumu değişti
_buttonCount ++; // sinyal durumu sayacına +1
if (_buttonCount> = _timeButton) {
// sinyal durumu belirtilen süreyi değiştirmedi
// sinyal durumu kararlı hale geldi
flagPress =! flagPress; // durum göstergesinin tersi
_buttonCount = 0; // sinyal durum sayacını sıfırla
if (flagPress == true) flagClick = true; // tıklama tıklaması işareti
}
}
}
// çıkış numarasını ve onay zamanını ayarlama yöntemi
void Düğmesi :: setPinTime (bayt pin, bayt timeButton) {
_pin = pin;
_timeButton = timeButton;
pinMode (_pin, INPUT_PULLUP); // çıktıyı girdi olarak tanımla
}
// Button sınıfının kurucusunun açıklaması
Düğme :: Düğme (bayt pin, bayt timeButton) {
_pin = pin;
_timeButton = timeButton;
pinMode (_pin, INPUT_PULLUP); // çıktıyı girdi olarak tanımla
}