Sa una, ang termostat ay ginawa lamang bilang isang thermometer upang makontrol ang temperatura sa labas ng window. Pagkatapos, sa panahon ng frosts, ang mga patatas ay nagsimulang mag-freeze sa ilalim ng lupa at pag-andar ay idinagdag upang makontrol ang microclimate. Ang data ng pasaporte ng relay ng paglilipat - 250V at 10A (2.5kW). Dahil hindi kinakailangan ang init sa ilalim ng lupa, sapat na ang isang sampung bawat kilowatt.
Mga kinakailangang materyales at tool:kahon ng pangangalaga ng sapatos
-USB-singilin para sa telepono (anumang, hindi bababa sa 0.7A)
-
Arduino-Pro-Mini
-2-line 8 na pagpapakita ng character (WH0802A-NGA-CT ay mas siksik)
Encoder na may isang pindutan (maaaring mabili sa anumang radio mag, ang pindutan ay hindi maaaring built-in)
-Schild na may relay na 5V (binili ko ang isang bungkos ng mga relay na Tsino nang walang optical na paghihiwalay sa isang pagkakataon, kaya kailangan ko ng isa pang Optocoupler PC817 at isang 470 Ohm risistor. Kung mayroon kang optical na paghihiwalay sa nameplate, maaari mong ikonekta ang nameplate nang direkta sa arduino port)
USB connector
-2 3-meter USB extension cable (isa para sa cord ng kuryente, sa pangalawang naibenta namin ang DS1820)
- DS1820 (na may anumang sulat)
paghihinang bakal
-glue gun
Nameplate FTDI232
Hakbang 1: Una sa lahat, kailangan nating i-flash ang arduino, dahil mayroon akong isang Pro Mini (napupunta ito nang walang converter ng USB-RS232), kailangan kong ibenta ang isang namumuno na may mga pin sa arduino. Mula sa gilid kung saan nagmula ang DTR, TXD, RXD, VCC, GND, GND. Ngayon ikinonekta namin ang FTDI232 DTR sa DTR, VCC sa VCC, GND sa GND, TXD sa RXD, RXD sa TXD. Patakbuhin ang arduino IDE, i-download ang sketch at flash ito (sketch sa dulo).
Hakbang 2: Ngayon ay alagaan natin ang katawan ng katawan. Pinupuksa namin ang espongha sa "FUKS", binabawasan nang maayos ang lahat, ang malalim na bahagi ng kahon ay maaaring maipasa sa isang tela ng emery (isang bagay ay mas mahigpit na natigil). Markahan ang butas para sa encoder, USB-konektor (ina) at ang pagpapakita mismo. I-paste ang relay sa takip ng kahon. Dapat nating subukang ilagay ang relay na mas malayo mula sa processor at ayusin ang mga sangkap upang ang takip ay magsara sa bandang huli (mayroong maraming espasyo).
Hakbang 3: Kinukuha namin ngayon ang USB extension cable, putulin ang konektor socket (ina). Pinutol namin ang cut end, mag-drill ng isang butas para sa cable sa katawan, ipasok ito at ipako ang susi gamit ang isang baril. Dagdag pa, ang cable ay may pula, minus itim (suriin ko lang ito), kasama ang plus ng konektor, minus ang minus (hindi ko binibigyan ang pinout ng konektor - ito ay nasa Internet). Sa pagitan ng pagdaragdag ng konektor at 2 daluyan (mayroon akong konektado sa kanila), ang isang risistor na 4.7kOhm ay dapat ibenta.
Hakbang 4: Kumuha kami ng 2 USB extension cable, pinutol ang konektor (ina), pinutol ang cable. Kung sakali, susuriin natin kung tama ba ang ating paghihinang Ikinonekta namin ang power cable na may USB charging at sa network, idikit ang cut cable sa USB connector, tingnan ang tester + na pula - sa itim. Inilabas namin ang cable at nagbebenta ng DS1820: - hanggang 1, + hanggang 3 ang natitirang 2 wire sa 2. Pagkatapos ay sinuot ko ang epoxy compound (para sa pagkumpuni ng mga tanke, radiator), iniwan ang kaunti sa sensor ng pabahay sa labas, upang magkaroon ng mas mabilis na reaksyon sa mga pagbabago sa temperatura.Kaya, ginagawa namin ang pag-install ayon sa diagram ng circuit (ikinonekta namin ang kapangyarihan at lupa ng relay plate na may mga karaniwang + at - circuit, ayon sa pagkakabanggit).
Hakbang 5: Ang lahat ng mga bahagi ng circuit ay konektado. Ikinonekta namin ang aming sensor (kung wala ito, ang display ay mananatiling itim), mag-apply ng kapangyarihan. Sa unang linya - ang halaga ng temperatura, sa 2 kung "*" ay nasa - ang relay ay hindi, hindi - off. Ngayon subukan nating itakda ang mga limitasyon ng paglilipat ng relay. Pindutin ang encoder shaft (o ang iyong pindutan) ang halaga ng limitasyon ay lilitaw kung saan ang relay ay i-on sa pamamagitan ng pag-ikot ng baras - tataas o bumababa ang halaga. Sa pamamagitan ng pag-click muli sa baras - nakukuha namin ang itaas na limitasyon (tatalikod ang relay), itakda ang halaga at pindutin muli. Ang aparato ay susubaybayan ang temperatura, ang halaga ng mga limitasyon ay pinananatili kapag naka-off ang lakas. Iyon lang.
#include
#include
#include
#define BUTTON_1_PIN 10 // ang bilang ng output ng button 1 ay 12
OneWire ds (12); // sa pin 10 (kinakailangan ang isang risistor ng 4.7K)
// pasiyahin ang aklatan kasama ang mga bilang ng mga pin ng interface
Liquid Crystal lcd (3, 2, 4, 5, 6, 7);
hindi naka -ignign na mahabang kasalukuyangTime;
const int pin_A = 8; // pin 12
const int pin_B = 9; // pin 11
hindi naka -ignign na char enc_A;
hindi naka-lagda na char enc_B;
hindi naka-lock na char enc_A_prev = 0;
lumutang n_pr = 24.1;
lumutang b_pr = 26.2;
boolean priz = maling;
klase ng Button {
pampubliko:
Button (byte pin, byte timeButton); // paglalarawan ng tagabuo
boolean flagPress; // pindutan ng watawat ay pinindot ngayon
boolean flagClick; // pindutan ng watawat ay pinindot (i-click)
walang bisa scanState (); // pamamaraan para sa pagsuri sa estado ng signal
walang bisa ang setPinTime (byte pin, byte time Button); // paraan para sa pagtatakda ng numero ng output at oras ng pagkumpirma (numero)
pribado:
byte _buttonCount; // matatag na kumpirmasyon ng estado
byte _timeButton; // pindutan ng oras ng kumpirmasyon ng estado
byte _pin; // numero ng pin
};
Butang pindutan1 (BUTTON_1_PIN, 30);
walang bisa knopka () {
lcd.clear ();
lcd.setCursor (1,0);
lcd.print (n_pr);
// button1.scanState ();
habang (button1.flagClick == maling) {
enc_A = digitalRead (pin_A);
enc_B = digitalRead (pin_B);
kung ((! enc_A) && (enc_A_prev)) {
kung (enc_B) {
n_pr = n_pr-0.1;
} iba pa {
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 = maling;
lcd.clear ();
lcd.setCursor (1,0);
lcd.print (b_pr);
habang (button1.flagClick == maling) {
enc_A = digitalRead (pin_A);
enc_B = digitalRead (pin_B);
kung ((! enc_A) && (enc_A_prev)) {
kung (enc_B) {
b_pr = b_pr-0.1;
} iba pa {
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 = maling;
kung (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);
pagkaantala (300);
}
walang bisa na pag-setup (walang bisa) {
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;
kung (c == 'y') {
EEPROM.get (addr, n_pr);
addr + = sizeof (float);
EEPROM.get (addr, b_pr);
}
// Serial.begin (9600);
}
walang bisa loop (walang bisa) {
byte i;
byte kasalukuyan = 0;
mga byte type_s;
data ng bait [12];
byte addr [8];
float celsius;
kung (! ds.search (addr)) {
ds.reset_search ();
pagkaantala (250);
bumalik
}
kung (OneWire :: crc8 (addr, 7)! = addr [7]) {
bumalik
}
// ang unang ROM byte ay nagpapahiwatig kung aling chip
lumipat (addr [0]) {
kaso 0x10:
type_s = 1;
masira;
kaso 0x28:
type_s = 0;
masira;
kaso 0x22:
type_s = 0;
masira;
default:
bumalik
}
ds.reset ();
ds.select (addr);
ds.write (0x44, 1); // simulan ang conversion, na may kapangyarihan ng parasito sa dulo
enc_A = digitalRead (pin_A);
enc_A_prev = enc_A;
kasalukuyangTime = millis ();
habang ((millis () - kasalukuyangTime) <2000) {
button1.scanState ();
kung (button1.flagClick == totoo) {
// mayroong isang pag-click sa pindutan
button1.flagClick = maling; // i-reset ang katangian
knopka ();
}
}
// pagkaantala (1000); // siguro 750ms ay sapat na, siguro hindi
// maaari naming gawin ang isang ds.depower () dito, ngunit ang pag-reset ay mag-aalaga dito.
kasalukuyan = ds.reset ();
ds.select (addr);
ds.write (0xBE); // Basahin ang Scratchpad
para sa (i = 0; i <9; i ++) {// kailangan namin ng 9 bait
data [i] = dread ();
}
// I-convert ang data sa aktwal na temperatura
// dahil ang resulta ay isang 16 bit na naka-sign integer, dapat
// nakaimbak sa isang "int16_t" na uri, na laging 16 na piraso
// kahit na pinagsama-sama sa isang 32 bit na processor.
int16_t raw = (data [1] << 8) | data [0];
kung (type_s) {
hilaw = raw << 3; / Default default ang 9 na resolution
kung (data [7] == 0x10) {
// "count remain" ay nagbibigay ng buong 12 bit na resolution
raw = (hilaw at 0xFFF0) + 12 - data [6];
}
} iba pa {
byte cfg = (data [4] & 0x60);
// sa mas mababang res, ang mga mababang piraso ay hindi natukoy, kaya't zero ang mga ito
kung (cfg == 0x00) raw = raw & ~ 7; // 9 bit na resolusyon, 93.75 ms
kung hindi man kung (cfg == 0x20) raw = raw & ~ 3; // 10 bit res, 187.5 ms
kung hindi man kung (cfg == 0x40) raw = raw & ~ 1; // 11 bit res, 375 ms
//// default ay 12 bit na resolution, 750 ms oras ng pag-convert
}
celsius = (float) raw / 16.0;
lcd.clear ();
lcd.setCursor (1,0);
lcd.print (celsius);
kung (priz) {
lcd.setCursor (0,1);
lcd.print ('*');
}
kung (n_pr! = b_pr) {
kung (celsius b_pr) {
digitalWrite (11, LOW);
priz = maling;
}
}
}
// paraan ng pagsusuri ng estado button
// flagPress = totoo - nai-click
// flagPress = maling - pinindot
// flagClick = totoo - ay nai-click (click)
walang bisa Button :: scanState () {
kung (flagPress == (! digitalRead (_pin))) {
// estado ng signal ay nananatiling pareho
_buttonCount = 0; // reset ang signal status counter
}
iba pa {
// estado ng signal ay nagbago
_buttonCount ++; // +1 sa counter ng signal ng estado
kung (_buttonCount> = _time Button) {
// estado ng signal ay hindi nagbago ng tinukoy na oras
// estado ng signal ay naging matatag
flagPress =! flagPress; // kabaligtaran ng tagapagpahiwatig ng katayuan
_buttonCount = 0; // reset ang signal status counter
kung (flagPress == totoo) flagClick = totoo; // sign of click sa pag-click
}
}
}
// paraan para sa pagtatakda ng numero ng output at oras ng pagkumpirma
walang bisa Button :: setPinTime (byte pin, byte time Button) {
_pin = pin;
_timeButton = orasNgayon;
pinMode (_pin, INPUT_PULLUP); // tukuyin ang output bilang input
}
// paglalarawan ng tagapagtayo ng klase ng pindutan
Button :: Button (byte pin, byte time Button) {
_pin = pin;
_timeButton = orasNgayon;
pinMode (_pin, INPUT_PULLUP); // tukuyin ang output bilang input
}