Professional Documents
Culture Documents
Sadr
zaj
1 Uvod
2
2
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.1
Arduino UNO
4.1
Modul sa
cetiri elektromagnetna releja
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.
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.
4.4
LCD modul
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.
4.6
10
/* 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
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
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;
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
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);
// Initialize LCD
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
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