PODESIVI TERMOSTAT S RELEJOM
ŠTO ĆU DOBITI S OVIM TUTORIALOM?
Prevenstveno cilj tutoriala je na konkretnom primjeru kombinirati više modula s Dasduinom. Kombinirati znači praviti mogusobne uvjete i korelacije pojedinih očitanja i prikazivati ih, odnosno upravljati njima. Moduli koje ćemo koristiti nalaze se u tablici desno, a večinu ih možete pronaći u CSP Hobby setu.
Konačno dobiti ćemo uređaj koji će s obzirom na temperaturu paliti, odnosno gasiti relej (grijač). Temperatura prilikom koje će se to događati biti će podesiva s tipkovnicom, a sve navedeno očitavati ćemo na LCD displayu.
Popis komponenata i pojediničanih tutoriala:
Dasduino Core – instalacija drivera
DHT11 – KKM
Matrix membranska tipkovnica – KKM
LCD 16×2 – KKM
Relej
POVEZIVANJE MODULA
Svi moduli već su pojedninačno obrađeni u KKM – Kako koristiti module tutorialima. Stoga nećeo ponovno isto raditi. U predhodno poglavlju nalaze se linkovi za pojedinačne tutoriale. Sada povežite modula kako pokazuje slika dolje, pa krećemo odmah s programiranjem.
SVI MODULI U JEDAN SKETCH
Plan je kopirati dio koda iz KKM tutoriala koji nam je potreban za svaki modul posebno. Nakon čega ćemo napisati potrebne uvijete i funkcije za određene varijable. Pa krenimo…
DHT11
NAPOMENA: budite sigurni da ste predhodno instalirali potreben librarye, kako je zapisano u KKM tutorialima
#include "dht.h" // dodajemo dht library// potrebno definirati za ocitanja s DHTadht DHT; #define dht_dpin A0 //data pin DHT11 na A0 pinu Croduinaint ocitanaTemp = 0; void setup(){ } void loop(){ // čitamo stanje DHT11 // ova naredba sprema ocitanje temperature u "DHT.temperature" DHT.read11(dht_dpin); // ocitanje temperature spremamo u varijablu ocitanaTemp ocitanaTemp = DHT.temperature; delay(800); // minimalni razmak ocitanja s DHT11 je 800ms}Matrix Membranska Tipkovnica
NAPOMENA: dalje ćemo u postojeći kod samo dodavati nove dijelove, kako je označeno komentarima
// PREDDEFINIRAMO#include "Keypad.h" // dodajemo library Keypad// potrebno definirati za Matrix tipkovnicu const byte red = 4; // Tipkovnica ima 4 reda const byte stupac = 4; // i 4 stupca char tipke[red][stupac] = { // definiraj polozaj tipki na tipkovnici {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} }; byte red_pinovi[red] = {7,6,5,4}; // pinove redova spajamo redom na PIN9, PIN8, PIN7, PIN6 byte stupac_pinovi[stupac] = {3,2,1,0}; // pinove stupaca spajamo redom na PIN5, PIN4, PIN3, PIN2 Keypad tipkovnica = Keypad(makeKeymap(tipke), red_pinovi, stupac_pinovi, red, stupac); // pritisnutu tipku oslusavati cemo pomocu: "tipkovnica.getKey()"// VOID SETUP() // ovdje ništa // VOID LOOP() // ovdje ništa // pritisnutu tipku oslusavati cemo pomocu: "tipkovnica.getKey()"// PREDEFINIRAMO#include "LiquidCrystal_I2C.h" // dodajemo potrebni library za LCD#include "Wire.h" // pošto koristimo I2C za LCD// potrebno definirati za LCDLiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);// VOID SETUP()lcd.begin(16,2); // podesi LCD 16x2 lcd.backlight(); // ukljuci pozadinsko osvjetljenje LCDa // ispisi pozdravnu poruku lcd.setCursor(0,0); // postavi kursor pisanja na prvi stupac i prvi red lcd.print("Termostat"); // pripazite da String ne bude duži od 16 znakova lcd.setCursor(0,1) // postavi kursor na prvi stupac, drugi red lcd.print("e-radionica.com");// VOID LOOP() // za sada ništa// PREDEFINIRAMOint relej = 8; // relej spajamo na D8// VOID SETUP()pinMode(relej, OUTPUT); // definiramo relej kao izlaznu komponentu// VOID SETUP// ovdje ništa#include "dht.h" // dodajemo dht library#include "Keypad.h" // dodajemo library Keypad#include "LiquidCrystal_I2C.h" // dodajemo potrebni library za LCD#include "Wire.h" // pošto koristimo I2C za LCD// potrebno definirati za ocitanja s DHTa dht DHT; #define dht_dpin A0 //data pin DHT11 na A0 pinu Croduina int ocitanaTemp = 0;// potrebno definirati za Matrix tipkovnicu const byte red = 4; // Tipkovnica ima 4 reda const byte stupac = 4; // i 4 stupca char tipke[red][stupac] = { // definiraj polozaj tipki na tipkovnici {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} }; byte red_pinovi[red] = {7,6,5,4}; // pinove redova spajamo redom na PIN9, PIN8, PIN7, PIN6 byte stupac_pinovi[stupac] = {3,2,1,0}; // pinove stupaca spajamo redom na PIN5, PIN4, PIN3, PIN2 Keypad tipkovnica = Keypad(makeKeymap(tipke), red_pinovi, stupac_pinovi, red, stupac); // pritisnutu tipku oslusavati cemo pomocu: "tipkovnica.getKey()"// potrebno definirati za LCDLiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);// potrebno definirati za relejint relej = 8; // relej spajamo na D8void setup(){ pinMode(relej, OUTPUT); // definiramo relej kao izlaznu komponentu lcd.begin(16,2); // podesi LCD 16x2 lcd.backlight(); // ukljuci pozadinsko osvjetljenje LCDa // ispisi pozdravnu poruku lcd.setCursor(0,0); // postavi kursor pisanja na prvi stupac i prvi red lcd.print("Termostat"); // pripazite da String ne bude duži od 16 znakova lcd.setCursor(0,1); // postavi kursor na prvi stupac, drugi red lcd.print("e-radionica.com"); delay(1000); // neka nam se ova poruka prikazuje 1 sekundu lcd.clear(); // nakon čega ćemo ju obrisati} void loop(){ // čitamo stanje DHT11 // ova naredba sprema ocitanje temperature u "DHT.temperature" DHT.read11(dht_dpin); // ocitanje temperature spremamo u varijablu ocitanaTemp ocitanaTemp = DHT.temperature; delay(800); // minimalni razmak ocitanja s DHT11 je 800ms}PISANJE UVJETA
Za početak ispišimo temperaturu očitanu s DHT11 senzora. Napraviti ćemo posebnu funkciju koja će to izvršiti. Funkciju “Ispis()” možemo zapisaati prije ili poslije “setup()” i “void()” funkcija.
CIJELI, KONAČNI KOD
Cijeli, konačni kod je pomalo nabacan te ga možete kopirati ovdje. U njemu se nalazi hrpa komentara pa možete preskočiti odlomak iznad. Ako se pojavi problem u razumjevanju, uvijek možete škicnuti tamo za dodatna pojašnjenja.
Cilj ovog tutorijala je, na primjeru, prikazati logiku nakon čega vas ohrabrujemo da kod napišete sami. Isti izbornik može se napisati na mnogo načina i dobra je vježba. Ukoliko zapnete, javite se s konkretnim pitanjima (molimo da iskomentirate kod). Ne zaboraviti instalirati potrebne library-e.
#include "dht.h" // dodajemo dht library#include "Keypad.h" // dodajemo library Keypad#include "LiquidCrystal_I2C.h" // dodajemo potrebni library za LCD#include "Wire.h" // pošto koristimo I2C za LCD#include "EEPROM.h"// potrebno definirati za ocitanja s DHTa dht DHT; #define dht_dpin A0 //data pin DHT11 na A0 pinu Croduina int ocitanaTemp = 0;// potrebno definirati za Matrix tipkovnicu const byte red = 4; // Tipkovnica ima 4 reda const byte stupac = 4; // i 4 stupca char tipke[red][stupac] = { // definiraj polozaj tipki na tipkovnici {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} }; byte red_pinovi[red] = {7,6,5,4}; // pinove redova spajamo redom na PIN9, PIN8, PIN7, PIN6 byte stupac_pinovi[stupac] = {3,2,1,0}; // pinove stupaca spajamo redom na PIN5, PIN4, PIN3, PIN2 Keypad tipkovnica = Keypad(makeKeymap(tipke), red_pinovi, stupac_pinovi, red, stupac); // pritisnutu tipku oslusavati cemo pomocu: "tipkovnica.getKey()"// potrebno definirati za LCDLiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);// potrebno definirati za relejint relej = 8; // relej spajamo na D8// dodatne postavke izbornikaint podesenaTemp = 0; // varijabla u koju ćemo spremiti podesenu temperaturu// očitavamo vrijednom spremljenu na adresi 10 EEPROM memorije// u tu adresu spremiti ćemo svaku promjenu koju napravimo na ovoj varijabliString unosString = String(EEPROM.read(10)); // string varijabla u kojoj ćemo "graditi" unos tipkovniceboolean boolUnosTemp = false; // uvjet ulaska i izlaska iz izbornikavoid setup(){ pinMode(relej, OUTPUT); // definiramo relej kao izlaznu komponentu lcd.begin(16,2); // podesi LCD 16x2 lcd.backlight(); // ukljuci pozadinsko osvjetljenje LCDa // ispisi pozdravnu poruku lcd.setCursor(0,0); // postavi kursor pisanja na prvi stupac i prvi red lcd.print("Termostat"); // pripazite da String ne bude duži od 16 znakova lcd.setCursor(0,1); // postavi kursor na prvi stupac, drugi red lcd.print("e-radionica.com");} void loop(){ // čitamo stanje DHT11 // ova naredba sprema ocitanje temperature u "DHT.temperature" DHT.read11(dht_dpin); // ocitanje temperature spremamo u varijablu ocitanaTemp ocitanaTemp = DHT.temperature; char pritisnuto = tipkovnica.getKey(); // pritisnuta tipka sprema se u varijablu pritisnuto // zbog delay(800) koji je nužan za čitanje s DHT11 // moguće je da će tipku trebati držati i do 800ms pritisnuto // kako bi je registrirao ovaj dio sketcha// ulazak u izbornik za podešavanje temperatureif( pritisnuto == '#' && boolUnosTemp == false) { // ako je pritisnuta tipka '#' i već nismo u izborniku boolUnosTemp = true; // usli smo u Menu // ispisi tekst Menu-a lcd.clear(); lcd.setCursor(0,0); lcd.print("postavi temp:"); unosString = ""; // napravimo loop koji ce slusati unos temperature, sve dok ponovno ne pritisnemo tipku '#' // nakon čega ćemo izači iz Menu-a while( boolUnosTemp == false) { // spremi pritisnutu tipku u "unos" char unos = tipkovnica.getKey(); // pošto zelimo samo brojeve u temperaturi, sve ostale znakove moramo zanemaariti: // ako je zadovoljen jedan od navedenih uvjeta unos je "prazan" char if( unos == 'A' || unos == 'B' || unos == 'C' || unos == 'D' || unos == '*' ) unos = '\0'; // ako je pak pritisnuta tipka '#' izači iz ovog izbornika, te ispisati i usporediti unešenu temperaturu else if( unos == '#' ) { boolUnosTemp = false; // ovo će izaći iz zadanog while-a unos = '\0'; // ne želimo da ništa bude dodano u naš unosString } // spremimo svaku pojedinačnu tipku u jedan string, kojeg cemo kasnije uspoređivati s trenutnom temperaaturom // te s obzirom na to paliti, odnosno gasiti relej unosString += String(unos); //ispisujemo što zapisujemo lcd.setCursor(0,1); lcd.print(unosString); //spremamo promjene u EEPROM memoriju na adresu 10 EEPROM.write(10,unosString.toInt()); }} // ostali uvjeti, za tipke A,B,C i D // ako je pritisnuta tipka 'A', podesi temperaturu na 15 stupnjeva else if( pritisnuto == 'A' ) unosString = "15"; // ako je pritisnuta tipka 'B', podesi temperaturu na 20 stupnjeva else if( pritisnuto == 'B' ) unosString = "20"; // ako je pritisnuta tipka 'C', podesi temperaturu na 25 stupnjeva else if( pritisnuto == 'C' ) unosString = "25"; // ako je pritisnuta tipka 'D', podesi temperaturu na 30 stupnjeva else if( pritisnuto == 'D' ) unosString = "30";// uvjet prema kojem se relej pali, odnosno gasi// u slučaju da je podešena temperatura manja od očitane upali relej if( unosString.toInt() > ocitanaTemp ) digitalWrite(relej, HIGH);// ugasi relej u svim ostalim slučajevima else digitalWrite(relej, LOW); delay(800); // minimalni razmak ocitanja s DHT11 je 800ms}// funkcija koja ispisuje ocitanjavoid Ispis() { // ispis temp ocitane s DHT11 senzora lcd.clear(); // obrisi sve predhodno zapisano na LCDu lcd.setCursor(0,0); // postavi kursor na prvi stupac, prvi red lcd.print("Ocitano:" + String(ocitanaTemp)); // ispis temp zadane u izborniku lcd.setCursor(0,1); // postavljamo kursor na prvi stupac, drugi red lcd.print("Podeseno:" + unosString);}

