Sākumā termostats tika izgatavots vienkārši kā termometrs, lai kontrolētu temperatūru ārpus loga. Tad salnu laikā kartupeļi sāka sasalst pazemē un tika pievienota funkcionalitāte, lai kontrolētu mikroklimatu. Komutācijas releja pases dati - 250 V un 10 A (2,5 kW). Tā kā siltums pazemē nav vajadzīgs, pietiek ar desmit uz kilovatiem.
Nepieciešamie materiāli un instrumenti:apavu kopšanas kaste
-USB maksa par tālruni (jebkura, vismaz 0.7A)
-
Arduino-Pro-Mini
-2 rindas 8 rakstzīmju displejs (WH0802A-NGA-CT ir kompakts)
Kodētājs ar pogu (var iegādāties jebkurā radio magnā, pogu nevar iebūvēt)
-bērns ar 5 V releju (vienā reizē iegādājos ķīniešu ķēžu relejus bez optiskas izolācijas, tāpēc man bija nepieciešams cits Optocoupler PC817 un 470 omu rezistors. Ja datu plāksnītē ir optiskā izolācija, datu plāksnīti varat savienot tieši arduino ostā)
USB savienotājs
-2 3 metru USB pagarinātājs (vienu strāvas vadam, otru pielodējam DS1820)
- DS1820 (ar jebkuru burtu)
lodāmurs
-līmes pistole
Datu plāksne FTDI232
1. solis: Vispirms mums ir jāapgaismo arduino, jo man ir Pro Mini (tas notiek bez USB-RS232 pārveidotāja), un man ir jālodē lineāls ar tapām arduino. No tās puses, kur iegūti DTR, TXD, RXD, VCC, GND, GND. Tagad mēs savienojam FTDI232 DTR ar DTR, VCC ar VCC, GND uz GND, TXD uz RXD, RXD uz TXD. Palaidiet arduino IDE, lejupielādējiet skici un mirgojiet to (skice beigās).
2. solis: Tagad parūpēsimies par korpusu. Mēs noplēšam sūkli pie “FUKS”, visu labi attaukojam, kastes dziļo daļu var izlaist ar smirģeļa audumu (kaut kas labāk pielīp). Atzīmējiet kodētāja, USB savienotāja (mātes) un paša displeja caurumu. Līmējiet releju pie kastes pārsega. Mums ir jācenšas novietot releju tālāk no procesora un sakārtot komponentus tā, lai vēlāk vāks aizvērtos (ir daudz vietas).
3. solis: Tagad mēs ņemam USB pagarinātāju, nogrieztu savienotāja ligzdu (māte). Mēs nogriezām griezto galu, urbt caurumu kabelim ķermenī, ievietojiet to un līmējiet atslēgu ar pistoli. Plus, kabelim ir sarkans, mīnus melns (es to vienkārši pārbaudu), kā arī savienotāja plus, mīnus mīnus (es nedodu savienotāja pinoutu - tas ir internetā). Starp savienotāja plusu un 2 vidējiem elementiem (man tie ir savienoti) ir jāpielodē 4,7kOhm rezistors.
4. solis: mēs ņemam 2 USB pagarinātājus, nogrieztu savienotāju (māti), nogrieztu kabeli. Tikai gadījumā mēs pārbaudīsim, vai mēs visi esam pareizi pielodējuši. Mēs savienojam strāvas kabeli ar USB lādēšanu un ar tīklu, iespraužam izgriezto kabeli USB savienotājā, skatāmies uz testeri + uz sarkanu - uz melnu. Mēs izvelkam kabeli un pielodējam DS1820: - līdz 1, + līdz 3 atlikušajiem 2 vadiem līdz 2. Pēc tam es pārklāju epoksīda savienojumu (lai labotu tvertnes, radiatorus), atstājot nedaudz no sensora korpusa uz āru, lai ātrāk notiktu reakcija uz temperatūras izmaiņām.Nu, mēs veicam uzstādīšanu saskaņā ar shēmas shēmu (mēs savienojam releja plāksnes jaudu un zemi attiecīgi ar kopējām + un - shēmām).
5. darbība: visi ķēdes komponenti ir savienoti. Mēs savienojam savu sensoru (bez tā displejs paliks melns), pielietosim strāvu. Pirmajā rindā - temperatūras vērtība, 2, ja ir ieslēgts “*” - relejs ir ieslēgts, nav - izslēgts. Tagad mēģināsim iestatīt releja pārslēgšanas robežas. Nospiediet kodētāja vārpstu (vai savu pogu), parādās robežvērtība, pie kuras relejs ieslēgsies, pagriežot vārpstu - vērtība palielinās vai samazinās. Vēlreiz noklikšķinot uz vārpstas - mēs iegūstam augšējo robežu (relejs izslēgsies), iestatīsim vērtību un vēlreiz nospiediet. Ierīce uzraudzīs temperatūru, kad strāva tiek izslēgta, robežu vērtība tiek uzturēta. Tas arī viss.
# iekļaut
# iekļaut
# iekļaut
#define BUTTON_1_PIN 10 // 1. pogas izvades numurs ir 12
OneWire ds (12); // uz 10. tapas (nepieciešams 4,7K rezistors)
// inicializējiet bibliotēku ar saskarnes tapu numuriem
Šķidro kristālu LCD (3, 2, 4, 5, 6, 7);
neparakstīts ilgs pašreizējais laiks;
const int pin_A = 8; // 12. tapa
const int pin_B = 9; // 11. tapa
neparakstīts char enc_A;
neparakstīts char enc_B;
neparakstīts char enc_A_prev = 0;
pludiņš n_pr = 24,1;
pludiņš b_pr = 26,2;
Būla prizma = nepatiesa;
klases poga {
publiska:
Poga (baitu piespraude, baita laika poga); // konstruktora apraksts
Būla karodziņšPress; // Tagad ir nospiesta karoga poga
Būla karogsClick; // tika nospiesta karoga poga (noklikšķiniet)
void scanState (); // signāla stāvokļa pārbaudes metode
void setPinTime (baitu piespraude, baita laika poga); // izejas numura un apstiprināšanas laika (skaitļa) iestatīšanas metode
privāts:
baits _buttonCount; // stabils stāvokļa apstiprināšanas skaitītājs
baits _timeButton; // pogas stāvokļa apstiprināšanas laiks
baits _pin; // pin numurs
};
Pogas poga1 (BUTTON_1_PIN, 30);
tukšs knopka () {
lcd.clear ();
lcd.setCursor (1,0);
lcd.print (n_pr);
// button1.scanState ();
kamēr (button1.flagClick == false) {
enc_A = digitalRead (pin_A);
enc_B = digitalRead (pin_B);
if ((! enc_A) && (enc_A_prev)) {
ja (enc_B) {
n_pr = n_pr-0,1;
} cits {
n_pr = n_pr + 0,1;
}
lcd.clear ();
lcd.setCursor (1,0);
lcd.print (n_pr);
}
enc_A_prev = enc_A;
poga1.scanState ();
}
button1.flagClick = nepatiess;
lcd.clear ();
lcd.setCursor (1,0);
lcd.print (b_pr);
kamēr (button1.flagClick == false) {
enc_A = digitalRead (pin_A);
enc_B = digitalRead (pin_B);
if ((! enc_A) && (enc_A_prev)) {
ja (enc_B) {
b_pr = b_pr-0,1;
} cits {
b_pr = b_pr + 0,1;
}
lcd.clear ();
lcd.setCursor (1,0);
lcd.print (b_pr);
}
enc_A_prev = enc_A;
poga1.scanState ();
}
button1.flagClick = nepatiess;
ja (n_pr> b_pr) {
pludiņš 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 + = izmērs (pludiņš);
EEPROM.put (addr, b_pr);
kavēšanās (300);
}
Nederīga iestatīšana (spēkā neesoša) {
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;
if (c == 'y') {
EEPROM.get (addr, n_pr);
addr + = izmērs (pludiņš);
EEPROM.get (addr, b_pr);
}
// Serial.begin (9600);
}
tukšs cilpa (tukšs) {
i baits;
klāt esošais baits = 0;
baitu tips_s;
baitu dati [12];
baitu pievienotājs [8];
peldēt pēc Celsija;
if (! ds.search (addr)) {
ds.reset_search ();
kavēšanās (250);
atgriezties
}
if (OneWire :: crc8 (addr, 7)! = addr [7]) {
atgriezties
}
// pirmais ROM baits norāda, kura mikroshēma
slēdzis (addr [0]) {
gadījums 0x10:
tips_s = 1;
pārtraukums;
gadījums 0x28:
tips_s = 0;
pārtraukums;
gadījums 0x22:
tips_s = 0;
pārtraukums;
noklusējums:
atgriezties
}
ds.reset ();
ds.select (addr);
dswrite (0x44, 1); // sāk pārveidi, parazītu ieslēdzot beigās
enc_A = digitalRead (pin_A);
enc_A_prev = enc_A;
currentTime = millis ();
savukārt ((milis () - currentTime) <2000) {
poga1.scanState ();
if (button1.flagClick == true) {
// bija pogas klikšķis
button1.flagClick = nepatiess; // atiestatīt atribūtu
knopka ();
}
}
// kavēšanās (1000); // varbūt pietiek ar 750ms, varbūt nē
// mēs šeit varētu darīt ds.depower (), bet par to rūpēsies atiestatīšana.
klāt = ds.reset ();
ds.select (addr);
dswrite (0xBE); // Lasīt Scratchpad
priekš (i = 0; i <9; i ++) {// mums nepieciešami 9 baiti
dati [i] = ds.read ();
}
// Konvertējiet datus uz faktisko temperatūru
// jo rezultāts ir 16 bitu paraksts vesels skaitlis, tam vajadzētu
// jāglabā “int16_t” tipā, kas vienmēr ir 16 bitu
// pat ja tiek apkopots 32 bitu procesorā.
int16_t raw = (dati [1] << 8) | dati [0];
if (type_s) {
raw = raw << 3; // 9 bitu izšķirtspēja pēc noklusējuma
if (dati [7] == 0x10) {
// "skaits paliek" nodrošina pilnu 12 bitu izšķirtspēju
raw = (raw & 0xFFF0) + 12 - dati [6];
}
} cits {
baits cfg = (dati [4] un 0x60);
// apakšējā izšķirtspējā zemie biti nav definēti, tāpēc tos nullēsim
if (cfg == 0x00) raw = raw & ~ 7; // 9 bitu izšķirtspēja, 93,75 ms
citādi, ja (cfg == 0x20) raw = raw & ~ 3; // 10 bitu rez., 187,5 ms
citādi, ja (cfg == 0x40) raw = raw & ~ 1; // 11 bitu res, 375 ms
//// noklusējums ir 12 bitu izšķirtspēja, konvertēšanas laiks 750 ms
}
celsius = (pludiņš) neapstrādāts / 16,0;
lcd.clear ();
lcd.setCursor (1,0);
lcd.print (pēc Celsija);
if (priz) {
lcd.setCursor (0,1);
lcd.print ('*');
}
ja (n_pr! = b_pr) {
ja (pēc Celsija b_pr) {
digitalWrite (11, LOW);
priz = nepatiess;
}
}
}
// pogas stāvokļa pārbaudes metode
// flagPress = true - noklikšķinājis
// flagPress = viltus - nospiests
// flagClick = true - tika noklikšķināts (noklikšķiniet)
tukšs taustiņš :: scanState () {
if (flagPress == (! digitalRead (_pin))) {
// signāla stāvoklis nemainās
_buttonCount = 0; // atiestatīt signāla statusa skaitītāju
}
cits {
// signāla stāvoklis ir mainījies
_buttonCount ++; // +1 signāla stāvokļa skaitītājam
if (_buttonCount> = _timeButton) {
// signāla stāvoklis nemainīja norādīto laiku
// signāla stāvoklis ir kļuvis stabils
flagPress =! flagPress; // statusa indikatora apgrieztā puse
_buttonCount = 0; // atiestatīt signāla statusa skaitītāju
if (flagPress == true) flagClick = true; // klikšķa zīme par klikšķi
}
}
}
// izejas numura un apstiprināšanas laika iestatīšanas metode
void Button :: setPinTime (baitu piespraude, baita timeButton) {
_pin = tapa;
_timeButton = timeButton;
pinMode (_pin, INPUT_PULLUP); // definējiet izvadi kā ieeju
}
// Button klases konstruktora apraksts
Poga :: Poga (baitu tapa, baita laika poga) {
_pin = tapa;
_timeButton = timeButton;
pinMode (_pin, INPUT_PULLUP); // definējiet izvadi kā ieeju
}