Opprinnelig ble termostaten laget ganske enkelt som et termometer for å kontrollere temperaturen utenfor vinduet. Da frostet begynte potetene å fryse under jorden og funksjonalitet ble lagt til for å kontrollere mikroklimaet. Passdata for koblingsreléet - 250V og 10A (2,5kW). Siden varmen i undergrunnen ikke er nødvendig, er en ti per kilowatt nok.
Nødvendige materialer og verktøy:skopleie boks
-USB-lading for for telefonen (hvilken som helst, minst 0,7A)
-
ArduinoPro-Mini
-2-linjers display med 8 tegn (WH0802A-NGA-CT er mer kompakt)
Koder med en knapp (kan kjøpes i hvilken som helst radiomagasin, knappen kan ikke være innebygd)
-skild med 5V-relé (jeg kjøpte en haug med kinesiske reléer uten optisk isolering på en gang, så jeg trengte en annen Optocoupler PC817 og en 470 Ohm-motstand. Hvis du har optisk isolasjon på typeskiltet, kan du koble navneskiltet direkte til arduino-porten)
USB-kontakt
-2 3-meters USB-forlengelseskabel (en for strømkabelen, til den andre lodder vi DS1820)
- DS1820 (med hvilken som helst bokstav)
loddejern
limpistol
Navneskilt FTDI232
Trinn 1: For det første må vi blinke arduino, fordi jeg har en Pro Mini (den går uten en USB-RS232-omformer), jeg trenger å lodde en linjal med pinner til arduino. Fra siden der DTR, TXD, RXD, VCC, GND, GND er avledet. Nå kobler vi FTDI232 DTR til DTR, VCC til VCC, GND til GND, TXD til RXD, RXD til TXD. Kjør arduino IDE, last ned skissen og flash den (skisse på slutten).
Trinn 2: La oss ta vare på skroget. Vi river av svampen ved “FUKS”, avfetter alt godt, den dype delen av esken kan føres med en sladdet klut (noe vil være mer fast stukket). Merk hullet for koderen, USB-kontakten (mor) og selve skjermen. Lim reléet til kassedekselet. Vi må prøve å plassere reléet lenger fra prosessoren og ordne komponentene slik at lokket lukkes senere (det er nok plass).
Trinn 3: Nå tar vi USB-forlengelseskabelen, klipper av stikkontakten (mor). Vi kutter av den kuttede enden, borer et hull for kabelen i kroppen, setter den inn og limer nøkkelen med en pistol. Pluss at kabelen har rød, minus svart (jeg bare sjekker den), pluss pluss på kontakten, minus minus (jeg gir ikke pinout på kontakten - den er på Internett). Mellom pluss av kontakten og 2 medium (jeg har dem tilkoblet), må en 4.7kOhm motstand loddes.
Trinn 4: Vi tar 2 USB-forlengelseskabler, klipper av kontakten (mor), klipper kabelen. Bare i tilfelle, vil vi sjekke om vi alle loddet riktig. Vi kobler strømkabelen med USB-lading og til nettverket, stikker den kuttede kabelen i USB-kontakten, ser på testeren + på rød - på svart. Vi trekker ut kabelen og lodder DS1820: - til 1, + til 3 de resterende 2 ledningene til 2. Jeg belegger deretter epoksyforbindelsen (for å reparere tankene, radiatorene), og etterlater litt av sensorhuset utover, slik at det ville komme en raskere reaksjon på temperaturendringer.Vel, vi gjør installasjonen i henhold til kretsskjemaet (vi kobler reléplatenes kraft og jord til henholdsvis de vanlige + og - kretsene).
Trinn 5: Alle kretskomponenter er tilkoblet. Vi kobler til sensoren vår (uten den vil skjermen forbli svart), bruker strøm. I den første linjen - temperaturen, i 2 hvis “*” er på - er reléet på, nei - av. La oss prøve å sette relébrytergrensene. Trykk på koderen akselen (eller knappen) grenseverdien vises når reléet slås på ved å rotere akselen - verdien øker eller synker. Ved å klikke på akselen igjen - får vi den øvre grensen (reléet vil slå seg av), stille inn verdien og trykk igjen. Enheten vil overvåke temperaturen, grensenes verdi opprettholdes når strømmen er slått av. Det er alt.
#include
#include
#include
#definer BUTTON_1_PIN 10 // outputnummeret til knapp 1 er 12
OneWire ds (12); // på pinne 10 (en 4.7K-motstand er nødvendig)
// initialisere biblioteket med antall grensesnittpinner
Liquid Crystal lcd (3, 2, 4, 5, 6, 7);
usignert lang strømtid;
const int pin_A = 8; // pinne 12
const int pin_B = 9; // pinne 11
usignert røye enc_A;
usignert røye enc_B;
usignert røye enc_A_prev = 0;
float n_pr = 24,1;
flyte b_pr = 26,2;
boolsk pris = falsk;
klasse-knapp {
public:
Knapp (byte pin, byte time Button); // konstruktørbeskrivelse
boolsk flagPress; // flagg-knappen er nå trykket
boolsk flaggKlikk; // flaggknappen ble trykket (klikk)
void scanState (); // metode for å sjekke signaltilstanden
void setPinTime (byte pin, byte timeButton); // metode for å angi utdatanummer og bekreftelsestid (nummer)
privat:
byte _buttonCount; // bekreftelsesteller for stabil tilstand
byte _timeButton; // bekreftelsestid for knappen
byte _pin; // pin nummer
};
Knappknapp1 (BUTTON_1_PIN, 30);
void knopka () {
lcd.clear ();
lcd.set Markør (1,0);
lcd.print (n_pr);
// button1.scanState ();
while (button1.flagClick == false) {
enc_A = digitalRead (pin_A);
enc_B = digitalLes (pin_B);
hvis ((! enc_A) && (enc_A_prev)) {
if (enc_B) {
n_pr = n_pr-0.1;
} annet {
n_pr = n_pr + 0,1;
}
lcd.clear ();
lcd.set Markør (1,0);
lcd.print (n_pr);
}
enc_A_prev = enc_A;
button1.scanState ();
}
button1.flagClick = falsk;
lcd.clear ();
lcd.set Markør (1,0);
lcd.print (b_pr);
while (button1.flagClick == false) {
enc_A = digitalRead (pin_A);
enc_B = digitalLes (pin_B);
hvis ((! enc_A) && (enc_A_prev)) {
if (enc_B) {
b_pr = b_pr-0,1;
} annet {
b_pr = b_pr + 0,1;
}
lcd.clear ();
lcd.set Markør (1,0);
lcd.print (b_pr);
}
enc_A_prev = enc_A;
button1.scanState ();
}
button1.flagClick = falsk;
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);
forsinkelse (300);
}
void setup (void) {
pinMode (11, UTGANG);
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.begin (9600);
}
void loop (void) {
byte i;
byte tilstede = 0;
byte type_s;
byte data [12];
byte addr [8];
float celsius;
if (! ds.search (addr)) {
ds.reset_search ();
forsinkelse (250);
tilbake;
}
if (OneWire :: crc8 (addr, 7)! = addr [7]) {
tilbake;
}
// den første ROM-byten indikerer hvilken brikke
bytte (addr [0]) {
sak 0x10:
type_s = 1;
break;
sak 0x28:
type_s = 0;
break;
sak 0x22:
type_s = 0;
break;
standard:
tilbake;
}
ds.reset ();
ds.select (addr);
ds.skrive (0x44, 1); // starte konvertering, med parasitt på på slutten
enc_A = digitalRead (pin_A);
enc_A_prev = enc_A;
strømtid = millis ();
mens ((millis () - nåværende tid) <2000) {
button1.scanState ();
if (button1.flagClick == true) {
// det var et knappeklikk
button1.flagClick = falsk; // tilbakestill klikkattributtet
knopka ();
}
}
// forsinkelse (1000); // kanskje 750 ms er nok, kanskje ikke
// vi kan gjøre en ds.depower () her, men tilbakestillingen vil ta vare på den.
present = ds.reset ();
ds.select (addr);
ds.write (0xBE); // Les Scratchpad
for (i = 0; i <9; i ++) {// vi trenger 9 byte
data [i] = ds.read ();
}
// Konverter dataene til faktisk temperatur
// fordi resultatet er et 16-bits signert heltall, bør det
// lagres i en "int16_t" type, som alltid er 16 biter
// selv når den er satt sammen på en 32-bit prosessor.
int16_t raw = (data [1] << 8) | data [0];
if (type_s) {
rå = rå << 3; // 9-bits oppløsning standard
if (data [7] == 0x10) {
// "count rest" gir full oppløsning på 12 bit
raw = (raw & 0xFFF0) + 12 - data [6];
}
} annet {
byte cfg = (data [4] & 0x60);
// ved lavere res er de lave bitene ikke definert, så la oss nullstille dem
if (cfg == 0x00) raw = raw & ~ 7; // 9 bit oppløsning, 93,75 ms
ellers hvis (cfg == 0x20) raw = raw & ~ 3; // 10 bit res, 187,5 ms
ellers hvis (cfg == 0x40) raw = raw & ~ 1; // 11 bit res, 375 ms
// // standard er 12 bits oppløsning, 750 ms konverteringstid
}
celsius = (flyter) rå / 16,0;
lcd.clear ();
lcd.set Markør (1,0);
lcd.print (celsius);
hvis (pris) {
lcd.set markør (0,1);
lcd.print ('*');
}
if (n_pr! = b_pr) {
if (celsius b_pr) {
digitalWrite (11, LAV);
pris = usant;
}
}
}
// knappen status sjekk metode
// flagPress = sant - klikket
// flagPress = falsk - trykket
// flagKlikk = sant - ble klikket (klikk)
void Button :: scanState () {
if (flagPress == (! digitalRead (_pin))) {
// signaltilstand forblir den samme
_buttonCount = 0; // tilbakestille telleren for signalstatus
}
ellers {
// signaltilstand er endret
_buttonCount ++; // +1 til signaltilstandstelleren
if (_buttonCount> = _timeButton) {
// signaltilstand endret ikke den angitte tiden
// signaltilstand har blitt stabil
flagPress =! flagPress; // invers av statusindikatoren
_buttonCount = 0; // tilbakestille telleren for signalstatus
if (flagPress == true) flaggKlikk = true; // tegn på klikk på klikk
}
}
}
// metode for å angi utdatanummer og bekreftelsestid
void Button :: setPinTime (byte pin, byte timeButton) {
_pin = pin;
_timeButton = timeButton;
pinMode (_pin, INPUT_PULLUP); // definere output som input
}
// beskrivelse av konstruktøren til knappen
Button :: Button (byte pin, byte timeButton) {
_pin = pin;
_timeButton = timeButton;
pinMode (_pin, INPUT_PULLUP); // definere output som input
}