You are on page 1of 24

Konstrukcija sistema za bezicnu kontrolu releja

pomocu Arduino UNO mikrokontrolerske ploce


seminarski rad
Arhitektura i operativni sistemi

Dorde Milicevic 86/2013


4. decembar 2014.
Sa
zetak
U danasnje vreme su mikrokontroleri (eng. Microcontroller, MCU) prisutni svuda i njihova primena se sve vise povecava, a time i njihov znacaj.
Vecu primenu postizu zbog svoje niske cene i mogucnosti koju pruzaju
u izradi razlicitih uredaja. Sistem za bezicnu kontrolu releja je zasnovan na Arduino UNO mikrokontrolerskoj ploci i pomocu njega se bezicno
mogu kontrolisati cetiri visokonaponska uredaja. Korisnicki interfejs je
dostupan kroz LCD ekran (eng. Liquid-crystal display), a od dodatnih
mogucnosti poseduje automatsku regulaciju radne temperature i prikaz
tekuceg vremena i datuma.

Sadr
zaj
1 Uvod

2 Osnovne karakteristike Arduino razvojnog sistema


2.1 Arduino UNO . . . . . . . . . . . . . . . . . . . . . . . . . .

2
2

3 Opis rada sistema i njegovog softverskog interfejsa

4 Elektronske komponente kori


s
cene u izradi sistema i njihove osnovne karakteristike
4
4.1 Modul sa cetiri elektromagnetna releja . . . . . . . . . . . . 5
4.2 Bluetooth modul . . . . . . . . . . . . . . . . . . . . . . . . 6
4.3 Vremenski modul . . . . . . . . . . . . . . . . . . . . . . . . 7
4.4 LCD modul . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
4.5 Infracrveni prijemnik . . . . . . . . . . . . . . . . . . . . . . 9
4.6 Senzor temperature i vlaznosti vazduha . . . . . . . . . . . 10
5 Izvorni kod sistema

11

6 Zaklju
cak

24

Literatura

24

Uvod

Sa pojavom prvih mikroprocesora (eng. Microprocessor) 1971. godine pocela je i njihova upotreba. Medutim, tipican sistem je zahtevao veliki broj dodatnih komponenti za rad kao sto su bili A/D pretvaraci (eng. Analog-to-digital converter), brojaci (eng. Counter), oscilatori (eng. Electronic oscillator) i drugo. Vremenom je doslo do integrisanja
potrebnih komponenti u jedno kolo, i tako je stvoren moderni mikrokontroler. Mikrokontroleri su imali brz razvoj. Sve vise i vise kola je integrisano, programiranje je olaksano uvodenjem fles (eng. Flash) memorija
(koje se mogu mnogo puta brisati i pisati), smanjena je potrosnja struje
(vazno za baterijske uredaje), a ponuda razlicitih kontrolera je postala
neverovatno siroka i dostupna svima. U nastavku je predstavljena konstrukcija sistema cija je glavna funkcija kontrola visokonaponskih uredaja
strujom niskog napona. Kontrolu vrsi Arduino UNO mikrokontrolerska
ploca posredstvom komponente koja se naziva relej (eng. Relay).

2 Osnovne karakteristike Arduino razvojnog sistema


Arduino je razvojni sistem otvorenog koda.
Hardver (eng. Hardware) se sastoji od jednostavnog hardverskog
dizajna Arduino ploce sa Atmel AVR mikrokontrolerom i pratecim
komponentama koje uveliko olaksavaju programiranje i povezivanje
sa drugom elektronikom. Bitan aspekt Arduino projekta je standardizovan raspored konektora koji omogucava lako povezivanje sa
dodatnim modulima, poznatijim kao Arduino stitovi (eng. Arduino
shields).
Softver (eng. Software) se sastoji od razvojnog okruzenja koje cine
standardni kompajler (eng. Compiler) i programirani bootloader (eng. Bootloader) koji pojednostavljuje postupak prebacivanja prevedenog
koda u fles memoriju na cipu. Drugi mikrokontroleri obicno zahtevaju zaseban elektronski programator (eng. Electrical Programmer). Integrisano razvojno okruzenje je aplikacija napisana u Java
(eng. Java) programskom jeziku. Sastoji se od uredivaca koda sa
mogucnostima kao sto su oznacavanje koda, uparivanje zagrada, automatsko uvlacenje linija. Arduino programi se pisu u jeziku slicnom
C/C++ (eng. Programming language C/C++) programskom jeziku
sa izvesnim pojednostavljenjima i izmenama. Programeri moraju da
definisu samo dve funkcije kako bi napravili izvrsni program.
Te funkcije su:
setup() - funkcija koja se izvrsava jednom, pri ukljucivanju
Arduino ploce, i sluzi za pocetna podesavanja
loop() - funkcija koja se izvrsava u petlji sve vreme dok se ne
iskljuci Arduino ploca

2.1

Arduino UNO

Jedna od najpoznatijih Arduino ploca je Arduino UNO na kojoj je


baziran ovaj sistem. Glavna komponenta na ploci je ATmega328 mikrokontroler. Ploca poseduje 14 digitalnih ulazno/izlaznih konektora, 6
analognih ulaza, keramicki oscilator od 16 MHz, dugme za resetovanje

sistema, USB (eng. Universal Serial Bus) strujne i druge konektore.


Neke osnovne karakteristike ploce su:
radni napon ploce je 5 V
optimalni napon na stujnom konektoru u rasponu od 7 do 12 V
maksimalna dozvoljena jacina stuje po U/I konektoru 40 mA
32 KB Flash memorije
2 KB SRAM (eng. Static random access memory) memorije
1 KB EEPROM (eng. Electrically erasable programmable read only
memory) memorije
Na slici 1 se nalazi fabricki dizajn Arduino UNO ploce.

Slika 1: Arduino UNO Rev 3 ploca

3 Opis rada sistema i njegovog softverskog interfejsa


Podesavanje i upravljanje sistemom je moguce vrsiti bilo kojim daljinskim upravljacem koji koristi tehnologiju infracrvene svetlosti (eng. Infrared light) ili nekim drugim uredajem koji ima mogucnost Bluetooth
(eng. Bluetooth) prosirenja.
Sistem moze da kontrolise cetiri zasebna, visokonaponska uredaja. Ta
funkcija je omogucena koriscenjem cetiri elektromagnetna releja koji su
pod neposrednom kontrolom mikrokontrolera. Softverski interfejs je dostupan kroz LCD ekran koji sadrzi dve linije od po sesnaest karaktera.
Podrzana su tri menija:
Relejni meni - sadrzi vizuelne indikatore trenutnog stanja releja
(Slika 2)
Temperaturni meni - sadrzi prikaz trenutne temperature i vlaznosti
vazduha koja vlada u sistemu, kao i indikator automatske regulacije
temperature sistema (Slika 3)

Vremenski meni - prikazuje trenutno vreme, datum i dan u nedelji


(Slika 4)
Pozadinsko osvetljenje LCD ekrana se takode kontrolise daljinskim putem.
Na jedan od releja je povezan ventilator koji obavlja funkciju automatske
regulacije temperature sistema kada je to neophodno, odnosno, kada temperaturni senzor detektuje da je temperatura dostigla odredeni prag koji
je zadat u izvornom kodu sistema i moguce ga je podesavati. Ocitavanje
vrednosti temperature se odvija u vremenskim razmacima od po pet minuta. Kada je automatska regulacija temperature ukljucena, stanje releja
na koji je spojen ventilator nije moguce menjati.

Slika 2: Relejni meni

Slika 3: Temperaturni meni

Slika 4: Vremenski meni

4 Elektronske komponente koris


cene u izradi sistema i njihove osnovne karakteristike
U izradi sistema za bezicnu kontrolu releja su koriscene sledece komponente:
Modul sa cetiri elektromagnetna releja
Bluetooth modul
Vremenski modul
LCD ekran
Infracrveni prijemnik
Senzor temperature i vlaznosti vazduha

4.1

Modul sa
cetiri elektromagnetna releja

Glavna komponenta koja vrsi ukljucivanje ili iskljucivanje potrosaca


povezanih na sistem je relej. To je elektromehanicka naprava koja sluzi
za prekidanje ili uspostavljanje strujnog kola putem elektromagneta koji
otvara ili zatvara strujne kontakte. Princip rada releja se zasniva na elektromagnetu koji se sastoji od mnogobrojnih namotaja izolovane bakarne
zice oko gvozdenog jezgra. Kada struja tece kroz primarno strujno kolo,
oko elektromagneta se stvara magnetno polje koje privlaci gvozdenu sinu,
a sama sina na sebi nosi elektricne kontakte koji otvaraju ili zatvaraju sekundarno strujno kolo. Na slici 5 se nalazi ilustrovani prikaz rada releja.

Slika 5: Elektromagnetni relej


Modul, koji se sastoji od cetiri elektromagnetna releja, na sebi poseduje
i integrisane komponente koje obezbeduju sigurnost i ispravan rad modula.
Neke od tih komponenti su:
Dioda (eng. Diode) povezuje se paralelno na kontakte releja i sluzi
za ponistavanje napona samoindukcije i moguce varnice na strujnim
kontaktima
Optokapler (eng. Optocoupler) uvodi jos jedan nivo sigurnosti tako
sto fizicki razdvaja kontakte releja od mikrokontrolera
LE dioda (eng. Light-emiting diode) obavlja funkciju indikatora
stanja releja
Na slici 6 se nalazi izgled modula sa relejima.
Na slici 7 se nalazi shema povezivanja sa Arduino plocom.

Slika 6: Princip rada releja

Slika 7: Shema povezivanja

4.2

Bluetooth modul

Jedna od mogucnosti koju sistem pruza je ta da se njegovo upravljanje odvija i putem Bluetooth-a. Da bi se nesto takvo ostvarilo uredaj
mora posedovati Bluetooth modul na kom se nalazi cip koji omogucava
Bluetooth komunikaciju sa klijentom.
Na slici 8 se nalazi izgled Bluetooth modula.
Na slici 9 se nalazi shema povezivanja HC-05 modula sa Arduino UNO
plocom.

Slika 8: Bluetooth modul

Slika 9: Shema povezivanja

4.3

Vremenski modul

Iako funkcija digitalnog sata trenutno ne pruza sistemu znacajne podatke za njegovo funkcionisanje, sam uredaj je dizajniran za kucne uslove,
te kao takav treba da pruza i dodatne informacije korisniku poput tacnog
vremena. To je realizovano koriscenjem DS1302 vremenskog modula koji
na sebi ima ugradenu CR2032 bateriju koja omogucava cuvanje podataka
o vremenu kada je sistem iskljucen. Na slici 10 se nalazi izgled vremenskog
modula.

Slika 10: Vremenski modul


Na slici 11 se nalazi shema povezivanja sa Arduino UNO plocom.

Slika 11: Shema povezivanja

4.4

LCD modul

Da bi korisnik lakse upravljao sistemom i softverskim interfejsom, na


raspolaganju je LCD modul koji sadrzi ekran od 2 linije po 16 karaktera
i plavo pozadinsko osvetljenje koje se po potrebi moze regulisati. Modul
je zasnovan na HD44780 kontroleru koji predstavlja industrijski standard.
Za koriscenje sa Arduino plocama postoje biblioteke koje imaju implementirane osnovne funkcije za rad modula. Na slici 12 se nalazi izgled
LCD modula.

Slika 12: LCD modul


Na slici 13 se nalazi shema povezivanja sa Arduino UNO plocom.

Slika 13: Shema povezivanja

4.5

Infracrveni prijemnik

Sistem je moguce kontrolisati i putem daljinskog upravljaca koji koristi tehnologiju infracrvene svetlosti. Infracrveni prijemnik je komponenta
koja omogucava ocitavanje impulsa poslatih sa daljinskog upravljaca. Mikrokontroler ce reagovati u zavisnosti od impulsa koji mu je prosleden. Na
slici 14 se nalazi izgled standardnog infracrvenog prijemnika koji se moze
naci u kucnim uredajima koji funkcionisu po slicnom principu.

Slika 14: Infracrveni prijemnik


Na slici 15 se nalazi shema povezivanja sa Arduino UNO plocom.

Slika 15: Shema povezivanja

4.6

Senzor temperature i vla


znosti vazduha

Usled zagrevanja pojedinih komponenti sistema, pojavila se potreba za


uvodenjem automatske regulacije temperature. Kada temperatura prede
odredeni prag, ventilator koji je povezan na jedan od releja se ukljucuje
i time se obavlja regulacija temperature. Da bi mikrokontroler mogao
da detektuje kada je neophodno regulisati temperaturu, on mora imati
odgovarajuci senzor. U ovom slucaju je to temperaturni senzor DHT11
koji ujedno meri i vlaznost vazduha. Na slici 16 se nalazi izgled senzora.
Osnovne karakteristike:
Radni napon: 3-5 V
Maksimalna potrosnja struje: 2.5 mA
Raspon merenja vlaznosti vazduha: 20-80 %
Raspon merenja temperature: 0-50 C

Slika 16: Senzor temperature i vlaznosti vazduha DHT11


Na slici 17 se nalazi shema povezivanja sa Arduino UNO plocom.

10

Slika 17: Shema povezivanja

Izvorni kod sistema


ArduinoHeader.h datoteka:

/* Relays */
#define RELAY_1_PIN
#define RELAY_2_PIN
#define RELAY_3_PIN
#define RELAY_4_PIN

2
3
4
5 // DC Fan (5V)

/* IR reciever pin */
#define IR_PIN 14
/* Remote control codes */
#define RELAY_1_SWITCH
0xC084
#define RELAY_2_SWITCH
0xC044
#define RELAY_3_SWITCH
0xC0C4
#define RELAY_4_SWITCH
0xC024
#define SHOW_TEMP
0xC230
#define LCD_BACKLIGHT
0xC240
#define SHOW_CLOCK
0xC2C0
#define SHOW_RELAY
0xC038

//
//
//
//
//
//
//
//

NUM 1
NUM 2
NUM 3
NUM 4
PLAY
REC
STOP
MUTE

/* Temperature and humidity sensor */


#define DHTPIN 15
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
/* Temperature (Celsius) and
#define TEMP_UP_LIMIT 35
#define TEMP_DOWN_LIMIT 32
#define HUM_UP_LIMIT 80
#define HUM_DOWN_LIMIT 60

humidity limits */
// Turn ON auto-cooling
// Turn OFF auto-cooling
// Turn ON auto-cooling
// Turn OFF auto-cooling

11

/* LCD backlight */
#define LCD_BACKLIGHT_PIN 17
/* LCD characters */
byte thermometer[8] = {
B00100,
B01010,
B01010,
B01110,
B01110,
B11111,
B11111,
B01110
};
byte drop[8] = {
B00100,
B00100,
B01010,
B01010,
B10001,
B10001,
B10001,
B01110
};
byte leftFan[8] = {
B01111,
B01100,
B01010,
B01001,
B01001,
B01010,
B01100,
B01111
};
byte rightFan[8] = {
B11110,
B00110,
B01010,
B10010,
B10010,
B01010,
B00110,
B11110
};
byte degree[8] = {
B01110,
B01010,
B01110,
B00000,

12

B00000,
B00000,
B00000,
B00000
};
byte yes1[8] = {
B00000,
B00000,
B00000,
B00000,
B10000,
B01000,
B00101,
B00010
};
byte yes2[8] = {
B00000,
B00001,
B00010,
B00100,
B01000,
B00000,
B00000,
B00000
};
byte no[8] = {
B00000,
B00000,
B10001,
B01010,
B00100,
B01010,
B10001,
B00000
};
/* Clock module */
DS1302 rtc(0, 1, 16); // CE IO SCLK

13

ArduinoMain.ino datoteka:

#include <LiquidCrystal.h>
#include <IRremote.h>
#include "DHT.h"
sensor library
#include <SoftwareSerial.h>
#include <DS1302.h>

// LCD library
// IR library
// Temperature and humidity

#include "ArduinoHeader.h" // Setup library


/* Indicators
[1] -> Relay 1
[2] -> Relay 2
[4] -> Relay 3
[8] -> Relay 4
[16] -> Clock indicator
[32] -> Auto-Cooling indicator
[64] -> LCD backlight
*/
byte indicators = B00000000;
/* IR reciever pin */
IRrecv irrecv(IR_PIN);
decode_results results;
/* Temperature and humidity variables */
float celsius;
int humidity;
float fahrenheit;
/* LCD pins */
LiquidCrystal lcd(6, 7, 8, 9, 10, 11, 12);
/* Bluetooth */
SoftwareSerial Genotronex(18, 19); // RX, TX
int bluetooth_data;
/*************************************
************* FUNCTIONS **************
**************************************/
/* Welcome screen: EN language */
void LCD_show_welcome_EN()
{
lcd.clear();
lcd.setCursor(4, 0);
lcd.print("Welcome!");
delay(1000);
lcd.setCursor(0, 1);
lcd.print("Loading ");

14

delay(1000);
lcd.setCursor(8, 1);
lcd.print(".");
delay(1000);
lcd.setCursor(9, 1);
lcd.print(".");
delay(1000);
lcd.setCursor(10, 1);
lcd.print(".");
delay(1000);
}
/* RELAY menu */
void LCD_show_relay_menu()
{
indicators &= B11101111;

// Clock indicator: OFF

lcd.begin(16,2);
lcd.clear();
/* ------------ Relay 1 ------------ */
if ((indicators & B00000001) == 0)
{
lcd.print("R1: OFF");
}
else if ((indicators & B00000001) == 1)
{
lcd.print("R1: ON");
}
/* ------------ Relay 2 ------------ */
if (((indicators & B00000010) >> 1) == 0)
{
lcd.setCursor(9, 0);
lcd.print("R2: OFF");
}
else if (((indicators & B00000010) >> 1) == 1)
{
lcd.setCursor(9, 0);
lcd.print("R2: ON");
}
/* ------------ Relay 3 ------------ */
if (((indicators & B00000100) >> 2) == 0)
{
lcd.setCursor(0, 1);
lcd.print("R3: OFF");
}
else if (((indicators & B00000100) >> 2) == 1)
{
lcd.setCursor(0, 1);
lcd.print("R3: ON");
}
/* ------------ Relay 4 ------------ */
if (((indicators & B00001000) >> 3) == 0)
{
lcd.setCursor(9, 1);

15

lcd.print("R4: OFF");
}
else if (((indicators & B00001000) >> 3) == 1)
{
lcd.setCursor(9, 1);
lcd.print("R4: ON");
}
}
/* Turn ON relay 1 */
void turn_on_relay_1()
{
digitalWrite(RELAY_1_PIN, LOW); // Turn ON relay 1
indicators |= B00000001;
// RELAY 1 indicator: ON
}
/* Turn OFF relay 1 */
void turn_off_relay_1()
{
digitalWrite(RELAY_1_PIN, HIGH); // Turn OFF relay 1
indicators &= B11111110;
// RELAY 1 indicator: OFF
}
/* Relay 1 ON/OFF */
void relay_1_switch()
{
if ((indicators & B00000001) == 0)
{
turn_on_relay_1();
LCD_show_relay_menu();
// Show RELAY menu
}
else if ((indicators & B00000001) == 1)
{
turn_off_relay_1();
LCD_show_relay_menu();
}
}
/* Turn ON relay 2 */
void turn_on_relay_2()
{
digitalWrite(RELAY_2_PIN, LOW);
indicators |= B00000010;
}
/* Turn OFF relay 2 */
void turn_off_relay_2()
{
digitalWrite(RELAY_2_PIN, HIGH);
indicators &= B11111101;
}
/* Relay 2 ON/OFF (same as "relay_1_switch" function) */
void relay_2_switch()

16

{
if (((indicators & B00000010) >> 1) == 0)
{
turn_on_relay_2();
LCD_show_relay_menu();
}
else if (((indicators & B00000010) >> 1) == 1)
{
turn_off_relay_2();
LCD_show_relay_menu();
}
}
/* Turn ON relay 3 */
void turn_on_relay_3()
{
digitalWrite(RELAY_3_PIN, LOW);
indicators |= B00000100;
}
/* Turn OFF relay 3 */
void turn_off_relay_3()
{
digitalWrite(RELAY_3_PIN, HIGH);
indicators &= B11111011;
}
/* Relay 3 ON/OFF (same as "relay_1_switch" function) */
void relay_3_switch()
{
if (((indicators & B00000100) >> 2) == 0)
{
turn_on_relay_3();
LCD_show_relay_menu();
}
else if (((indicators & B00000100) >> 2) == 1)
{
turn_off_relay_3();
LCD_show_relay_menu();
}
}
/* Turn ON relay 4 */
void turn_on_relay_4()
{
digitalWrite(RELAY_4_PIN, LOW);
indicators |= B00001000;
}
/* Turn OFF relay 4 */
void turn_off_relay_4()
{
digitalWrite(RELAY_4_PIN, HIGH);
indicators &= B11110111;

17

}
/* Relay 4 ON/OFF (same as "relay_1_switch" function) */
void relay_4_switch()
{
if (((indicators & B00001000) >> 3) == 0)
{
turn_on_relay_4();
LCD_show_relay_menu();
}
else if (((indicators & B00001000) >> 3) == 1)
{
turn_off_relay_4();
LCD_show_relay_menu();
}
}
/* TEMP menu */
void LCD_temperature_menu()
{
lcd.clear();
/* LCD custom characters [Arduino_IRRC_header.h] */
lcd.createChar(0, thermometer);
lcd.createChar(1, drop);
lcd.createChar(2, leftFan);
lcd.createChar(3, rightFan);
lcd.createChar(4, degree);
lcd.createChar(5, yes1);
lcd.createChar(6, yes2);
lcd.createChar(7, no);
lcd.setCursor(0, 0);
lcd.write(byte(0));
lcd.setCursor(2, 0);
lcd.print(celsius, 2);
lcd.setCursor(7, 0);
lcd.write(byte(4));
lcd.setCursor(8, 0);
lcd.print("C");

// Celsius (C)

lcd.setCursor(11, 0);
lcd.write(byte(1));
lcd.setCursor(13, 0);
lcd.print(humidity);
lcd.setCursor(15, 0);
lcd.print("%");

// Humidity (%)

lcd.setCursor(0, 1);
// Fahrenheit (F)
lcd.write(byte(0));
lcd.setCursor(2, 1);
lcd.print(fahrenheit, 2);
lcd.setCursor(7, 1);
lcd.write(byte(4));

18

lcd.setCursor(8, 1);
lcd.print("F");
if (((indicators & B00100000) >> 5) == 0) // AUTO-COOLING
indicator: OFF
{
lcd.setCursor(12, 1);
lcd.write(byte(2));
lcd.setCursor(13, 1);
lcd.write(byte(3));
lcd.setCursor(15, 1);
lcd.write(byte(7));
}
else if (((indicators & B00100000) >> 5) == 1) //
AUTO-COOLING indicator: ON
{
lcd.setCursor(12, 1);
lcd.write(byte(2));
lcd.setCursor(13, 1);
lcd.write(byte(3));
lcd.setCursor(14, 1);
lcd.write(byte(5));
lcd.setCursor(15, 1);
lcd.write(byte(6));
}
}
/* Show TEMP menu */
void LCD_show_temperature_menu()
{
indicators &= B11101111; // Clock indicator: OFF
celsius = dht.readTemperature();
humidity = dht.readHumidity();
fahrenheit = dht.readTemperature(true);
LCD_temperature_menu();
}
/* Auto-cooling feature */
void auto_cooling()
{
celsius = dht.readTemperature();
humidity = dht.readHumidity();
if ((celsius > TEMP_UP_LIMIT) || (humidity >
HUM_UP_LIMIT))
{
indicators |= B00100000;
// AUTO-COOLING
indicator: ON (you can not control relay 4
manually)
turn_on_relay_4();

19

}
else if((celsius < TEMP_DOWN_LIMIT) && (humidity <
HUM_DOWN_LIMIT))
{
indicators &= B11011111;
// AUTO-COOLING
indicator: OFF (you can control relay 4 manually)
turn_off_relay_4();
}
}
/* LCD backlight ON/OFF */
void lcd_backlight_switch()
{
if (((indicators & B01000000) >> 6) == 0)
{
digitalWrite(LCD_BACKLIGHT_PIN, LOW);
indicators |= B01000000;
}
else if (((indicators & B01000000) >> 6) == 1)
{
digitalWrite(LCD_BACKLIGHT_PIN, HIGH);
indicators &= B10111111;
}
}
void LCD_show_clock_menu()
{
lcd.clear();
indicators |= B00010000;
ON

// Set clock menu indicator:

// Display time centered on the upper line


lcd.setCursor(4, 0);
lcd.print(rtc.getTimeStr());
// Display abbreviated Day-of-Week in the lower left
corner
lcd.setCursor(0, 1);
lcd.print(rtc.getDOWStr(FORMAT_SHORT));
// Display date in the lower right corner
lcd.setCursor(6, 1);
lcd.print(rtc.getDateStr());
}
/*************************************
************ SETUP LOOP **************
**************************************/
void setup()
{
pinMode(13, OUTPUT);
pinMode(LCD_BACKLIGHT_PIN, OUTPUT);

20

digitalWrite(LCD_BACKLIGHT_PIN, HIGH);
pinMode(RELAY_1_PIN,
pinMode(RELAY_2_PIN,
pinMode(RELAY_3_PIN,
pinMode(RELAY_4_PIN,

OUTPUT);
OUTPUT);
OUTPUT);
OUTPUT);

digitalWrite(RELAY_1_PIN,
digitalWrite(RELAY_2_PIN,
digitalWrite(RELAY_3_PIN,
digitalWrite(RELAY_4_PIN,

HIGH);
HIGH);
HIGH);
HIGH);

// Start the Bluetooth reciever


Genotronex.begin(9600);
Genotronex.println("Bluetooth is ON! Ready!");
// Start the IR receiver
pinMode(IR_PIN, INPUT);
irrecv.enableIRIn();
lcd.begin(16, 2);

// Initialize LCD

// Start temp&himidity sensor


dht.begin();
// Set the clock to run-mode, and disable the write
protection
rtc.halt(false);
rtc.writeProtect(true);
// The following lines can be commented out to use the
values already stored in the DS1302
//rtc.setDOW(SATURDAY);
// Set Day-of-Week to FRIDAY
//rtc.setTime(15, 04, 40); // Set the time to 12:00:00
(24hr format)
//rtc.setDate(13, 12, 2014); // Set the date to August
6th, 2010
LCD_show_welcome_EN();
LCD_show_clock_menu();
}
void bluetooth_read()
{
if (Genotronex.available())
{
bluetooth_data = Genotronex.read();
if (bluetooth_data == 1)
{
Genotronex.println("Relay 1");
relay_1_switch();
}

21

else if (bluetooth_data == 2)
{
Genotronex.println("Relay 2");
relay_2_switch();
}
else if (bluetooth_data == 3)
{
Genotronex.println("Relay 3");
relay_3_switch();
}
else if(bluetooth_data == 4)
{
if (((indicators & B00100000) >> 5) == 0)
{
Genotronex.println("Relay 4");
relay_4_switch();
}
}
else if (bluetooth_data == 7)
{
Genotronex.println("Show R_MENU");
LCD_show_relay_menu();
}
else if (bluetooth_data == 8)
{
Genotronex.println("Show T_MENU");
LCD_show_temperature_menu();
}
else if (bluetooth_data == 5)
{
Genotronex.println("BACKLIGHT");
lcd_backlight_switch();
}
else if (bluetooth_data == 9)
{
Genotronex.println("SHOW C_MENU");
LCD_show_clock_menu();
}
}
}
void IR_read()
{
if (irrecv.decode(&results))
{
if (results.value == RELAY_1_SWITCH)
{
relay_1_switch(); // Turn ON/OFF relay 1 and set
indicator to the correct value
}
else if (results.value == RELAY_2_SWITCH)
{
relay_2_switch(); // Turn ON/OFF relay 2 and set
indicator to the correct value

22

}
else if (results.value == RELAY_3_SWITCH)
{
relay_3_switch(); // Turn ON/OFF relay 3 and set
indicator to the correct value
}
else if(results.value == RELAY_4_SWITCH)
{
if (((indicators & B00100000) >> 5) == 0) // If
AUTO-COOLING indicator is ON, relay 4 can not
be switched OFF
{
relay_4_switch(); // Turn ON/OFF relay 4 and
set indicator to the correct value
}
}
else if (results.value == SHOW_TEMP)
{
LCD_show_temperature_menu(); // Show TEMP menu
}
else if (results.value == SHOW_RELAY)
{
LCD_show_relay_menu();
// Show RELAY menu
}
else if (results.value == SHOW_CLOCK)
{
LCD_show_clock_menu();
// Show CLOCK menu
}
else if (results.value == LCD_BACKLIGHT)
{
lcd_backlight_switch(); // Turn ON/OFF LCD
backlight
}
irrecv.resume(); // Receive the next value
}
}
/*************************************
************ LOOP LOOP :) ************
**************************************/
void loop()
{
bluetooth_read();
IR_read();
if (((indicators & B00010000) >> 4) == 1)
{
const unsigned long clock_interval = 5000UL;
static unsigned long last_sample_time_clock = 0 clock_interval;
unsigned long now_clock = millis();

23

if ((now_clock - last_sample_time_clock) >=


clock_interval)
{
last_sample_time_clock = now_clock;
LCD_show_clock_menu();
}
}
/* Sampling temperature every five minutes */
const unsigned long interval = 5 * 60 * 1000UL; // Time
interval for sampling temperature and humidity
static unsigned long last_sample_time = 0 - interval; //
Initialize such that a reading is due the first time
through loop()
unsigned long now = millis();
if ((now - last_sample_time) >= interval)
{
last_sample_time = now;
auto_cooling();
}
}

Zaklju
cak

Kao sto se vidi, programiranje Arduino ploca je zanimljiv i ne preterano tezak posao, a mogu se napraviti mnogi korisni uredaji i slozeni
sistemi. Jedan takav je ArduSat koji se moze videti na sledecoj adresi:
http://en.wikipedia.org/wiki/ArduSat. Prezentacija sistema za bezicnu
kontrolu releja se moze videti na sledecoj adresi: http://mrgeorgem.
blogspot.com/

Literatura
[1] Massimo Banzi. Arduino, 2014. on-line at: http://arduino.cc/.
[2] Vladimir D. Krstic. Mala skola elektronike. Radio klub.
[3] Wikipedia. Mikrokontroler, 2014. on-line at: http://sh.wikipedia.
org/wiki/Mikrokontroler.
[4] Wikipedia. Relej, 2014. on-line at: http://sr.wikipedia.org/wiki/
Relej.
[5] Wikispaces. Arduino, 2014. on-line at: http://arduino-info.
wikispaces.com/Arduino-What-IS-it.

24

You might also like