Professional Documents
Culture Documents
US - Internet Stvari ARDUINO
US - Internet Stvari ARDUINO
rs
Marko Tanasković
9 788679 126764
Marko Tanasković
INTERNET STVARI
INTERNET
INTERNET OF THINGS
INTERNET OF THINGS
Ovaj praktikum je namenjen pre svega studentima
softverskog inženjerstva, kao podloga za izradu labo-
ratorijskih vežbi za predmet internet stvari korišće-
njem Arduino razvojnog sistema. Međutim mogu je
koristiti svi oni koje zanimaju oblasti programiranja
mikrokontrolera i interneta stvari. Priručnik je pisan
tako da ga mogu koristiti i oni koji imaju početna
znanja iz oblasti elektronike i programiranja mikro-
kontrolera, ali i oni koji tek prave svoje prve korake u
ovim oblastima.
STVARI
interneta stvari polazeći od poglavlja koja daju osnove
Arduino sistema, objašnjavaju kako se fizički sklapaju
električne šeme, preko poglavlja koja objašnjavaju kako
se prave jednostavne aplikacije koristeći digitalne i
analogne ulaze, pa sve do poglavlja u kojima su pred-
stavljeni složeniji projekti koji podrazumevaju rad sa
modulima, komunikaciju sa drugim uređajima ili
izlazak na internet uz pomoć wi-fija. Poglavlja su orga-
nizovana tako da su osnovne stvari i najjednstavniji
problemi pokriveni u prvim poglavljima, dok težina
problema koji se obrađuju raste kroz svako sledeće
poglavlje.
Beograd, 2020.
UNIVERZITET SINGIDUNUM
INTERNET STVARI
ARDUINO PRAKTIKUM
PRVO IZDANJE
Beograd, 2020.
INTERNET STVARI
Autor:
a a :
UNIVERZITET SINGIDUNUM
Beograd, Danijelova 32
www.singidunum.ac.rs
a a a a:
a a a:
a a:
Godina izdanja:
2020.
a:
400 primeraka
Štampa:
ISBN: 978-86-7912-724-2
Copyright:
© 2020. Univerzitet Singidunum
I
Reprodukcija pojedinih delova ili celine ove publikacije nije dozvoljena.
SADRŽAJ
1. UVOD 1
4.3.Primeri 31
Primer 4.1. - Treperenje diode 31
a r a I
Primer 5.3. - Dve diode i taster 51
5.3.Zadaci za samostalan rad 53
7. TAJMERI 65
7.1. Primeri 66
Primer 7.1. - Treperenje diode 66
Primer 7.2. - Promena periode treperenja diode 68
Primer 7.3. - Dve diode koje trepere i taster 69
7.2 Zadaci za samostalni rad 72
9. DISPLEJI 93
9.2.Sedmosegmentni LED displej 93
9.4.Primeri 102
Primer 9.1. - Ispis jednocifrenog broja na LED displej 102
I
I
II Internet stvari
Primer 9.9. - Štoperica 124
9.5.Zadaci za samostalan rad 129
a r a III
Primer 12.4. - Semafor 192
12.2. Zadaci za samostalni rad 198
IV Internet stvari
Sadržaj V
1. UVOD
-
-
teoretski uvod koji opisuje temu od interesa, a potom je ta teoretska osnova ilustrova-
-
v 1
pa m
-
I I
-
-
I I
I I I -
- Brzina
Broj pinova Radni napon
troler – bitska širina rada
14 – Digitalnih
Arduino UNO ATmega328P – 8 bit 16MHz 5V
6 – Analognih
Arduino 20 – Digitalnih
ATmega32u4 – 8bit 16MHz 5V
LEONARDO 7- Analognih
20 – Digitalnih
Arduino MICO ATmega32u4 – 8 bit 16MHz 5V
7 - Analognih
i ita ni a i i ra sa tasteri a 3
pa m
22 – Digitalnih
Arduino NANO ATmega328 – 8bit 16MHz 5V
8 - Analognih
Arduino MEGA 54 – Digitalnih
ATmega2560 – 8bit 16MHz 5V
2560 16 - Analognih
54 – Digitalnih
Arduino DUE 84MHz 5V
12 - Analognih
Konektor za napajanje -
-
lan napon napajanja iznosi 7V.
USB interfejs
4 Internet stvari
pa m
-
pona pri radu sa elektronskim komponentama. Pored napona od 5V i 3.3V tu se nalaze
Pinovi koji se nalaze u ovom delu kao i njihova svrha izslistani su u tabeli 2 - 2.
Vin
naponom napajanja
Analogni pinovi -
ovom delu kao i njihova svrha izslistani su u tabeli 2 - 3. Više detalja o analognim pi-
novima dato je u poglavlju 8.
i ita ni a i i ra sa tasteri a 5
pa m
Digitalni pinovi
PWM I
I -
6 Internet stvari
pa m
se sastoji od tri celine: radni deo, informacioni deo i deo u kome se vrše podešavanja.
-
-
komunikaciju itd.
i ita ni a i i ra sa tasteri a 7
pa m
-
I
rad sa tajmerima, a detaljan opis ove biblbioteke dat je u poglavlju 7.
Deo za
podešavanje
Radni deo
Informacioni
deo
8 Internet stvari
pa m
prikazan je na slici 2 - 5.
Izbor komunikacionog porta se vrši tako što se u meniju Tools, sekciji Port, izabere onaj port
i ita ni a i i ra sa tasteri a 9
pa m
10 Internet stvari
pa m
I -
otvaranja novog Arduino fajla dobijamo situaciju prikazanu na slici 2 - 8, gde se inici-
jalno nalaze dve neophodne funkcije sa praznim telima.
Izvršava se jednom
na početku
Izvršava se ciklično
u beskonačnoj petlji
i ita ni a i i ra sa tasteri a 11
pa m
-
-
u tekstualnom formatu. Taj kod se piše po sintaksnim pravilima programskog jezika C. Ovaj
mogu direktno da ga razumeju. Zbog toga je neophodno da ovaj kod bude preveden u niz
ima zadatak da kod napisan u C-u prevede na mašinski kod koji Arduino hardverska
prikazano na slici 2 - 9. Nakon toga, ukoliko je kod pravilno napisan i nema sintaksnih
1. Pokretanje
komajlirana
3. Prenos programa
na Arduino
platformu
2.
Kompajliranje
završeno
12 Internet stvari
pa m
I -
ese na mikrokontroler on ostaje u memoriji mikrokontrolera sve dok se ponovo ne unese
neki novi kod. Opisani mehanizam programiranja mikrokontroler ilustrovan je na slici 2 - 10.
PC
Arduino kod u C-u
Prevođenje na
mašinski kod
Mašinski kod
USB Interfejs
(Nule i jedinice)
Ukoliko bi se ova veza prekinula, a Arduino napajo iz nekog drugog izvora napa-
i ita ni a i i ra sa tasteri a 13
pa m
U=I × R
ili
U
I=
R
a an e e e tri ni a 15
pa m
I
-
16 Internet stvari
pa m
-
mernog napona prikazan je na slici 3 - 3.
a an e e e tri ni a 17
pa m
Struja I
5V
I=
R1 + R 2
napon na otporniku R2
U A =I×R 2
R
U = 2 ×5V
A R +R
1 2
I
1
i
R1+R2. Što je otpornost R2
otpornost R1
-
gled potenciometra su prikazani na slici 3 - 4.
18 Internet stvari
pa m
Slika 3 - 5 - Protobord
1. Muško-muški
a an e e e tri ni a 19
pa m
20 Internet stvari
pa m
Displej
Tasteri za konfiguraciju
Priključci za kablove
-
-
a an e e e tri ni a 21
pa m
• m ap a a ap m p aa m
a a ata a m ap ta p m ap a
potenciometra (menja se otpornost R2 t a :
22 Internet stvari
pa m
a an e e e tri ni a 23
pa m
24 Internet stvari
pa m
-
nos skladištenje ili prikazivanje informacija. Digitalni sistemi uglavnom rade na principu
visok naponski
nivo ili nivo logičke jedinice (HIGH) i nizak naponski nivo ili nivo logičke nule (LOW). Kod
i ita ni i a i i ra sa i a a 27
pa m
4.2. DIODA
kolima. Njihovo glavno svojstvo jeste da provode struju samo u jednom smeru. Dioda
anoda i at a
Anoda
-
jstvo diode ilustrovano je na slici 4 - 3.
28 Internet stvari
pa m
t ap t a p
su na slici 4 - 4.
i ita ni i a i i ra sa i a a 29
pa m
I
pinova ove diode prikazani su na slici 4 - 5.
-
zlikuju se po tome da li diode dele katodu ili anodu. Na slici 4 - 5 je prikazana varijanta
30 Internet stvari
pa m
4.3. PRIMERI
• a a t m at a at p a
p m ap a p am a ta a t
pa p t p t a a
Rešenje:
- Arduino UNO
- Dioda
- Protobord
i ita ni i a i i ra sa i a a 31
pa m
-
-
void setup() {
// Initialize diode pin as output pin
pinMode(PinNo,OUTPUT);
// Set initial diode state
digitalWrite(PinNo,DiodeStatus);
}
void loop() {
// Change diode status
DiodeStatus = !DiodeStatus;
// Write desired output value to desired pin
digitalWrite(PinNo, DiodeStatus);
// Delay program execution for DelayTime ms
delay(DelayTime);
}
Digitalni pinovi mogu da se koriste kao ulazni i kao izlazni. Inicijalizacija smera u
pinMode(PinNo,Direction);
PinNo – Broj pina
32 Internet stvari
pa m
I
pozivom funkcije
delay(delayTimeInms);
I
Promenljiva DiodeStatus
LOW HIGH
I
funkciji setup
funkcije ta t koja kao prvi argument prima broj pina dok je drugi argument
Funkcija p se ponavlja sve dok Arduino ima napajanje. U prvoj naredbi unutar
glavne programske petlje p vrši se promena trenutnog stanja diode primenom op-
eracije inverzije na promenljivu DiodeStatus. Operator inverzije u Arduino kodu je op-
I
t a
-
ljivoj DiodeStatus -
promenljive a m .
i ita ni i a i i ra sa i a a 33
pa m
• a a t m ap a
p am a m a a a ap a
pa p t p t a a t ma
Rešenje:
Za realizaciju ovog sistema potrebno je:
- Arduino UNO
- Protobord
34 Internet stvari
pa m
setup i p
i Green
-
a m
RedDiodeStatus i GreenDiodeStatus
I
Nakon deklaracije promenljvih ulazi se u funkciju setup koja ima zadatak da inicijali-
i ita ni i a i i ra sa i a a 35
pa m
• a a t m ap a p am
a : a t
pa ap a a a t a a t pa
p t p t a a t ma
Rešenje:
- Arduino UNO
- RGB dioda
- Protobord
36 Internet stvari
pa m
-
-
i ita ni i a i i ra sa i a a 37
pa m
i zelene LE diode.
u toj boji sa periodom 0.5 sekundi. Dakle, 6 sekundi treperi crvena pa 6 sekundi
38 Internet stvari
pa m
Cilj ovog poglavlja je da uvede osnove u radu sa digitalnim pinovima kada se oni
5.1. TASTERI
Tasteri imaju dva stanja: otvoren i zatvoren. Pod otvorenim tasterom se podrazume-
i ita ni a i i ra sa tasteri a 41
pa m
sistema.
42 Internet stvari
pa m
-
I
I -
p
otpornik dok se otpornik na slici desno naziva .
i ita ni a i i ra sa tasteri a 43
pa m
44 Internet stvari
pa m
-
kom
i ita ni a i i ra sa tasteri a 45
pa m
5.2. PRIMERI
• a a t m ta t p t
p t m a a a ap a mp m at a a
t pa p t p t a a
Rešenje
- Arduino UNO
- Dioda
- Protobord
- Taster
46 Internet stvari
pa m
Value = digitalRead(PinNo);
Unutar funkcije setup vrši se inicijalizacija sistema. Prvo se podese direkcije pinova.
Pin na koji je povezana dioda podešava se kao izlazni, dok se pin na koji je povezan
I
petlje p
i ita ni a i i ra sa tasteri a 47
pa m
• a a t m a m m m ta t m a a ta t t a
a ap a p am a
pa p t p t a a t ma
Rešenje:
- Arduino UNO
- Dioda
- Protobord
48 Internet stvari
pa m
ButtonPrevStatus = digitalRead(ButtonPinNo);
ButtonCurrentStatus = digitalRead(ButtonPinNo);
}
void loop() {
// Read button pin status
ButtonCurrentStatus = digitalRead(ButtonPinNo);
// If the button current status is different from the
// previous one
if(ButtonCurrentStatus != ButtonPrevStatus){
// Check if falling edge
if(ButtonCurrentStatus == LOW){
//Change diode status
DiodeStatus = !DiodeStatus;
//Write new diode status to the pin
digitalWrite(DiodePinNo,DiodeStatus);
}
ButtonPrevStatus = ButtonCurrentStatus;
}
}
Promenljiva DiodeStatus
Unutar funkcije setup
pin na koji je povezana dioda podešava kao izlazni i dodeljuje mu se inicijalna vrednost,
dok se pinovi koji se koriste kao pinovi tastera proglašavaju kao ulazni.
Unutar glavne programske petlje p vrši se detekcija silazne ivice i kao rezultat te
p funkcije. Ukoliko
razlika postoji, tada smo detektovali promenu stanja na pinu za koji je povezan taster.
-
ponska ivica na datom pinu, neophodno je odmah posle detekcije promene stanja na
i ita ni a i i ra sa tasteri a 49
pa m
Nakon drugog
stanja pina na koji je povezana dioda pozivom funkcije ta t
Na kraju prvog uslova, odnosno detekcije promene stanja na pinu, neophodno je
promenljivoj tat t tat
p
toku trenutnog izvršavanja ove funkcije.
-
raju male oscilacije koje dovode do odskakivanja tastera. Odskakivanje tastera za
50 Internet stvari
pa m
void loop() {
// Read button pin status
ButtonCurrentStatus = digitalRead(ButtonPinNo);
// If the button current status is different from the
// previous one
if(ButtonCurrentStatus != ButtonPrevStatus){
delay(BouncingTime);
ButtonCurrentStatus = digitalRead(ButtonPinNo);
// Check if falling edge
if(ButtonCurrentStatus == LOW){
//Change diode status
DiodeStatus = !DiodeStatus;
//Write new diode status to the pin
digitalWrite(DiodePinNo,DiodeStatus);
}
ButtonPrevStatus = ButtonCurrentStatus;
}
}
• a a t m at ta t a
m a ta t p m aa t ta ta a
a a aa a a ap a a pa m
a ta a t pa p t p t a a
Rešenje:
- Arduino UNO
- Protobord
- Taster
i ita ni a i i ra sa tasteri a 51
pa m
void setup() {
// Initialize diodes pins direction as ouput
pinMode(RedDiodePinNo,OUTPUT);
pinMode(GreenDiodePinNo,OUTPUT);
// Initialize button pin direction as input
pinMode(ButtonPinNo,INPUT);
// Write diodes pins init values
digitalWrite(RedDiodePinNo,RedDiodeStatus);
digitalWrite(GreenDiodePinNo,GreenDiodeStatus);
// Read current status on the button pin
ButtonPrevStatus = digitalRead(ButtonPinNo);
ButtonCurrentStatus = digitalRead(ButtonPinNo);
}
void loop() {
52 Internet stvari
pa m
I
sada umesto jedne, radimo sa sve diode.
1.
uspešnost realizacije.
-
-
-
mentacijom sistema.
i ita ni a i i ra sa tasteri a 53
pa m
p -
interrupt
t pt
void
programa
Trenutak pojave
prekida
pinovi 2 i 3.
56 Internet stvari
pa m
koji se naziva t t -a
-
nama kao što su intezitet osvetljaja diode, brzina okretanja motora, itd.
t -a.
t -a signala.
6.3. PRIMERI
-
talnih ulaza i izlaza. Neki primeri iz prethodnih poglavlja ovde su elegantnije rešeni
• p m p m mm a ma p a
Rešenje:
58 Internet stvari
pa m
• I
•
• I I
• I
•
petlja p
-
kasnije, tj. da se što manje posla obavlja u prekidnoj proceduri.
I
t
tonPressed -
avlja se na vrednost true
U glavnoj programskoj petlji p se proverava da li je postavljena ova vrednost i ukoliko
jeste menjaju se stanja dioda.
60 Internet stvari
pa m
• a a t m at a ta t a ta t ma
p a a t t t a at a a t a t t ta
a a a ta t ma t t t a p a a ta t
p a a t t t t aa a ap a a a
pa m p a p t p t a a
Rešenje:
- Arduino Uno
- Dioda
- Protobord
- 2 tastera
-
void setup() {
//Initialize system
pinMode(DiodePinNo, OUTPUT);
pinMode(ButtonUpPinNo, INPUT);
pinMode(ButtonDownPinNo, INPUT);
attachInterrupt(digitalPinToInterrupt(ButtonUpPinNo), UpISR, FALLING);
attachInterrupt(digitalPinToInterrupt(ButtonDownPinNo), DownISR, FALLING);
}
void loop() {
analogWrite(DiodePinNo, 255*Intensity/100);
}
analogWrite(PinNo, Value);
62 Internet stvari
pa m
UpISR
t t za 10. Suprotno ovoj funkciji za servisiranje prekida imamo funkciju DownISR
u koju se ulazi usled silazne ivice signala na pinu broj 3 na koji je prikljucen drugi taster.
U glavnoj programskoj petlji pozivom funkcije a a t vršimo stalno generi-
t t .
Pitanje:
Odgovor I
-
I
t -a diode.
t
7. TAJMERI
signal
-
I
-
a
-
voljavaju konstantnu upotrebu procesora za izvršavanje korisnih programskih funkcija.
a eri 65
pa m
7.1. PRIMERI
• a a t m at at p ap m
ap a mp m at a a t pa p t p t
a a
Rešenje:
- Arduino UNO
- Dioda
- Protobord
#include <TimerOne.h>
const int DiodePinNo = 13;
const unsigned long TimerPeriod = 500000; //microseconds
66 Internet stvari
pa m
void TimerISR(){
//Change diode status
DiodeStatus = !DiodeStatus;
//Write new value to the diode pin
digitalWrite(DiodePinNo,DiodeStatus);
}
void TimerISR(){
//Change diode status
void setup() {
//Initialize diode pin as output
pinMode(DiodePinNo, OUTPUT);
//Write value to the diode pin
digitalWrite(DiodePinNo, DiodeStatus);
//Initialize timer period
Timer1.initialize(TimerPeriod);
//Assign timmer interrupt function
Timer1.attachInterrupt(TimerISR);
}
void loop() {
// put your main code here, to run repeatedly:
}
Timer1.attachInterrupt(FunctionName);
am
TimerISR
unutar koje se vrši promena stanja diode.
a eri 67
pa m
• a a t m at a ta t a m
a a ta t a p t p a a
p m a ta t ma p t p a a
a p at p a a a at
p a t a a aa p
t t a tp t p a aa a a p a a
p ta t a m p a a p a ta p a
ta t a t a a ap a mp m at a a t
pa p t p t a a
Rešenje:
- Arduino UNO
- Dioda
- Protobord
- 2 Tastera
#include <TimerOne.h>
const int DiodePinNo = 13;
const int ButtonUpPinNo = 2;
const int ButtonDownPinNo = 3;
volatile int TimerPeriod = 100000; //microseconds
volatile int DiodeStatus = LOW;
void TimerISR(){
DiodeStatus = !DiodeStatus;
digitalWrite(DiodePinNo,DiodeStatus);
}
void DownISR(){
TimerPeriod-=10000;
Timer1.setPeriod(TimerPeriod);
}
void UpISR(){
TimerPeriod+=10000;
Timer1.setPeriod(TimerPeriod);
}
void setup() {
68 Internet stvari
pa m
-
ljive TimerPeriod -
• a a t m at a a
ta t a t p ap m mt t t p
am a a a a a a a m aa p
m a ta t ap a a pa m a a t m
m ta m a p a p t p t ap a a
Rešenje:
- Arduino UNO
a eri 69
pa m
- Protobord
- Taster
#include <TimerOne.h>
const int GreenDiodePinNo = 13;
const int RedDiodePinNo = 12;
const int ButtonPinNo = 2;
volatile int ButtonStatus;
volatile int GreenDiodeStatus = LOW;
volatile int RedDiodeStatus = LOW;
//Combination == true => Red diode active
//Combination == false => Green diode active
volatile boolean Combination;
const unsigned long DiodePeriod = 500000;
//Diode period blink in microseconds
void setup() {
//Initialize all port’s pins direction and variable
//Diode pin directions as output pin
pinMode(GreenDiodePinNo,OUTPUT);
pinMode(RedDiodePinNo,OUTPUT);
//Button pin direction as input pin
pinMode(ButtonPinNo,INPUT);
//Initialize diode pin pins value
digitalWrite(GreenDiodePinNo, GreenDiodeStatus);
digitalWrite(RedDiodePinNo, RedDiodeStatus);
//Red active
Combination = true;
//Attach interrupt to the pin
attachInterrupt(digitalPinToInterrupt(ButtonPinNo), ButtonISR, FALLING);
//Initialize timer
Timer1.initialize(DiodePeriod);
Timer1.attachInterrupt(TimerISR);
}
void ButtonISR()
{
Combination = !Combination;
}
void TimerISR()
{
if(Combination == false)
{
GreenDiodeStatus = !GreenDiodeStatus;
digitalWrite(GreenDiodePinNo,GreenDiodeStatus);
}
70 Internet stvari
pa m
else
{
RedDiodeStatus = !RedDiodeStatus;
digitalWrite(RedDiodePinNo,RedDiodeStatus);
}
}
void loop() {
//Free
}
-
jamo stanje ove diode.
TimerISR koja
a eri 71
pa m
-
kom na taster selektuje dioda koja treperi. Selektovana dioda treperi sa perio-
dom od 1s. Prilikom pokretanja sistema crvena dioda je selektovana. Promena
72 Internet stvari
pa m
digitalne konverzije.
-
AD konvertora.
na ni a i i sen ri 75
pa m
Opseg
K=
BROJ BITA KOVERTORA
2 -1
t t a a ma ta
a a a t a a ta a ata a a
t a a a a a a a
5 V-0 V 5 é ù
K= = ëê V ûú
210 -1 1023
U 5
D= = ×1023=1023
K 5
U 5 1023
D= = ×1023= =511
K 5 2
76 Internet stvari
pa m
8.2. FOTOOTPORNIK
Fotootpornik
na ni a i i sen ri 77
pa m
5V
GND
IZLAZ
78 Internet stvari
pa m
Ovaj senzor ima tri pina: GND – pin koji povezujemo sa masom sistema, 5V – pin koji
povezujemo na napajanje sistema i izlazni pin senzora. Na izlaznom pinu se generiše
napon Vo, srazmeran temperaturi:
mV
V0 =10 ×T
0
C
V0 0
T= × C
10 mV
V
D= 0 ×1023
5V
D×5 V
T= × C
0
1023×10 mV
D×5×1000 mV
T= × C
0
1023×10 mV
D
T= ×500 C
0
1023
na ni a i i sen ri 79
pa m
8.4. PRIMERI
• a a t m at p t m ta m a
ta p t m ta p m t t ta t ap a
a ta a t pa p t p t a a
Rešenje:
- Arduino UNO
- Dioda
- Protobord
- Potenciometar
80 Internet stvari
pa m
#include <TimerOne.h>
#define PotentPin A0
const int DiodePinNo = 9;
//With this period we read potentiometer
//analog pin value
const unsigned long SensorReadPeriod = 10000;
//Variable for storing the value we read
volatile unsigned int Value;
void TimerISR(){
Value = analogRead(PotentPin);
Value /=4;
}
void setup() {
pinMode(DiodePinNo, OUTPUT);
Timer1.initialize(SensorReadPeriod);
Timer1.attachInterrupt(TimerISR);
}
void loop() {
analogWrite(DiodePinNo, Value);
}
Value = analogRead(PinNo);
jednostavnim deljenjem sa 4.
Unutar funkcije setup vrši se inicijalizacija sistema i tajmera dok se u glavnoj pro-
t -a što za posledicu
ima promenu intenziteta diode.
na ni a i i sen ri 81
pa m
• ap a t m at t tp a m t t t
t a a t t ta t p t a
m p m t tp a t t t t t a a t
am a t t t t p t a a a a p t t
ta m a a t p m t t t m a a p t ma
ma t a a ap a a a
pa m p a p t p t a a
Rešenje:
Za realizaciju ovog projekta neophodno je:
- Arduino UNO
- LE dioda
- Protobord
- Fotootpornik
su na slici 8 - 6.
82 Internet stvari
pa m
#include <TimerOne.h>
#define ResistorPin A0
const int DiodePinNo = 9;
//Here is located readed value from Photoresistor
volatile unsigned int Value;
const int SensorReadPeriod = 20000;
void TimerISR(){
//Variable for storing the analog value
Value = analogRead(ResistorPin);
Value /= 2;
//constrain value
Value = constrain(Value,0,255);
}
void setup() {
//Init pins direction
pinMode(DiodePinNo,OUTPUT);
Timer1.initialize(SensorReadPeriod);
Timer1.attachInterrupt(TimerISR);
}
void loop() {
//Write Duty cicle
analogWrite(DiodePinNo,255-Value);
}
vrednost promenljive.
I
t m a
Pre setup
na ni a i i sen ri 83
pa m
• ap a t m at t tp a t t
ma a a t p t p t ama a
t a a a am a a p t a t a a
ta a p t a a t at a a a t ap a
a a pa m p a p t p t a a
Rešenje:
- Arduino UNO
- Protobord
- Fotootpornik
84 Internet stvari
pa m
#include <TimerOne.h>
#define ResistorPin A0
const int RedPinNo = 13;
const int YellowPinNo = 12;
const int GreenPinNo = 11;
volatile unsigned int
const unsigned int SensorReadPeriod = 20000;
void TimerISR(){
Value = analogRead(ResistorPin);
Value /= 2;
//constrain value
Value = constrain(Value,0,255);
}
void setup() {
//Set pins directions
pinMode(RedPinNo,OUTPUT);
pinMode(YellowPinNo,OUTPUT);
pinMode(GreenPinNo,OUTPUT);
//Set pins init values
digitalWrite(RedPinNo,LOW);
digitalWrite(YellowPinNo,LOW);
digitalWrite(GreenPinNo,LOW);
//Init timer
Timer1.initialize(SensorReadPeriod);
Timer1.attachInterrupt(TimerISR);
}
void loop() {
//Always green beacouse Value is
//always greather than 0
digitalWrite(GreenPinNo,HIGH);
if(Value > 255/3){
digitalWrite(YellowPinNo,HIGH);
if(Value > 255*2/3){
digitalWrite(RedPinNo,HIGH);
}
else{
digitalWrite(RedPinNo,LOW);
}
}
else{
digitalWrite(YellowPinNo,LOW);
}
}
na ni a i i sen ri 85
pa m
I -
-
1
* 2 5 5
3
2
i od * 2 5 5 -
3
• a a t m at a t mp at
a a a t mp at p t t mp at
am ta p at a a pa a t mp at a
p t m at a a a a at mp at
am ta p at a a a ap a a
a pa m mp m at a a t pa p t
p t a a
Rešenje:
- Arduino UNO
- RGB dioda
- Protobord
- LM35 temperaturni senzor
86 Internet stvari
pa m
#include <TimerOne.h>
#define SensorPin A0
//Timer variable
const unsigned long SensorReadPeriod = 500000;
//microseconds
//Temperature variable
volatile unsigned int Temp;
//RGB Diode pins
const int RedDiodePinNo = 13;
const int GreenDiodePinNo = 12;
const int BlueDiodePinNo = 11;
na ni a i i sen ri 87
pa m
void setup() {
pinMode(RedDiodePinNo, OUTPUT);
pinMode(GreenDiodePinNo, OUTPUT);
pinMode(BlueDiodePinNo, OUTPUT);
digitalWrite(RedDiodePinNo, LOW);
digitalWrite(GreenDiodePinNo, LOW);
digitalWrite(BlueDiodePinNo, LOW);
Timer1.initialize(SensorReadPeriod);
Timer1.attachInterrupt(TimerISR);
}
void TimerISR()
{
Temp=(analogRead(SensorPin)*500.0)/1023;
}
void loop() {
if(Temp < 18){
digitalWrite(RedDiodePinNo, LOW);
digitalWrite(GreenDiodePinNo, LOW);
digitalWrite(BlueDiodePinNo, HIGH);
}
else{
if(Temp <23){
digitalWrite(RedDiodePinNo, LOW);
digitalWrite(GreenDiodePinNo, HIGH);
digitalWrite(BlueDiodePinNo, LOW);
}
else{
digitalWrite(RedDiodePinNo, HIGH);
digitalWrite(GreenDiodePinNo, LOW);
digitalWrite(BlueDiodePinNo, LOW);
}
}
}
Temp
U funkciji setup
-
88 Internet stvari
pa m
#include <TimerOne.h>
#define SensorPin A0
//Timer variable
const unsigned long SensorReadPeriod = 10000;
//microseconds
//Temperature variable
volatile unsigned int CurrentTemp;
volatile unsigned int TempSum;
volatile unsigned int Temp;
volatile int counter =0;
volatile const int SamplesNo = 100;
//RGB Diode pins
const int RedDiodePinNo = 13;
const int GreenDiodePinNo = 12;
const int BlueDiodePinNo = 11;
void setup() {
pinMode(RedDiodePinNo, OUTPUT);
pinMode(GreenDiodePinNo, OUTPUT);
pinMode(BlueDiodePinNo, OUTPUT);
digitalWrite(RedDiodePinNo, LOW);
digitalWrite(GreenDiodePinNo, LOW);
digitalWrite(BlueDiodePinNo, LOW);
Timer1.initialize(SensorReadPeriod);
Timer1.attachInterrupt(TimerISR);
}
void TimerISR()
na ni a i i sen ri 89
pa m
{
CurrentTemp=(5.0*analogRead(SensorPin)*100.0)/1024;
//Add to the temperature sum;
TempSum+=CurrentTemp;
counter++;
if(counter == SamplesNo){
//Count average
Temp = TempSum/SamplesNo;
//Reset counter and temperature
TempSum = 0;
counter = 0;
}
}
void loop() {
if(Temp < 18){
digitalWrite(RedDiodePinNo, LOW);
digitalWrite(GreenDiodePinNo, LOW);
digitalWrite(BlueDiodePinNo, HIGH);
}
else{
if(Temp <23){
digitalWrite(RedDiodePinNo, LOW);
digitalWrite(GreenDiodePinNo, HIGH);
digitalWrite(BlueDiodePinNo, LOW);
}
else{
digitalWrite(RedDiodePinNo, HIGH);
digitalWrite(GreenDiodePinNo, LOW);
digitalWrite(BlueDiodePinNo, LOW);
}
}
}
-
promenljive:
t mp
TempSum – Trenutna suma uzoraka
Temp – Srednja vrednost temperature
t – Koliko uzoraka je trenutno prikupljeno
amp – Koliko uzoraka temperature prikupljamo
90 Internet stvari
pa m
amp
t
ponavlja.
-
-
na ni a i i sen ri 91
pa m
9. DISPLEJI
je na slici 9 - 1.
is e i 93
pa m
I -
-
94 Internet stvari
pa m
Simbol
A B C D E F G DP
0 1 1 1 1 1 1 0 0
1 0 1 1 0 0 0 0 0
2 1 1 0 1 1 0 1 0
3 1 1 1 1 0 0 1 0
4 0 1 1 0 0 1 1 0
5 1 0 1 1 0 1 1 0
6 1 0 1 1 1 1 1 0
7 1 1 1 0 0 0 0 0
8 1 1 1 1 1 1 1 0
9 1 1 1 1 0 1 1 0
A 1 1 1 0 1 1 0 0
B 0 0 1 1 1 1 1 0
C 1 0 0 1 1 1 0 0
D 0 1 1 1 1 0 1 0
E 1 0 0 1 1 1 1 0
F 1 0 0 0 1 1 1 0
is e i 95
pa m
segmente.
96 Internet stvari
pa m
is e i 97
pa m
98 Internet stvari
pa m
pozadinsko osvetljenje i bela slova. Suprotno displeju nalaze se pinovi preko kojih se LCD
6 E
7-14 DB0-DB7 Linije za prenos informacija
15 A Napajanje za pozadinsko osvetljenje
16 K
is e i 99
pa m
-
lazi da ona bude bele boje. Polarizaciju polja za svaki segment vrši poseban regulator
koji je sastavni deo displeja. Primer polarizacije polja u matrici jednog segmenta za
ove biblioteke vrši se tako što se u meni baru izabere Sketch-> Include library i iz izlistanih
is e i 101
pa m
9.4. PRIMERI
• a a t m at p a a p
p ap t t a p a p a a m
ap m ta t a a a a a t a p
a a a a p a a ap a a
a pa m a a t a a t p t
p t a a t ma
Rešenje:
- Arduino UNO
- Protobord
Ovaj primer ima za cilj da demonstrira jednostavan ispis jednocifrenog broja na LED
Init7Seg();
TurnDspOn(DSPNumber);
DSPNumber
WriteNum(Digit);
Digit – Cifra od 0-9 koju ispisujemo na sedmosegmentni displej.
is e i 103
pa m
Unutar setup
displeju vrši se unutar prekidne funkcije tajmera. Unutar ove funkcije najpre se vrši
t za 1.
• a a t m at t p a
a p p a t t a t a p m a ap m a
p p t t p m p aa a a
p a ap m a aa p a a m
a a a a p a a a a a p p
a a p a a a aa t
p a a a a a a p ta p ap a a
a pa m p a p t p t a a
Rešenje:
- Arduino UNO
- Protobord
counter = 0;
TurnDspOff(ActiveDsp);
if(ActiveDsp == 1)
{
ActiveDsp = 4;
TurnDspOn(ActiveDsp);
}
else
{
ActiveDsp --;
TurnDspOn(ActiveDsp);
}
}
else
{
//increment counter
counter++;
}
}
void setup() {
//First init LED diplay
Init7Seg();
//Turn on display number 4
TurnDspOn(ActiveDsp);
Timer1.initialize(TimerPeriod);
Timer1.attachInterrupt(TimerISR);
}
void loop() {
//Write counter value to display
WriteNum(counter);
}
Vrednost promenljive p
is e i 105
pa m
• a a t m at p a a m p
ap t t a p a p a
a m ap m a a a a a t a p
a a a a p a a ap a a
a pa m mp m at a a tpa
p t p t a a
Rešenje:
p a p a.
I
-
perenje ne bude vidljivo golim okom. Ovo se ostvaruje ukoliko dioda treperi sa perio-
20ms
T= (11)
Broj displeja
#include <7Seg.h>
#include <TimerOne.h>
int DisplayRefreshTime = 10000; //microsecunds
//Currently active dsp;
volatile int NextDspUpd;
int counter = 0;
volatile int NoOfEnter = 0; // in interrupt service routine
//Low digit of counter value
volatile int LowDigit = 0;
//High digit of counter value
volatile int HighDigit = 0;
void setup() {
//First init LED display
Init7Seg();
NextDspUpd = 4;
Timer1.initialize(DisplayRefreshTime);
Timer1.attachInterrupt(DisplayRefresh);
}
//Extract low and high digit from Number
void Convert(const int Number)
{
int Temp = Number;
//Extract higher digit
HighDigit = Temp/10;
//Calculate rest
Temp%=10;
//Extract lower digit
LowDigit = Temp/1;
}
//Timer callback function
//This function refreshes display contents
void DisplayRefresh()
{
NoOfEnter++;
switch(NextDspUpd)
{
case 3:
//Turn off display 4
TurnDspOff(4);
//Turn on display 3
TurnDspOn(3);
//Write digit to dsp3
WriteNum(HighDigit);
//Next active display is 4
NextDspUpd = 4;
break;
case 4:
//Turn off display 3
TurnDspOff(3);
//Turn on display 4
is e i 107
pa m
TurnDspOn(4);
//Write lower digit
WriteNum(LowDigit);
// Next active display is 3;
NextDspUpd = 3;
break;
}
}
void loop() {
//Call function for extracting lower and higher digit
Convert(counter);
//check whether the value has reached 99
if(NoOfEnter == 100){
if(counter == 99)
{
counter = 0;
}
//if not
else
{
//increment counter value
counter++;
}
NoOfEnter = 0;
}
}
Promenljiva t p p
• a a t m at p a a p at
m a p t a a p t t t a ap a a
a t a a t pa p t p t a a t ma
Rešenje:
- Arduino UNO
- Protobord
- LCD displej
is e i 109
pa m
ta ,
ta
LiquidCrystal LCD(rs, enable, DB4, DB5, DB6, DB7);
rs
enable
pin sa LCD displeja
DB4,DB5,DB6,DB7
begin(cols, rows);
cols
rows
print(data);
data a
t t t
-
ljive p ti p t koje nose informaciju o visini i širini displeja. Nakon toga
ta
promenljiva pri radu sa LCD displejom.
Unutar setup funkcije vrši se inicijalizacija širine displeja pozivom funkcije a
I p je prazna i u
setup
funkcje ostanu ispisana sve dok Arduino ima napajanja.
is e i 111
pa m
• a a t m a a a p a ma ta t
p a t t p a a p m ap m a ta t t a
a a t a a m a a a p a a ta t a
m p m t t t a ap a a a pa m
pa p t p t a a t ma
Rešenje:
- Arduino UNO
- Protobord
- Taster
- LCD displej
-
is e i 113
pa m
clear();
U ovom enum p .
t am a t am i Topic
podataka je uveden da bi program imao informaciju o tome koji od podataka se trenutno
t p .
t gde na osnovu trenutnog
a
print() koja kao argument prima string kome
u t a strukturi.
• a a t m m t mp at t t p
t tat m a p a p mp at a t a a
p a a a t p ma a a p a p a
t tt a a p aa a a p a
a p a t ap a a a a mp a
p t p t a a
Rešenje:
- Arduino UNO
- Protobord
- Fotootpronik
- Temperaturni senzor LM35
- LCD displej
is e i 115
pa m
is e i 117
pa m
LCD.print((char)0xB0);
//Print ‘C’ char
LCD.print(‘C’);
LCD.setCursor(DispHeight/2-1,1);
LCD.print(CurrentLight);
}
void TimerISR(){
DispCount++;
switch(CurrentRead){
case DummyRead:
CurrentTemp=(5.0*analogRead(TempSensorPinNo)*100.0)/1024;
CurrentRead = TempRead;
break;
case TempRead:
CurrentTemp=(5.0*analogRead(TempSensorPinNo)*100.0)/1024;
SumTemp+=CurrentTemp;
counter++;
if(counter == SamplesNo){
//Count average
Temp = SumTemp/SamplesNo;
//Reset counter and temperature
SumTemp = 0;
counter = 0;
}
CurrentRead = LightRead;
break;
case LightRead:
CurrentLight = analogRead(LightSensorPinNo);
CurrentLight /= 2;
CurrentLight = constrain(CurrentLight,0,255);
CurrentRead = DummyRead;
break;
}
if(DispCount == 50){
DispCount = 0;
DispRefresh = true;
}
}
void loop() {
if(DispRefresh == true){
DispRefresh = false;
WriteToLCD();
}
}
-
p a
t a .
mm a -
je. TempRead
vrednost izmerene temperature. Nakon toga sledi ispis specijalnog simbola za stepen
is e i 119
pa m
Prvi horizontalni red odozgo predstavlja viših 4 bita osmobitne adrese dok prvi
• a a t m am tp a ap p a a
ap a m a a p a a ma p tp p at
tp m t a a p a ap a p tp
a tp t m t m tp p t p a a
a t mt a a ta a t t a a tp t at a
a m p t a a a a aa t m a a a m p
p a t a a p ta tp am am p
tm tp ap a a a pa m a
ta a t pa p t p t a a
Rešenje:
- Arduino UNO
- Protobord
- LCD displej
is e i 121
pa m
je na slici 9 - 23.
I
-
V =
5V
´10kW
(12)
x R +10kW
x
Slika 9 - 23 - Razdelnik I
napona
æç 5 V ö÷
R x =10kWç -1÷ (13)
çè Vx ÷÷ø
ç
is e i 123
pa m
void WriteToLCD()
{
LCD.clear();
//Write temperature to the display
LCD.print(ResValue);
//Print degree symbol
LCD.print((char)0xDE);
}
void loop() {
}
ta . Nakon
t koji predstavlja broj analognog pina na koji
a
-
ljiva ta predstavlja digitalni ekvivalent ulaznog napona na analognom pinu.
Nakon inicijalizacije sistema u funkciji setup program ulazi u glavnu programsku
petlju p
• p a a t m mp m a a t t p
Št p a at p a a ta t a a a a ta t p
a ta a t p p a a ta t t t p Št p a
ma m tm ap t m a ma ma m ta
t p a aa m t a a ama t p t a
m m p a p mat m : :t
ap a a a pa m mp m a p a
a t t p pa p t p t a a mat a
a tat m a t p tata m a ata a a a a
m p t a at m m a
Rešenje:
- Arduino UNO
- 2 tastera
- Protobord
- Displej
is e i 125
pa m
#include <LiquidCrystal.h>
#include <TimerOne.h>
const int ButtonStopStartPinNo = 2;
const int ButtonClearPinNo = 3;
//Display size
const int DispHeight = 16;
const int DispWidth = 2;
//LCD Pin number
const int RSPinNo = 12;
const int EnablePinNo = 11;
const int D7PinNo = 4;
const int D6PinNo = 5;
const int D5PinNo = 6;
const int D4PinNo = 7;
LiquidCrystal LCD(RSPinNo, EnablePinNo,
D4PinNo, D5PinNo, D6PinNo, D7PinNo);
//When timer is stoped this value is true
//When timer is started this value is false
volatile boolean TimerStop = true;
is e i 127
pa m
}
//increase miliseconds value if timer is not stoped and refresh LCD
display
void TimerISR(){
if(TimerStop == false){
Hund+=1;
}
WriteToDsp();
}
//Initialize system
void setup() {
//Initialize buttons pins as input pin
pinMode(ButtonStopStartPinNo,INPUT);
pinMode(ButtonClearPinNo, INPUT);
//Attach interrupt to the buttons
attachInterrupt(digitalPinToInterrupt(ButtonStopStartPinNo),
StopStartISR, FALLING);
attachInterrupt(digitalPinToInterrupt(ButtonClearPinNo), ClearISR, FALLING);
//Init LCD
LCD.begin(DispHeight, DispWidth);
//Set timer stopwatch resolution
Timer1.initialize(TimerRes);
//Attach interrupt function to the timer
Timer1.attachInterrupt(TimerISR);
}
void loop() {
//Always convert
Convert_ms();
}
Promenljive ta t t p i a
su povezani tasteri za zaustavljanje/startovanje štoperice i resetovanje štoperice,
unutar funkcije t
Ispis vremenskih promenljivih t p
koja ispisuje ove promenljive na LCD displej pozivom funkcije iz biblioteke tal.
ili kada se
funkciji a
uspešnost realizacije.
-
I
is e i 129
pa m
- paralelna
- serijska
-
-
ovom magistralom su znatno manje od brzine prenosa podataka putem paralelne magistrale.
-
-
a
ma ta
- half-duplex
- full-duplex
- simplex
Simplex komunikacija se odvija u jednom smeru. Half-duplex komunikacija se odvi-
- SPI
- I2C
- UART
eri s a ni a i a i i 131
pa m
Simplex
Half-duplex
Full-duplex
I
i postao je standard.
eri s a ni a i a i i 133
pa m
I
-
I
prikaz primljenih podataka na tom interfejsu. Ta opcija se naziva a t iu
t a slekcijom opcije Serial
Monitor. Nakon pokretanja ove opcije dobijamo prozor prikazan na slici 10 - 6.
a at -
BaudRate
a at
-
eri s a ni a i a i i 135
pa m
t t
t t t t modul pod nazivom
t t
Povezivanje aplikacije sa t t
Prepreka
Predajnik
Prijemnik
Najpre se na pin
. Kada se na pin dovede
Vzvuka × vreme
S= (14)
2
SIG -
eri s a ni a i a i i 139
pa m
-
zor BMP180 . Ovaj modul prikazan je na slici 10 - 17.
Modul ima 5 pinova. Za povezivanje sa Ardu-
biblioteku I -
I
-
ka napon na izlazu ovog pina 0V. Potenciome-
10.7. PRIMERI
• t a a t m at a a am a
p a p t m ma t a p ta a ma
t a a ma t a a p a a p
p ma p ta a a a p ma t a a t
t a p m ap a a a a t
t ap t m ma t a a ma t a a
Rešenje:
- Dva Arduina
10 - 19 i 10 - 20.
eri s a ni a i a i i 141
pa m
#include <TimerOne.h>
const long UARTSpeed = 9600;
const unsigned long MsgPeriod= 2000000;
void SendMsg(){
Serial.write(“Pozdrav”);//Send string
}
void setup() {
Serial.begin(UARTSpeed); //Init communication
Timer1.initialize(MsgPeriod);
Timer1.attachInterrupt(SendMsg);
}
void loop() {
}
Nakon instalacije koda na master Arduino, neophodno je instalirani kod na slave Arduino
Serial.begin(SerialSpeed)
SerialSpeed
Serial.Write(msg)
msg – String koji se šalje
Provera da li je primljen neki karakter na prijemnoj strani se vrši pozivom funkcije
Serial.available()
Receivedmsg = Serial.readString()
Receivedmsg – Prihvatni string u koji smeštamo primljenu poruku.
Ispis stringa na Serijski monitor se vrši pozivom funkcije
Serial.println(msg)
msg
eri s a ni a i a i i 143
pa m
• a a t m at a pa m
m a a a a a p a a ta t t
p ta m a m a m t a mp m
a p am m ap a a a a a
a p m a ta t p a a t m
a mp t p a a a a a ap t mp m a
t p am a a a t a ap a a
a pa m p a p t p t a a
Rešenje:
- Dva tastera
//System variables
int DiodePinNo = 13;
int ButtonPinNo = 2;
int BouncingTime = 200;
int ButtonStatus;
int DiodeStatus = LOW;
//Serial variables
const int BaudRate = 9600;
//Recieved string is stored here
char ControlChar;
void setup() {
//Diode pin direction as output
pinMode(DiodePinNo,OUTPUT);
//Button pin direction as input
pinMode(ButtonPinNo,INPUT);
//Initialize diode state
digitalWrite(DiodePinNo, DiodeStatus);
//Attach interrupt to the pin
attachInterrupt(digitalPinToInterrupt(ButtonPinNo), ButtonISR, FALLING);
Serial.Begin(BaudRate);
void ButtonISR()
{
eri s a ni a i a i i 145
pa m
//wait
delay(BouncingTime);
//check again if button is pressed
ButtonStatus = digitalRead(ButtonPinNo);
if(ButtonStatus == LOW){
//Send signal to other Arduino
Serial.write(‘P’);
}
void loop() {
//Check receive buffer
if(Serial.available()>0)
{
//Check if signal received?
ControlChar = Serial.read();
if(ControlChar == ‘P’)
{
DiodeStatus = !DiodeStatus;
digitalWrite(DiodePinNo,DiodeStatus);
}
}
}
• a a t m a t t m t mt a a
a a ta a ap m p t m t t m a a
p a t t t a a ta a ap a am mt
ap ta a t t t m a ap a mp m a a t a
a pa p t p t a a
Rešenje:
- Arduino UNO
- Protobord
- Bluetooth modul
-
eri s a ni a i a i i 147
pa m
-
je bluetooth modula i telefona kao što je objašnjeno u poglavlju 10.1. Kod koji realizuje
#include <TimerOne.h>
const long BaudRate = 9600;
const unsigned long MsgPeriod= 2000000;
void SendMsg(){
Serial.write(“Internet Stvari”);//Send string
}
void setup() {
Serial.begin(BaudRate); //Init communication
Timer1.initialize(MsgPeriod);
Timer1.attachInterrupt(SendMsg);
}
void loop() {
}
a at
, šalje poruka
I
• a a t m at a t mp at
t t m a t m t a a ta a t mp at a a
a ta t t mp at a a p t m t t
m a a t m a ap a at ap a a a t a
a t pa p t p t a a
Rešenje:
- Arduino UNO
- Protobord
-
zani su na slikama 10 - 25 i 10 - 26.
eri s a ni a i a i i 149
pa m
#include <TimerOne.h>
#define SensorPin A1
const int BaudRate = 9600;
const int DelayTime = 100; //ms
volatile float Temperature;
volatile int counter = 1;
const int NumberOfSamples = 100;
void ReadSensor(){
Temperature += (5.0 * analogRead(SensorPin) * 100.0) / 1024;
counter++;
if(counter == NumberOfSamples)
{
Temperature /= counter;
Serial.println(Temperature);
Temperature = 0;
counter = 1;
}
}
void setup() {
//Init serial communication
Serial.begin(BaudRate);
Timer1.initialize(ReadPeriod);
Timer1.attachInterrupt(ReadSensor);
}
void loop() {
}
• a a t m am a a m tat
p a a a a m p m ta m a
ap a a a pa m mp m ata
a t pa p t p t a a
Rešenje:
- Arduino UNO
- Protobord
eri s a ni a i a i i 151
pa m
#include <TimerOne.h>
const int EchoPin = 10;
const int TrigPin = 9;
CurrentState = Transmit;
digitalWrite(TrigPin,LOW);
Timer1.initialize(TimerRes);
Timer1.attachInterrupt(TimerISR);
}
void loop() {
}
pulseIn(pin, value)
pin – broj pina na kome merimo trajanje nivoa signala
value I
signal na pinu.
Promenljive EchoPin i TrigPin
Promenljiva m t -
ovu rezolucije tajmera. Naime, tajmerska funkcija se poziva sa periodom od 2ms. Svaki
eri s a ni a i a i i 153
pa m
• a a t m p ta a ta t m t a m
a t m at ta ta t
p a a p p p a t t a t
ta m t ma ap a mp m at a a t
pa p t p t a a
Rešenje:
- Arduino UNO
- Protobord
#include <TimerOne.h>
#include <7Seg.h>
const int EchoPin = 12;
const int TrigPin = 13;
volatile unsigned long Duration;
volatile unsigned long Distance;
volatile int TimerCounter = 0;
volatile int Digit1 = 0;
volatile int Digit2 = 0;
volatile int Digit3 = 0;
volatile int Digit4 = 0;
const unsigned long TimerRes = 1000;
int ActiveDsp = 4;
void setup() {
Init7Seg();
pinMode(EchoPin, INPUT);
pinMode(TrigPin, OUTPUT);
digitalWrite(TrigPin, LOW);
Timer1.initialize(TimerRes);
Timer1.attachInterrupt(TimerISR);
}
void Convert(const int Number)
{
int Temp = Number;
Digit1 = Temp/1000;
Temp%=1000;
Digit2 = Temp/100;
Temp%=100;
Digit3 = Temp/10;
Temp%=10;
Digit4 = Temp;
}
void DispRefresh(){
switch(ActiveDsp)
case 1:
//Turn off display 4
TurnDspOff(4);
//Turn on display 3
TurnDspOn(1);
//Write digit to dsp3
WriteNum(Digit1);
//Next active display is 4
ActiveDsp = 2;
break;
case 2:
//Turn off display 4
TurnDspOff(1);
eri s a ni a i a i i 155
pa m
//Turn on display 3
TurnDspOn(2);
//Write digit to dsp3
WriteNum(Digit2);
//Next active display is 4
ActiveDsp = 3;
break;
case 3:
//Turn off display 4
TurnDspOff(2);
//Turn on display 3
TurnDspOn(3);
//Write digit to dsp3
WriteNum(Digit3);
//Next active display is 4
ActiveDsp = 4;
break;
case 4:
//Turn off display 3
TurnDspOff(3);
//Turn on display 4
TurnDspOn(4);
//Write lower digit
WriteNum(Digit4);
// Next active display is 3;
ActiveDsp = 1;
break;
}
}
void TimerISR()
{
TimerCounter++;
DispRefresh();
if(TimerCounter >= 500){
if(TimerCounter <= 510){
digitalWrite(TrigPin,HIGH);
}
else{
digitalWrite(TrigPin,LOW);
Duration = pulseIn(EchoPin,HIGH);
Distance = Duration*0.034/2;
Convert(Distance);
TimerCounter = 0;
}
}
}
void loop() {
}
pinu se generiše unutar TimerISR funkcije koja predstavlja prekidnu funkciju tajmera.
p -
pleksiranje LED displeja.
• a a t m t t a a m a t m
at a a a t mt a p ta p t m
t a a p t t t a a a
a a p a pa a t a a at a a
a a t ap a a ta
a t pa p t p t a a
Rešenje:
- Arduino UNO
- Dioda
- Protobord
eri s a ni a i a i i 157
pa m
#include <TimerOne.h>
const int SensorPinNo = 13;
const int DiodePinNo = 12;
void TimerISR(){
if(VibrationDetected == true){
VibrationDetected = false;
}
}
void setup() {
pinMode(SensorPinNo,INPUT);
pinMode(DiodePinNo,OUTPUT);
digitalWrite(DiodePinNo, LOW);
Serial.begin(9600);
Timer1.initialize(ReadPeriod);
Timer1.attachInterrupt(TimerISR);
}
void loop() {
VibrationAmplitude = pulseIn(SensorPinNo,HIGH);
if(VibrationAmplitude > Threshold){
VibrationDetected = true;
}
if(VibrationDetected == true){
digitalWrite(DiodePinNo, HIGH);
}
else{
digitalWrite(DiodePinNo, LOW);
}
}
a t t .
• a a t m at a t a
t p t a at a a a
ap a a mp m ata a t pa
p t p t a a
Rešenje:
- Arduino UNO
- Protobord
#include <TimerOne.h>
const int SensorPin = 12;
const int DiodePin = 11;
volatile int Touch = 0;
const unsigned long ReadPeriod = 10000;
void ReadSensorValue(){
Touch = digitalRead(SensorPin);
}
void setup() {
pinMode(SensorPin,INPUT);
pinMode(DiodePin,OUTPUT);
digitalWrite(DiodePin, LOW);
Timer1.initialize(ReadPeriod);
Timer1.attachInterrupt(ReadSensorValue);
}
void loop() {
if(Touch == HIGH){
digitalWrite(DiodePin, HIGH);
}
else{
digitalWrite(DiodePin, LOW);
}
}
eri s a ni a i a i i 159
pa m
• a a t m at a a t
ap a a p t a
p t m a a a p t p t a a t ma
Rešenje:
- Protobord
- Arduino UNO
- LE dioda
vrednost jednala
eri s a ni a i a i i 161
pa m
• a a t m a ta a a m t m at
a p a ap a mp m a ta a t
pa p t p t a a
Rešenje:
- Arduino UNO
- Protobord
#include <SFE_BMP180.h>
#include <Wire.h>
// You will need to create an SFE_BMP180 object,
// here called presssure
SFE_BMP180 pressure;
// baseline pressure
double baseline;
void setup()
{
Serial.begin(9600);
// Initialize the sensor (it is important to get calibration
// values stored on the device).
if (pressure.begin())
Serial.println(“Uspesna inicijalizacija”);
else
{
// Oops, something went wrong
Serial.println(“Neuspesna inicijalizacija\n\n”);
// Pause forever.
while(1);
}
// Get the baseline pressure:
baseline = getPressure();
}
double getPressure()
{
char status;
double T,P,p0,a;
// You must first get a temperature measurement to perform a pressure
// reading.
// Start a temperature measurement:
status = pressure.startTemperature();
if (status != 0)
{
// Wait for the measurement to complete:
delay(status);
// Retrieve the completed temperature measurement:
status = pressure.getTemperature(T);
if (status != 0)
{
// Start a pressure measurement:
status = pressure.startPressure(3);
if (status != 0)
{
// Wait for the measurement to complete:
delay(status);
// Retrieve the completed pressure measurement:
status = pressure.getPressure(P,T);
if (status != 0)
{
eri s a ni a i a i i 163
pa m
return(P);
}
else Serial.println(“Nije moguce ocitati pritisak\n”);
}
else Serial.println(“Nije moguce zapoceti ocitavanje pritiska\n”);
}
else Serial.println(“Nije moguce ocitati temperaturu\n”);
}
else Serial.println(“Nije moguce zapoceti ocitavanje temperature\n”);
}
void loop()
{
double a,P;
// Get a new pressure reading:
P = getPressure();
// Show the relative altitude difference between
// the new reading and the baseline reading:
a = pressure.altitude(P,baseline);
Serial.print(“Relativna visina: “);
if (a >= 0.0) Serial.print(“ “); // add a space for positive numbers
Serial.print(a,1);
Serial.print(“ m \n “);
}
return = startTemperature(void);
return
return = getTemperature(Temperature);
return
Temperature
return = startPresure(3);
return
return -
nom ova vrednost 0.
-
-
tup senzoru putem I2C interfejsa dok biblioteka -
cije za rad sa senzorom. Nakon toga deklarišemo globalnu promenljivu pressure koja
a p nosi informaciju o
eri s a ni a i a i i 165
pa m
uspešnost realizacije.
-
-
-
uspešnost realizacije.
eri s a ni a i a i i 167
pa m
a sa re e i a 169
pa m
pinova predstavljaju pinovi na primarnoj strani i oni su S, + i -. Pin + predstavlja pin na koji
se dovodi napon napajanja sa mikrokontrolera od 5V dok se na pin – dovodi masa mik-
11.1. PRIMERI
-
• a a t m at ta t a a a ta t a
a a ap a mp m a
ta a t pa p t p t a a
Rešenje:
- Arduino UNO
- Dioda
- Protobord
- Taster
- Relej
a sa re e i a 171
pa m
• a a t m at a t ta t a
p a a t m a t a ma p aa a a
at t p ap a a
mp m at a a t pa p t p t a a
Rešenje:
- Arduino UNO
- Protobord
- 3 tastera
- 3 releja
a sa re e i a 173
pa m
a sa re e i a 175
pa m
Realizovani sistem je takav da dva tastera direktno kontrolišu releje koji su redno
Obzirom da se u primeru koriste tri ulazna digitalna pina, a da Arduino ima mehanizam
p funkcije.
• a a t m a t t m m a ta a
a am a p t m t t t m aa at p a t
aa p p t a
a a ta ap a a at a p
ap a a a pa m a ta a t
t ma p a p t p t a a
Rešenje:
- Arduino UNO
- Dioda
- Protobord
- Bluetooth modul
- Relej
na slikama 11 - 8 i 11 - 9.
a sa re e i a 177
pa m
if(RelayStatus == HIGH){
Serial.println(“Ukljucena dioda”);
Serial.println(“Unesite sifru da iskljucite diodu:”);
}
else{
Serial.println(“Iskljucena dioda”);
Serial.println(“Unesite sifru da ukljucite diodu:”);
}
}
void loop()
{
//Check is Arduino recevied some data?
if(Serial.available()>0)
{
//Read received data
ReceivedString = Serial.readString();
if(ReceivedString == Password)
{
SwitchRelay();
}
else
{
Serial.println(“Pogresna sifra! Pokusajte ponovo”);
Serial.println(“Unesite sifru:”);
}
}
}
a tat se
I
t t
String a
t a koja
uspešnost realizacije.
-
-
-
a sa re e i a 179
pa m
12.1. PRIMERI
mašine stanja.
• a a t m at ta t a p m
a ta t p m a ta a ap a a a t a
a t pa p t p t a a
Rešenja:
- Arduino UNO
- Dioda
- Protobord
- Taster
Ovo rešenje se od rešenja primera 5.1. razlikuje u tome što sada pokušavamo da
Dijagram prelaza se sastoji od stanja i uslova usled koga se prelazi u naredno stanje.
Stanje je upisano u pravougaonik sa zaobljenim temenima, dok se uslov prelaza upisuje
I
attachInterrupt(digitalPinToInterrupt(ButtonPinNo), ButtonISR,FALLING);
CurrentState = DiodeOn;
}
void loop() {
switch(CurrentState){
case DiodeOn:
digitalWrite(DiodePinNo,HIGH);
if(ButtonIn == true){
ButtonIn = false;
CurrentState = DiodeOff;
}
break;
case DiodeOff:
digitalWrite(DiodePinNo,LOW);
if(ButtonIn == true){
ButtonIn = false;
CurrentState = DiodeOn;
}
break;
}
}
Promenljiva
setup
.
U glavnoj programskoj petlji p t
case strukture. Ova struktura ima zadatak da dovede sistem u stanje koje odgovara
t tat , odnosno trenutnom stanju sistema.
Ukoliko je sistem u stanju i vrednost promenljive nije jednaka
jednaka true,
resetuje se vrednost ove promenljive i sistem prelazi u stanje tako što se
promenljivoj t tat dodeljuje vrednost .
Ukoliko se sistem nalzi u stanju i vrednost promenljive nije jednaka
• t a a t m t t p a ta t a
t t pa p t m
a a a t mt a a t t :
p ta a ta t a a m a t a a
a a ta a ap a a a pa m mp m
at a a t pa p t p t a a
Rešenje:
- Arduino UNO
- Protobord
- 2 tastera
Inicijalno se sistem nalazi u stanju Start. U ovom stanju sistem ostaje sve dok se
D2_1 I
u stanje Start
D2_1
D2_2 Start.
D2_2 nastavlja se sa is-
pravnom detekcijom sekvence i sistem odlazi u stanje D1_3. Ovom logikom se prelazi u
Start
do ispunjavanja zadate sekvence.
CurrentState = Start;
}
void loop() {
switch(CurrentState){
case Start:
digitalWrite(RedDiodePinNo,HIGH);
if(Button2 == true){
Button2 = false;
digitalWrite(RedDiodePinNo,LOW);
CurrentState = D2_1;
}
break;
case D2_1:
if(Button2 == true){
Button2 = false;
CurrentState = D2_2;
}
else{
if(Button1 == true){
Button1 = false;
digitalWrite(YellowDiodePinNo,LOW);
CurrentState = Start;
}
else{
digitalWrite(YellowDiodePinNo,HIGH);
}
}
break;
case D2_2:
if(Button1 == true){
Button1 = false;
CurrentState = D1_3;
}
else{
if(Button2 == true){
Button2 = false;
digitalWrite(YellowDiodePinNo,LOW);
CurrentState = Start;
}
else{
digitalWrite(YellowDiodePinNo,HIGH);
}
}
break;
case D1_3:
if(Button2 == true){
Button2 = false;
CurrentState = D2_4;
}
else{
if(Button1 == true){
Button1 = false;
digitalWrite(YellowDiodePinNo,LOW);
CurrentState = Start;
}
else{
digitalWrite(YellowDiodePinNo,HIGH);
}
}
break;
case D2_4:
if(Button1 == true){
Button1 = false;
digitalWrite(YellowDiodePinNo,LOW);
CurrentState = SDetected;
}
else{
if(Button2 == true){
Button2 = false;
digitalWrite(YellowDiodePinNo,LOW);
CurrentState = Start;
}
else{
digitalWrite(YellowDiodePinNo,HIGH);
}
}
break;
case SDetected:
if((Button1 == true) ||(Button2 == true) )
{
Button2 = false;
Button1 = false;
digitalWrite(GreenDiodePinNo,LOW);
CurrentState = Start;
}
else{
digitalWrite(GreenDiodePinNo,HIGH);
}
break;
}
}
• a a t m at a a ta
t a a a a : mp ta a t ma
a at a at p p ta ta a
at p a m a t a a a a a a a m
a a m a ta t p a t mp m p ta a a
a a a a a a m ta a m a ta a t mp m
p ta a p t a a ta a a a a
a a t a t t m m a ta t p
p ta a p m m a a a a t a
a p p at p a a p a a ap a
a a pa m p a p t p t a a
Rešenje:
Komponente koje su neophodne za realizaciju ovog sistema su:
- Arduino UNO
- Protobord
Inicijalno je sistem u stanju u kome treperi crvena dioda. Svaki put kada istekne
t
potreban broj t koji predstavlja broj promena stanja crvene diode. Ukoliko ovaj broj
Logika unutar stanja BlinkRed, BlinkGreen i BlinkYellow je ista izuzev toga što se
pred ulazak u BlinkAll stanje menja perioda tajmerskog prekida sa 200ms na 100ms.
#include <TimerOne.h>
const int RedDiodePinNo = 11;
const int GreenDiodePinNo = 12;
const int YellowDiodePinNo = 13;
int RedDiodeStatus = LOW;
int GreenDiodeStatus = LOW;
int YellowDiodeStatus = LOW;
const int RedCount = 10;
const int GreenCount = 10;
const int YellowCount = 10;
const int AllCount = 10;
volatile int Counter =0;
unsigned long DiodeBlinkPeriod = 100000;
unsigned long DiodeAllBlinkPeriod = 50000;
volatile boolean TimerFlag = false;
//Machine states
typedef enum{
BlinkRed,
BlinkGreen,
BlinkYellow,
BlinkAll
}States;
States CurrentState;
void TimerISR(){
TimerFlag = true;
}
//System is initialized here
void setup() {
//Init diode pins as output pins
pinMode(RedDiodePinNo, OUTPUT);
pinMode(GreenDiodePinNo, OUTPUT);
pinMode(YellowDiodePinNo, OUTPUT);
CurrentState = BlinkRed;
Timer1.initialize(DiodeBlinkPeriod);
Timer1.attachInterrupt(TimerISR);
}
void loop(){
switch(CurrentState){
case BlinkRed:
if(Counter == RedCount){
Counter = 0;
CurrentState = BlinkGreen;
digitalWrite(RedDiodePinNo,LOW);
}
else{
if(TimerFlag == true){
TimerFlag = false;
Counter++;
RedDiodeStatus = !RedDiodeStatus;
digitalWrite(RedDiodePinNo,RedDiodeStatus);
}
}
break;
case BlinkGreen:
if(Counter == GreenCount ){
Counter = 0;
CurrentState = BlinkYellow;
digitalWrite(GreenDiodePinNo,LOW);
}
else{
if(TimerFlag == true){
TimerFlag = false;
Counter++;
GreenDiodeStatus = !GreenDiodeStatus;
digitalWrite(GreenDiodePinNo,GreenDiodeStatus);
}
}
break;
case BlinkYellow:
if(Counter == YellowCount ){
Counter = 0;
CurrentState = BlinkAll;
digitalWrite(YellowDiodePinNo,LOW);
Timer1.setPeriod(DiodeAllBlinkPeriod);
}
else{
if(TimerFlag == true){
TimerFlag = false;
Counter++;
YellowDiodeStatus = !YellowDiodeStatus;
digitalWrite(YellowDiodePinNo,YellowDiodeStatus);
}
}
break;
case BlinkAll:
if(Counter == AllCount ){
Counter = 0;
CurrentState = BlinkRed;
digitalWrite(RedDiodePinNo,LOW);
digitalWrite(GreenDiodePinNo,LOW);
digitalWrite(YellowDiodePinNo,LOW);
Timer1.setPeriod(DiodeBlinkPeriod);
}
else{
if(TimerFlag == true){
TimerFlag = false;
Counter++;
RedDiodeStatus = !RedDiodeStatus;
GreenDiodeStatus = !GreenDiodeStatus;
YellowDiodeStatus = !YellowDiodeStatus;
digitalWrite(RedDiodePinNo,RedDiodeStatus);
digitalWrite(GreenDiodePinNo,GreenDiodeStatus);
digitalWrite(YellowDiodePinNo,YellowDiodeStatus);
}
}
break;
}
}
• p a a tm m ap aa ma a ma
at ta t a a pa ma a a ma a a ma t ta
t ma ap a ma ta
a a a ma a t a a
ap a m ta t m ta m m m a t
a p a a ta t m t ap a
t ap a ma a p a ta t a p t
a a ta a a t t a a t aa
a a m t a a a t
t a a p t ap a ta
a t a m t aa
t ap a m t aa t t
a a t aa a a m t a a
a a p a a ap a a a pa m
mp m at a a pa p t p t a a
192 Internet stvari
pa m
Rešenje:
- Arduino UNO
- Protobord
- 1 taster
I
promenljivoj m a
promenljivoj
jedan deo dijagrama prelaza mašine stanja koji je prikazan na slici 12 - 7.
je prikazano na slici 12 - 8.
mp t
slici 12 - 9.
#include <TimerOne.h>
const int V_RedDiodePinNo = 13;
const int V_YellowDiodePinNo = 12;
const int V_GreenDiodePinNo = 11;
const int P_RedDiodePinNo = 10;
const int P_GreenDiodePinNo = 9;
const int ButtonPinNo = 2;
volatile boolean ButtonPressed = false;
volatile boolean TimeReqSatisfied = false;
boolean CycleCompleted;
const unsigned long GreenPeriod = 10000000;
const unsigned long YellowPeriod = 3000000;
const unsigned long V_RedPeriod = 1000000;
CurrentState = GV_RP;
CycleCompleted = false;
}
void loop() {
switch(CurrentState){
case GV_RP:
digitalWrite(V_RedDiodePinNo, LOW);
digitalWrite(V_GreenDiodePinNo, HIGH );
digitalWrite(V_YellowDiodePinNo, LOW);
digitalWrite(P_RedDiodePinNo,HIGH);
digitalWrite(P_GreenDiodePinNo, LOW );
if((TimeReqSatisfied == true) && (ButtonPressed == true)){
TimeReqSatisfied = false;
ButtonPressed = false;
CycleCompleted = false;
CurrentState = YV_RP;
Timer1.setPeriod(YellowPeriod);
}
break;
case YV_RP:
digitalWrite(V_RedDiodePinNo, LOW);
digitalWrite(V_GreenDiodePinNo, LOW );
digitalWrite(V_YellowDiodePinNo, HIGH);
digitalWrite(P_RedDiodePinNo,HIGH);
digitalWrite(P_GreenDiodePinNo, LOW );
if((TimeReqSatisfied == true)){
TimeReqSatisfied = false;
if(CycleCompleted == false){
CurrentState = RV_RP;
Timer1.setPeriod(V_RedPeriod);
}
else{
CurrentState = GV_RP;
Timer1.setPeriod(GreenPeriod);
}
}
break;
case RV_RP:
digitalWrite(V_RedDiodePinNo, HIGH);
digitalWrite(V_GreenDiodePinNo, LOW );
digitalWrite(V_YellowDiodePinNo, LOW);
digitalWrite(P_RedDiodePinNo,HIGH);
digitalWrite(P_GreenDiodePinNo, LOW );
if((TimeReqSatisfied == true)){
TimeReqSatisfied = false;
if(CycleCompleted == false){
CurrentState = RV_GP;
Timer1.setPeriod(GreenPeriod);
}
else{
CurrentState = YV_RP;
Timer1.setPeriod(YellowPeriod);
}
}
break;
case RV_GP:
digitalWrite(V_RedDiodePinNo, HIGH);
digitalWrite(V_GreenDiodePinNo, LOW );
digitalWrite(V_YellowDiodePinNo, LOW);
digitalWrite(P_RedDiodePinNo,LOW);
digitalWrite(P_GreenDiodePinNo, HIGH );
if((TimeReqSatisfied == true)){
TimeReqSatisfied = false;
CycleCompleted = true;
CurrentState = RV_RP;
Timer1.setPeriod(P_RedPeriod);
}
break;
}
}
-
I
-
no znanja da se prilagodi ovim promenama i da ponekad, usled pojednostavljenja siste-
-
sku realizaciju modula za koji kreiramo biblioteku.
-
zijom .cpp. Ovaj fajl se naziva source
broj linija koda source
source -
header fajl.
a fajlovi imaju ekstenziju .h. Svaki header source fajl u
-
trano, vidljive samo u tom fajlu. Ako se neka promenljiva deklariše kao globalna unuatr
-
ljivu samo za taj C++ fajl.
header fajlova. Za funkcije koje su deklarisane un-
utar header .cpp fajlovi u kojima su te funkcije
-
cpp header fajl u kome je funkcija
koja kao argument prima naziv fajla.
ea i a i a risni i i i te a 201
pa m
m/s² m/s².
-
I
I
I DataShee
tu
0x3C
0x3E
0x40
I 0x1C
akcelerometra
ea i a i a risni i i i te a 203
pa m
I
kao što je prikazano na slici 13 - 2.
I -
-
tokolom podrazumevamo niz koraka koji se dešavaju na komunikacionoj magistraliu cilju
ea i a i a risni i i i te a 205
pa m
#ifndef AccelLib_h
#define AccelLib_h
#include “Arduino.h”
#include “Wire.h”
//Define registers addresses
#define ACCEL_XOUT_H 0x3B
#define ACCEL_XOUT_L 0x3C
#define ACCEL_YOUT_H 0x3D
#define ACCEL_YOUT_L 0x3E
#define ACCEL_ZOUT_H 0x3F
#define ACCEL_ZOUT_L 0x40
#define ACCEL_CONFIG 0x1c
//define class
class MPU_9250{
public:
// Init object of this class by Module Address
MPU_9250(const uint8_t Address);
// Read Acceleraton on X,Y and Z axes
void ReadAccel(int16_t* X,int16_t* Y,int16_t* Z);
ea i a i a risni i i i te a 207
pa m
koja
Arduino.h
Nakon Arduino.h
I
Addressu modula.
Funkcija a
t t
t t
Funkcija t
prima vrednost -
zora i to su 2, 4, 8 i 16. Ukoliko korisnik prosledi neku vrednost koja ne pripada ovom
Ovim smo završili sa kodom koji se nalazi u header fajlu. Sada je potrebno sve funk-
.cpp fajlu. Ovaj fajl se kreira
.cpp
#include “AccelLib.h”
MPU_9250::MPU_9250(const uint8_t Address){
Module_Address = Address;
Wire.begin();
}
void MPU_9250::ReadAccel(int16_t* X,int16_t* Y,int16_t* Z){
//Begin transmission to the Module_Address
Wire.beginTransmission(Module_Address);
ea i a i a risni i i i te a 209
pa m
I
Wire.beginTransmission(address)
Wire.write(data)
data – Adresa registra
Wire.requestFrom(DeviceAddr,NoOfBytes);
Wire.read();
-
-
nos. Prilikom svake I2C komunikacije neophodno je da ova funkcija bude pozvana kao prva.
Unutar funkcije a
a m postavimo
. Nakon toga upišemo adresu prvog registra iz koga
-
I
funkcije a m
t m zahtevamo od
a
I
.cpp
Arduino projekat
13.3. PRIMERI
• a a t m at m a a a
ta am a at t ma tat ta a a
p t p a a ap a mp m
at a a t pa p t p t a a
Rešenje:
- Arduino UNO
ea i a i a risni i i i te a 211
pa m
#include <AccelLib.h>
#define ModuleAddress 0x68
MPU_9250 Module(ModuleAddress);
int16_t X;
int16_t Y;
int16_t Z;
void setup() {
Serial.begin(9600);
}
void loop() {
Module.SetAccelRes(2);
Module.ReadAccel(&X,&Y,&Z);
Serial.print(“X:”);
Serial.println(X);
Serial.print(“Y:”);
Serial.println(Y);
Serial.print(“Z:”);
Serial.println(Z);
Serial.println(“******”);
}
I
I
ea i a i a risni i i i te a 213
pa m
IoT
ESP8266 modul, sa oznakama pinova, prikazan je na slici 14 - 1.
RX
GPIO0
GPIO2
GND
3.3V
RST
C H _P D
TX
komanda=argumenti\r\n
ma a
i i ni a i a 215
pa m
\r\n
kao kraj komande.
-
-
pozna AT komandu dok se u suprotnom odgovor završava sa ERROR. U dokumentaciji
2 3
i i ni a i a 217
pa m
a t
-
1
2
3
AT+CWMODE = mode
I I
Slika 14 - 6 - Izgled Arduino IDE Serial monitor-a nakon podešavanja SSIDa i password-a
i i ni a i a 219
pa m
Slika 14 - 7 - Izgled Arduino IDE Serial monitor-a nakon podešavanja broja klijenata
-
-
AT+CIPMUX = mode
-
podacima. Server nakon što detektuje da je primio zahtev, klijentu odgovara slanjem
AT+CIPSERVER=mode,port
Slika 14 - 8 - Izgled Arduino IDE Serial monitor-a nakon otvaranja servera na portu 80
I I
AT+CIFSR
i i ni a i a 221
pa m
I
na slici 14 - 9.
14.2. PRIMERI
• p a a t m at m a
p ta a a m aa ta a a p t
p m p t pa a a a a ta t a a ta a a p t t
t t ta ma a m ta pa a a p ap a
mp m at a a t pa p t p t a a
i i ni a i a 223
pa m
Rešenje:
- Arduino UNO
- Protobord
- ESP8266 modul
#include <SoftwareSerial.h>
const int RxPinNo = 2;
const int TxPinNo = 3;
//Create Virtual UART interface
SoftwareSerial vUART(RxPinNo,TxPinNo);
//Send AT command data via vUART interface
String sendData(String command, const int timeout){
String response = “”;
char c = vUART.read();
// read the next character.
response+=c;
}
}
return response;
}
void setup() {
Serial.begin(115200);
vUART.begin(115200);
//Send AT command to configure our module as AP server
//Reset module
sendData(“AT+RST\r\n”,2000);
//Send AT command to configure our module as AP server
//Reset module
sendData(“AT+RST\r\n”,2000);
//Configure AP name and password
sendData(“AT+CWSAP=\”IoT1\”,\”1234test\”,5,3\r\n”,2000);
//Configure as access point
sendData(“AT+CWMODE=2\r\n”,2000);
//Configure for multiple connections
sendData(“AT+CIPMUX=1\r\n”,2000);
//Configure server on port 89
sendData(“AT+CIPSERVER=1,80\r\n”,2000);
}
void loop() {
if(vUART.available()){
//If client request page, server will receive +IPD AT command
if(vUART.find(“+IPD,”)){
delay(1000);
//Get ID by substracting 48 to get number from char
int connectionId = vUART.read()-48;
//Web page content
String webpage = “<h1>Internet stvari</h1><p>Dobro dosli
na prvu stranicu</p>”;
//Create AT command which open server connectio
String cipSend = “AT+CIPSEND=”;
cipSend += connectionId;
cipSend += “,”;
cipSend +=webpage.length();
cipSend +=”\r\n”;
sendData(cipSend,1000);
sendData(webpage,1000);
//Add extra content to the page
i i ni a i a 225
pa m
webpage=”<button>Dummy</button>”;
cipSend = “AT+CIPSEND=”;
cipSend += connectionId;
cipSend += “,”;
cipSend +=webpage.length();
cipSend +=webpage.length();
cipSend +=”\r\n”;
sendData(cipSend,1000);
sendData(webpage,1000);
//Close the server connection
String closeCommand = “AT+CIPCLOSE=”;
closeCommand+=connectionId; // append connection id
closeCommand+=”\r\n”;
sendData(closeCommand,3000);
}
}
}
U funkciji setup
14.1. Komande se ka ESP8266 modulu šalju posredstvom funkcije sendData koja ima
I I
I -
u string cipSend a
AP+CIPCLOSE = id
IoT
modula ESP8266 i diode. Sistem treba da, nakon što detektuje zahtev od klijenta,
I
I -
i i ni a i a 227
Arduino praktikum
15. LITERATURA
www.hackster.io/arduino/projects
I
I
I
I
iterat ra 229
CIP - Каталогизација у публикацији
Народна библиотека Србије, Београд
. .
. .
Н СК , арко, -
Internet stvari rduino praktikum arko anaskovi . - eograd niverzitet
Singidunum, eograd Caligraph . - , str. ilustr. cm
IS N - - - -
C ISS.S -I
© 2020.
Sva prava zadržana. Nijedan deo ove publikacije ne može biti reprodukovan u bilo
kom vidu i putem bilo kog medija, u delovima ili celini bez prethodne pismene saglas-
nosti izdavača.
www.singidunum.ac.rs
Marko Tanasković
9 788679 126764
Marko Tanasković
INTERNET STVARI
INTERNET
INTERNET OF THINGS
INTERNET OF THINGS
Ovaj praktikum je namenjen pre svega studentima
softverskog inženjerstva, kao podloga za izradu labo-
ratorijskih vežbi za predmet internet stvari korišće-
njem Arduino razvojnog sistema. Međutim mogu je
koristiti svi oni koje zanimaju oblasti programiranja
mikrokontrolera i interneta stvari. Priručnik je pisan
tako da ga mogu koristiti i oni koji imaju početna
znanja iz oblasti elektronike i programiranja mikro-
kontrolera, ali i oni koji tek prave svoje prve korake u
ovim oblastima.
STVARI
interneta stvari polazeći od poglavlja koja daju osnove
Arduino sistema, objašnjavaju kako se fizički sklapaju
električne šeme, preko poglavlja koja objašnjavaju kako
se prave jednostavne aplikacije koristeći digitalne i
analogne ulaze, pa sve do poglavlja u kojima su pred-
stavljeni složeniji projekti koji podrazumevaju rad sa
modulima, komunikaciju sa drugim uređajima ili
izlazak na internet uz pomoć wi-fija. Poglavlja su orga-
nizovana tako da su osnovne stvari i najjednstavniji
problemi pokriveni u prvim poglavljima, dok težina
problema koji se obrađuju raste kroz svako sledeće
poglavlje.
Beograd, 2020.