SlideShare a Scribd company logo
1 of 63
Download to read offline
ARDUİNO KODLAMA
İlkin məlumatlar
Məcidov Səfa
11.1. void setup() və void loop()
Şəkil 9.1 dəki şəkildə bunları görə bilərsiz. void setup() və void loop() -ə keçməzdən əvvəl
sketchdə olan bəzi işarələrin izahını verək.
1. /* */ sintaksisi- Bu işarələr, məsələn yaratdığınız arduino proyekt kodlarının və
cihazınızın haqqında bəzi izahları bu işarənin içinə ata bilərsiz. Buna açıqlama sətiri deyirlər. /*
ilə başlayıb, */ ilə bağlanır. Bu işarələrin içində yazılmız izahlar və ya cümlələr kod tərəfindən
nəzərə alınmır, yəni Arduino onu kod kimi tanımaz.
Məsələn, /* Arduino Uno kartı əvəz edilməzdir. */
2. // sintaksisi - Bu işarə isə, yazdığının hər hansı bir kodun qarşısında və ya ondan sora
gələrək, həmin kodun izahını vermək üçün istifadə edilir. Yazdığınız izahın sonunda nöqtə, iki
nöqtə olsasa-olmasa da bir problem olmaz. İstənilən kod qarşısında qoyularaq izah yazıla bilər,
arduino bunu bir kod kimi tanımaz.
Məsələn, pinMode(3; HİGH); // arduinonun 3-cü pini HİGH-dır.
Şəkil 9.2
3. void setup() - Bu bir sketçdir, yəni əgər kodumuzu bu sketçin içinə yazsaq, həmin kod
arduinoya enerji verildikdə, birdəfə işləyəcək, reset komandası verilməyənə kimi sabitliyini
qoruyacaqdır. setup-quraşdırmaq
void setup()
{ - Bu işarə kodların yazılması üçün açılır
- Bura kodlar yazılır
}- Kodlar yazıldıqdan sonra bu işarə ilə bağlanılır.
digər bir variant;
void setup() {
kod yazılan hissə
}
Nəzərinizə çatdırım hər ikisi eyni şeydir.
Məsələn,
void setup()
{
pinMode(LED_BUILTIN, OUTPUT);// LED_BUILTIN çıxış olaraq kodlandı(bu izah
verilməsədə və ya // işarəsi qoyulmasada olar)
}
4. void loop() - Bu da bir proqramlama sketçidir, void setupdan fərqli olaraq, əgər kodumuzu
bu sketçin içərisinə yazsaq, həmin kod arduinoya enerji verildiyində və ya arduino işlədiyi
müddətdə, yazılan kod təkrar olaraq çalışacaqdır. Məsələn, içərisinə yazılan sətirlərlə kodu, hər
dəfə təkrar olaraq işləyəcəkdir. Bu metodun daxilinə yazılan kodlar sonsuza qədər bir-birinin
ardınca növbəli şəkildə yenidən işləyəcəkdir. loop ingilis dilindən azərbaycan dilinə dövr edən
və ya sikl kimi tərcümə olunur.
void loop(){ - Bu işarə kodun yazılması üçün açılır.
- Bura kod yazılır
} - Kodlar yazıldıqdan sonra bu işarə ilə bağlanılır.
Məsələn,
void loop()
{
digitalWrite(LED_BUILTIN, HIGH);
delay(1000);
digitalWrite(LED_BUILTIN, LOW);
delay(1000);
}
İzahı: Əvvəl digitalWrite(LED_BUILTIN, HIGH); kodu oxunar, sonra delay(1000); kodu
oxunar, sonra digitalWrite(LED_BUILTIN, LOW); kodu oxunar, sonra delay(1000); kodu
oxunar və yenidən başa qayıdar yəni, digitalWrite(LED_BUILTIN, HIGH); koduna.
Bildiyiniz kimi Arduino kartının bütün modelləri bir çox giriş çıxış pinlərinə sahibdirlər, bu
giriş, çıxış pinlərini işlətmək üçün, bunları kartın başa düşdüyü dildə yəni arduino proqramı ilə
idarə etmək lazımdır. Kod kartın başa düşdüyü dildir, kartın böyük proyektləri icra etməyi sizin
yazdığınız kodlardan asılıdır. Gəlin keçək bu kodları bir-bir izah edək və öyrənək.
11.2. =, int, pinMode, digitalWrite, delay
1. int verilənlərin bir tam tipidir(data type). Hər hansı bir dəyişəni(x, ad, söz rəqəm olmaz)
tanıtmaq üçün istifadə edilir.
Dəyişən nədir? Dəyişən özündə hansısa bir məlumatı saxlayır. Həmin məlumat aydındır ki,
yaddaşda (RAM - da) saxlanılır.
Verilənlər tipi nədir? Verilənlər tipi isə, bir dəyişənin nə kimi məumatları özündə saxlaya
biləcəyini, həmin dəyişənin yaddaşdakı nüfuzunu və həmin dəyişən üzərində hansı
əməliyyatları yerinə yetirə biləcəyimizi təyin edən bir məntiqi anlayışdır.
Proqramda intin yazılış qaydası:
int a;
yəni, <verilənlər tipi><dəyişənin adı>;
int, 16 bit həcmi var, [-32,768 -- +32,767] parça aralığında müsbət və mənfi işarəli tam
qiymət alır.
Əlavə oxumaq üçün:
Qlobal dəyişənlər
Bütün program içərisində tanıdılanan dəyişənlərdir. Programın daha başında gəlirlər.
Programınızın bütün bölmələrində bir dəyişəni istifadə etmək istəyirsizsə, birinci etməli
olduğunuz iş, dəyişəni kodlarınızın ən üst hissəsində tanıdın. Beləliklə bu dəyişənə, kodunuzun
hər hissəsindən çata bilərsiz.
Lokal dəyişənlər.
Lokal dəyişənlər, bir sinif daxilindəki hər hansısa kontekst içərisində təyin olunan və ancaq
həmin kontekst (buna əhatə dairəsi də deyilir) içərisində müraciət edilə bilər dəyişənlərdir.
Məsələn metodların parametrləri, metodların gövdələrində təyin olunan dəyişənlər lokal
dəyişənlərdir. Bir lokal dəyişənə, bütün sinif daxilində müraciət etmək olmaz.
Dəyişənin ömrü
Başa düşmək lazımdır ki, bir dəyişən, təyin olunduqdan sonra, həmişə mövcud olmur. Bütün
insanların ömrü olduğu kimi, dəyişənlərin də ömrü var. Dəyişənlər, təyin olunduqları kontekst
və ya skop daxilində mövcuddurlar.
Verilənlər tiplərinin(data types) özü 4 yerə bölünür:
1. Tam tiplər
2. Kərs tiplər
3. Simvol tiplər
4. Məntiqi tiplər
2. = mənimsətmə operatoru. Bəlkə də heç bir proqramlaşdırma dilində mənimsətmə kimi
vacib bir ikinci əməliyyat yoxdur. Bir dəyişənə bir qiymətin mənimsədilməsi, ən fundamental
proqramlaşdırma prosesidir. Dəyişənlərə mənimsədilən qiymət onun tipi ilə uyğun olmalıdır.
Tam tipdə bir dəyişən təyin edək və ona qiymət verək:
int a;
a = 5;
Arduinoda(C dilində) mənimsətməni, dəyişənin təyin olunma sətrində də birbaşa yerinə
yetirə bilərik. Yuxarıdakı iki kod sətrini bir sətirdə belə yaza bilərik:
int a = 5;
Eyniylə,
int a;
int b;
int c;
a = 10;
b = 15;
c = 76;
kodarını, aşağıdakı kimi tək bir sətirdə yaza bilərik;
int a = 10, b = 15, c = 76;
Gördüyünüz kimi, dəyişənlərə qiymət, təyin olunma sətrində dəyişənin adı qeyd olunduqdan
sonra mənimsədildi. Bu nümunə həm də göstərir ki, eyni tipə malik bir neçə dəyişəni, bir-
birindən vergüllə ayıraraq eyni bir sətirdə təyin etmək olar.
3. pinMode funksiyası. Arduino kartlarında olan rəqəmsal və analog pinlərin giriş və ya çıxış
olaraq təyin etməyimizi təmin edər. Ədəbiyyatlarda, pinMode əsasən rəqəmsal girişlər üçün
nəzərdə tutulduqlarına baxmayaraq, mən bunu analoq pinləri üçündə sınağdan keçirmişəm.
Rəqəmsal olaraq giriş-çıxışdan dedikdə, 1 və 0 olan iki dəyərdən bəhs edirik. Bir pinin giriş və
çıxışı üçün 1 və 0 dəyərləri pində 5V-un olum olmadığını ifadə edir. Yəni, 1 (hə, 5 V) , 0(yox,
0 V) kimi başa düşülür. pinMode-nin sintaksisi aşağıdakı kimi yazılır:
pinMode(pin nömrəsi, INPUT və ya OUTPUT);
pin nömrəsi- arduino kartında seçdiyimiz pin(giriş -çıxış) nömrəsi məsələn, 1, 2, 3 və.s
INPUT, OUTPUT - giriş və ya çıxış- bu sintaksis ingilis dilində yazılır INPUT və
OUTPUT, karta seçdiyimiz istənilən pinin giriş yada çıxış olmasını təmin edir.
Məsələn;
pinMode(5, INPUT);
pinMode(6, OUTPUT);
Digər bir variantda da yazıla bilər;
pinMode(pin nömrəsi, INPUT_PULLUP);
pinMode(pin nömrəsi, INPUT_PULLDOWN);
Bu mövzuya keçməzdən qabağ, gəlin sizə pullup-pulldown müqavimətinin nə olduğunu izah
edək.
Arduino dövrələrində ən çox istifadə etdiyimiz elementlər LED-lər və düymə və ya
açarlardır(button). Arduinonun çıxış pininə LED qoşduqda, çəkilən cərəyanı məhdudlaşdırmaq
üçün LED-lə ardıcıl müqavimət bağlanır. Düymələridə arduinounun pin girişlərinə bağladıqda
pull-up müqavimətləri bağlanlılır.
Pull-down müqaviməti. Düyməyə basdığınızda, dövrə qapanaraq +5V gərginlik birbaşa
arduinonun giriş pininə verilir. Əlinizi düymədən çəkdiyinizdə, istər istəməz xəttə kiçik də olsa
cərəyan qalacaqdır. Bu enerji Düyməyə basmadığmız müddətdə belə sanki Arduinonun
düyməyə basılmış kimi davranmasına səbəb olur. Bu enerjinin yox olması üçün xətt çox vaxt
10K Om müqavimət ilə, torpağa(gnd) bağlanılır və qalıcı enerji müqavimət üzərində yoxa
çıxacaqdır.. Ümumiyyətə bu üsulun istifadəsi mütləqdir, çünki bizim bir defe düymeye
basmağımız, arduino tərəfində 2,3.. və.s dəfə basılmaq kimi qəbul oluna bilər. Buna səbəb,
düymənin kontakının qapalı -açıq olması vaxtı, kontakt dodağlarında qısa hiss olunmaz qövslər
yaranır. pulldown və pullup müqavimətləri bu maniyələri aradan qaldırır. Bu metod düymə
vasitəsilə arduinonun giriş pininə +5 V yəni məntiqi 1 komandası verdikdə tətbiq olunur.
Şəkil 10.2.1. Pull-down müqaviməti,
Pull-upp müqaviməti. Düyməyə basmadığımız müddətdə, +5V gərginlik mütəmadi olaraq
Arduinonun giriş pininə verilir. Əgər düyməyə bassaq, dövrə qapandığı üçün, 5V gərginlik
GND ilə qısa qapanacaqdır, gərginlik pull-up müqaviməti üzərində yox olaraq, bu zaman
arduinonun girişinə 0V verilmiş olacaqdır. Əlimizi düymədən götürdükdə, qısa qapanmış
dövrə açılacaq, +5V yenidən gərginlik müqavimət üzərindən arduinonun girişinə verilmiş
olacaqdır. Bu metod arduonun girişinə 0V, yəni məntiqi 0 komandası vermək üçün istifadə
edilir.
Bu göstərdiyim metodlar xaricdən pullup və pulldown müqavimətləri istifadə etməklə
reallaşdırıldı. Ancaq Arduino kartının üzərindəki mikrokontrollerin daxili 20 KOm pull up
müqaviməti əlavə etmək xüsusiyyətidə vardır. Beləliklə, bu müqavimətləri proqram dili istifadə
edərək aktiv hala gətirmək olar. Pull-up müqavimətini aktiv hala gətirmək üçün, giriş olaraq
tənzimlədiyimiz pinə məntiqi 1 komandası verilməldir. Yəni daxili metod vasitəsilə arduinonun
istənilən cixis giris pinini məntiqi 0 və ya 1 edə bilərik. Bunun mənası,tutaq ki arduinonun 1
nomrəli pininə bir düymə, 2 nömrəli pininə bir LED bağlamışıq, biz istəsək düyməyə basdiqda
LED yanar, düyməni buraxsaq LED sönər, istəsəkdə düyməyə basmadıqda LED yansın,
düyməyə basdıqda sönsün edə bilərik.
Arduino Unonun çıxış pinləri 40mA olduğu üçün, bu pinləri böyük güclə yükləmək olmaz,
bunun üçündə bu pinlərlə böyük güclü elementləri idarə edərkən, gücləndiricilərdən istifadə
edilməldir.
4. digitalWrite funksiyası. Hər hansı bir pinə rəqəmsal olaraq HIGH - məntiqi 1(hə,5V)
yada LOW - məntiqi 0(yox, 0V) dəyər yazmaq üçün istifadə edilir. İstifadə edilmə sintaksisi
aşağıdakı kimidir:
digitalWrite (pin nömrəsi, HIGH və ya LOW);
Nümunə:
digitalWrite(5, HİGH);
digitalWrite(6, LOW)
Bu funksiya rəqəmsal pin girişlərinin və ya çıxışlarını 5V və 0V olmasını təmin edir. Əgər
giriş pini olaraq tənzimlənirsə, digitalWrite ilə HIGH etdikə, pull up müqavimətləri aktiv
edilməli, LOW edildikdə isə pull up müqavimətləri passiv edilməldir. Bu metodu pinMode(pin
nömrəsi, INPUT_PULLUP); funksiyası ilə reallaşdırırlar.
5. delay funksiyası. Programlarımızda gecikmələr və ya zamanlama yaratmaq üçün, yəni
ardıcıl iki kod arasında zaman müddəti və ya fasilə yaratmaq üçün delay(ingilis dilindən
gecikmə kimi tərcümə edilir)
funksiyası istifadə edilir. Sintaksis(istifadə edilmə forması) şəkli aşağıdakı kimidir:
delay();
() mötərizə içərisində qoymaq istədiyimiz zaman yazılır. Məsələn, delay(1000); // bu o
deməkdirki 1000 milli saniyə və 1 saniyə. Əgər programlarımıza millisaniyə yox mikrosaniyə
zamanı qoymaq istəsək, bu zaman delayMicroseconds(); funksiyasını istifadə etməliyik. delay-
ın bir başqa növüdə millis(); funksiyasıdır, buda eyni millisaniyə üçündür, ancaq delay-dan
fərqli olaraq millis funksiyası 50 gün işləyə bilir. 50 gündən sonra, öz-özünü
sıfırlayacaqdır.50-ci günün sonunda millis funksiyasını istifadə etsək, funksiya sıfırlandığı
üçün Arduino yenidən başlamış kimi dəyərlər göstərəcəkdir.
6. for idarə etmə struktur. for dövr ifadəsi Proqramın axışını idarə edən növbəti kontrol
ifadələrindən biri də dövr ifadələridir. Bəzən vəziyyət elə olur ki, poqramda bir əməliyyatı
müəyyən sayda yerinə yetirmək – təkrar icra etmək lazım gəlir. Bu kimi bir işi dövrə salaraq
təkrarən yerinə yetirmək üçün dövr kontrol ifadələrindən istifadə olunur. Bu ifadələrdən biri də
for – dur. for ifadəsinin ən çox istifadə olunan sintaktik şəkli aşağıdakı kimidir:
for(başlanğıc; şərt; ifadə)
{
Əməliyyatlar…
}
Burada başlanğıc adətən, dövrü idarə edən dəyişənə müəyyən bir başlanğıc qiymətin verilməsi
kimi müəyyən olunur. Şərt, dövrün hansı şərtlər daxilində icra olunmasını müəyyənləşdirən
şərtdir və ümumi qiyməti bool tipində olur. Nə qədər ki, bu şərt doğrudur, dövr icra olunur. ifadə
isə for ifadəsi hərdəfə dövr etdikcə, dövr idarə edən dəyişənin hansı şəkildə dəyişəcəyini özündə
saxlayır. Qeyd etmək lazımdır ki, dövrün şərti ilk addımda düzgün deyilsə, onda dövr ifadəsinə
aid heç bir əməliyyat yerinə yetirilmir.
7. [] massivlər(cərgə). Biz baxdığımız nümunə proqramlarda elə də çox sayda dəyişəndən
istifadə etmirdik.
1,2 və ya 3 dəyişən maksimum halda.
Aydındır ki, bütün bunlar nümunə proqramlardır və materialı izah etmək üçün verilir.
Real tətbiqi proqramlar isə 10 000 -lərlə və ya 100 000 -lərlə müxtəlif məlumatlar üzərində
əməliyyatlar aparmalı olur.
Sadə misala baxaq:
Tutaq ki, univeristetdə bu il bütün fakultələr üzrə təhsil alan tələbələrin, bütün fənlər üzrə qış
imtahanlarının yekun nəticələrinin orta qiymətini hesablamaq lazımdır. Əgər universitetdə 6000
tələbə, 5 fəndən imtahan veribsə bu 30 000 imtahan nəticəsi deməkdir. başqa sözlə bu proqramı
qurmaq üçün biz 30 000 dənə dəyişən elan etməliyik, hansı ki, praktiki olaraq mümkün deyil
(əlbəttdə mümkündür, amma heç kim bu işi görməz). Bu zaman cərgələrdən istifadə olunur.
Massivi elan edən zaman yaddaşda biz lazım olan sayda dəyişən (10, 5000, 100 000 )
yerləşdirmək üçün sahə ayırırıq və bu sahəyə bütövlükdə bir ad veririk.
Dəyişənlər bu sahəyə ardıcıl düzülür, massiv şəkilində. Daha sonra bu massivdən istənilən
elementə müraciət etmək üçün həmin sahəyə verdiyimiz addan və həmin dəyişənin indeksindən
(cərgədəkədi sıra nömrəsindən) istifadə edirik.
Massivdə dəyişənlərin nömrələnməsi 0 -dan başlayır, yəni cərgənin ilk elementinə müraciət
eləmək üçün cərgənin adı və 0 indeksindən istifadə olunur.
Cərgə elan eləmək üçün aşağıdakı çox sadə sintaksisdən istifadə edirik:
tip cərgənin_adı[elementələrin_sayı];
int saylar [6];
int girisPin[] = {2, 4, 6, 8};
11.2.1. ARDUİNO BLİNK(LED yandırıb-söndürmək)
Əvvəlcə dövrəmizi quraq,
Şəkil 11.2.1. LED-lərin sxematik arduino kartının 2 və 13 rəqəmsal pinlərinə
bağlanmasına
Biz dövrəmizdə nümunə üçün həm 2 ci həmdə 13 cü pinə bağlanmış LED-lər üçün kod
yazdığımız üçün, bir dövrədə hər ikisini göstərdik. LED(işıq yayan diod) p-n keçidə malik yarım
keçirici olduğu üçün, bağlantı ayaqlarının + və ya - qütbünə diqqət etməlisiz. LED-lər müxtəlif
rəng kateqoriyalarına ayrılırlar, və hər rəngin öz cərəyan, gərginlik kimi paramatrik qiymətləri
vardır. Arduino UNO kartımız 5V qida mənbəyi ilə qidalanırsa, məlum məsələdir ki, çıxış
pinlərindən alınan gərginlik də 5V olacaqdır. LED-lər kiçik gərginlik və cərəyana malik
olduqdlarında birbaşa bu pinlərə bağlana bilməzlər. Böyük cərəyan axdığından LED-lər sıradan
çıxa bilər və ya pin zədələnə bilər. Bu böyük cərəyanı və gərginliyi məhdudlaşdırmaqdan ötrü
mütləqdir ki, LED pinə ardıcıl bir müqavimət ilə qoşulsun. LEDə görə müqavimətin təyin
edilməsi aşağıdakı kimidir:
V- mənbə gərginliyi və ya pin gərginliyi; VLED - LED-in öz gərginliyi; R- məhdudlaşdırıcı
müqavimət; Led üçün 5V gərginlikdə çox vaxt 220 Om və ya 330 Om müqavimət istifadə edilə
bilər.
LED-in müsbət və mənfi qütbünün təyin edilməsi şəkli aşağıda verilmişdir:
Rənglərə görə LED-lərin gərginlik parametrləri: Bu cədvəl 20mA cərəyan çəkən LED-lər
üçün verilmişdir:
Şəkil 11.2.2. LED-lərin real olaraq arduino kartının 2 və 13 rəqəmsal pinlərinə
bağlanmasına
Bir LED-i yandırıb söndürmək(buna ingilis dilində Blink deyilir) üçün üç formada kod yazmaq
olar.
1 ci forma. Arduinonun 2 ci pinə bağlanmış LED-in yanıb sönməsi
int safa= 2;
// yəni, safa dəyişənini 2 rəqəminə tanıtdım və ya mənimsətdim
void setup()
{
pinMode(safa, OUTPUT); // safa çıxışdır, yəni 2-ci pinimiz çıxışdır
}
void loop()
{
digitalWrite(safa, HIGH);
// 2-ci pinimiz "on" olsun, yəni 2-ci pinə volt gəlsin,
//məntiq elementi kimi desək "hə"
delay(1000);
// 1000 millisaniyə gözlə, yəni bir saniyə gözlə,
//zamanı sürətləndirib-ləngidə bilərik, məsələn 100millisaniyə
digitalWrite(safa, LOW);
// 2-ci pinimiz "of" olsun, yəni 2-cü pinə volt gəlməsin,
//məntiq elementi kimi desək "yox"
delay(1000);
//1 saniyə gözlə,bu pross yeniden tekrarlanacaqdır
}
2 ci forma.
Arduinonun 13 cü pinə bağlanmış LED-in yanıb sönməsi
void setup() {
pinMode(LED_BUILTIN, OUTPUT);// LED_BUILTIN dedikdə bu ancaq
//13-cu pini nəzərdə tutur, LED_BUILTIN əvəzinə 13 rəqəmidə yaza bilərdik.
}
void loop() {
digitalWrite(LED_BUILTIN, HIGH);// 13-cü pinimiz "on" olsun,
//yəni 13-cü pinə volt gəlsin, məntiq elementi kimi desək "hə"
delay(1000);// 1000 millisaniyə gözlə, yəni bir saniyə gözlə
digitalWrite(LED_BUILTIN, LOW);//13-cü pinimiz "of" olsun, ,
//yəni 13-cü pinə volt gəlməsin, məntiq elementi kimi desək "yox"
delay(1000);//1 saniyə gözlə,bu pross yeniden tekrarlanacaqdır
}
3 cü forma. Arduinonun 2 ci pinə bağlanmış LED-in yanıb sönməsi
void setup()
{
pinMode(2, OUTPUT);//yəni 2-ci pinimiz çıxışdır
}
void loop()
{
digitalWrite(2, HIGH);// 2-ci pinimiz "on" olsun,
//yəni 2-ci pinə volt gəlsin, məntiq elementi kimi desək "hə"
delay(1000); // 1000 millisaniyə gözlə, yəni bir saniyə gözlə
digitalWrite(2, LOW);// 2-ci pinimiz "of" olsun,
//yəni 2-cü pinə volt gəlməsin, məntiq elementi kimi desək "yox"
delay(1000); // 1 saniyə gözlə,bu pross yeniden tekrarlanacaqdır
}
İki LED-in eyni anda yanıb-sönməsi.
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
pinMode(2, OUTPUT);
}
void loop() {
digitalWrite(LED_BUILTIN, HIGH);
digitalWrite(2, HIGH);
delay(1000);
digitalWrite(LED_BUILTIN, LOW);
digitalWrite(2, LOW);
delay(1000);
}
Multivibrator. İki LED-n fərqli zamanlarda yanıb-sönməsi
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
pinMode(2, OUTPUT);
}
void loop() {
digitalWrite(LED_BUILTIN, HIGH);
digitalWrite(2, LOW);
delay(1000);
digitalWrite(LED_BUILTIN, LOW);
digitalWrite(2, HIGH);
delay(1000);
}
5 ədəd LED-in sağa sola sürüşməsinin(qara şimşək) iki formada kodlanması:
Sxem:
Şəkil 11.2.3
1 ci forma.
void setup() {
pinMode (8, OUTPUT);
pinMode (9, OUTPUT);
pinMode (10, OUTPUT);
pinMode (11, OUTPUT);
pinMode (12, OUTPUT);
}
void loop() {
digitalWrite (8, HIGH);
delay (100);
digitalWrite (8, LOW);
digitalWrite (9, HIGH);
delay (100);
digitalWrite (9, LOW);
digitalWrite (10,HIGH);
delay (100);
digitalWrite (10, LOW);
digitalWrite (11, HIGH);
delay (100);
digitalWrite (11, LOW);
digitalWrite (12, HIGH);
delay (100);
digitalWrite (12, LOW);
digitalWrite (11, HIGH);
delay (100);
digitalWrite (11, LOW);
digitalWrite (10, HIGH);
delay (100);
digitalWrite (10, LOW);
digitalWrite (9, HIGH);
delay (100);
digitalWrite (9, LOW);
}
Kodların izahı:
void setup() { // ledlərin bağlı olduğu pinləri və çıxış olduqlarını qeyd edirik.
pinMode (8, OUTPUT);
pinMode (9, OUTPUT);
pinMode (10, OUTPUT);
pinMode (11, OUTPUT);
pinMode (12, OUTPUT); }
void loop() { //ledlərin ardıcıl olaraq, birinin sönüb digərinin yanmasını qeyd edirik.
digitalWrite (8, HIGH); 8 ci pinə gərginlik gəlsin(məntiqi 1)
delay (100); // zamanı istənilən vaxta qurmaq olar, 1000 millisaniyə= 1 saniyə
digitalWrite (8, LOW); // 8-ci pinə gərginlik gəlməsin(məntiqi 0)
digitalWrite (9, HIGH); cu pinə gərginlik gəlsin(məntiqi 1)
Bu qayda ilə artan istiqamətdə 12-yə qədər qeyd edirik, buz zaman LED-lər soldan sağa
yanmış olacaqdır. Daha sonra LED-lərin sağsan sola sürüşməsi üçün, 12-ci pindən əksinə olaraq
həmin prosesin əksini yazırıq.
digitalWrite (12, LOW); 12ci pinə gərginlik kəsilsin
digitalWrite (11, HIGH); 11 ci pinə gərginlik gəlsin
delay (100); 0,1 saniyə gözlə
digitalWrite (11, LOW); 11 ci pinə gərginlik kəsilsin
digitalWrite (10, HIGH); 10 cu pinə gərginlik gəlsin
Bu kod prosesinin azalan şəkildə 9cu pinə qədər yazırıq.
2 ci forma.
int LEDler[] = {8,9,10,11,12};
void setup (){
for(int i=0; i<5 ;i++){
pinMode(LEDler[i], OUTPUT);
}}
void loop(){
for(int i=0; i<5; i++){
digitalWrite(LEDler[i],HIGH);
delay(50);
digitalWrite(LEDler[i],LOW);
}
for(int i=5;i>0; i--){
digitalWrite(LEDler[i],HIGH);
delay(50);
digitalWrite(LEDler[i], LOW);
}}
Kodların izahı:
int LEDler[] = {8,9,10,11,12}; //LED-lər dəyişəninə beş ədəd rəqəm tanıdırıq
void setup (){
for(int i=0; i<5 ;i++){
// For operatoru i=0-dan 4-e(i<5) qeder 5eded ardıcıl olaraq int [] operatorunun daxilində
qeyd olunan dəyişənə tanıdılan ədədləri(bu ədədlər ledin hansı pine qosuldugu pinlerin
nomreleridir) artan istiqametde qosmaqin ayarlayir, i++ burada artan istiqamet demekdir //
pinMode(LEDler[i], OUTPUT); // ledler cixisa qosulub
}}
void loop(){
for(int i=0; i<5; i++){
// Butun ledler ardicil olaraq artan istiqametde yanmagi qeyd olunur
digitalWrite(LEDler[i],HIGH); // ledin her biri ardicilliqla high olar
delay(50); // 0,05 saniye sonra
digitalWrite(LEDler[i],LOW); // ledlerin her biri ardicil olaraq low olar, bir ledden sonraki
yanir, evvelki sonur
}
for(int i=5;i>0; i--){
// LEDler əks istiqamətdə 50 milisaniye yanib sondurururk
digitalWrite(LEDler[i],HIGH);
delay(50);
digitalWrite(LEDler[i], LOW);
}}
11.3. Serial.begin, Serial.print., analogRead.
Analog Read Serial(ardıcıl monitordan analoq dəyərləri oxumaq)
Potensiometr. Potensiomet, bir digər adı reostat, müqavimət növlərindən biridir.
Potensiometrin xüsusiyyəti tənzimlənə bilən v ya idarə edilə bilən müqavimət olmasıdır.
Elektronikanın əsas elementlərindən biridir və idarəetmə tələb edən işlərin bir çoxunda var. Şərti
işarəsidə də normal bir müqavimətin üzərinə ox əlavə olunması ilə meydana gəlir. Bunun səbəbi
də müqavimət dəyərinin ani idarə edildiyini edildiyini göstərməsidir.
Şəkil 11.3.1. Potensiometrin şərti işarəsi
Potensiometr 3 ayaqlı bir dövrə elementidir və üzərində yerləşmiş fırlanğıcla ayaqlar
arasındakı müqaviməti idarə edilir. Aşağıdakı hərəkətli simualtsiyaya baxsaq, C ayağı
idarəetməni təmin edən ayaqıdır. Potensiomentrin istiqaməti B ayağına doğru çevrildikdə A-C
arasında müqavimət artır, C-B arasında müqavimət azalır. Əgər potensiometr A istiqamətinə
doğru çevrilərsə C-B arasında müqavimət artıb A-C arasında müqavimət də azalacaqdır.
Şəkil 11.3.2
Serial.begin();
Rəqəmsal kommunikasiyada əsas olaraq iki qayda vardır : ardıcıl(serial) və
paralel kommunikasiya. Ardıcıl kommunikasiyada rəqəmsal məlumatlar(data bitlər) tək bir xətt
üzərindən ard-arda göndərilərkən, paralel kommunikasiyada isə müəyyən qruplar halında bərabər
zamanlı olaraq ötürülür. Daha az məlumat xəttinə ehtiyac olduğundan(yəni bir xətt üzərində bir
neçə fərqli məlumat göndərmək mümkün olduğundan) ardıcıl kommunikasiya elektronika
proyektlərində sıx-sıx istifadə edilir. Nümunə gətirmiş olsaq, kompüterlərdə istifadə edilən USB,
SATA, və.s kimi ardıcıl kommunikasiya standartlarını saya bilərik. Məhz arduino kartımızla
kompüterimiz arasında əlaqə ardıcıl kommunikasiya ilə yaradılır. Həm kompüterdən arduinoya
məlumat ötürdükdə, həm arduinodan komputerimizə məlumat ötürməkdə çox vacib bir yer tutur.
Keçmiş zamanlarda, kompüterlərdə ardıcıl kommunikasiya RS232 poru üzərindən yaradılırdı.
Müasiz zamanda bunun yerini USB tutmuşdur. Ancaq onuda qeyd etmək lazımdır ki, RS232 ilə
USB arasındada bir əlaqə burmaq olur, bunun üçün RS232-USB konvertor əlimizdə olmalıdır.
Məhz bu konvertorun özü bizim arduino kartlarımızda yer almışdır. Ardıcıl kommunikasiyada
iki ayrı xətt üzərindən(Rx və Tx) məlumatlar(datalar) baytların bit cərgələri şəklində göndərilib-
alınır. Demək olar ki bu metod bütün mikrokontrollerlərdə vardır. Ardıcıl kommunikasiya üçün,
arduino üzərində yerləşən cihaza UART(Universal Asynchronous Receiver-Transmitter:
universal asinxron qəbuledici-ötürücü) adı verilir. Arduino modelindən asılı olaraq üzərində bir
və bir neçə sayda UART mikrokontroller yerləşə bilər. Arduino Uno kartında bir ədəd vardır.
UART-ı arduino kartımız üzərində artırada bilərik, bunu üçün xüsusi UART periferik modullar
mövcuddurlar. Arduino ilər komputer arasındakı bu kommunikasiya UART protokolu deyilir.
Ardıcıl kommunikasiya üçün, arduino uno kartı üzərində D0(Rx) D1(Tx) olmaqla iki
rəqəmsal pin mövcuddur. Bu iki pin eyni zamanda, Rx, Tx LED-lərinə və USB konvertor çipi
ilədə əlaqəlidir. Programlama əsnasında, bu iki pinlər üzərindən kommunikasiya sistemi qurulur.
Məlumatı uzatmadan Serial.begin() funksiyasına keçək. Bu funksiya setup() funksiyasının
daxilində yazılır, və ardıcıl kommunikasiyanın başlatmasını təmin edir. Serial.begin()
funksiyasına parametr olaraq 300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600
və 115300 dəyərlərindən birini verə bilərik. Bu dəyərlərin ölçü vahidi bps(bir saniyə ərzindəki
bit) və ya baud rate(uzaq ötürmə) olaraq götürülür. Kodlanmada aşağıdakı kimi yazılır:
void setup() {
Serial.begin(9600);
}
İki arduino kartının bir-birilə və ya digər periferik cihaz ilə ardıcıl kommunukasiya zamanı
mütlər hər iki bps vahidi eyni olmalıdır.
Qeyd etməl lazımdırki, arduino üzərindəki Rx Tx rəqəmsal pinlər yalnız UART üçün nəzərdə
tutulmuşdur, yox əgər biz istəsək ki, bu pinləri də hər hansı bir rəqəmsal çıxış üçün istifadə edək,
bu zaman void loop(); daxilində Serial.end(); funksiyası yazaraq ardıcıl kommunikasiyanı
deaktiv edə bilərik.
Serial. print və Serial.println();
Kompüterimizə göndərilən məlumatı, monitorda əks etdirmək üçün bu funksiyalardan istifadə
edilir. Serial.print yazını,rəqəmi və ya hər hansı bir simvolu ard-arda düzərək monitorda göstərir,
yəni bir sətirdən ibarət məlumat göndərir, serial.println funksiyası isə növbəti gələn məlumatları
yeni sətrlərdə alt-alta yerləşdirərək monitora göndərir. Əgər yazı və ya məlumat əvvəlcədən hər
hansı bir dəyişənə mənimsədilibsə Serial.print(safa); belə yazılır, əgər mənimsədilməyibsə və ya
proqramın daxilində ilk yazılan məlumatdırsa, bu zaman Serial.print("safa") kimi yazılır. Bu eyni
ilə Serial.println-də aiddir.
analoRead(analoq pinin nömrəsi); bu funksiya arduinonun analog girişlərində tətbiq olunan
10 bitlik 0 - 5V arası gərginlikləri 0 - 1023 arasındakı rəqəmsal dəyərlərə çevirir. Əgər analoq
pinə tətbiq olunan 5V gərginliyi ekranda volt şəklində görmək istəsək, bu zaman 5V-u 1024
rəqəmsal dəyərə böllmək lazım olacaqdır. 5V/1023=4,88mV. Əgər analog girişə tətbiq olunan
5V gərginliyi 5V kimi ardıcıl monitorda(serial monitor) görmək istəyiriksə, biz potensiometrin
ardıcıl monitora çıxartdığı qiyməti 1023 -ə bölüb və nəticəni 5-ə vurmaq lazımdır.
Analog Read Serial(ardıcıl monitordan analoq dəyərləri oxumaq).
Sxem:
Sxemdə istifadə olunan elementlər:
1. Potensiometr 10 KOm
Kodlar:
void setup() {
Serial.begin(9600);
}
void loop() {
int potDeyer = analogRead(A0);
Serial.println(potDeyer);
delay(1);
}
Kodların izah olunması:
/* Arduino Uno kartının A0 pinindəki analoq dəyəri oxuyur və oxunan dəyəri ardıcıl
monitora çıxardır(monitorda göstərir). Potensiometrin orta pinini A0, kənar pinlərini(burada
ayaq mənasında) +5V-a və GND(-) bağlayın*/
void setup() {
Serial.begin(9600); // saniyədə 9600 bitlə ardıcıl kommunikasiya başlansın
}
void loop() {
int potDəyəri = analogRead(A0); // potensiometrin dəyəri analogRead funksiyasına
mənimsədildi, yəni potensiometrin orta ayağı A0 pini tərəfindən oxunsun
Serial.println( potDəyəri ); analogRead-ın A0 pinindən oxuduğu dəyəri alt-alt sətirlərlə
monitorda göstər
delay(1); // hər dəyişən dəyər arasındankı zaman 1 milli saniyə, biz potensiometrimizi hər
döndərdikdə məlum məsələdir ki dəyər dəyişəcəkdir, bu üzdən dəyişən dəyərləri arasındakı
zaman vacibdir.
}
11.4. digitalRead() funksiyası
Digital Read Serial(ardıcıl monitordan rəqəmsal dəyərin oxunması)
digitalRead(pin); Hansı ki, digitalRead funksiyası rəqəmsal girişə verilən 0 və 5V
gərginlikdən birini oxuyur, açıq demiş olsaq, bu funksiya arduinonun pinləri rəqəmsal giriş
kimi(məntiqi 0 və 1) istifadə edildikdə yazılır. digitalWrite rəqəmsal 0-1 çıxış üçün, digitalRead
isə rəqəmsal 0-1 giriş üçün yazılır.
Düymə(button). Düymə və ya açarda adlanır, ON-OF prinsipi ilə işləyən elementdir, adi açar
funksiyasını daşıyır, yəni üzərinə əlimizlə basdığımızda dövrəni qoşar, əlimizi götürdükdə isə
dövrəni ayırar. Təbi ki, bir çox növləri vardır. Normal halda açıq və ya qapalı düymələr, 2
kontaktlı, 4 kontaktlı tərs kontaktı olaraq növlərə bölünürlər.
Digital Read Serial(ardıcıl monitordan rəqəmsal dəyərin oxunması).
Sxem:
Sxemdə istifadə olunan elementlər:
Pushbutton(düymə, açar) -1 ədəd
Rezistor(pull up) 10 KOm
Kod:
int pushButton = 2;
void setup() {
Serial.begin(9600);
pinMode(pushButton, INPUT);
}
void loop() {
int buttonState = digitalRead(pushButton);
Serial.println(buttonState);
delay(1);
}
Kodların izahı:
int pushButton = 2; // pushButton(düyməni bas) dəyişəninə 2 rəqəmini mənimsətdik
void setup() { funksiyanın daxilində aşağıdakı quraşdırmalar yerinə yetirilsin
Serial.begin(9600); // saniyədə 9600 bit ardıcıl kommunukasiya başlansın
pinMode(pushButton, INPUT); //pushbutton yəni 2 ci pin INPUT(giriş)-dur, düyməni 2 ci
pinə bağlamışıq
void loop() { // kodların dövr etmə ilə oxunduğu yəni kodların ardıcıl işləməsi funksiyası,
burda yazılan kodlar əvvəldən sona sırayla ardıcıl olaraq oxunur, və bu proses təkrarlanaraq
yenilənir
int buttonState= digitalRead(pushButton); //serial monitorda göstərmək üçün,
buttonState(düymənin açıq-qapalı olduğu vəziyyəti) dəyişəninə digitalRead(pushButton)
funksiyasını mənimsədirik.
Serial.println(buttonStae); // digitalRead(pushButton)-unun oxudugu qiyməti ardıcıl
monitorda göstərəcəkdir.
delay(1); // düyməni basb-buraxdıqda ardıcıl monitorda hansı zaman fasiləsində oxunan
dəyəri göstərməsi üçündür, özünüz üçün bu zamanı artırıb azaldaraq nə baş verdiyini araşdıra
bilərsiz.
11.5. analogWrite() funksiyası.
LED-in parlaqlığının avtomatik olaraq artıb-azalması(Fade)
Bu dərsimizdə, sizlərlə arduinonun rəqəmsal D9 pininə qoşulan LED-in parlaqlığının artıb-
azaltmaq qaydasını öyrənərik. Nəzərinizə çatdırım ki, arduino kartlarında analoq çıxış funksiyası
yoxdur, yalnız analoq giriş kimi istifadə edə bilirik. Biz analoq çıxış almaq üçün, rəqəmsal
pinlərdən PWM üsulundan istifadə etməklə əldə edəcəyik.
Şəkil 11.5.1
Şəkil 11.5.2
PWM(eninə impuls modulyasiyası) elektron dövrələrdə ən çox istifadə edilən qaydadır.
Arduino kartında çıxış rəqəmsal pindən sürətli şəkildə 0-5V verməklə biz analoq qiyməti ala
bilərik. Şəkil 11.5.1 dən göründüyü kimi, 5V-un ON rejimi nə qədər çox olarsa, 0V-un off rejimi
az olarsa bir o qədər analoq qiymət çox olacaqdır. Buna ingilis dilində duty cucle deyilir.
ton- 5V-un verildiyi müddət;
T- ümumi period, yəni ton + toff
Alınan nəticə 100%-ə vurulur. Gördüyünüz kimi, faizi çox olan analoq qiyməti çox olandır.
Və bu alınan faizə işçi tsikl(duty cycle) adlanır, pwm bu dəyərdən asılıdır. Arduinoda PWM -
i analogWrite(pin, qiymət); funksiyası yerinə yetirir. Bu funksiya 0 - 255 arasında 8 bitlik dəyərə
malikdir. Arduino Uno kartında PWM üçün ən uyğun olan pinlər 5-6 cı pinlərdir, bu pinlərdə
maksimum tezlik 980 Hs-dir. analogWrite(pin, qiymət); funksiyası ilə pindəki çıxış gərginlyinini
tənzimləyərək LED, sabit cərəyan mühərriklərini idarə edə bilərik.
LED-in parlaqlığının avtomatik olaraq artıb-azalması(Fade).
Sxem:
Şəkil 11.5.3
Kodlar:
int led = 9;
int brightness = 0;
int fadeAmount = 5;
void setup() {
pinMode(led, OUTPUT);
}
void loop() {
analogWrite(led, brightness);
brightness = brightness + fadeAmount;
if (brightness <= 0 || brightness >= 255) {
fadeAmount = -fadeAmount;
}
delay(1000);
}
Sxemdə istifadə olunan elementlər:
1. 220 Om rezistor
2. LED
3. Birləşdimə naqilləri
Kodların izahı:
int led = 9; // pwm 9 cu pindən alınacaq, led-in bağlı olduğu ayaq
int brightness = 0; // parlaqlığa verilən dəyər, 0-ledin parlaq olmadıgı dəyərdir, yəni
arduinodaya enerji verildiyi anda led ilk anda parlaq olmuyacaqdır. yəni ilk annda 9-cu pin 0V
ilə artmaya başlasın.
int fadeAmount = 5; // gərginliyin və ya ledə verilən gərginliyin və ya led-in parlaqlığının
hansı pillələrdə artmasını təyin edən dəyər.
void setup() {
// resetdən sonra və ya arduinoya enerji verildikdə, birdəfə işləyən quraşdırma funksiyası
pinMode(led, OUTPUT); // 9- cu pin çıxış olaraq quraşdırıldı
}
void loop() {
// bu funksiyaya yazılan kodlar dövr etmə ilə oxunub işləyəcəkdir
analogWrite(led, brightness); //9 cu pinin parlaqlıq dəyəri, yuxarıda int brightness = 0; kimi
qeyd edilib
brightness = brightness + fadeAmount; // parlaqlığn və ya led-ə verilən gərginliyin hansı
aralıqda və ya pillədə artması, 0+5+5+5+5+5
if (brightness <= 0 || brightness >= 255) {
//əgər brightnes(parlaqlığ) 0-dan kiçik bərabər və ya( ||) 255-dən kiçik bərabər olarsa, || işarəsi
və ya deməkdir.
fadeAmount = -fadeAmount;// fadeAmount dəyəri mənfi olsun, bu zaman cəmləmə yox çıxma
əməliyyatı aparılacaqdır, 9 pin-dəki gərginlik 255 dəyərinə yəni maksimum dəyərinə çatsa,
fadeAmount mənfi olduğundan , gərginlik maksimumdan minimuma azalacaqdır, bunu dövrəyə
bağladığım voltmetrlə də izləyə bilərsiz.
delay(1000); // parlaqlıq və ya qaranlıqın arması-azalması müddəti 1 saniyə
}
11.6. float.
Read Analog Voltage(ardıcıl monitordan gərginliyin ölçülməsi)
float çevirmə dəyişən tipi, 32 bit həcmi var, [-3,4028235E...38 -- +3,4028235E...38] parça
aralığında müsbət və mənfi işarəli kəsr qiymət alır. Analoq dəyəri(0 - 1023) volt dəyərinə(0 -
5V) çeviririk. burada potDeyer- analogRead(A0) funksiyasının oxuduğu qiymətdir. Və bu
qiyməti 5:1023= 0, 005 dəyərinə vururuq, aldığımız dəyər artıq volt dəyəri olmuş olur.
Read Analog Voltage(ardıcıl monitordan gərginliyin ölçülməsi)
11.3 -cü mövusunda biz bunu izah etmişdik, lakin o mövzuda yalnız potensiometrdən alınan
dəyərləri birbaşa olaraq ardıcıl monitorda göstərdik. İndi istə, bu dəyəri volta(5V) çevirib ardıcıl
monitorda göstərməyi öyrənərik. Təbi ki, arduino kartımızın giriş-çıxış gərginliyi maksimum 5V
olduğu üçün, və biz bu praktikanı birbaşa kart üzərində göstərdiyimiz üçün, nəzərinizdə saxlayın
ki bu yalnız 5V üçün olacaqır. Aşkar demiş olsaq, ardıcıl monitoru 5V-luq monitor kimi istifadə
etmiş olacağıq. Gələcəkdə, konvertor modullardan istifadə edərək, istənilən gərginliyi ardıcıl
monitordan göstərmiş olacağıq.
Sxem:
Şəkil 11.6.1
Sxemdə istifadə olunan elementlər:
1. 10 KOm potensiometr
Kodlar:
void setup() {
Serial.begin(9600);
}
void loop() {
int potDeyer = analogRead(A0);
float gerginlik = potDeyer * (5.0 / 1023.0);
Serial.println(gerginlik);
}
Kodların izahı:
void setup() {
Serial.begin(9600); // saniyədə 9600 bitlə komunikasiya başlanılsın
}
void loop() {
int potDeyer = analogRead(A0); //int veriləninə sensorValue dəyişəninin tanıtdırırıq,
və analogRead(A0) funksiyasını bu dəyişənə mənimsətdik. A0 arduinonun giriş analoq pininin
nömrəsidir.
float gerginlik = sensorValue * (5.0 / 1023.0); // float-a gerginlik adlı dəyişən tanıdırıq və bu
dəyişənə sensorValue * (5.0 / 1023.0) dəyərini mənimsədirik.
Serial.println(gerginlik);// alına gərginlik dəyərini ardıcıl monitorda print edir yəni nəticəni
ekrana çıxarır.
- Gördüyünüz kimi burada delay(); zaman funksiyasını istifadə etməmişik, burada bunuda
istifadə edə bilərsiz, özünüz yazıb-yazmamaqla arasındakı fərqi hiss edəcəksiz, delay(100); 0,1
milli saniyə etsəz, potensiometrin dəstəyini fırlatmaqla anında anında dəyişilən dəyəri ardıcıl
monitorda göstərəcəkdir.
}
11.7. const, unsigned, long, millis().
delay() funksiyasını istifadə etmədən LED-in yanıb-sönməsi
1. const, qarşısında yazıldığı verilənlər tipini sabit saxlayırlar ki, onları loop və setup
içərisində dəyişmək olmaz
const int = 100;
2. unsigned int , 16 bit həcmi var, [0 - 65535] parça aralığında müsbət işarəli tam qiymət
alır.
unsigned ad = 4000;3.
3. long, 32 bit həcmi var, [-2147483648 -- +4294967296] parça aralığında müsbət və mənfi
işarəli tam qiymət alır.
long dəyişənləri, uzun ölçülü ədədləri saxlamaq üçün, dəyişən tipləridir və 32 bit (4 bayt), -
2,147,483,648 - 2,147,483,647 aralığındadır. Tam ədədlərdə riyazi hesab aparırsızsa, ədədlərdən
ən azından birinin L ilə izlənilməsi lazım gəlir.
Yazılış şəkli
long var = val;
Burada
var: dəyişənin adı.
val: dəyişənə mənimsədilən dəyər.
Nümunə kodu:
long speedOfLight = 186000L;
4. unsigned long, 32 bit həcmi var, 0 - 4294967295 aralığında müsbət tam qiymət alır
5. millis(), gecikmə funksiyası, delaydan fərqli olaraq,50 gün çalışdıqdan sonra, sıfırlanaraq
başa qayıdar, həmdə millis gecikmə funksiyası arduino proqram kodlarını çalışdırana qədər
olan zamanıda verə bilir və ya göstərə bilir. Neçə saniyədən sonra kodların oxunmağa başladığı
müddəti göstərə bilir.
Nümunə Kodlar:
unsignedlong zaman;
voidsetup(){
Serial.begin(9600);
}
voidloop(){
Serial.print("Zaman: ");
zaman =millis();
Serial.println(zaman);
delay(1000);
}
millis(); gecikmə funksiyasının zamanı unsigned long-un tutduğu dəyərə bağlıdır. Bunu
serial.println- kommunikasiyası monitorda hesablayaraq göstərir.
delay() funksiyasını istifadə etmədə LED-in yanıb-sönməsi.
13 ayağına bağlanmış LED-in yanıb sönməsini delay zaman funksiyasını istifadə etmədən
sizlərlə öyrənək. Bu funksiyanı millis(); funksiyası ilə əvəz etməklə reallaşdırarıq. Bu funksiya
işə düşdüyü andan 50 gün ömrü var, bu müddət bitdikdən sonra təkrar başa dönəcəkdir.delay-
da olduğu kimi vahidi millisaniyədir.
Sxem:
Şəkil 11.7.1
Sxemdə istifadə olunan elementlər:
1. 220 Om rezistor
2. LED
Kodlar:
const int ledPin = LED_BUILTIN;
int ledVeziyyeti = LOW;
unsigned long evvelkizaman = 0;
const long interval = 1000;
void setup() {
pinMode(ledPin, OUTPUT);
}
void loop() {
unsigned long zamanDeyeri = millis();
if (zamanDeyeri - evvelkizaman >= interval) {
evvelkizaman = zamanDeyeri;
if (ledVeziyyeti == LOW) {
ledVeziyyeti = HIGH;}
else {
ledVeziyyeti = LOW;
}
digitalWrite(ledPin, ledVeziyyeti);}}
Kodların izahı:
const int ledPin = LED_BUILTIN; // LED_BUILTIN 13-cü pin deməkdir, 13-cü pinimizi
ledPin dəyişəninə mənimsədirik. const-burada int veriləninin sabit , dəyişməz tip olduğu başa
düşülür.
int ledVeziyyeti = LOW; // ledin vəziyyətini göstərən dəyişən
unsigned long evvelkizaman = 0; // başlanğıc zaman dəyişəni,
const long interval = 1000; //zaman aralığı
void setup() {
pinMode(ledPin, OUTPUT); //13cü pinimizi çıxış kimi quraşdırdıq
}
void loop() {
unsigned long zamanDeyeri = millis(); // zamanDeyeri dəyişənimiz millis() funksiyasına
mənimsədildi.
if (zamanDeyeri - evvelkizaman >= interval) {
// əgər zamanDeyeri ilə evvelkizama-ın fərqi intervaldan(zaman aralığından) böyük
bərabərdirsə
evvelkizaman = zamanDeyeri; //zamanDeyeri evvelkizaman-a mənimsədilsin
if (ledVeziyyeti == LOW) { // əgər ledVeziyyeti LOW-dursa
ledVeziyyeti = HIGH; // ledVeziyeti HIGH-ya mənimsədilsin
}
else {
// əgər elə deyilsə
ledVeziyyeti = LOW; //ledVeziyyeti LOW-ya mənimsədilsin
}
digitalWrite(ledPin, ledVeziyyeti); // 13 cü pinimiz, ledVeziyyeti-ne bağlı olaraq çıxış versin
}}
11.8. if, else, Müqayisə operatorları.
Düyməyə basmaqla LED- in yanması
if -şərt, əgər operatorundan(idarə etmə struktur) və else-deyil, deyilsə operatorundan
yaranmış bir operatordur. Biz, if operatorunda demişdik ki, bu operatorun mötərizə içərisində
yazılan kod təmin olumadısa və ya ödənmədisə, loop işərisində avtomatik olaraq if-dən sonra
gələn kodu oxuyacaqdır. Ancaq if / else operatorunda isə, if-də ödənilməyən və ya ödənilən
kod else operatoruna ötürülür, yəni else-də oxunur. Bu operatator iki qaydada yazıla bilər:
1.
if ( ) {
kod yazılan yer
}
else {
kod yazılan yer
}
İzahı:
if (a==3 ) { -əgər a=3 -sə
bura yazılan kod işləsin
}
else { - a=3 deyilsə, yəni if də olan hal ödənmədisə
bura yazılan kod işləsin(və ya oxunsun)
}
2.
if ( ) {
kod yazılan yer
}
else if () {
kod yazılan yer
}
İzahı:
if(a==3) { - əgər a=3-sə
bura yazılan kod işləsin
}
else if(a==5) { - a=3 deyilsə, a=5 -sə
bura yazılan kod işləsin
else { - bunlardan heçbirisi deyilsə
bura yazılan kod işləsin
}
3. Müqayisə operatorları:
x == y (x bərabərdir y);
x != y (x bərabər deyil y);
x < y (x balacadır y);
x > y (x böyükdür y);
x <= y (x kiçik bərabərdir y);
x >= y (x böyük bərabərdir y).
Düyməyə basmaqla LED- in yanması
Pin 5-ə bağlanmış düyməyə basdıqda, 8-ci rəqəmsal pinə bağlı olan LED-i yanacaq, əlimizi
götürdükdə isə sönəcəkdir.
Sxem:
Şəkil 11.8.1
Sxemdə istifadə olunan elementlər:
1. düymə(button on-off)
2. LED
3. 220 Om rezistor
Kodlar:
constintduyme=5;
constintled= 8;
intduymeVeziyyeti=0;
voidsetup(){
pinMode(led,OUTPUT);
pinMode(duyme,INPUT);
}
voidloop(){
duymeVeziyyeti=digitalRead(duyme);
if(duymeVeziyyeti==HIGH){
digitalWrite(led,HIGH);}
else{
digitalWrite(led,LOW);
}}
Kodların izahı:
const int duyme = 5; // sabit duyme dəyişəninə 5 ci pin mənimsədildi, 5 ci pinə düymə
bağlıdır
const int led = 8; // sabit led dəyişəninə 8 ci pin mənimsədildi, 8 ci inə LED bağlıdır
int duymeVeziyyeti = 0; // normal halda düymənin vəziyyəti 0-dır, yəni basılmayıb
void setup() {
pinMode(led, OUTPUT); // led qoşulan pin çıxış kimi quraşdırıldı
pinMode(duyme, INPUT); // düymə qoşulan pin giriş kimi quraşdırıldı
}
void loop() {
duymeVeziyyeti = digitalRead(duyme); // digitalRead-ın oxuduğu dəyər, duymeVeziyyətinə
mənimsədilsin,
if (duymeVeziyyeti == HIGH) {//əgər düyməyə basıldısa, yəni duymeVeziyyəti HIGH(məntiqi
1) -sə
digitalWrite(led, HIGH);} // led yansın, yəni led bağlanan pin məntiqi 1 olsun
else { // əgər düymə basılı deyilsə
digitalWrite(led, LOW); // onda LED yanmasın, yəni led bağlanan pin məntiqi 0 olsun
}}
11.9. ++ artırma və -- azaltma operatoru, qalıq almaq (%).
Düymənin vəziyyətinin ardıcıl monitordan izlənilməsi
++ artırma və -- azaltma operatoru
x++; // x qalır və hərdəfə +1 artır,
Nümunə, x=5; x>5; x++; // 5,6,7.. və.s
++x; // x birbaşa +1 artır
Nümunə, x=5; x>5; ++x; // 6,7,8.. və.s
x--; // x qalır və hər dəfə -1 azalır
Nümunə, x=5; x>5; x--; // 5,4,3.. və.s
--x; // x bir başa -1 azalır
Nümunə: x=5; x>5; --x; // 4,3,2.. və.s
Qalıq almaq %
Orta məktəb riyaziyyat dərsində keçdiyimiz qalıqdır, % işarəsi ədədin ədədə bölünməsindən
alınan qalıqı verir. Əgər sürət məxrəcdən kiçikdirsə, onda qalıq olaraq sürətin özü götürülür.
Nümunə:
3 %4 =3, 6 % 4 =2
Bu gün, pin 2-yə bağlanmış düymənin(pushbutton) açıq-qapalı olmasını ardıcıl monitordan
izlənilməsini öyrənərik.
Sxem:
Sxemdə istifadə olunan elementlər:
1. Button(düymə)
2. LED
3. 220 Om və 1 KOm rezistor
Kodlar:
constint duymeninPini = 2;
constint ledinPini = 13;
int duymeninBasilmaSayi = 0;
int duymeninVeziyyeti = 0;
int duymeninEvelkiVeziyyeti = 0;
voidsetup() {
pinMode(duymeninPini,INPUT);
pinMode(ledinPini,OUTPUT);
Serial.begin(9600);
}
voidloop() {
duymeninVeziyyeti =digitalRead(duymeninPini);
if (duymeninVeziyyeti != duymeninEvelkiVeziyyeti) {
if (duymeninVeziyyeti ==HIGH) {
duymeninBasilmaSayi++;
Serial.println("qapali");
Serial.print("duymenin sixilma sayi: ");
Serial.println(duymeninBasilmaSayi);
}
else {
Serial.println("achiq");
}
delay(100);
}
duymeninEvelkiVeziyyeti = duymeninVeziyyeti;
if (duymeninBasilmaSayi % 4 == 0) {
digitalWrite(ledinPini,HIGH);
}
else {
digitalWrite(ledinPini,LOW);
}}
Kodların izahı:
constint duymeninPini = 2;
Düymənin bağlandığı yeri 2 ci pin olaraq mənimsətdik
constint ledinPini = 13;
Ledin bağandığı yeri 13-cü pin olaraq mənimsətdik
int duymeninBasilmaSayi = 0;
Düymənin basılma sayı 0-dan etibarən başladığını mənimsətdik
int duymeninVeziyyeti = 0;
Düymənin normala açıq olduğu vəziyyət yəni 0
int duymeninEvelkiVeziyyeti = 0;
Düymənin əvvəlki vəziyyətini 0 rəqəminə mənimsətdik
voidsetup() {
pinMode(duymeninPini,INPUT);
pinMode(ledinPini,OUTPUT);
Serial.begin(9600);
}
void setup() birdəfə çalışan quraşdırıcı funksiyası daxilinə, duymeninPini giriş, ledinPini çıxış
olaraq təyin etdik, və saniyədə 9600 bitlə kommunukasiyaya başlanılsın qeyd etdik
duymeninVeziyyeti =digitalRead(duymeninPini);
void loop() təkrarlanaraq dövr edən funksiyanın daxilində, digitalRead-in düyməninPini-ndən
aldığı dəyəri duymeninVeziyyeti dəyişəninə mənimsətdik. digitalRead düyməyə hər dəfə
basıldıqda həmin dəyərin 0 və ya 1 olduğunu oxuyur.
if (duymeninVeziyyeti != duymeninEvelkiVeziyyeti) {
Əgər düymənin açıq-qapanma vəziyyəti, düymənin əvvəlki vəziyyətinə bərabər deyilsə, !=
işarəsi bərabər deyil operatorudur, x != y (x bərabər deyil y)
if (duymeninVeziyyeti ==HIGH) {
Əgər düymənin vəziyyəti HIGH-ya bərabər yəni məntiqi 1 və ya basılıdırsa. = = işarəsi
bərabərlik operatorudur
duymeninBasilmaSayi++;
Düymənin basılma sayı hər dəfə +1 dəfə artsın.
Serial.println("qapali");
Düyməyə basdıqda, ardıcıl monitorda yeni sətrdə qapalı yazısın göstərəcəkdir. Və bu sətrdən
sonra yazılan alt sətrə düşəcəkdir
Serial.print("duymenin sixilma sayi: ");
Düyməyə hər dəfə sıxıldıqda, sıxılma sayı yazısı : ilə birlikdə sayıda ardıcıl olaraq
yazılacaqdır
Serial.println(duymeninBasilmaSayi);
Düymənin basılma sayını hesabayıb göstərir.
else {
Serial.println("achiq");
}
Düymə basılı deyilsə, ardıcıl monitorda achiq yazısı göstərsin. "" işarəsi hər hansı əvvəlcədən
dəyişənə mənimsədilməyən bir söz, yazı yazılmasını istənilərsə qoyulur.
delay(100);
100 milli saniyə gözlə
if (duymeninBasilmaSayi % 4 == 0) {
Əgər düymənin basılma sayının qalığı 0-ra bərabər olarsa, %4 bu o deməkdir ki məsələn
düymeni 1 dəfə bassaq, 1%4=1 qalıq 1 olacaq, əgər 4 dəfə, 8 dəfə və.s bassaq 4%4=0 qalıq 0
olacaqdır.
digitalWrite(ledinPini,HIGH);
Qalığın 0-ra bərabərliyi ödənilərsə, ledinPini HIGH olsun, yəni led yansın
else {
digitalWrite(ledinPini,LOW);
Elə deyilsə, ledinPini LOW olsun, yəni led sönsün
11.10. # define, #include, tone. Buzzer
Basılan düymələrə uyğun olaraq səslər(tone keyboard)
#define makrosu. #define makrosu(komanda), global dəyişənləri mənimsətdiyimiz yerə, yəni
setup-ın üstündəki yerə yazılır. #define bir dəyişən mənimsətmə metodu deyil. Bir
tapşırıq(assignment) komandası deyə bilərik buna.
İstifadə şəkli və ya sintaksisi:
#define ad dəyər
Ad hissəsi dəyişən adı, dəyər isə bu dəyişənin qarşılığı(rəqəmlə əvəzlənməsi) olacaqdır. Bu
makrosu yazınca, Arduino IDE programı, kodu Arduinoya yükləmədən əvvəl ad sözünün olduğu
yerə ad hissəsinin qarşısında yazılmış dəyəri kopyalamış olacaqdır. Yəni #define ledPin 10
makrosunu yazmış olsaq, arduino kompayleri, kodun içərisindəki bütün ledPin sözlərini 10 ilə
əvəz edəcəkdir. Bu da pinləri const int ilə mənimsətməkdən daha yaxşıdır. Çünki Aduinonun kod
yaddaşında "heç bir yer tutmaz"!. Təyin makrosları hər hansı bir ifadənin başqa ifadə ilə əvəz
edilməsinə xidmət edir. Misal üçün əgər biz proqramın hər-hansı yerində #define
MAX_QIYMET 1024 sətrini yerləşdiririksə onda kompilyator proqramda MAX_QIYMET
ifadəsinə rast gəldiyi bütün yerlərdə onu 1024 ilə
əvəz edəcək.
#include. #include, sketçinizə kənar kitabxanaları daxil etmək üçün istifadə edilir. Bu
programçıya geniş bir standart C kitabxana qrupununa(əvvəlcədən hazırlanmış funksiya qrupları)
və ayrıca xüsusilə Arduino üçün yazılmış kitabxanalara keçid etməsini təmin edir. #define-yə
bənzər #include-nin də nöqtəli vergül sonlandırıcısı yoxdur, əgər sonunda ; işarəsi qoyularsa
mütləq error göstərmiş olacaqdır. Arduinoda istifadə şəkli belədir:
#include<Servo.h>
Burada <servo.h> arduino IDE-sinə əvvəlcədən yazılmış servo mühərrik kitabxanasıdır,
hansılarki bu kitabxanaları siz özünüzdə hazırlaya bilərsiz(Dərs 8-ə baxa bilərsiz).
tone(). Təyin etdiyimiz pindən, istənilən tezlikdə kvadrat dalğa ala bilməyimiz üçün irəli
sürülmüş(advanced) funksiyadır. Bu funksiyanın verdiyi siqnal 50% işçi tsiklinə malikdir. Pin,
zil səs çalmaq üçün, piezo zummer və ya başqa bir səs ucaldıcıya(dinamik) bağlana bilər. Bir
dəfə(an) üçün bir zil səs istehsal edir. Əgər zil səsi fərqli bir pində çalınırsa, tone() funksiyasını
istifadə etməyin bir effekti olmuyacaqdır, yəni birini işlətmək üçün digərini söndürmək lazımdır
proqramdan. Zil səsi eyni pin üzərində çalınırsa, çağrılan tezliyi tənzimləyəcəkdir. Yox əgər bir
neçə pində zil səs çıxarma proyektini qurmaq istəyirsizsə, bu zaman bir sonraki pində tone()
istifadə etməzdən əvvəl bir pin üzərində noTone() funksiyasını istifadə etmək lazımdır.
Yazılış sintaksı aşağıdakı kimidir:
tone(pin, tezlik)
tone(pin, tezlik, müddət)
pin - arduinoda buzzer üçün isitfadə ediləcək pin
tezlik- buzzere verilə tezlik və ya pinin istehsal etdiyi tezlik, unsigned int verilən dəyər
çərçivəsində
müddət- tezliyin verilmə müddəti və ya zil səsin müddəti, unsigned long verilən dəyər
çərçivəsində
Qeyd: tone() funksiyası daxilində müddəti qey etməsəz, zil səsi dayanmadan çalacaqdır.
Buzzer. Buzzer(zummer) verilən gərginliyə görə fərqli səs siqnallarını çıxaran bir cihazdır.
Səs ucaldıcılar kimi yüksək səs yox sadəcə biiip kimi səs çıxarmaq üçün istifadə edilir, demək
olar ki elektronikanı əhatə etmiş bütün sistemlərdə istifadə edilir(siqnalizasiya və xəbərdarlıq
kimi xırda sistemlərdə). Buzzerin səsi iki usulla dəyişilə bilir: gərginlik və tezliklə. Ən çox
istifadə ediləni buzzerin girişinə verilən gərginlik sabit saxlayaraq tezliyini dəyişmə
qaydasıdır.Mexaniki, elektromexaniki və ya piezoelektrik işləmə prinsipinə əsaslanır.
Daxilindəki induktiv elementdəən cərəyan keçdikdə,və bu elementdən diskə verilən titrəyişlərin
nəticəsində diskdə səs çıxmağa başlayar. Səs səviyyələri 85-105dB arasındadır. Buzzerlərlə
arduino proyektlərində melodiyalar yaratmaq olur. + və - ucları vardır, sabit cərəyanla çalışırlar.
Buzzeri 5 V gərginliyə bir başa qoşmaq olmaz, bunu buzzerlə dövrəyə ardıcıl olaraq 100 Om
müqavimət qoşulmalıdır.
Şəkil 11.10.1. Buzzer
QHM-Qüvvəyə həssas müqavimət(force sensing resistor). İnterlink Electronics qüvvəyə
həssas müqaviməti(sensor) passiv elementdir. Üzərinə tətbiq edilmiş qüvvəni artırsaq, malik
olduğu müavimət qüvvəyə əks olaraq azalacaqdır və bu sayədə təzyiq və ya qüvvə dəyərlərini
ölçə bilərik.Əslində bu elementlər, ən dəqiq ölçmələrdə istifadə edilməyə yararsızdırlar, çünki
mühitə uyğun olaraq müqavimətləri yanlış ola bilərlər. Aktiv hala gəlməsi üçün üzərinə 2 qram
qüvvə kifayətdir.
Şəkil 11.10.2. Qüvvəyə həssas rezistor növləri
Basılan düymələrə uyğun olaraq Buzzerin səsi(tone keyboard)
Qeyd etmək istəyirəm ki, biz bu dövrəmizi adi buttonlar ilə də gerçəkləşdirə bilərik, sadəcə
QHM kimi effektiv səs verməyəcəkdir. Çünki, button-da konkret olaraq bir müqavimət (qapalı
)var, QHM isə basdığımız qüvvəyə əsasən buzzerdə səs çıxaracaqdır. Belə deyək, analog düymə
və rəqəmsal düymə.
Sxem:
Şəkil 11.10.3.
Dövrədə istifadə edilən elementlər:
1. 8 Om buzzer və ya səs uladıcı
2. 3 ədəd QHM
3. 3 ədəd 10 KOm rezistor
4. 1 ədəd 100 Om rezistor
5. Breadboard
Kodlar:
#include"pitches.h"
constint QHM = 10;
int notes[] = {
NOTE_A4, NOTE_B4, NOTE_C3
};
voidsetup() {
}
voidloop() {
for (int thisSensor = 0; thisSensor < 3; thisSensor++) {
int sensorReading =analogRead(thisSensor);
if (sensorReading > QHM) {
tone(8, notes[thisSensor], 20);
}}}
Kodların izahı:
#include"pitches.h"
Tezlik notlarından ibarət olan kitabxananın adıdır. Arduino IDE daxilində bu kitabxana
mövcud olduğundan, əlavə olaraq kitabxana kodu yazmağa ehtiyac yoxdur. Kitabxana aşağıdakı
kodlardan hazırlanıbdır:
#define NOTE_B0 31
#define NOTE_C1 33
#define NOTE_CS1 35
#define NOTE_D1 37
#define NOTE_DS1 39
#define NOTE_E1 41
#define NOTE_F1 44
#define NOTE_FS1 46
#define NOTE_G1 49
#define NOTE_GS1 52
#define NOTE_A1 55
#define NOTE_AS1 58
#define NOTE_B1 62
#define NOTE_C2 65
#define NOTE_CS2 69
#define NOTE_D2 73
#define NOTE_DS2 78
#define NOTE_E2 82
#define NOTE_F2 87
#define NOTE_FS2 93
#define NOTE_G2 98
#define NOTE_GS2 104
#define NOTE_A2 110
#define NOTE_AS2 117
#define NOTE_B2 123
#define NOTE_C3 131
#define NOTE_CS3 139
#define NOTE_D3 147
#define NOTE_DS3 156
#define NOTE_E3 165
#define NOTE_F3 175
#define NOTE_FS3 185
#define NOTE_G3 196
#define NOTE_GS3 208
#define NOTE_A3 220
#define NOTE_AS3 233
#define NOTE_B3 247
#define NOTE_C4 262
#define NOTE_CS4 277
#define NOTE_D4 294
#define NOTE_DS4 311
#define NOTE_E4 330
#define NOTE_F4 349
#define NOTE_FS4 370
#define NOTE_G4 392
#define NOTE_GS4 415
#define NOTE_A4 440
#define NOTE_AS4 466
#define NOTE_B4 494
#define NOTE_C5 523
#define NOTE_CS5 554
#define NOTE_D5 587
#define NOTE_DS5 622
#define NOTE_E5 659
#define NOTE_F5 698
#define NOTE_FS5 740
#define NOTE_G5 784
#define NOTE_GS5 831
#define NOTE_A5 880
#define NOTE_AS5 932
#define NOTE_B5 988
#define NOTE_C6 1047
#define NOTE_CS6 1109
#define NOTE_D6 1175
#define NOTE_DS6 1245
#define NOTE_E6 1319
#define NOTE_F6 1397
#define NOTE_FS6 1480
#define NOTE_G6 1568
#define NOTE_GS6 1661
#define NOTE_A6 1760
#define NOTE_AS6 1865
#define NOTE_B6 1976
#define NOTE_C7 2093
#define NOTE_CS7 2217
#define NOTE_D7 2349
#define NOTE_DS7 2489
#define NOTE_E7 2637
#define NOTE_F7 2794
#define NOTE_FS7 2960
#define NOTE_G7 3136
#define NOTE_GS7 3322
#define NOTE_A7 3520
#define NOTE_AS7 3729
#define NOTE_B7 3951
#define NOTE_C8 4186
#define NOTE_CS8 4435
#define NOTE_D8 4699
#define NOTE_DS8 4978
Burada NOTE qarşısında yazılmış B0, C1, CS1 və.s adları, notlara verilmiş adlardır, bu
adların qarşısında olan 31, 33, 35 və.s rəqəmlər isə bu notların tezlikləridir. Hansılar ki, tone()
funksiyası ilə bunlara müraciət etmiş olarıq.
constint QHM = 10;
QHM-ə verilən dəyər
int notes[] = {
NOTE_A4, NOTE_B4, NOTE_C3
};
Basılan üç QHM-ə uyğun olan fərqli tezlikdə notları massiv içərisində mənimsətdik. Biz
yuxarıda #define ilə verilənlərdən istəlinlən notu burada qeyd edə bilərik, hər notun öz tezliyi ,
hər tezliyin öz səsi vardır.
for (int thisSensor = 0; thisSensor < 3; thisSensor++) {
for dövr etməsi daxilində, hər bir QHM sensora uyğun mənimsədilmə, 3 ədəd sensor üçün
int sensorReading =analogRead(thisSensor);
Düyməyə və ya sensora basılan dəyərlər analogRead tərəfindən oxunsun və sensorReading
dəyişəninə mənimsədilsin.
if (sensorReading > QHM) {
Əgər sensora basdığımız dəyər, QHM -ə verdiyimiz dəyərdən böyükdürsə. Bu dəyər bizim
sensora nə qədər möhkəm basdığımızdan asılıdır.
tone(8, notes[thisSensor], 20);
tone funksiyası 8 ci pinə qoşulan səs ucaldıcıya 20 millisaniyə müddətində basılan düyməyə
uyğn olan notların səsini göndərmiş olacaqdır.
11.11. Melodiyanın çalınması
Sxem:
Şəkil 11.11
Sxemdə istifadə edilən elementlər:
1. Buzzer
Kodlar:
#include"pitches.h"
int melody[] = {
NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_C4
};
int noteDurations[] = {
4, 8, 8, 4, 4, 4, 4, 4
};
voidsetup() {
for (int thisNote = 0; thisNote < 8; thisNote++) {
int noteDuration = 1000 / noteDurations[thisNote];
tone(8, melody[thisNote], noteDuration);
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
noTone(8);
}}
voidloop() {
// melodiyanın təkrar olunmasını istəsək bura yazın
}
Kodların izahı:
#include"pitches.h"
Notlardan ibarət olan hazır kitabxanadır, bu kitabxana kodları 11.20-ci mövzuda verilmişdir.
int melody[] = {
NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_C4
};
Kitabxana daxilində yerləşən kodların 8 notu(istəyə bağlı olaraq) melody massiv dəyişəninə
mənimsədildi
int noteDurations[] = {
4, 8, 8, 4, 4, 4, 4, 4
};
Bu səkkiz notun ardıcıl olaraq çalınma müddətləri noteDuration massivinə mənimsədildi.
for (int thisNote = 0; thisNote < 8; thisNote++) {
Bu 8 notların ardıcıl olaraq çalınmaları for dövretməsində qey olundu
int noteDuration = 1000 / noteDurations[thisNote];
Notların çalınma müddətini bir daha biz istədiyimiz zamana görə hesablasın, məsələn 1000:4,
1000:8 və.s
tone(8, melody[thisNote], noteDuration);
tone funksiyasında 8 ci pində, melodiyaların, qeyd olunmuş zaman müddətində çalınması
qeyd olundu
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
Hesablanmış zamanı 1.30-a vuraraq, hər not arasındakı gecikmə hesablandı
11.12. Bir neçə buzzerdə melodiya çalınması
Sxem:
Şəkil 11.12.1
Sxemdə istifadə edilən elementlər:
1. 3 ədəd buzzer
Kodlar:
voidsetup() {
}
voidloop() {
noTone(8);
tone(6, 440, 200);
delay(200);
noTone(6);
tone(7, 494, 500);
delay(500);
noTone(7);
tone(8, 523, 300);
delay(300);
}
Kodların izahı:
noTone(8);
8 ci pin sönsün
tone(6, 440, 200);
6 cı pin 440Hers tezliklə, 200millinasiyə müddətində çalsın
delay(200);
200 millisaniyə gözləsin
noTone(6);
6 cı pin sönsün və ya dayansın
tone(7, 494, 500);
7 si pin, 494 hers tezlikdə, 500 millisaniyə çalsın
delay(500);
500 millisaniyə gözləsin
noTone(7);
7 ci pin dayansın
tone(8, 523, 300);
8 ci pin, 523 tezliklə, 300 millisaniyə müddətində çalsın
11.13. map() riyazi funksiyası, LDR(fotorezistor). Arduino tone() ilə analoq girişin
izlənilməsi.
Bu dərsimizdə, LDR fotorezistoru istifadə edərək, analog girişdə olan dəyişmələri, tone
funksiyası ilə izləmiş olacağıq, yəni bu dəyişmələr buzzerdən hiss oluncaqdır. Əvvəlcə, bu
dövrənin kodlanmasında istifadə edilən , map() riyazi operatorunu öyrənək.
map(); riyazi funksiyası.
Bu funksiya, tam ədədlər aralığını bir başqa tam ədədlər aralığına çevirmək üçün istifadə
edilir. Nümunə göstərmiş olsaq, arduinoda analog pindən olan 0-1023 dəyərini, map funksiyası
ilə istənilən aralığa çevirə bilərik, məsələn 0- 512 dəyərinə.
int netice = map(oxunan deyer, a, a1, b, b1 );
oxunan dəyər- analogRead funksiyasının oxuduğu dəyər, dəyişənə mənimsədilmiş dəyər
a- oxunan dəyərin ən kiçik qiyməti
a1- oxunan dəyərin ən böyük qiyməti
b- çevirmək istədiyimiz dəyərin ən kiçik dəyəri
b1- çevimək istədiyimiz ən böyük dəyər
LDR. Açılışı Light Dependent Resistor(iqdan asılı müqavimət) olan LDR, bir foto
müqavimətdir. Foto müqavimətlər, işıq şiddətinə bağlı olaraq müqavimətini dəyişən elektron bir
komponentdir. LDR işıq fotonlarını qəbul edə biləcək yarımkeçirici material olan "kadmium
sulfid" (CdS) dən emal edilmişdir. LDR-in üst səthi gələn fotonları görməsi və ya qəbul edə
bilməsi üçün şəffaf bir material ilə örtülmüşdür.
Şəkil 11.13.1
LDR üzərinə işıq fotonları düşəndə kadmium sulfid də olan sərbəst elektronlar yer dəyişdirir.
LDR üzərinə düşən foton sayı artdıqca yer dəyişdirən elektron sayı da artacaqdır. Elektronların
yer dəyişdirməsi nəticəsində LDR nin müqavimətinin dəyişməsinə səbəb olur. Bu dəyişikliyi
Arduino da analoq dəyəri oxuyaraq görə bilərsiz. LDR də işıqlı mühitdə müqavimət
minimumdur. Eyni şəkildə, qaranlıq bir mühitdə maksimumdur deyə bilərik. LDR-lər həm
dəyişən cərəyan, həm də sabit cərəyanda eyni iş prinsipi ilə çalışırlar dolayısı ilə həm dəyişən
həm də sabit cərəyanda istifadə edilə bilərlər. LDR-lər ən çox yaşıl işığa həssasdırlar. LDR -dəki
elementlərin işığa həssaslığı işığı qəbul edən səthin böyüklüyü və üzərində yer alan linzaya görə
dəyişiklik göstərir. Bəbək tipi linza istifadə edilən ldrlerde həssaslıq daha yüksək olur. Quruluşu
etibarilə LDR-lər yüksək temperatura tab gətirməzlər və sıradan çıxarlar. Maksimum çalışma
temperaturu 60 °c dir. LDR model nömrələri bu şəkildədir: BRY33, LDR03, LDR05, LDR07,
OPR60. Çox qaranlıq mühitdə ldr müqaviməti 1MOm-dur (1 milyon Om).. Üzərinə işıq düşəndə
müqaviməti bir neçə KOm-a qədər düşür. (1kilo Om 1000 Om)
Sxem:
.
Şəkil 11.13.2
Sxemdə istifadə edilən elementlər:
1. Fotorezistor(LDR)
2. Rezistor 100 Om və 4,7KOm
3. Buzzer
Kodlar:
voidsetup() {
Serial.begin(9600);
}
voidloop() {
int sensoroxudugu =analogRead(A0);
Serial.println(sensoroxudugu);
int netice =map(sensoroxudugu, 400, 1000, 120, 1500);
tone(9, netice, 10);
delay(1);
}
Kodların izahı:
voidsetup() {
Serial.begin(9600);
}
void setup quraşdırma sketçində yalnız ardıcıl monitorda saniyədə 9600 bit göndərişi qeyd
edilir
voidloop() {
int sensoroxudugu =analogRead(A0);
analogRead funksiyasının A0 pinindən oxuduğu dəyəri, sensoroxudugu dəyişəninə
mənimsədildi
Serial.println(sensoroxudugu);
A0 pinindən oxunan dəyər ardıcıl monitorda göstərilsin
int netice =map(sensoroxudugu, 400, 1000, 120, 1500);
A0 pinindən oxunan dəyər, map riyazi funksiyası ilə 120-1500 aralığına çevrilsin və netice
dəyişəninə mənimsədilsin
tone(9, netice, 10);
tone funksiyasında, 9 cu pindən çıxış alınacaq buzzerə veriləcək, netice dəyişənində olan
dəyərlərə uyğun olaraq tezliyi qeyd edilir, tezliyin müddəti 10 millisaniyə olsun
delay(1);
Kodların void loop sketçinin içərisində 1 millisaniyə ilə oxunub dövr etməsi zamanı
11.14. Analoq giriş/çıxış ardıcıl monitor
Bu dərsimizdə, anog giriş pinini necə oxuyacağımızı, alınan nəticəni map() operatporu ilə 0-
255 aralığına bərabərləşdirdiyimizi, LED-in parlaqlığının artırıb azaltması üçün, PWM -i
tənizmləməyimizi və nəticəni ardıcıl monitorda göstərilməsini öyrənərik.
Sxem:
Şəkil 11.14.1.
Sxemdə istifadə edilən elementlər:
1. Potensiometr
2. LED
3. 220 Om rezistor
4. Multimetr(praktik test məqsədli)
Kodlar:
constint analogGirisPin = A0;
constint analogCixisPin = 9;
voidsetup() {
Serial.begin(9600);
}
voidloop() {
int girisDeyer =analogRead(analogGirisPin);
int cixisDeyer =map(girisDeyer, 0, 1023, 0, 255);
analogWrite( analogCixisPin, cixisDeyer);
Serial.print("pot = ");
Serial.print(girisDeyer);
Serial.print("t potCevrilmis = ");
Serial.println(cixisDeyer);
delay(2);
}
Kodların izahı:
constint analogGirisPin = A0;
analog girişin A0 pini olduğu və analogGirispin dəyişəninə mənimsədilməsi, potensiomentin
orta elektrodu A0 pininə bağlanır
constint analogCixisPin = 9;
analog çıxışın 9 cu rəqəmsal pini olduğu və analoqcixis pininə mənimsədilməsi, LED-in
anodu və voltmetin + qütbü 9 cu pinə bağlanır
voidsetup() {
Serial.begin(9600);
}
ardıcıl monitorun 9600 bit/saniyəyə ayarlanması
int girisDeyer =analogRead(analogGirisPin);
analogRead funksiyası ilə A0 analoq girişdən oxunan dəyərin, girisDeyer dəyişəninə
mənimsədilməsi
int cixisDeyer =map(girisDeyer, 0, 1023, 0, 255);
A0 -dan oxunan 0 - 1023 arası dəyərin, map() ilə 0-255 arasındakı dəyərə mütənasib olaraq
çevrilməsi, və bu dəyərin cixisDeyer dəyişəninə mənimsədilməsi.
analogWrite( analogCixisPin, cixisDeyer);
analogWrite funksiyası ilə, 9 cu rəqəmsal pinə, map() ilə alınan dəyər aralığının PWM
formasında verilməsi, bu dəyər aralığı dute cycle adlanır.
Serial.print("pot = ");
Serial.print(girisDeyer);
Potensiometri çevirdiyimizdə dəyərin birbaşa ardıcıl monitorda göstərilməsi
Serial.print("t potCevrilmis = ");
Serial.println(cixisDeyer);
Potensiometrin dəyər aralğını map() ilə çevirdikən sonra monitorda göstərilməsi, t - burada
pot dəyər ilə potCevrilmis deyer yazılarını bir-birindən uzaq məsafədə yazılması üçün nəzərdə
tutulubdur, println isə növbəti yazını bir sətr altda göstərilməsi üçün nəzərdə tutulmuşdur.
11.15. LED-in yanıb-sönmə zamanının idarə edilməsi, Analoq giriş.
Bu dərsimizdə, giriş analoq dəyəyərə(müqavimətə) bağlı olaraq, çıxış rəqəmsal pinimizin
delay zamanını necə idarə edəcəyimizi öyrənərik. Analoq giriş olaraq dövrədə istəyə bağlı
olaraq, LDR-fotorezistor, və ya Potensiometr ikisindən birini istifadə edə bilərsiz.
Sxem:
Sxemdə istifadə edilən elementlər:
1. LED
2. 220 Om müqavimət
3. Potensiometr
Kodlar:
int potensiometr = A0;
int ledPin = 13;
voidsetup() {
pinMode(ledPin,OUTPUT);
}
voidloop() {
int zaman =analogRead(potensiometr);
digitalWrite(ledPin,HIGH);
delay(zaman);
digitalWrite(ledPin,LOW);
delay(zaman);
}
Kodların izahı:
int potensiometr = A0;
A0 analoq pininə potensiometrin orta ayağı bağlanması, və bu pindən analoq dəyərin
oxunması, potensiometr dəyişəninə mənimsədilməsi
int ledPin = 13;
13 cü pin çıxış rəqəmsal pinimizdir, bu pinə LED bağlanacaqdır. ledPin dəyişəninə
mənimsədilməsi
voidsetup() {
pinMode(ledPin,OUTPUT);
}
13 cü pinimiz çıxışdır
int zaman =analogRead(potensiometr);
analogRead funksiyamız A0 dəyərini oxuyacaqdır, oxunan dəyər zaman dəyişəninə
mənimsədiləcəkdir
digitalWrite(ledPin,HIGH);
digitalWrite funksiyası 13-cü pinimzi hıgh(məntiqi 1 və ya 5V) eləsin. LED yanacaq
delay(zaman);
delay() gecikmə funksiyası zaman dəyişəninin dəyərinə uyğun olaraq gözləmə verəcək
digitalWrite(ledPin,LOW);
Gözləmədən sonra, 13 cü pini LOW(məntiqi 0 və ya 0V ) edəcəkdir. LED sönmüş olacaq
delay(zaman);
Yenidən zaman dəyişəninin dəyərinə uyğun olaraq gözləmə və ya gecikmə olacaq. Bu zaman
potensiometrin vəziyyətinə, doğru demiş olsaq müqavimətinə bağlıdır.
Bu qaydada void loop-da dövr etmə gedəcəkdir.
11.16. LED-lərin parlaqlıqları artıb-azalaraq növbəli şəkildə yanıb-sönməsi
Bu dərsimizdə, LED-in yanıb sönməsilə birgə, onların parlaqlıqlarını eyni dövrədə tətbiq edib
öyrənərik. Dövrədə 12 ədəd LED növbəli şəkildə parlaqlığı artıb-azalaraq yanıb sönmüş
olacaqdır.
Sxem:
Şəkil 11.16.1
Sxemdə istifadə olunan elementlər:
1. 12 ədəd LED
2. 12 ədəd 220 Om rezistor
Kodlar:
constint ikincipin = 2;
constint onucuncupin = 13;
voidsetup() {
for (int i = ikincipin; i <= onucuncupin; i++) {
pinMode(i,OUTPUT);
}}
voidloop() {
for (int i = ikincipin; i <= onucuncupin; i++) {
for (int parlaqliq = 0; parlaqliq < 255; parlaqliq++) {
analogWrite(i, parlaqliq);
delay(2);
}
for (int parlaqliq = 255; parlaqliq >= 0; parlaqliq--) {
analogWrite(i, parlaqliq);
delay(2);
}
delay(100);
}}
Kodların izahı:
constint ikincipin = 2;
constint onucuncupin = 13;
Arduino kartının 2 ci və 13 rəqəmsal pinlərinin mənimsədilməsi
voidsetup() {
for (int i = ikincipin; i <= onucuncupin; i++) {
pinMode(i,OUTPUT);
}}
setutp-quraşdırma hissəsində, for dövr etməsi daxilində ikinci pini hər hansı bir i dəyişəninə
mənimsədilməsi, i dəyişənimiz 13cü pinə kiçik bərabər götürülür, bu o deməkdir ik i(və ya ikici
pin) 13 cü pin arasında 12 ədəd pin var, daha sonra i++ yazırıq bunun mənası 2ci pindən 13 cu
pinə qədər , 13 cu pin daxil olmaqla artan istiqamətə getsin, və for daxilində pinMode funksiyası
ilə pinlərin çıxış olduğunu qeyd elədik.
voidloop() {
for (int i = ikincipin; i <= onucuncupin; i++) {
Bu prosesin dövr etməsi üçün, loop daxilindədə eyni şeyi qey edirik
for (int parlaqliq = 0; parlaqliq < 255; parlaqliq++) {
for dövr etməsi daxilinə, led-in pwm şəkildə, yəni artan istiqamətdə parlamasını qeyd edirik,
parlaqliq++ , 0-dan 255-ə qədər dytu cucle-imizin artmış olduğunu qeyd elədik.
analogWrite(i, parlaqliq);
analogWrite analoq funksiyası daxilinə i dəyişənimizin yəni, 2 ci pindən 13 cü pinə qədər
bağlanan LED-lərin artan istiqamətdə, 0-255 aralığında pilləvari parlaqlığını artan istiqamətdə
qeyd elədik.
delay(2);
2 milli saniyə gözlənilsin
for (int parlaqliq = 255; parlaqliq >= 0; parlaqliq--) {
analogWrite(i, parlaqliq);
delay(2);
Bu səfər, azalan istiqamətdə kodları yazırıq, 255 - 0 aralığında azalma baş verəcək, LED-in
parlaqlığı azalmağa başlayacaqdır.
delay(100);
2 ci pindən 13 cü pinə kimi led-lərin parlaqlığı artıb azalaraq növbəli şəkildə artan istiqatdə
yanıb söndükdən sonra, 100 mS sonra yenidən, bu prosesin təkrarlanması müddəti.
Kodlanmada əsas fikir verilən məsələlər, for dövretmə funksiyasının daxilində yenidən for
dövretməsi açılıbdır.
Bu kodu daha da təkmilləşdirərək, LED-lərin sağa və sola hərəkət edərək, parlaqlıqlarını
artırıb-azaldaraq yazmaq olar.
Kodlar:
constint ikincipin = 2;
constint onucuncupin = 13;
voidsetup() {
for (int i = ikincipin; i <= onucuncupin; i++) {
pinMode(i,OUTPUT);
}}
voidloop() {
for (int i = ikincipin; i <= onucuncupin; i++) {
for (int parlaqliq = 0; parlaqliq < 255; parlaqliq++) {
analogWrite(i, parlaqliq);
delay(2);
}
for (int parlaqliq = 255; parlaqliq >= 0; parlaqliq--) {
analogWrite(i, parlaqliq);
delay(2);
}
delay(200);
}
for (int i = onucuncupin; i >= ikincipin; i--) {
for (int parlaqliq = 0; parlaqliq < 255; parlaqliq++) {
analogWrite(i, parlaqliq);
delay(2);
}
for (int parlaqliq = 255; parlaqliq >= 0; parlaqliq--) {
analogWrite(i, parlaqliq);
delay(2);
}
delay(200);
}}
Kodların izahı:
Gördüyünz kimi, kodlar eyni şəkildə yazılıbdır,
lakin
for (int i = onucuncupin; i >= ikincipin; i--) {
for dövretməsi daxilində LED-in yanıb-sönməsini geriyə azalan istiqamətdə yanıb sönməsi
qeyd edilmişdir.
11.17. while(), constrain(). Analog qiymətin kalibrasiya olunması.
while() dövretməsi. Bir otaqda 100 ədəd qutu olduğunu və bu qutuladan neçəsinin boş,
neçəsinin dolu olduğunu öyrənmək istədiyimizi fərz edək. Bunun üçün qutuları bir-bir açıb
qutuların dolu olub-olmadığına baxmalıyıq. Buna oxşar əməliyyatları proqramlaşdırmada da
yerinə yetirərkən eyni üsuldan istifadə etməliyik. Yazacağımız xəyali proqram qutuları bir-bir
açıb hansının dolu, hansının boş olmasını yoxlamalıdır. 100 dəfə qutuları yoxlamaq isə bir xeyli
vaxtımızı alacaq. Proqramlaşdırmada sırf bu cür ardıcıl əməliyyatları qısa şəkildə yerinə
yetirmək üçün, eyni bir əməliyyatı bir neçə dəfə təkrarlamaq üçün bir sıra operatorlar
mövcuddur. Bu operatorlardan biri də while operatorudur. Bu operator, bir şərt ödəndiyi
müddətcə bir əməliyyatı yerinə yetirmək üçündür. Operatorun istifadə qaydası if operatoruna
oxşardır. Əvvəlcə operatorun adı yazılır, sonra mötərizə daxilində şərt, sonra isə fiqurlu
mötərizələr arasında əməliyyatlar yazılır. Nümunə bir proqramda bu operatordan istifadə edək.
Sintaks şəkli aşağıdakı kimidir:
while(şərt) {
şərt ödənilsə, bura yazılan kodlar işləsin.
}
int i=0;
while(i<10){
Serial.println("While");
}
Proqramı işlətdikdən sonra, alt-alta daima «While» sözünün çap olunduğunu görəcəyik.
Çünki, operatorda şərt olaraq i dəyişəninin 10-dan kiçik olduğu halları yazmışıq. Bu dəyişən isə
0-a bərabərdir və həmişə 10-dan kiçikdir. Buna görə də operatorun daxilindəki əməliyyatlar
həmişə, sonsuzluğa qədər işləməyə davam edəcək, yəni, ardıcıl monitorda sonsuz sayda alt-alta
«While» yazısı çap olunacaq. «While» operatorunda ilk olaraq yazdığımız şərt yoxlanılır. Burada
yazdığımız şərt i dəyişəninin 10-dan kiçik olmasıdır. Şərt ödəndiyi üçün ilk olaraq əməliyyatlar
yerinə yetirilir. Əməliyyatlar bir dəfə yerinə yetirildikdən sonra, operator yenidən əvvələ
qayıdaraq şərti bir daha yoxlayır. Şərt doğru olarsa yenidən əməliyyatlar aparılır. Bu proses
daimi olaraq davam edir. Yuxarıdakı nümunədə də şərt həmişə ödənəcəyinə görə, əməliyyatlar
həmişə yerinə yetirilir.
İndi isə əməliyyatları sonsuz sayda yox, 5 dəfə yerinə yetirməyə çalışaq. Bunun üçün
yuxarıdakı kodda kiçik bir dəyişiklik edəcəyik.
int i=0;
while(i<5){
Serial.println("While");
i++;
}
Burada ilk olaraq i dəyişəninin qiyməti 0-dır. İlk şərtdə dəyişənin qiymətinin 5-dən kiçik
olub-olmaması yoxlanılır. Həqiqətən də 0 rəqəmi 5-dən kiçikdir. Şərt ödəndiyinə görə
əməliyyatlar yerinə yetirilməyə başlanır. İlk əməliyyatımız sözün çap olunmasıdır. Sonrakı
əməliyyatımız isə dəyişənin qiymətinin 1 vahid artmasıdır. İlk dövrün sonunda dəyişənin qiyməti
1 vahid artaraq 1 olur.
Artıq əməliyyatlar 5 dəfə yerinə yetirilib və i dəyişəninin qiyməti 5-ə bərabər olub. 5-ci dəfə
əməliyyatlar yerinə yetirildikdən sonra, operator yeindən əvvələ qayıdaraq i dəyişəninin
qiymətinin 5-dən kiçik olub olmadığını yoxlayır. Bu dəfə i dəyişəninin qiyməti 5-dir və 5-dən
kiçik deyil, 4 olsa idi doğru olacaqdı. Beləliklə şərt ödənmir, şərt ödənmədiyinə görə, görə
operator bu dəfə əməliyyatları yerinə yetirmir və operatorun işi sona çatmış olur. Bundan sonra
artıq operatordan sonrakı əməliyyatlar yerinə yetirilməyə başlayır.
while dövretməsini, bir dəfə çalışdırmaq istədiyimiz programlar içərisinə qoyaraq, sonsuz
dövretmə yara bilər və programın istənilən nöqtəsində Arduinonu bloklaya bilər.
while(true);
və ya
while(1);
ifadələrinin olduğu sətirdə sonsuz dövretməyə daxil olunur və program o nöqtədə bloklanır və
while daxilində dövr etmə dayanmış olur, başa qayıtmır. Bunu aşağıdakı kod nümunəsində
göstərə bilərik:
voidsetup() {
Serial.begin(9600);
}
voidloop() {
int a = 0;
while (a < 10){
a = a+1 ;
Serial.println(a);
delay(200);
}
Serial.println("donguden cıkıldı");
while(1);
}
constrain(x, a, b) riyazi funksiya. Verilən parametrlərə görə x dəyərinin a ilə b dəyərləri
arasında olub olmadığını yoxlayır. Əgər x-in dəyəri a və b aralıqındadırsa, funksiya x dəyərini
çevirir. a-dan kiçikdirsə, x-i a-ya çevirir, b-dən böyükdürsə b-yə çevirir. Sintaksis şəkli aşağıdakı
kimidir:
constrain(x, a, b);
Analoq qiymətin kalibrasiya olunması.
Bu dərsimizdə, analoq dəyəri müəyyən müddət ərzində, müəyyən dəyərə kalibrasiya edərək,
rəqəmsal pindən alınan PWM dəyərini tənzimləməyi öyrənərik. Analoq giriş üçün həm LDR
həm də potensiometr istifadə etmək olar, biz potensiometr istifadə edərik.
Sxem:
Şəkil 11.17.1.
Sxemdə istifadə olunan elementlər:
1. 250 KOm potensiometr
2. 220 Om rezistor
3. LED
Kodlar:
constint potpin = A0;
constint ledPin = 9;
int potdanoxunan;
int potMin = 0;
int potMax = 1023;
voidsetup() {
pinMode(13,OUTPUT);
digitalWrite(13,HIGH);
while (millis() < 5000) {
potdanoxunan =analogRead(potpin);
if (potdanoxunan > potMax) {
potMax = potdanoxunan;
}
if (potdanoxunan < potpin) {
potMin = potdanoxunan;
}}
digitalWrite(13,LOW);
}
voidloop() {
int potdanoxunan =analogRead(potpin);
potdanoxunan =map(potdanoxunan, potMin, potMax, 0, 255);
potdanoxunan =constrain(potdanoxunan, 0, 255);
analogWrite(ledPin, potdanoxunan);
}
Kodların izahı:
constint potpin = A0;
constint ledPin = 9;
A0 analoq pinini potpin(potensiometrin pini) sabit dəyişəninə mənimsədilməsi, 9 cu rəqəmsal
pinin ledpin sabit dəyişəninə mənimsədilməsi.
int potdanoxunan;
Potensiometrdən oxunan adlı dəyişənin mənimsədilmsəi
int potMin = 0;
int potMax = 1023;
Potensiometrin minimum və maksimum dəyişənlərinə minimum və maksimum dəyərlərin
mənimsədilməsi
voidsetup() {
pinMode(13,OUTPUT);
13-cü pinin çıxış olunmasını qeyd etdik.
digitalWrite(13, HIGH);
13 cu pin HIGH yəni məntiqi 1 olsun və ya 13 cü çıxış pinimiz 5V versin.
while (millis() < 5000) {
while dövretməsinə millis() funksiyası ilə arduinoya start veriləndən sonra, kodların
oxunmasından 5 saniyə sonra şərtinin ödənilməsini qeyd elədik. millis(), delay gecikmə
funksiyasından fərqli olaraq, həmdə kodların oxunma zamanını qeyd edir. Yəni 5 saniyə ərzində
kalibrasiya etməlidir.
potdanoxunan =analogRead(potpin);
Potensiometrdən oxunan dəyər potdanoxunan dəyişəninə mənimsədildi
if (potdanoxunan > potMax) {
Əgər potdan oxunan dəyər, pot max=1023- dən böyükdürsə, maksimum dəyərin kalibrasiyaya
alınması
potMax = potdanoxunan;
potesiometrdən oxunan dəyər, potensiometrin maksimum dəyəri olsun.
if (potdanoxunan < potpin) {
potMin = potdanoxunan;
Əgər, oxunan dəyər potpin dəyərindən kiçikdirsə, minimum dəyərin kalibrasiyası,
potensiometrdən oxunan dəyər potensiometrin minimum dəyəri olsun.
digitalWrite(13,LOW);
Kalibrasiya sona çatdıqdan sonra, 13 cü pindən gərginlik kəsilsin, və ya məntiqi 0 olsun.
voidloop() {
int potdanoxunan =analogRead(potpin);
potdanoxunan =map(potdanoxunan, potMin, potMax, 0, 255);
Analoq Read funksiyasının potensiometrdən oxunan dəyəri, potdan oxunan dəyişəninə
mənimsədilsin, daha sonra bu dəyərin map() funksiyası ilə minimum maksimum dəyərləri
arasında 0-255 aralıqlı dəyərə çevrilməsini qeyd elədik
potdanoxunan =constrain(potdanoxunan, 0, 255);
map ilə çevirdiyimiz 0 - 255 aralıqlı dəyəri yenidən constrain funksiyası ilə məhdudlaşmış
şəkilə salırıq. Yəni, map ilə çevrilmiş potdan oxunan dəyər 0-255 aralğından kənardırsa 0-255
aralığına çevrilməsi baş versin.
analogWrite(ledPin, potdanoxunan);
Analoq write funksiyası məhz constrain funksiyasının aldığı dəyərə uyğun olaraq 9-cu
rəqəmsal pinə bağlanan LED-ə PWM vermiş olacaqdır.

More Related Content

What's hot

Misra C Software Development Standard
Misra C Software Development StandardMisra C Software Development Standard
Misra C Software Development StandardVittorio Giovara
 
BLOQUEIO DE FONTES DE ENERGIAS PERIGOSAS.pdf
BLOQUEIO DE FONTES DE ENERGIAS PERIGOSAS.pdfBLOQUEIO DE FONTES DE ENERGIAS PERIGOSAS.pdf
BLOQUEIO DE FONTES DE ENERGIAS PERIGOSAS.pdfCAROLINA LIMA
 
Siber Güvenlik ve Etik Hacking Sunu - 5
Siber Güvenlik ve Etik Hacking Sunu - 5Siber Güvenlik ve Etik Hacking Sunu - 5
Siber Güvenlik ve Etik Hacking Sunu - 5Murat KARA
 
Automata do Brasil - Adequação NR.12 (Máquinas injetoras)
Automata do Brasil - Adequação NR.12 (Máquinas injetoras)Automata do Brasil - Adequação NR.12 (Máquinas injetoras)
Automata do Brasil - Adequação NR.12 (Máquinas injetoras)Eduardo Marcelo Borges
 
COLREGS 1972 (Understandable Version)
COLREGS 1972 (Understandable Version) COLREGS 1972 (Understandable Version)
COLREGS 1972 (Understandable Version) Gian Gabriel Ibo
 
Lidar : light detection and rangeing
Lidar : light detection and rangeingLidar : light detection and rangeing
Lidar : light detection and rangeingRahul Bhagore
 
Radar and it's applications
Radar and it's applicationsRadar and it's applications
Radar and it's applicationsDudekula Jamal
 
Osc4.x installation v1-upload
Osc4.x installation v1-uploadOsc4.x installation v1-upload
Osc4.x installation v1-uploadDong-Hwa jung
 
6 draft survey
6 draft survey6 draft survey
6 draft surveyanittepe1
 
Dpdk: rte_security: An update and introducing PDCP
Dpdk: rte_security: An update and introducing PDCPDpdk: rte_security: An update and introducing PDCP
Dpdk: rte_security: An update and introducing PDCPHemant Agrawal
 

What's hot (15)

Radar History final
Radar History finalRadar History final
Radar History final
 
Misra C Software Development Standard
Misra C Software Development StandardMisra C Software Development Standard
Misra C Software Development Standard
 
BLOQUEIO DE FONTES DE ENERGIAS PERIGOSAS.pdf
BLOQUEIO DE FONTES DE ENERGIAS PERIGOSAS.pdfBLOQUEIO DE FONTES DE ENERGIAS PERIGOSAS.pdf
BLOQUEIO DE FONTES DE ENERGIAS PERIGOSAS.pdf
 
Siber Güvenlik ve Etik Hacking Sunu - 5
Siber Güvenlik ve Etik Hacking Sunu - 5Siber Güvenlik ve Etik Hacking Sunu - 5
Siber Güvenlik ve Etik Hacking Sunu - 5
 
Automata do Brasil - Adequação NR.12 (Máquinas injetoras)
Automata do Brasil - Adequação NR.12 (Máquinas injetoras)Automata do Brasil - Adequação NR.12 (Máquinas injetoras)
Automata do Brasil - Adequação NR.12 (Máquinas injetoras)
 
COLREGS 1972 (Understandable Version)
COLREGS 1972 (Understandable Version) COLREGS 1972 (Understandable Version)
COLREGS 1972 (Understandable Version)
 
Marine radar
Marine  radarMarine  radar
Marine radar
 
Lidar : light detection and rangeing
Lidar : light detection and rangeingLidar : light detection and rangeing
Lidar : light detection and rangeing
 
COLREG 1972, A Presentation
COLREG 1972, A PresentationCOLREG 1972, A Presentation
COLREG 1972, A Presentation
 
1. radar
1. radar1. radar
1. radar
 
11 sart
11   sart11   sart
11 sart
 
Radar and it's applications
Radar and it's applicationsRadar and it's applications
Radar and it's applications
 
Osc4.x installation v1-upload
Osc4.x installation v1-uploadOsc4.x installation v1-upload
Osc4.x installation v1-upload
 
6 draft survey
6 draft survey6 draft survey
6 draft survey
 
Dpdk: rte_security: An update and introducing PDCP
Dpdk: rte_security: An update and introducing PDCPDpdk: rte_security: An update and introducing PDCP
Dpdk: rte_security: An update and introducing PDCP
 

ARDUİNO KODLAMA S.Məcidov.pdf

  • 2. 11.1. void setup() və void loop() Şəkil 9.1 dəki şəkildə bunları görə bilərsiz. void setup() və void loop() -ə keçməzdən əvvəl sketchdə olan bəzi işarələrin izahını verək. 1. /* */ sintaksisi- Bu işarələr, məsələn yaratdığınız arduino proyekt kodlarının və cihazınızın haqqında bəzi izahları bu işarənin içinə ata bilərsiz. Buna açıqlama sətiri deyirlər. /* ilə başlayıb, */ ilə bağlanır. Bu işarələrin içində yazılmız izahlar və ya cümlələr kod tərəfindən nəzərə alınmır, yəni Arduino onu kod kimi tanımaz. Məsələn, /* Arduino Uno kartı əvəz edilməzdir. */ 2. // sintaksisi - Bu işarə isə, yazdığının hər hansı bir kodun qarşısında və ya ondan sora gələrək, həmin kodun izahını vermək üçün istifadə edilir. Yazdığınız izahın sonunda nöqtə, iki nöqtə olsasa-olmasa da bir problem olmaz. İstənilən kod qarşısında qoyularaq izah yazıla bilər, arduino bunu bir kod kimi tanımaz. Məsələn, pinMode(3; HİGH); // arduinonun 3-cü pini HİGH-dır. Şəkil 9.2 3. void setup() - Bu bir sketçdir, yəni əgər kodumuzu bu sketçin içinə yazsaq, həmin kod arduinoya enerji verildikdə, birdəfə işləyəcək, reset komandası verilməyənə kimi sabitliyini qoruyacaqdır. setup-quraşdırmaq void setup() { - Bu işarə kodların yazılması üçün açılır - Bura kodlar yazılır }- Kodlar yazıldıqdan sonra bu işarə ilə bağlanılır. digər bir variant; void setup() { kod yazılan hissə } Nəzərinizə çatdırım hər ikisi eyni şeydir. Məsələn,
  • 3. void setup() { pinMode(LED_BUILTIN, OUTPUT);// LED_BUILTIN çıxış olaraq kodlandı(bu izah verilməsədə və ya // işarəsi qoyulmasada olar) } 4. void loop() - Bu da bir proqramlama sketçidir, void setupdan fərqli olaraq, əgər kodumuzu bu sketçin içərisinə yazsaq, həmin kod arduinoya enerji verildiyində və ya arduino işlədiyi müddətdə, yazılan kod təkrar olaraq çalışacaqdır. Məsələn, içərisinə yazılan sətirlərlə kodu, hər dəfə təkrar olaraq işləyəcəkdir. Bu metodun daxilinə yazılan kodlar sonsuza qədər bir-birinin ardınca növbəli şəkildə yenidən işləyəcəkdir. loop ingilis dilindən azərbaycan dilinə dövr edən və ya sikl kimi tərcümə olunur. void loop(){ - Bu işarə kodun yazılması üçün açılır. - Bura kod yazılır } - Kodlar yazıldıqdan sonra bu işarə ilə bağlanılır. Məsələn, void loop() { digitalWrite(LED_BUILTIN, HIGH); delay(1000); digitalWrite(LED_BUILTIN, LOW); delay(1000); } İzahı: Əvvəl digitalWrite(LED_BUILTIN, HIGH); kodu oxunar, sonra delay(1000); kodu oxunar, sonra digitalWrite(LED_BUILTIN, LOW); kodu oxunar, sonra delay(1000); kodu oxunar və yenidən başa qayıdar yəni, digitalWrite(LED_BUILTIN, HIGH); koduna. Bildiyiniz kimi Arduino kartının bütün modelləri bir çox giriş çıxış pinlərinə sahibdirlər, bu giriş, çıxış pinlərini işlətmək üçün, bunları kartın başa düşdüyü dildə yəni arduino proqramı ilə idarə etmək lazımdır. Kod kartın başa düşdüyü dildir, kartın böyük proyektləri icra etməyi sizin yazdığınız kodlardan asılıdır. Gəlin keçək bu kodları bir-bir izah edək və öyrənək. 11.2. =, int, pinMode, digitalWrite, delay 1. int verilənlərin bir tam tipidir(data type). Hər hansı bir dəyişəni(x, ad, söz rəqəm olmaz) tanıtmaq üçün istifadə edilir. Dəyişən nədir? Dəyişən özündə hansısa bir məlumatı saxlayır. Həmin məlumat aydındır ki, yaddaşda (RAM - da) saxlanılır. Verilənlər tipi nədir? Verilənlər tipi isə, bir dəyişənin nə kimi məumatları özündə saxlaya biləcəyini, həmin dəyişənin yaddaşdakı nüfuzunu və həmin dəyişən üzərində hansı əməliyyatları yerinə yetirə biləcəyimizi təyin edən bir məntiqi anlayışdır. Proqramda intin yazılış qaydası: int a; yəni, <verilənlər tipi><dəyişənin adı>;
  • 4. int, 16 bit həcmi var, [-32,768 -- +32,767] parça aralığında müsbət və mənfi işarəli tam qiymət alır. Əlavə oxumaq üçün: Qlobal dəyişənlər Bütün program içərisində tanıdılanan dəyişənlərdir. Programın daha başında gəlirlər. Programınızın bütün bölmələrində bir dəyişəni istifadə etmək istəyirsizsə, birinci etməli olduğunuz iş, dəyişəni kodlarınızın ən üst hissəsində tanıdın. Beləliklə bu dəyişənə, kodunuzun hər hissəsindən çata bilərsiz. Lokal dəyişənlər. Lokal dəyişənlər, bir sinif daxilindəki hər hansısa kontekst içərisində təyin olunan və ancaq həmin kontekst (buna əhatə dairəsi də deyilir) içərisində müraciət edilə bilər dəyişənlərdir. Məsələn metodların parametrləri, metodların gövdələrində təyin olunan dəyişənlər lokal dəyişənlərdir. Bir lokal dəyişənə, bütün sinif daxilində müraciət etmək olmaz. Dəyişənin ömrü Başa düşmək lazımdır ki, bir dəyişən, təyin olunduqdan sonra, həmişə mövcud olmur. Bütün insanların ömrü olduğu kimi, dəyişənlərin də ömrü var. Dəyişənlər, təyin olunduqları kontekst və ya skop daxilində mövcuddurlar. Verilənlər tiplərinin(data types) özü 4 yerə bölünür: 1. Tam tiplər 2. Kərs tiplər 3. Simvol tiplər 4. Məntiqi tiplər 2. = mənimsətmə operatoru. Bəlkə də heç bir proqramlaşdırma dilində mənimsətmə kimi vacib bir ikinci əməliyyat yoxdur. Bir dəyişənə bir qiymətin mənimsədilməsi, ən fundamental proqramlaşdırma prosesidir. Dəyişənlərə mənimsədilən qiymət onun tipi ilə uyğun olmalıdır. Tam tipdə bir dəyişən təyin edək və ona qiymət verək: int a; a = 5; Arduinoda(C dilində) mənimsətməni, dəyişənin təyin olunma sətrində də birbaşa yerinə yetirə bilərik. Yuxarıdakı iki kod sətrini bir sətirdə belə yaza bilərik: int a = 5; Eyniylə, int a; int b; int c; a = 10; b = 15; c = 76; kodarını, aşağıdakı kimi tək bir sətirdə yaza bilərik; int a = 10, b = 15, c = 76; Gördüyünüz kimi, dəyişənlərə qiymət, təyin olunma sətrində dəyişənin adı qeyd olunduqdan sonra mənimsədildi. Bu nümunə həm də göstərir ki, eyni tipə malik bir neçə dəyişəni, bir- birindən vergüllə ayıraraq eyni bir sətirdə təyin etmək olar.
  • 5. 3. pinMode funksiyası. Arduino kartlarında olan rəqəmsal və analog pinlərin giriş və ya çıxış olaraq təyin etməyimizi təmin edər. Ədəbiyyatlarda, pinMode əsasən rəqəmsal girişlər üçün nəzərdə tutulduqlarına baxmayaraq, mən bunu analoq pinləri üçündə sınağdan keçirmişəm. Rəqəmsal olaraq giriş-çıxışdan dedikdə, 1 və 0 olan iki dəyərdən bəhs edirik. Bir pinin giriş və çıxışı üçün 1 və 0 dəyərləri pində 5V-un olum olmadığını ifadə edir. Yəni, 1 (hə, 5 V) , 0(yox, 0 V) kimi başa düşülür. pinMode-nin sintaksisi aşağıdakı kimi yazılır: pinMode(pin nömrəsi, INPUT və ya OUTPUT); pin nömrəsi- arduino kartında seçdiyimiz pin(giriş -çıxış) nömrəsi məsələn, 1, 2, 3 və.s INPUT, OUTPUT - giriş və ya çıxış- bu sintaksis ingilis dilində yazılır INPUT və OUTPUT, karta seçdiyimiz istənilən pinin giriş yada çıxış olmasını təmin edir. Məsələn; pinMode(5, INPUT); pinMode(6, OUTPUT); Digər bir variantda da yazıla bilər; pinMode(pin nömrəsi, INPUT_PULLUP); pinMode(pin nömrəsi, INPUT_PULLDOWN); Bu mövzuya keçməzdən qabağ, gəlin sizə pullup-pulldown müqavimətinin nə olduğunu izah edək. Arduino dövrələrində ən çox istifadə etdiyimiz elementlər LED-lər və düymə və ya açarlardır(button). Arduinonun çıxış pininə LED qoşduqda, çəkilən cərəyanı məhdudlaşdırmaq üçün LED-lə ardıcıl müqavimət bağlanır. Düymələridə arduinounun pin girişlərinə bağladıqda pull-up müqavimətləri bağlanlılır. Pull-down müqaviməti. Düyməyə basdığınızda, dövrə qapanaraq +5V gərginlik birbaşa arduinonun giriş pininə verilir. Əlinizi düymədən çəkdiyinizdə, istər istəməz xəttə kiçik də olsa cərəyan qalacaqdır. Bu enerji Düyməyə basmadığmız müddətdə belə sanki Arduinonun düyməyə basılmış kimi davranmasına səbəb olur. Bu enerjinin yox olması üçün xətt çox vaxt 10K Om müqavimət ilə, torpağa(gnd) bağlanılır və qalıcı enerji müqavimət üzərində yoxa çıxacaqdır.. Ümumiyyətə bu üsulun istifadəsi mütləqdir, çünki bizim bir defe düymeye basmağımız, arduino tərəfində 2,3.. və.s dəfə basılmaq kimi qəbul oluna bilər. Buna səbəb, düymənin kontakının qapalı -açıq olması vaxtı, kontakt dodağlarında qısa hiss olunmaz qövslər yaranır. pulldown və pullup müqavimətləri bu maniyələri aradan qaldırır. Bu metod düymə vasitəsilə arduinonun giriş pininə +5 V yəni məntiqi 1 komandası verdikdə tətbiq olunur.
  • 6. Şəkil 10.2.1. Pull-down müqaviməti, Pull-upp müqaviməti. Düyməyə basmadığımız müddətdə, +5V gərginlik mütəmadi olaraq Arduinonun giriş pininə verilir. Əgər düyməyə bassaq, dövrə qapandığı üçün, 5V gərginlik GND ilə qısa qapanacaqdır, gərginlik pull-up müqaviməti üzərində yox olaraq, bu zaman arduinonun girişinə 0V verilmiş olacaqdır. Əlimizi düymədən götürdükdə, qısa qapanmış dövrə açılacaq, +5V yenidən gərginlik müqavimət üzərindən arduinonun girişinə verilmiş olacaqdır. Bu metod arduonun girişinə 0V, yəni məntiqi 0 komandası vermək üçün istifadə edilir. Bu göstərdiyim metodlar xaricdən pullup və pulldown müqavimətləri istifadə etməklə reallaşdırıldı. Ancaq Arduino kartının üzərindəki mikrokontrollerin daxili 20 KOm pull up müqaviməti əlavə etmək xüsusiyyətidə vardır. Beləliklə, bu müqavimətləri proqram dili istifadə edərək aktiv hala gətirmək olar. Pull-up müqavimətini aktiv hala gətirmək üçün, giriş olaraq
  • 7. tənzimlədiyimiz pinə məntiqi 1 komandası verilməldir. Yəni daxili metod vasitəsilə arduinonun istənilən cixis giris pinini məntiqi 0 və ya 1 edə bilərik. Bunun mənası,tutaq ki arduinonun 1 nomrəli pininə bir düymə, 2 nömrəli pininə bir LED bağlamışıq, biz istəsək düyməyə basdiqda LED yanar, düyməni buraxsaq LED sönər, istəsəkdə düyməyə basmadıqda LED yansın, düyməyə basdıqda sönsün edə bilərik. Arduino Unonun çıxış pinləri 40mA olduğu üçün, bu pinləri böyük güclə yükləmək olmaz, bunun üçündə bu pinlərlə böyük güclü elementləri idarə edərkən, gücləndiricilərdən istifadə edilməldir. 4. digitalWrite funksiyası. Hər hansı bir pinə rəqəmsal olaraq HIGH - məntiqi 1(hə,5V) yada LOW - məntiqi 0(yox, 0V) dəyər yazmaq üçün istifadə edilir. İstifadə edilmə sintaksisi aşağıdakı kimidir: digitalWrite (pin nömrəsi, HIGH və ya LOW); Nümunə: digitalWrite(5, HİGH); digitalWrite(6, LOW) Bu funksiya rəqəmsal pin girişlərinin və ya çıxışlarını 5V və 0V olmasını təmin edir. Əgər giriş pini olaraq tənzimlənirsə, digitalWrite ilə HIGH etdikə, pull up müqavimətləri aktiv edilməli, LOW edildikdə isə pull up müqavimətləri passiv edilməldir. Bu metodu pinMode(pin nömrəsi, INPUT_PULLUP); funksiyası ilə reallaşdırırlar. 5. delay funksiyası. Programlarımızda gecikmələr və ya zamanlama yaratmaq üçün, yəni ardıcıl iki kod arasında zaman müddəti və ya fasilə yaratmaq üçün delay(ingilis dilindən gecikmə kimi tərcümə edilir) funksiyası istifadə edilir. Sintaksis(istifadə edilmə forması) şəkli aşağıdakı kimidir: delay(); () mötərizə içərisində qoymaq istədiyimiz zaman yazılır. Məsələn, delay(1000); // bu o deməkdirki 1000 milli saniyə və 1 saniyə. Əgər programlarımıza millisaniyə yox mikrosaniyə zamanı qoymaq istəsək, bu zaman delayMicroseconds(); funksiyasını istifadə etməliyik. delay- ın bir başqa növüdə millis(); funksiyasıdır, buda eyni millisaniyə üçündür, ancaq delay-dan fərqli olaraq millis funksiyası 50 gün işləyə bilir. 50 gündən sonra, öz-özünü sıfırlayacaqdır.50-ci günün sonunda millis funksiyasını istifadə etsək, funksiya sıfırlandığı üçün Arduino yenidən başlamış kimi dəyərlər göstərəcəkdir. 6. for idarə etmə struktur. for dövr ifadəsi Proqramın axışını idarə edən növbəti kontrol ifadələrindən biri də dövr ifadələridir. Bəzən vəziyyət elə olur ki, poqramda bir əməliyyatı müəyyən sayda yerinə yetirmək – təkrar icra etmək lazım gəlir. Bu kimi bir işi dövrə salaraq təkrarən yerinə yetirmək üçün dövr kontrol ifadələrindən istifadə olunur. Bu ifadələrdən biri də for – dur. for ifadəsinin ən çox istifadə olunan sintaktik şəkli aşağıdakı kimidir: for(başlanğıc; şərt; ifadə) { Əməliyyatlar… } Burada başlanğıc adətən, dövrü idarə edən dəyişənə müəyyən bir başlanğıc qiymətin verilməsi kimi müəyyən olunur. Şərt, dövrün hansı şərtlər daxilində icra olunmasını müəyyənləşdirən
  • 8. şərtdir və ümumi qiyməti bool tipində olur. Nə qədər ki, bu şərt doğrudur, dövr icra olunur. ifadə isə for ifadəsi hərdəfə dövr etdikcə, dövr idarə edən dəyişənin hansı şəkildə dəyişəcəyini özündə saxlayır. Qeyd etmək lazımdır ki, dövrün şərti ilk addımda düzgün deyilsə, onda dövr ifadəsinə aid heç bir əməliyyat yerinə yetirilmir. 7. [] massivlər(cərgə). Biz baxdığımız nümunə proqramlarda elə də çox sayda dəyişəndən istifadə etmirdik. 1,2 və ya 3 dəyişən maksimum halda. Aydındır ki, bütün bunlar nümunə proqramlardır və materialı izah etmək üçün verilir. Real tətbiqi proqramlar isə 10 000 -lərlə və ya 100 000 -lərlə müxtəlif məlumatlar üzərində əməliyyatlar aparmalı olur. Sadə misala baxaq: Tutaq ki, univeristetdə bu il bütün fakultələr üzrə təhsil alan tələbələrin, bütün fənlər üzrə qış imtahanlarının yekun nəticələrinin orta qiymətini hesablamaq lazımdır. Əgər universitetdə 6000 tələbə, 5 fəndən imtahan veribsə bu 30 000 imtahan nəticəsi deməkdir. başqa sözlə bu proqramı qurmaq üçün biz 30 000 dənə dəyişən elan etməliyik, hansı ki, praktiki olaraq mümkün deyil (əlbəttdə mümkündür, amma heç kim bu işi görməz). Bu zaman cərgələrdən istifadə olunur. Massivi elan edən zaman yaddaşda biz lazım olan sayda dəyişən (10, 5000, 100 000 ) yerləşdirmək üçün sahə ayırırıq və bu sahəyə bütövlükdə bir ad veririk. Dəyişənlər bu sahəyə ardıcıl düzülür, massiv şəkilində. Daha sonra bu massivdən istənilən elementə müraciət etmək üçün həmin sahəyə verdiyimiz addan və həmin dəyişənin indeksindən (cərgədəkədi sıra nömrəsindən) istifadə edirik. Massivdə dəyişənlərin nömrələnməsi 0 -dan başlayır, yəni cərgənin ilk elementinə müraciət eləmək üçün cərgənin adı və 0 indeksindən istifadə olunur. Cərgə elan eləmək üçün aşağıdakı çox sadə sintaksisdən istifadə edirik: tip cərgənin_adı[elementələrin_sayı]; int saylar [6]; int girisPin[] = {2, 4, 6, 8}; 11.2.1. ARDUİNO BLİNK(LED yandırıb-söndürmək) Əvvəlcə dövrəmizi quraq,
  • 9. Şəkil 11.2.1. LED-lərin sxematik arduino kartının 2 və 13 rəqəmsal pinlərinə bağlanmasına Biz dövrəmizdə nümunə üçün həm 2 ci həmdə 13 cü pinə bağlanmış LED-lər üçün kod yazdığımız üçün, bir dövrədə hər ikisini göstərdik. LED(işıq yayan diod) p-n keçidə malik yarım keçirici olduğu üçün, bağlantı ayaqlarının + və ya - qütbünə diqqət etməlisiz. LED-lər müxtəlif rəng kateqoriyalarına ayrılırlar, və hər rəngin öz cərəyan, gərginlik kimi paramatrik qiymətləri vardır. Arduino UNO kartımız 5V qida mənbəyi ilə qidalanırsa, məlum məsələdir ki, çıxış pinlərindən alınan gərginlik də 5V olacaqdır. LED-lər kiçik gərginlik və cərəyana malik olduqdlarında birbaşa bu pinlərə bağlana bilməzlər. Böyük cərəyan axdığından LED-lər sıradan çıxa bilər və ya pin zədələnə bilər. Bu böyük cərəyanı və gərginliyi məhdudlaşdırmaqdan ötrü mütləqdir ki, LED pinə ardıcıl bir müqavimət ilə qoşulsun. LEDə görə müqavimətin təyin edilməsi aşağıdakı kimidir:
  • 10. V- mənbə gərginliyi və ya pin gərginliyi; VLED - LED-in öz gərginliyi; R- məhdudlaşdırıcı müqavimət; Led üçün 5V gərginlikdə çox vaxt 220 Om və ya 330 Om müqavimət istifadə edilə bilər. LED-in müsbət və mənfi qütbünün təyin edilməsi şəkli aşağıda verilmişdir: Rənglərə görə LED-lərin gərginlik parametrləri: Bu cədvəl 20mA cərəyan çəkən LED-lər üçün verilmişdir:
  • 11. Şəkil 11.2.2. LED-lərin real olaraq arduino kartının 2 və 13 rəqəmsal pinlərinə bağlanmasına Bir LED-i yandırıb söndürmək(buna ingilis dilində Blink deyilir) üçün üç formada kod yazmaq olar. 1 ci forma. Arduinonun 2 ci pinə bağlanmış LED-in yanıb sönməsi int safa= 2; // yəni, safa dəyişənini 2 rəqəminə tanıtdım və ya mənimsətdim void setup() { pinMode(safa, OUTPUT); // safa çıxışdır, yəni 2-ci pinimiz çıxışdır }
  • 12. void loop() { digitalWrite(safa, HIGH); // 2-ci pinimiz "on" olsun, yəni 2-ci pinə volt gəlsin, //məntiq elementi kimi desək "hə" delay(1000); // 1000 millisaniyə gözlə, yəni bir saniyə gözlə, //zamanı sürətləndirib-ləngidə bilərik, məsələn 100millisaniyə digitalWrite(safa, LOW); // 2-ci pinimiz "of" olsun, yəni 2-cü pinə volt gəlməsin, //məntiq elementi kimi desək "yox" delay(1000); //1 saniyə gözlə,bu pross yeniden tekrarlanacaqdır } 2 ci forma. Arduinonun 13 cü pinə bağlanmış LED-in yanıb sönməsi void setup() { pinMode(LED_BUILTIN, OUTPUT);// LED_BUILTIN dedikdə bu ancaq //13-cu pini nəzərdə tutur, LED_BUILTIN əvəzinə 13 rəqəmidə yaza bilərdik. } void loop() { digitalWrite(LED_BUILTIN, HIGH);// 13-cü pinimiz "on" olsun, //yəni 13-cü pinə volt gəlsin, məntiq elementi kimi desək "hə" delay(1000);// 1000 millisaniyə gözlə, yəni bir saniyə gözlə digitalWrite(LED_BUILTIN, LOW);//13-cü pinimiz "of" olsun, , //yəni 13-cü pinə volt gəlməsin, məntiq elementi kimi desək "yox" delay(1000);//1 saniyə gözlə,bu pross yeniden tekrarlanacaqdır } 3 cü forma. Arduinonun 2 ci pinə bağlanmış LED-in yanıb sönməsi void setup() { pinMode(2, OUTPUT);//yəni 2-ci pinimiz çıxışdır } void loop() { digitalWrite(2, HIGH);// 2-ci pinimiz "on" olsun, //yəni 2-ci pinə volt gəlsin, məntiq elementi kimi desək "hə" delay(1000); // 1000 millisaniyə gözlə, yəni bir saniyə gözlə digitalWrite(2, LOW);// 2-ci pinimiz "of" olsun, //yəni 2-cü pinə volt gəlməsin, məntiq elementi kimi desək "yox" delay(1000); // 1 saniyə gözlə,bu pross yeniden tekrarlanacaqdır } İki LED-in eyni anda yanıb-sönməsi. void setup() { pinMode(LED_BUILTIN, OUTPUT); pinMode(2, OUTPUT);
  • 13. } void loop() { digitalWrite(LED_BUILTIN, HIGH); digitalWrite(2, HIGH); delay(1000); digitalWrite(LED_BUILTIN, LOW); digitalWrite(2, LOW); delay(1000); } Multivibrator. İki LED-n fərqli zamanlarda yanıb-sönməsi void setup() { pinMode(LED_BUILTIN, OUTPUT); pinMode(2, OUTPUT); } void loop() { digitalWrite(LED_BUILTIN, HIGH); digitalWrite(2, LOW); delay(1000); digitalWrite(LED_BUILTIN, LOW); digitalWrite(2, HIGH); delay(1000); } 5 ədəd LED-in sağa sola sürüşməsinin(qara şimşək) iki formada kodlanması: Sxem:
  • 14. Şəkil 11.2.3 1 ci forma. void setup() { pinMode (8, OUTPUT); pinMode (9, OUTPUT); pinMode (10, OUTPUT); pinMode (11, OUTPUT); pinMode (12, OUTPUT); } void loop() { digitalWrite (8, HIGH); delay (100); digitalWrite (8, LOW); digitalWrite (9, HIGH); delay (100); digitalWrite (9, LOW); digitalWrite (10,HIGH); delay (100); digitalWrite (10, LOW); digitalWrite (11, HIGH); delay (100); digitalWrite (11, LOW); digitalWrite (12, HIGH); delay (100); digitalWrite (12, LOW); digitalWrite (11, HIGH); delay (100); digitalWrite (11, LOW); digitalWrite (10, HIGH); delay (100);
  • 15. digitalWrite (10, LOW); digitalWrite (9, HIGH); delay (100); digitalWrite (9, LOW); } Kodların izahı: void setup() { // ledlərin bağlı olduğu pinləri və çıxış olduqlarını qeyd edirik. pinMode (8, OUTPUT); pinMode (9, OUTPUT); pinMode (10, OUTPUT); pinMode (11, OUTPUT); pinMode (12, OUTPUT); } void loop() { //ledlərin ardıcıl olaraq, birinin sönüb digərinin yanmasını qeyd edirik. digitalWrite (8, HIGH); 8 ci pinə gərginlik gəlsin(məntiqi 1) delay (100); // zamanı istənilən vaxta qurmaq olar, 1000 millisaniyə= 1 saniyə digitalWrite (8, LOW); // 8-ci pinə gərginlik gəlməsin(məntiqi 0) digitalWrite (9, HIGH); cu pinə gərginlik gəlsin(məntiqi 1) Bu qayda ilə artan istiqamətdə 12-yə qədər qeyd edirik, buz zaman LED-lər soldan sağa yanmış olacaqdır. Daha sonra LED-lərin sağsan sola sürüşməsi üçün, 12-ci pindən əksinə olaraq həmin prosesin əksini yazırıq. digitalWrite (12, LOW); 12ci pinə gərginlik kəsilsin digitalWrite (11, HIGH); 11 ci pinə gərginlik gəlsin delay (100); 0,1 saniyə gözlə digitalWrite (11, LOW); 11 ci pinə gərginlik kəsilsin digitalWrite (10, HIGH); 10 cu pinə gərginlik gəlsin Bu kod prosesinin azalan şəkildə 9cu pinə qədər yazırıq. 2 ci forma. int LEDler[] = {8,9,10,11,12}; void setup (){ for(int i=0; i<5 ;i++){ pinMode(LEDler[i], OUTPUT); }} void loop(){ for(int i=0; i<5; i++){ digitalWrite(LEDler[i],HIGH); delay(50); digitalWrite(LEDler[i],LOW); } for(int i=5;i>0; i--){ digitalWrite(LEDler[i],HIGH); delay(50); digitalWrite(LEDler[i], LOW); }}
  • 16. Kodların izahı: int LEDler[] = {8,9,10,11,12}; //LED-lər dəyişəninə beş ədəd rəqəm tanıdırıq void setup (){ for(int i=0; i<5 ;i++){ // For operatoru i=0-dan 4-e(i<5) qeder 5eded ardıcıl olaraq int [] operatorunun daxilində qeyd olunan dəyişənə tanıdılan ədədləri(bu ədədlər ledin hansı pine qosuldugu pinlerin nomreleridir) artan istiqametde qosmaqin ayarlayir, i++ burada artan istiqamet demekdir // pinMode(LEDler[i], OUTPUT); // ledler cixisa qosulub }} void loop(){ for(int i=0; i<5; i++){ // Butun ledler ardicil olaraq artan istiqametde yanmagi qeyd olunur digitalWrite(LEDler[i],HIGH); // ledin her biri ardicilliqla high olar delay(50); // 0,05 saniye sonra digitalWrite(LEDler[i],LOW); // ledlerin her biri ardicil olaraq low olar, bir ledden sonraki yanir, evvelki sonur } for(int i=5;i>0; i--){ // LEDler əks istiqamətdə 50 milisaniye yanib sondurururk digitalWrite(LEDler[i],HIGH); delay(50); digitalWrite(LEDler[i], LOW); }} 11.3. Serial.begin, Serial.print., analogRead. Analog Read Serial(ardıcıl monitordan analoq dəyərləri oxumaq) Potensiometr. Potensiomet, bir digər adı reostat, müqavimət növlərindən biridir. Potensiometrin xüsusiyyəti tənzimlənə bilən v ya idarə edilə bilən müqavimət olmasıdır. Elektronikanın əsas elementlərindən biridir və idarəetmə tələb edən işlərin bir çoxunda var. Şərti işarəsidə də normal bir müqavimətin üzərinə ox əlavə olunması ilə meydana gəlir. Bunun səbəbi də müqavimət dəyərinin ani idarə edildiyini edildiyini göstərməsidir. Şəkil 11.3.1. Potensiometrin şərti işarəsi
  • 17. Potensiometr 3 ayaqlı bir dövrə elementidir və üzərində yerləşmiş fırlanğıcla ayaqlar arasındakı müqaviməti idarə edilir. Aşağıdakı hərəkətli simualtsiyaya baxsaq, C ayağı idarəetməni təmin edən ayaqıdır. Potensiomentrin istiqaməti B ayağına doğru çevrildikdə A-C arasında müqavimət artır, C-B arasında müqavimət azalır. Əgər potensiometr A istiqamətinə doğru çevrilərsə C-B arasında müqavimət artıb A-C arasında müqavimət də azalacaqdır. Şəkil 11.3.2 Serial.begin(); Rəqəmsal kommunikasiyada əsas olaraq iki qayda vardır : ardıcıl(serial) və paralel kommunikasiya. Ardıcıl kommunikasiyada rəqəmsal məlumatlar(data bitlər) tək bir xətt üzərindən ard-arda göndərilərkən, paralel kommunikasiyada isə müəyyən qruplar halında bərabər zamanlı olaraq ötürülür. Daha az məlumat xəttinə ehtiyac olduğundan(yəni bir xətt üzərində bir neçə fərqli məlumat göndərmək mümkün olduğundan) ardıcıl kommunikasiya elektronika proyektlərində sıx-sıx istifadə edilir. Nümunə gətirmiş olsaq, kompüterlərdə istifadə edilən USB, SATA, və.s kimi ardıcıl kommunikasiya standartlarını saya bilərik. Məhz arduino kartımızla kompüterimiz arasında əlaqə ardıcıl kommunikasiya ilə yaradılır. Həm kompüterdən arduinoya məlumat ötürdükdə, həm arduinodan komputerimizə məlumat ötürməkdə çox vacib bir yer tutur. Keçmiş zamanlarda, kompüterlərdə ardıcıl kommunikasiya RS232 poru üzərindən yaradılırdı. Müasiz zamanda bunun yerini USB tutmuşdur. Ancaq onuda qeyd etmək lazımdır ki, RS232 ilə USB arasındada bir əlaqə burmaq olur, bunun üçün RS232-USB konvertor əlimizdə olmalıdır. Məhz bu konvertorun özü bizim arduino kartlarımızda yer almışdır. Ardıcıl kommunikasiyada iki ayrı xətt üzərindən(Rx və Tx) məlumatlar(datalar) baytların bit cərgələri şəklində göndərilib- alınır. Demək olar ki bu metod bütün mikrokontrollerlərdə vardır. Ardıcıl kommunikasiya üçün, arduino üzərində yerləşən cihaza UART(Universal Asynchronous Receiver-Transmitter: universal asinxron qəbuledici-ötürücü) adı verilir. Arduino modelindən asılı olaraq üzərində bir və bir neçə sayda UART mikrokontroller yerləşə bilər. Arduino Uno kartında bir ədəd vardır. UART-ı arduino kartımız üzərində artırada bilərik, bunu üçün xüsusi UART periferik modullar mövcuddurlar. Arduino ilər komputer arasındakı bu kommunikasiya UART protokolu deyilir.
  • 18. Ardıcıl kommunikasiya üçün, arduino uno kartı üzərində D0(Rx) D1(Tx) olmaqla iki rəqəmsal pin mövcuddur. Bu iki pin eyni zamanda, Rx, Tx LED-lərinə və USB konvertor çipi ilədə əlaqəlidir. Programlama əsnasında, bu iki pinlər üzərindən kommunikasiya sistemi qurulur. Məlumatı uzatmadan Serial.begin() funksiyasına keçək. Bu funksiya setup() funksiyasının daxilində yazılır, və ardıcıl kommunikasiyanın başlatmasını təmin edir. Serial.begin() funksiyasına parametr olaraq 300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600 və 115300 dəyərlərindən birini verə bilərik. Bu dəyərlərin ölçü vahidi bps(bir saniyə ərzindəki bit) və ya baud rate(uzaq ötürmə) olaraq götürülür. Kodlanmada aşağıdakı kimi yazılır: void setup() { Serial.begin(9600); } İki arduino kartının bir-birilə və ya digər periferik cihaz ilə ardıcıl kommunukasiya zamanı mütlər hər iki bps vahidi eyni olmalıdır. Qeyd etməl lazımdırki, arduino üzərindəki Rx Tx rəqəmsal pinlər yalnız UART üçün nəzərdə tutulmuşdur, yox əgər biz istəsək ki, bu pinləri də hər hansı bir rəqəmsal çıxış üçün istifadə edək, bu zaman void loop(); daxilində Serial.end(); funksiyası yazaraq ardıcıl kommunikasiyanı deaktiv edə bilərik. Serial. print və Serial.println();
  • 19. Kompüterimizə göndərilən məlumatı, monitorda əks etdirmək üçün bu funksiyalardan istifadə edilir. Serial.print yazını,rəqəmi və ya hər hansı bir simvolu ard-arda düzərək monitorda göstərir, yəni bir sətirdən ibarət məlumat göndərir, serial.println funksiyası isə növbəti gələn məlumatları yeni sətrlərdə alt-alta yerləşdirərək monitora göndərir. Əgər yazı və ya məlumat əvvəlcədən hər hansı bir dəyişənə mənimsədilibsə Serial.print(safa); belə yazılır, əgər mənimsədilməyibsə və ya proqramın daxilində ilk yazılan məlumatdırsa, bu zaman Serial.print("safa") kimi yazılır. Bu eyni ilə Serial.println-də aiddir. analoRead(analoq pinin nömrəsi); bu funksiya arduinonun analog girişlərində tətbiq olunan 10 bitlik 0 - 5V arası gərginlikləri 0 - 1023 arasındakı rəqəmsal dəyərlərə çevirir. Əgər analoq pinə tətbiq olunan 5V gərginliyi ekranda volt şəklində görmək istəsək, bu zaman 5V-u 1024 rəqəmsal dəyərə böllmək lazım olacaqdır. 5V/1023=4,88mV. Əgər analog girişə tətbiq olunan 5V gərginliyi 5V kimi ardıcıl monitorda(serial monitor) görmək istəyiriksə, biz potensiometrin ardıcıl monitora çıxartdığı qiyməti 1023 -ə bölüb və nəticəni 5-ə vurmaq lazımdır. Analog Read Serial(ardıcıl monitordan analoq dəyərləri oxumaq). Sxem:
  • 20. Sxemdə istifadə olunan elementlər: 1. Potensiometr 10 KOm Kodlar: void setup() { Serial.begin(9600); } void loop() { int potDeyer = analogRead(A0); Serial.println(potDeyer); delay(1); } Kodların izah olunması: /* Arduino Uno kartının A0 pinindəki analoq dəyəri oxuyur və oxunan dəyəri ardıcıl monitora çıxardır(monitorda göstərir). Potensiometrin orta pinini A0, kənar pinlərini(burada ayaq mənasında) +5V-a və GND(-) bağlayın*/ void setup() { Serial.begin(9600); // saniyədə 9600 bitlə ardıcıl kommunikasiya başlansın } void loop() { int potDəyəri = analogRead(A0); // potensiometrin dəyəri analogRead funksiyasına mənimsədildi, yəni potensiometrin orta ayağı A0 pini tərəfindən oxunsun Serial.println( potDəyəri ); analogRead-ın A0 pinindən oxuduğu dəyəri alt-alt sətirlərlə monitorda göstər delay(1); // hər dəyişən dəyər arasındankı zaman 1 milli saniyə, biz potensiometrimizi hər döndərdikdə məlum məsələdir ki dəyər dəyişəcəkdir, bu üzdən dəyişən dəyərləri arasındakı zaman vacibdir. } 11.4. digitalRead() funksiyası Digital Read Serial(ardıcıl monitordan rəqəmsal dəyərin oxunması) digitalRead(pin); Hansı ki, digitalRead funksiyası rəqəmsal girişə verilən 0 və 5V gərginlikdən birini oxuyur, açıq demiş olsaq, bu funksiya arduinonun pinləri rəqəmsal giriş kimi(məntiqi 0 və 1) istifadə edildikdə yazılır. digitalWrite rəqəmsal 0-1 çıxış üçün, digitalRead isə rəqəmsal 0-1 giriş üçün yazılır. Düymə(button). Düymə və ya açarda adlanır, ON-OF prinsipi ilə işləyən elementdir, adi açar funksiyasını daşıyır, yəni üzərinə əlimizlə basdığımızda dövrəni qoşar, əlimizi götürdükdə isə dövrəni ayırar. Təbi ki, bir çox növləri vardır. Normal halda açıq və ya qapalı düymələr, 2 kontaktlı, 4 kontaktlı tərs kontaktı olaraq növlərə bölünürlər.
  • 21. Digital Read Serial(ardıcıl monitordan rəqəmsal dəyərin oxunması). Sxem:
  • 22. Sxemdə istifadə olunan elementlər: Pushbutton(düymə, açar) -1 ədəd Rezistor(pull up) 10 KOm Kod: int pushButton = 2; void setup() { Serial.begin(9600); pinMode(pushButton, INPUT); } void loop() { int buttonState = digitalRead(pushButton); Serial.println(buttonState); delay(1); } Kodların izahı: int pushButton = 2; // pushButton(düyməni bas) dəyişəninə 2 rəqəmini mənimsətdik void setup() { funksiyanın daxilində aşağıdakı quraşdırmalar yerinə yetirilsin
  • 23. Serial.begin(9600); // saniyədə 9600 bit ardıcıl kommunukasiya başlansın pinMode(pushButton, INPUT); //pushbutton yəni 2 ci pin INPUT(giriş)-dur, düyməni 2 ci pinə bağlamışıq void loop() { // kodların dövr etmə ilə oxunduğu yəni kodların ardıcıl işləməsi funksiyası, burda yazılan kodlar əvvəldən sona sırayla ardıcıl olaraq oxunur, və bu proses təkrarlanaraq yenilənir int buttonState= digitalRead(pushButton); //serial monitorda göstərmək üçün, buttonState(düymənin açıq-qapalı olduğu vəziyyəti) dəyişəninə digitalRead(pushButton) funksiyasını mənimsədirik. Serial.println(buttonStae); // digitalRead(pushButton)-unun oxudugu qiyməti ardıcıl monitorda göstərəcəkdir. delay(1); // düyməni basb-buraxdıqda ardıcıl monitorda hansı zaman fasiləsində oxunan dəyəri göstərməsi üçündür, özünüz üçün bu zamanı artırıb azaldaraq nə baş verdiyini araşdıra bilərsiz. 11.5. analogWrite() funksiyası. LED-in parlaqlığının avtomatik olaraq artıb-azalması(Fade) Bu dərsimizdə, sizlərlə arduinonun rəqəmsal D9 pininə qoşulan LED-in parlaqlığının artıb- azaltmaq qaydasını öyrənərik. Nəzərinizə çatdırım ki, arduino kartlarında analoq çıxış funksiyası yoxdur, yalnız analoq giriş kimi istifadə edə bilirik. Biz analoq çıxış almaq üçün, rəqəmsal pinlərdən PWM üsulundan istifadə etməklə əldə edəcəyik. Şəkil 11.5.1
  • 24. Şəkil 11.5.2 PWM(eninə impuls modulyasiyası) elektron dövrələrdə ən çox istifadə edilən qaydadır. Arduino kartında çıxış rəqəmsal pindən sürətli şəkildə 0-5V verməklə biz analoq qiyməti ala bilərik. Şəkil 11.5.1 dən göründüyü kimi, 5V-un ON rejimi nə qədər çox olarsa, 0V-un off rejimi az olarsa bir o qədər analoq qiymət çox olacaqdır. Buna ingilis dilində duty cucle deyilir. ton- 5V-un verildiyi müddət; T- ümumi period, yəni ton + toff Alınan nəticə 100%-ə vurulur. Gördüyünüz kimi, faizi çox olan analoq qiyməti çox olandır. Və bu alınan faizə işçi tsikl(duty cycle) adlanır, pwm bu dəyərdən asılıdır. Arduinoda PWM - i analogWrite(pin, qiymət); funksiyası yerinə yetirir. Bu funksiya 0 - 255 arasında 8 bitlik dəyərə malikdir. Arduino Uno kartında PWM üçün ən uyğun olan pinlər 5-6 cı pinlərdir, bu pinlərdə maksimum tezlik 980 Hs-dir. analogWrite(pin, qiymət); funksiyası ilə pindəki çıxış gərginlyinini tənzimləyərək LED, sabit cərəyan mühərriklərini idarə edə bilərik. LED-in parlaqlığının avtomatik olaraq artıb-azalması(Fade). Sxem:
  • 25. Şəkil 11.5.3 Kodlar: int led = 9; int brightness = 0; int fadeAmount = 5; void setup() { pinMode(led, OUTPUT); }
  • 26. void loop() { analogWrite(led, brightness); brightness = brightness + fadeAmount; if (brightness <= 0 || brightness >= 255) { fadeAmount = -fadeAmount; } delay(1000); } Sxemdə istifadə olunan elementlər: 1. 220 Om rezistor 2. LED 3. Birləşdimə naqilləri Kodların izahı: int led = 9; // pwm 9 cu pindən alınacaq, led-in bağlı olduğu ayaq int brightness = 0; // parlaqlığa verilən dəyər, 0-ledin parlaq olmadıgı dəyərdir, yəni arduinodaya enerji verildiyi anda led ilk anda parlaq olmuyacaqdır. yəni ilk annda 9-cu pin 0V ilə artmaya başlasın. int fadeAmount = 5; // gərginliyin və ya ledə verilən gərginliyin və ya led-in parlaqlığının hansı pillələrdə artmasını təyin edən dəyər. void setup() { // resetdən sonra və ya arduinoya enerji verildikdə, birdəfə işləyən quraşdırma funksiyası pinMode(led, OUTPUT); // 9- cu pin çıxış olaraq quraşdırıldı } void loop() { // bu funksiyaya yazılan kodlar dövr etmə ilə oxunub işləyəcəkdir analogWrite(led, brightness); //9 cu pinin parlaqlıq dəyəri, yuxarıda int brightness = 0; kimi qeyd edilib brightness = brightness + fadeAmount; // parlaqlığn və ya led-ə verilən gərginliyin hansı aralıqda və ya pillədə artması, 0+5+5+5+5+5 if (brightness <= 0 || brightness >= 255) { //əgər brightnes(parlaqlığ) 0-dan kiçik bərabər və ya( ||) 255-dən kiçik bərabər olarsa, || işarəsi və ya deməkdir. fadeAmount = -fadeAmount;// fadeAmount dəyəri mənfi olsun, bu zaman cəmləmə yox çıxma əməliyyatı aparılacaqdır, 9 pin-dəki gərginlik 255 dəyərinə yəni maksimum dəyərinə çatsa, fadeAmount mənfi olduğundan , gərginlik maksimumdan minimuma azalacaqdır, bunu dövrəyə bağladığım voltmetrlə də izləyə bilərsiz. delay(1000); // parlaqlıq və ya qaranlıqın arması-azalması müddəti 1 saniyə } 11.6. float. Read Analog Voltage(ardıcıl monitordan gərginliyin ölçülməsi) float çevirmə dəyişən tipi, 32 bit həcmi var, [-3,4028235E...38 -- +3,4028235E...38] parça aralığında müsbət və mənfi işarəli kəsr qiymət alır. Analoq dəyəri(0 - 1023) volt dəyərinə(0 - 5V) çeviririk. burada potDeyer- analogRead(A0) funksiyasının oxuduğu qiymətdir. Və bu qiyməti 5:1023= 0, 005 dəyərinə vururuq, aldığımız dəyər artıq volt dəyəri olmuş olur.
  • 27. Read Analog Voltage(ardıcıl monitordan gərginliyin ölçülməsi) 11.3 -cü mövusunda biz bunu izah etmişdik, lakin o mövzuda yalnız potensiometrdən alınan dəyərləri birbaşa olaraq ardıcıl monitorda göstərdik. İndi istə, bu dəyəri volta(5V) çevirib ardıcıl monitorda göstərməyi öyrənərik. Təbi ki, arduino kartımızın giriş-çıxış gərginliyi maksimum 5V olduğu üçün, və biz bu praktikanı birbaşa kart üzərində göstərdiyimiz üçün, nəzərinizdə saxlayın ki bu yalnız 5V üçün olacaqır. Aşkar demiş olsaq, ardıcıl monitoru 5V-luq monitor kimi istifadə etmiş olacağıq. Gələcəkdə, konvertor modullardan istifadə edərək, istənilən gərginliyi ardıcıl monitordan göstərmiş olacağıq. Sxem:
  • 28. Şəkil 11.6.1 Sxemdə istifadə olunan elementlər: 1. 10 KOm potensiometr Kodlar: void setup() { Serial.begin(9600); } void loop() { int potDeyer = analogRead(A0); float gerginlik = potDeyer * (5.0 / 1023.0); Serial.println(gerginlik); } Kodların izahı: void setup() { Serial.begin(9600); // saniyədə 9600 bitlə komunikasiya başlanılsın } void loop() { int potDeyer = analogRead(A0); //int veriləninə sensorValue dəyişəninin tanıtdırırıq, və analogRead(A0) funksiyasını bu dəyişənə mənimsətdik. A0 arduinonun giriş analoq pininin nömrəsidir. float gerginlik = sensorValue * (5.0 / 1023.0); // float-a gerginlik adlı dəyişən tanıdırıq və bu dəyişənə sensorValue * (5.0 / 1023.0) dəyərini mənimsədirik. Serial.println(gerginlik);// alına gərginlik dəyərini ardıcıl monitorda print edir yəni nəticəni ekrana çıxarır. - Gördüyünüz kimi burada delay(); zaman funksiyasını istifadə etməmişik, burada bunuda istifadə edə bilərsiz, özünüz yazıb-yazmamaqla arasındakı fərqi hiss edəcəksiz, delay(100); 0,1 milli saniyə etsəz, potensiometrin dəstəyini fırlatmaqla anında anında dəyişilən dəyəri ardıcıl monitorda göstərəcəkdir. }
  • 29. 11.7. const, unsigned, long, millis(). delay() funksiyasını istifadə etmədən LED-in yanıb-sönməsi 1. const, qarşısında yazıldığı verilənlər tipini sabit saxlayırlar ki, onları loop və setup içərisində dəyişmək olmaz const int = 100; 2. unsigned int , 16 bit həcmi var, [0 - 65535] parça aralığında müsbət işarəli tam qiymət alır. unsigned ad = 4000;3. 3. long, 32 bit həcmi var, [-2147483648 -- +4294967296] parça aralığında müsbət və mənfi işarəli tam qiymət alır. long dəyişənləri, uzun ölçülü ədədləri saxlamaq üçün, dəyişən tipləridir və 32 bit (4 bayt), - 2,147,483,648 - 2,147,483,647 aralığındadır. Tam ədədlərdə riyazi hesab aparırsızsa, ədədlərdən ən azından birinin L ilə izlənilməsi lazım gəlir. Yazılış şəkli long var = val; Burada var: dəyişənin adı. val: dəyişənə mənimsədilən dəyər. Nümunə kodu: long speedOfLight = 186000L; 4. unsigned long, 32 bit həcmi var, 0 - 4294967295 aralığında müsbət tam qiymət alır 5. millis(), gecikmə funksiyası, delaydan fərqli olaraq,50 gün çalışdıqdan sonra, sıfırlanaraq başa qayıdar, həmdə millis gecikmə funksiyası arduino proqram kodlarını çalışdırana qədər olan zamanıda verə bilir və ya göstərə bilir. Neçə saniyədən sonra kodların oxunmağa başladığı müddəti göstərə bilir. Nümunə Kodlar: unsignedlong zaman; voidsetup(){ Serial.begin(9600); } voidloop(){ Serial.print("Zaman: "); zaman =millis(); Serial.println(zaman); delay(1000); } millis(); gecikmə funksiyasının zamanı unsigned long-un tutduğu dəyərə bağlıdır. Bunu serial.println- kommunikasiyası monitorda hesablayaraq göstərir.
  • 30. delay() funksiyasını istifadə etmədə LED-in yanıb-sönməsi. 13 ayağına bağlanmış LED-in yanıb sönməsini delay zaman funksiyasını istifadə etmədən sizlərlə öyrənək. Bu funksiyanı millis(); funksiyası ilə əvəz etməklə reallaşdırarıq. Bu funksiya işə düşdüyü andan 50 gün ömrü var, bu müddət bitdikdən sonra təkrar başa dönəcəkdir.delay- da olduğu kimi vahidi millisaniyədir. Sxem:
  • 31. Şəkil 11.7.1 Sxemdə istifadə olunan elementlər: 1. 220 Om rezistor 2. LED Kodlar: const int ledPin = LED_BUILTIN; int ledVeziyyeti = LOW; unsigned long evvelkizaman = 0; const long interval = 1000; void setup() { pinMode(ledPin, OUTPUT); } void loop() { unsigned long zamanDeyeri = millis(); if (zamanDeyeri - evvelkizaman >= interval) { evvelkizaman = zamanDeyeri; if (ledVeziyyeti == LOW) { ledVeziyyeti = HIGH;} else { ledVeziyyeti = LOW; } digitalWrite(ledPin, ledVeziyyeti);}} Kodların izahı: const int ledPin = LED_BUILTIN; // LED_BUILTIN 13-cü pin deməkdir, 13-cü pinimizi ledPin dəyişəninə mənimsədirik. const-burada int veriləninin sabit , dəyişməz tip olduğu başa düşülür. int ledVeziyyeti = LOW; // ledin vəziyyətini göstərən dəyişən unsigned long evvelkizaman = 0; // başlanğıc zaman dəyişəni, const long interval = 1000; //zaman aralığı
  • 32. void setup() { pinMode(ledPin, OUTPUT); //13cü pinimizi çıxış kimi quraşdırdıq } void loop() { unsigned long zamanDeyeri = millis(); // zamanDeyeri dəyişənimiz millis() funksiyasına mənimsədildi. if (zamanDeyeri - evvelkizaman >= interval) { // əgər zamanDeyeri ilə evvelkizama-ın fərqi intervaldan(zaman aralığından) böyük bərabərdirsə evvelkizaman = zamanDeyeri; //zamanDeyeri evvelkizaman-a mənimsədilsin if (ledVeziyyeti == LOW) { // əgər ledVeziyyeti LOW-dursa ledVeziyyeti = HIGH; // ledVeziyeti HIGH-ya mənimsədilsin } else { // əgər elə deyilsə ledVeziyyeti = LOW; //ledVeziyyeti LOW-ya mənimsədilsin } digitalWrite(ledPin, ledVeziyyeti); // 13 cü pinimiz, ledVeziyyeti-ne bağlı olaraq çıxış versin }} 11.8. if, else, Müqayisə operatorları. Düyməyə basmaqla LED- in yanması if -şərt, əgər operatorundan(idarə etmə struktur) və else-deyil, deyilsə operatorundan yaranmış bir operatordur. Biz, if operatorunda demişdik ki, bu operatorun mötərizə içərisində yazılan kod təmin olumadısa və ya ödənmədisə, loop işərisində avtomatik olaraq if-dən sonra gələn kodu oxuyacaqdır. Ancaq if / else operatorunda isə, if-də ödənilməyən və ya ödənilən kod else operatoruna ötürülür, yəni else-də oxunur. Bu operatator iki qaydada yazıla bilər: 1. if ( ) { kod yazılan yer } else { kod yazılan yer } İzahı: if (a==3 ) { -əgər a=3 -sə bura yazılan kod işləsin } else { - a=3 deyilsə, yəni if də olan hal ödənmədisə bura yazılan kod işləsin(və ya oxunsun) } 2. if ( ) { kod yazılan yer
  • 33. } else if () { kod yazılan yer } İzahı: if(a==3) { - əgər a=3-sə bura yazılan kod işləsin } else if(a==5) { - a=3 deyilsə, a=5 -sə bura yazılan kod işləsin else { - bunlardan heçbirisi deyilsə bura yazılan kod işləsin } 3. Müqayisə operatorları: x == y (x bərabərdir y); x != y (x bərabər deyil y); x < y (x balacadır y); x > y (x böyükdür y); x <= y (x kiçik bərabərdir y); x >= y (x böyük bərabərdir y). Düyməyə basmaqla LED- in yanması Pin 5-ə bağlanmış düyməyə basdıqda, 8-ci rəqəmsal pinə bağlı olan LED-i yanacaq, əlimizi götürdükdə isə sönəcəkdir. Sxem: Şəkil 11.8.1 Sxemdə istifadə olunan elementlər: 1. düymə(button on-off) 2. LED
  • 34. 3. 220 Om rezistor Kodlar: constintduyme=5; constintled= 8; intduymeVeziyyeti=0; voidsetup(){ pinMode(led,OUTPUT); pinMode(duyme,INPUT); } voidloop(){ duymeVeziyyeti=digitalRead(duyme); if(duymeVeziyyeti==HIGH){ digitalWrite(led,HIGH);} else{ digitalWrite(led,LOW); }} Kodların izahı: const int duyme = 5; // sabit duyme dəyişəninə 5 ci pin mənimsədildi, 5 ci pinə düymə bağlıdır const int led = 8; // sabit led dəyişəninə 8 ci pin mənimsədildi, 8 ci inə LED bağlıdır int duymeVeziyyeti = 0; // normal halda düymənin vəziyyəti 0-dır, yəni basılmayıb void setup() { pinMode(led, OUTPUT); // led qoşulan pin çıxış kimi quraşdırıldı pinMode(duyme, INPUT); // düymə qoşulan pin giriş kimi quraşdırıldı } void loop() { duymeVeziyyeti = digitalRead(duyme); // digitalRead-ın oxuduğu dəyər, duymeVeziyyətinə mənimsədilsin, if (duymeVeziyyeti == HIGH) {//əgər düyməyə basıldısa, yəni duymeVeziyyəti HIGH(məntiqi 1) -sə digitalWrite(led, HIGH);} // led yansın, yəni led bağlanan pin məntiqi 1 olsun else { // əgər düymə basılı deyilsə digitalWrite(led, LOW); // onda LED yanmasın, yəni led bağlanan pin məntiqi 0 olsun }} 11.9. ++ artırma və -- azaltma operatoru, qalıq almaq (%). Düymənin vəziyyətinin ardıcıl monitordan izlənilməsi ++ artırma və -- azaltma operatoru x++; // x qalır və hərdəfə +1 artır, Nümunə, x=5; x>5; x++; // 5,6,7.. və.s ++x; // x birbaşa +1 artır Nümunə, x=5; x>5; ++x; // 6,7,8.. və.s x--; // x qalır və hər dəfə -1 azalır
  • 35. Nümunə, x=5; x>5; x--; // 5,4,3.. və.s --x; // x bir başa -1 azalır Nümunə: x=5; x>5; --x; // 4,3,2.. və.s Qalıq almaq % Orta məktəb riyaziyyat dərsində keçdiyimiz qalıqdır, % işarəsi ədədin ədədə bölünməsindən alınan qalıqı verir. Əgər sürət məxrəcdən kiçikdirsə, onda qalıq olaraq sürətin özü götürülür. Nümunə: 3 %4 =3, 6 % 4 =2 Bu gün, pin 2-yə bağlanmış düymənin(pushbutton) açıq-qapalı olmasını ardıcıl monitordan izlənilməsini öyrənərik. Sxem: Sxemdə istifadə olunan elementlər: 1. Button(düymə) 2. LED 3. 220 Om və 1 KOm rezistor Kodlar: constint duymeninPini = 2; constint ledinPini = 13; int duymeninBasilmaSayi = 0; int duymeninVeziyyeti = 0; int duymeninEvelkiVeziyyeti = 0; voidsetup() { pinMode(duymeninPini,INPUT); pinMode(ledinPini,OUTPUT); Serial.begin(9600); } voidloop() { duymeninVeziyyeti =digitalRead(duymeninPini); if (duymeninVeziyyeti != duymeninEvelkiVeziyyeti) { if (duymeninVeziyyeti ==HIGH) { duymeninBasilmaSayi++; Serial.println("qapali"); Serial.print("duymenin sixilma sayi: ");
  • 36. Serial.println(duymeninBasilmaSayi); } else { Serial.println("achiq"); } delay(100); } duymeninEvelkiVeziyyeti = duymeninVeziyyeti; if (duymeninBasilmaSayi % 4 == 0) { digitalWrite(ledinPini,HIGH); } else { digitalWrite(ledinPini,LOW); }} Kodların izahı: constint duymeninPini = 2; Düymənin bağlandığı yeri 2 ci pin olaraq mənimsətdik constint ledinPini = 13; Ledin bağandığı yeri 13-cü pin olaraq mənimsətdik int duymeninBasilmaSayi = 0; Düymənin basılma sayı 0-dan etibarən başladığını mənimsətdik int duymeninVeziyyeti = 0; Düymənin normala açıq olduğu vəziyyət yəni 0 int duymeninEvelkiVeziyyeti = 0; Düymənin əvvəlki vəziyyətini 0 rəqəminə mənimsətdik voidsetup() { pinMode(duymeninPini,INPUT); pinMode(ledinPini,OUTPUT); Serial.begin(9600); } void setup() birdəfə çalışan quraşdırıcı funksiyası daxilinə, duymeninPini giriş, ledinPini çıxış olaraq təyin etdik, və saniyədə 9600 bitlə kommunukasiyaya başlanılsın qeyd etdik duymeninVeziyyeti =digitalRead(duymeninPini); void loop() təkrarlanaraq dövr edən funksiyanın daxilində, digitalRead-in düyməninPini-ndən aldığı dəyəri duymeninVeziyyeti dəyişəninə mənimsətdik. digitalRead düyməyə hər dəfə basıldıqda həmin dəyərin 0 və ya 1 olduğunu oxuyur. if (duymeninVeziyyeti != duymeninEvelkiVeziyyeti) { Əgər düymənin açıq-qapanma vəziyyəti, düymənin əvvəlki vəziyyətinə bərabər deyilsə, != işarəsi bərabər deyil operatorudur, x != y (x bərabər deyil y) if (duymeninVeziyyeti ==HIGH) { Əgər düymənin vəziyyəti HIGH-ya bərabər yəni məntiqi 1 və ya basılıdırsa. = = işarəsi bərabərlik operatorudur duymeninBasilmaSayi++; Düymənin basılma sayı hər dəfə +1 dəfə artsın. Serial.println("qapali");
  • 37. Düyməyə basdıqda, ardıcıl monitorda yeni sətrdə qapalı yazısın göstərəcəkdir. Və bu sətrdən sonra yazılan alt sətrə düşəcəkdir Serial.print("duymenin sixilma sayi: "); Düyməyə hər dəfə sıxıldıqda, sıxılma sayı yazısı : ilə birlikdə sayıda ardıcıl olaraq yazılacaqdır Serial.println(duymeninBasilmaSayi); Düymənin basılma sayını hesabayıb göstərir. else { Serial.println("achiq"); } Düymə basılı deyilsə, ardıcıl monitorda achiq yazısı göstərsin. "" işarəsi hər hansı əvvəlcədən dəyişənə mənimsədilməyən bir söz, yazı yazılmasını istənilərsə qoyulur. delay(100); 100 milli saniyə gözlə if (duymeninBasilmaSayi % 4 == 0) { Əgər düymənin basılma sayının qalığı 0-ra bərabər olarsa, %4 bu o deməkdir ki məsələn düymeni 1 dəfə bassaq, 1%4=1 qalıq 1 olacaq, əgər 4 dəfə, 8 dəfə və.s bassaq 4%4=0 qalıq 0 olacaqdır. digitalWrite(ledinPini,HIGH); Qalığın 0-ra bərabərliyi ödənilərsə, ledinPini HIGH olsun, yəni led yansın else { digitalWrite(ledinPini,LOW); Elə deyilsə, ledinPini LOW olsun, yəni led sönsün 11.10. # define, #include, tone. Buzzer Basılan düymələrə uyğun olaraq səslər(tone keyboard) #define makrosu. #define makrosu(komanda), global dəyişənləri mənimsətdiyimiz yerə, yəni setup-ın üstündəki yerə yazılır. #define bir dəyişən mənimsətmə metodu deyil. Bir tapşırıq(assignment) komandası deyə bilərik buna. İstifadə şəkli və ya sintaksisi: #define ad dəyər Ad hissəsi dəyişən adı, dəyər isə bu dəyişənin qarşılığı(rəqəmlə əvəzlənməsi) olacaqdır. Bu makrosu yazınca, Arduino IDE programı, kodu Arduinoya yükləmədən əvvəl ad sözünün olduğu yerə ad hissəsinin qarşısında yazılmış dəyəri kopyalamış olacaqdır. Yəni #define ledPin 10 makrosunu yazmış olsaq, arduino kompayleri, kodun içərisindəki bütün ledPin sözlərini 10 ilə əvəz edəcəkdir. Bu da pinləri const int ilə mənimsətməkdən daha yaxşıdır. Çünki Aduinonun kod yaddaşında "heç bir yer tutmaz"!. Təyin makrosları hər hansı bir ifadənin başqa ifadə ilə əvəz edilməsinə xidmət edir. Misal üçün əgər biz proqramın hər-hansı yerində #define MAX_QIYMET 1024 sətrini yerləşdiririksə onda kompilyator proqramda MAX_QIYMET ifadəsinə rast gəldiyi bütün yerlərdə onu 1024 ilə əvəz edəcək. #include. #include, sketçinizə kənar kitabxanaları daxil etmək üçün istifadə edilir. Bu programçıya geniş bir standart C kitabxana qrupununa(əvvəlcədən hazırlanmış funksiya qrupları) və ayrıca xüsusilə Arduino üçün yazılmış kitabxanalara keçid etməsini təmin edir. #define-yə bənzər #include-nin də nöqtəli vergül sonlandırıcısı yoxdur, əgər sonunda ; işarəsi qoyularsa mütləq error göstərmiş olacaqdır. Arduinoda istifadə şəkli belədir:
  • 38. #include<Servo.h> Burada <servo.h> arduino IDE-sinə əvvəlcədən yazılmış servo mühərrik kitabxanasıdır, hansılarki bu kitabxanaları siz özünüzdə hazırlaya bilərsiz(Dərs 8-ə baxa bilərsiz). tone(). Təyin etdiyimiz pindən, istənilən tezlikdə kvadrat dalğa ala bilməyimiz üçün irəli sürülmüş(advanced) funksiyadır. Bu funksiyanın verdiyi siqnal 50% işçi tsiklinə malikdir. Pin, zil səs çalmaq üçün, piezo zummer və ya başqa bir səs ucaldıcıya(dinamik) bağlana bilər. Bir dəfə(an) üçün bir zil səs istehsal edir. Əgər zil səsi fərqli bir pində çalınırsa, tone() funksiyasını istifadə etməyin bir effekti olmuyacaqdır, yəni birini işlətmək üçün digərini söndürmək lazımdır proqramdan. Zil səsi eyni pin üzərində çalınırsa, çağrılan tezliyi tənzimləyəcəkdir. Yox əgər bir neçə pində zil səs çıxarma proyektini qurmaq istəyirsizsə, bu zaman bir sonraki pində tone() istifadə etməzdən əvvəl bir pin üzərində noTone() funksiyasını istifadə etmək lazımdır. Yazılış sintaksı aşağıdakı kimidir: tone(pin, tezlik) tone(pin, tezlik, müddət) pin - arduinoda buzzer üçün isitfadə ediləcək pin tezlik- buzzere verilə tezlik və ya pinin istehsal etdiyi tezlik, unsigned int verilən dəyər çərçivəsində müddət- tezliyin verilmə müddəti və ya zil səsin müddəti, unsigned long verilən dəyər çərçivəsində Qeyd: tone() funksiyası daxilində müddəti qey etməsəz, zil səsi dayanmadan çalacaqdır. Buzzer. Buzzer(zummer) verilən gərginliyə görə fərqli səs siqnallarını çıxaran bir cihazdır. Səs ucaldıcılar kimi yüksək səs yox sadəcə biiip kimi səs çıxarmaq üçün istifadə edilir, demək olar ki elektronikanı əhatə etmiş bütün sistemlərdə istifadə edilir(siqnalizasiya və xəbərdarlıq kimi xırda sistemlərdə). Buzzerin səsi iki usulla dəyişilə bilir: gərginlik və tezliklə. Ən çox istifadə ediləni buzzerin girişinə verilən gərginlik sabit saxlayaraq tezliyini dəyişmə qaydasıdır.Mexaniki, elektromexaniki və ya piezoelektrik işləmə prinsipinə əsaslanır. Daxilindəki induktiv elementdəən cərəyan keçdikdə,və bu elementdən diskə verilən titrəyişlərin nəticəsində diskdə səs çıxmağa başlayar. Səs səviyyələri 85-105dB arasındadır. Buzzerlərlə arduino proyektlərində melodiyalar yaratmaq olur. + və - ucları vardır, sabit cərəyanla çalışırlar. Buzzeri 5 V gərginliyə bir başa qoşmaq olmaz, bunu buzzerlə dövrəyə ardıcıl olaraq 100 Om müqavimət qoşulmalıdır.
  • 39. Şəkil 11.10.1. Buzzer QHM-Qüvvəyə həssas müqavimət(force sensing resistor). İnterlink Electronics qüvvəyə həssas müqaviməti(sensor) passiv elementdir. Üzərinə tətbiq edilmiş qüvvəni artırsaq, malik olduğu müavimət qüvvəyə əks olaraq azalacaqdır və bu sayədə təzyiq və ya qüvvə dəyərlərini ölçə bilərik.Əslində bu elementlər, ən dəqiq ölçmələrdə istifadə edilməyə yararsızdırlar, çünki mühitə uyğun olaraq müqavimətləri yanlış ola bilərlər. Aktiv hala gəlməsi üçün üzərinə 2 qram qüvvə kifayətdir. Şəkil 11.10.2. Qüvvəyə həssas rezistor növləri Basılan düymələrə uyğun olaraq Buzzerin səsi(tone keyboard) Qeyd etmək istəyirəm ki, biz bu dövrəmizi adi buttonlar ilə də gerçəkləşdirə bilərik, sadəcə QHM kimi effektiv səs verməyəcəkdir. Çünki, button-da konkret olaraq bir müqavimət (qapalı )var, QHM isə basdığımız qüvvəyə əsasən buzzerdə səs çıxaracaqdır. Belə deyək, analog düymə və rəqəmsal düymə. Sxem:
  • 40. Şəkil 11.10.3. Dövrədə istifadə edilən elementlər: 1. 8 Om buzzer və ya səs uladıcı 2. 3 ədəd QHM 3. 3 ədəd 10 KOm rezistor 4. 1 ədəd 100 Om rezistor
  • 41. 5. Breadboard Kodlar: #include"pitches.h" constint QHM = 10; int notes[] = { NOTE_A4, NOTE_B4, NOTE_C3 }; voidsetup() { } voidloop() { for (int thisSensor = 0; thisSensor < 3; thisSensor++) { int sensorReading =analogRead(thisSensor); if (sensorReading > QHM) { tone(8, notes[thisSensor], 20); }}} Kodların izahı: #include"pitches.h" Tezlik notlarından ibarət olan kitabxananın adıdır. Arduino IDE daxilində bu kitabxana mövcud olduğundan, əlavə olaraq kitabxana kodu yazmağa ehtiyac yoxdur. Kitabxana aşağıdakı kodlardan hazırlanıbdır: #define NOTE_B0 31 #define NOTE_C1 33 #define NOTE_CS1 35 #define NOTE_D1 37 #define NOTE_DS1 39 #define NOTE_E1 41 #define NOTE_F1 44 #define NOTE_FS1 46 #define NOTE_G1 49 #define NOTE_GS1 52 #define NOTE_A1 55 #define NOTE_AS1 58 #define NOTE_B1 62 #define NOTE_C2 65 #define NOTE_CS2 69 #define NOTE_D2 73 #define NOTE_DS2 78 #define NOTE_E2 82 #define NOTE_F2 87 #define NOTE_FS2 93 #define NOTE_G2 98 #define NOTE_GS2 104 #define NOTE_A2 110
  • 42. #define NOTE_AS2 117 #define NOTE_B2 123 #define NOTE_C3 131 #define NOTE_CS3 139 #define NOTE_D3 147 #define NOTE_DS3 156 #define NOTE_E3 165 #define NOTE_F3 175 #define NOTE_FS3 185 #define NOTE_G3 196 #define NOTE_GS3 208 #define NOTE_A3 220 #define NOTE_AS3 233 #define NOTE_B3 247 #define NOTE_C4 262 #define NOTE_CS4 277 #define NOTE_D4 294 #define NOTE_DS4 311 #define NOTE_E4 330 #define NOTE_F4 349 #define NOTE_FS4 370 #define NOTE_G4 392 #define NOTE_GS4 415 #define NOTE_A4 440 #define NOTE_AS4 466 #define NOTE_B4 494 #define NOTE_C5 523 #define NOTE_CS5 554 #define NOTE_D5 587 #define NOTE_DS5 622 #define NOTE_E5 659 #define NOTE_F5 698 #define NOTE_FS5 740 #define NOTE_G5 784 #define NOTE_GS5 831 #define NOTE_A5 880 #define NOTE_AS5 932 #define NOTE_B5 988 #define NOTE_C6 1047 #define NOTE_CS6 1109 #define NOTE_D6 1175 #define NOTE_DS6 1245 #define NOTE_E6 1319 #define NOTE_F6 1397 #define NOTE_FS6 1480 #define NOTE_G6 1568
  • 43. #define NOTE_GS6 1661 #define NOTE_A6 1760 #define NOTE_AS6 1865 #define NOTE_B6 1976 #define NOTE_C7 2093 #define NOTE_CS7 2217 #define NOTE_D7 2349 #define NOTE_DS7 2489 #define NOTE_E7 2637 #define NOTE_F7 2794 #define NOTE_FS7 2960 #define NOTE_G7 3136 #define NOTE_GS7 3322 #define NOTE_A7 3520 #define NOTE_AS7 3729 #define NOTE_B7 3951 #define NOTE_C8 4186 #define NOTE_CS8 4435 #define NOTE_D8 4699 #define NOTE_DS8 4978 Burada NOTE qarşısında yazılmış B0, C1, CS1 və.s adları, notlara verilmiş adlardır, bu adların qarşısında olan 31, 33, 35 və.s rəqəmlər isə bu notların tezlikləridir. Hansılar ki, tone() funksiyası ilə bunlara müraciət etmiş olarıq. constint QHM = 10; QHM-ə verilən dəyər int notes[] = { NOTE_A4, NOTE_B4, NOTE_C3 }; Basılan üç QHM-ə uyğun olan fərqli tezlikdə notları massiv içərisində mənimsətdik. Biz yuxarıda #define ilə verilənlərdən istəlinlən notu burada qeyd edə bilərik, hər notun öz tezliyi , hər tezliyin öz səsi vardır. for (int thisSensor = 0; thisSensor < 3; thisSensor++) { for dövr etməsi daxilində, hər bir QHM sensora uyğun mənimsədilmə, 3 ədəd sensor üçün int sensorReading =analogRead(thisSensor); Düyməyə və ya sensora basılan dəyərlər analogRead tərəfindən oxunsun və sensorReading dəyişəninə mənimsədilsin. if (sensorReading > QHM) { Əgər sensora basdığımız dəyər, QHM -ə verdiyimiz dəyərdən böyükdürsə. Bu dəyər bizim sensora nə qədər möhkəm basdığımızdan asılıdır. tone(8, notes[thisSensor], 20); tone funksiyası 8 ci pinə qoşulan səs ucaldıcıya 20 millisaniyə müddətində basılan düyməyə uyğn olan notların səsini göndərmiş olacaqdır. 11.11. Melodiyanın çalınması Sxem:
  • 44. Şəkil 11.11 Sxemdə istifadə edilən elementlər: 1. Buzzer Kodlar: #include"pitches.h" int melody[] = { NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_C4
  • 45. }; int noteDurations[] = { 4, 8, 8, 4, 4, 4, 4, 4 }; voidsetup() { for (int thisNote = 0; thisNote < 8; thisNote++) { int noteDuration = 1000 / noteDurations[thisNote]; tone(8, melody[thisNote], noteDuration); int pauseBetweenNotes = noteDuration * 1.30; delay(pauseBetweenNotes); noTone(8); }} voidloop() { // melodiyanın təkrar olunmasını istəsək bura yazın } Kodların izahı: #include"pitches.h" Notlardan ibarət olan hazır kitabxanadır, bu kitabxana kodları 11.20-ci mövzuda verilmişdir. int melody[] = { NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_C4 }; Kitabxana daxilində yerləşən kodların 8 notu(istəyə bağlı olaraq) melody massiv dəyişəninə mənimsədildi int noteDurations[] = { 4, 8, 8, 4, 4, 4, 4, 4 }; Bu səkkiz notun ardıcıl olaraq çalınma müddətləri noteDuration massivinə mənimsədildi. for (int thisNote = 0; thisNote < 8; thisNote++) { Bu 8 notların ardıcıl olaraq çalınmaları for dövretməsində qey olundu int noteDuration = 1000 / noteDurations[thisNote]; Notların çalınma müddətini bir daha biz istədiyimiz zamana görə hesablasın, məsələn 1000:4, 1000:8 və.s tone(8, melody[thisNote], noteDuration); tone funksiyasında 8 ci pində, melodiyaların, qeyd olunmuş zaman müddətində çalınması qeyd olundu int pauseBetweenNotes = noteDuration * 1.30; delay(pauseBetweenNotes); Hesablanmış zamanı 1.30-a vuraraq, hər not arasındakı gecikmə hesablandı 11.12. Bir neçə buzzerdə melodiya çalınması Sxem:
  • 46. Şəkil 11.12.1 Sxemdə istifadə edilən elementlər: 1. 3 ədəd buzzer Kodlar: voidsetup() { } voidloop() { noTone(8); tone(6, 440, 200); delay(200); noTone(6); tone(7, 494, 500); delay(500); noTone(7); tone(8, 523, 300);
  • 47. delay(300); } Kodların izahı: noTone(8); 8 ci pin sönsün tone(6, 440, 200); 6 cı pin 440Hers tezliklə, 200millinasiyə müddətində çalsın delay(200); 200 millisaniyə gözləsin noTone(6); 6 cı pin sönsün və ya dayansın tone(7, 494, 500); 7 si pin, 494 hers tezlikdə, 500 millisaniyə çalsın delay(500); 500 millisaniyə gözləsin noTone(7); 7 ci pin dayansın tone(8, 523, 300); 8 ci pin, 523 tezliklə, 300 millisaniyə müddətində çalsın 11.13. map() riyazi funksiyası, LDR(fotorezistor). Arduino tone() ilə analoq girişin izlənilməsi. Bu dərsimizdə, LDR fotorezistoru istifadə edərək, analog girişdə olan dəyişmələri, tone funksiyası ilə izləmiş olacağıq, yəni bu dəyişmələr buzzerdən hiss oluncaqdır. Əvvəlcə, bu dövrənin kodlanmasında istifadə edilən , map() riyazi operatorunu öyrənək. map(); riyazi funksiyası. Bu funksiya, tam ədədlər aralığını bir başqa tam ədədlər aralığına çevirmək üçün istifadə edilir. Nümunə göstərmiş olsaq, arduinoda analog pindən olan 0-1023 dəyərini, map funksiyası ilə istənilən aralığa çevirə bilərik, məsələn 0- 512 dəyərinə. int netice = map(oxunan deyer, a, a1, b, b1 ); oxunan dəyər- analogRead funksiyasının oxuduğu dəyər, dəyişənə mənimsədilmiş dəyər a- oxunan dəyərin ən kiçik qiyməti a1- oxunan dəyərin ən böyük qiyməti b- çevirmək istədiyimiz dəyərin ən kiçik dəyəri b1- çevimək istədiyimiz ən böyük dəyər LDR. Açılışı Light Dependent Resistor(iqdan asılı müqavimət) olan LDR, bir foto müqavimətdir. Foto müqavimətlər, işıq şiddətinə bağlı olaraq müqavimətini dəyişən elektron bir komponentdir. LDR işıq fotonlarını qəbul edə biləcək yarımkeçirici material olan "kadmium sulfid" (CdS) dən emal edilmişdir. LDR-in üst səthi gələn fotonları görməsi və ya qəbul edə bilməsi üçün şəffaf bir material ilə örtülmüşdür.
  • 48. Şəkil 11.13.1 LDR üzərinə işıq fotonları düşəndə kadmium sulfid də olan sərbəst elektronlar yer dəyişdirir. LDR üzərinə düşən foton sayı artdıqca yer dəyişdirən elektron sayı da artacaqdır. Elektronların yer dəyişdirməsi nəticəsində LDR nin müqavimətinin dəyişməsinə səbəb olur. Bu dəyişikliyi Arduino da analoq dəyəri oxuyaraq görə bilərsiz. LDR də işıqlı mühitdə müqavimət minimumdur. Eyni şəkildə, qaranlıq bir mühitdə maksimumdur deyə bilərik. LDR-lər həm dəyişən cərəyan, həm də sabit cərəyanda eyni iş prinsipi ilə çalışırlar dolayısı ilə həm dəyişən həm də sabit cərəyanda istifadə edilə bilərlər. LDR-lər ən çox yaşıl işığa həssasdırlar. LDR -dəki elementlərin işığa həssaslığı işığı qəbul edən səthin böyüklüyü və üzərində yer alan linzaya görə dəyişiklik göstərir. Bəbək tipi linza istifadə edilən ldrlerde həssaslıq daha yüksək olur. Quruluşu etibarilə LDR-lər yüksək temperatura tab gətirməzlər və sıradan çıxarlar. Maksimum çalışma temperaturu 60 °c dir. LDR model nömrələri bu şəkildədir: BRY33, LDR03, LDR05, LDR07, OPR60. Çox qaranlıq mühitdə ldr müqaviməti 1MOm-dur (1 milyon Om).. Üzərinə işıq düşəndə müqaviməti bir neçə KOm-a qədər düşür. (1kilo Om 1000 Om) Sxem:
  • 49. . Şəkil 11.13.2 Sxemdə istifadə edilən elementlər: 1. Fotorezistor(LDR) 2. Rezistor 100 Om və 4,7KOm 3. Buzzer Kodlar: voidsetup() { Serial.begin(9600); } voidloop() { int sensoroxudugu =analogRead(A0); Serial.println(sensoroxudugu); int netice =map(sensoroxudugu, 400, 1000, 120, 1500); tone(9, netice, 10);
  • 50. delay(1); } Kodların izahı: voidsetup() { Serial.begin(9600); } void setup quraşdırma sketçində yalnız ardıcıl monitorda saniyədə 9600 bit göndərişi qeyd edilir voidloop() { int sensoroxudugu =analogRead(A0); analogRead funksiyasının A0 pinindən oxuduğu dəyəri, sensoroxudugu dəyişəninə mənimsədildi Serial.println(sensoroxudugu); A0 pinindən oxunan dəyər ardıcıl monitorda göstərilsin int netice =map(sensoroxudugu, 400, 1000, 120, 1500); A0 pinindən oxunan dəyər, map riyazi funksiyası ilə 120-1500 aralığına çevrilsin və netice dəyişəninə mənimsədilsin tone(9, netice, 10); tone funksiyasında, 9 cu pindən çıxış alınacaq buzzerə veriləcək, netice dəyişənində olan dəyərlərə uyğun olaraq tezliyi qeyd edilir, tezliyin müddəti 10 millisaniyə olsun delay(1); Kodların void loop sketçinin içərisində 1 millisaniyə ilə oxunub dövr etməsi zamanı 11.14. Analoq giriş/çıxış ardıcıl monitor Bu dərsimizdə, anog giriş pinini necə oxuyacağımızı, alınan nəticəni map() operatporu ilə 0- 255 aralığına bərabərləşdirdiyimizi, LED-in parlaqlığının artırıb azaltması üçün, PWM -i tənizmləməyimizi və nəticəni ardıcıl monitorda göstərilməsini öyrənərik. Sxem:
  • 51. Şəkil 11.14.1. Sxemdə istifadə edilən elementlər: 1. Potensiometr
  • 52. 2. LED 3. 220 Om rezistor 4. Multimetr(praktik test məqsədli) Kodlar: constint analogGirisPin = A0; constint analogCixisPin = 9; voidsetup() { Serial.begin(9600); } voidloop() { int girisDeyer =analogRead(analogGirisPin); int cixisDeyer =map(girisDeyer, 0, 1023, 0, 255); analogWrite( analogCixisPin, cixisDeyer); Serial.print("pot = "); Serial.print(girisDeyer); Serial.print("t potCevrilmis = "); Serial.println(cixisDeyer); delay(2); } Kodların izahı: constint analogGirisPin = A0; analog girişin A0 pini olduğu və analogGirispin dəyişəninə mənimsədilməsi, potensiomentin orta elektrodu A0 pininə bağlanır constint analogCixisPin = 9; analog çıxışın 9 cu rəqəmsal pini olduğu və analoqcixis pininə mənimsədilməsi, LED-in anodu və voltmetin + qütbü 9 cu pinə bağlanır voidsetup() { Serial.begin(9600); } ardıcıl monitorun 9600 bit/saniyəyə ayarlanması int girisDeyer =analogRead(analogGirisPin); analogRead funksiyası ilə A0 analoq girişdən oxunan dəyərin, girisDeyer dəyişəninə mənimsədilməsi int cixisDeyer =map(girisDeyer, 0, 1023, 0, 255); A0 -dan oxunan 0 - 1023 arası dəyərin, map() ilə 0-255 arasındakı dəyərə mütənasib olaraq çevrilməsi, və bu dəyərin cixisDeyer dəyişəninə mənimsədilməsi. analogWrite( analogCixisPin, cixisDeyer); analogWrite funksiyası ilə, 9 cu rəqəmsal pinə, map() ilə alınan dəyər aralığının PWM formasında verilməsi, bu dəyər aralığı dute cycle adlanır. Serial.print("pot = "); Serial.print(girisDeyer); Potensiometri çevirdiyimizdə dəyərin birbaşa ardıcıl monitorda göstərilməsi Serial.print("t potCevrilmis = "); Serial.println(cixisDeyer);
  • 53. Potensiometrin dəyər aralğını map() ilə çevirdikən sonra monitorda göstərilməsi, t - burada pot dəyər ilə potCevrilmis deyer yazılarını bir-birindən uzaq məsafədə yazılması üçün nəzərdə tutulubdur, println isə növbəti yazını bir sətr altda göstərilməsi üçün nəzərdə tutulmuşdur. 11.15. LED-in yanıb-sönmə zamanının idarə edilməsi, Analoq giriş. Bu dərsimizdə, giriş analoq dəyəyərə(müqavimətə) bağlı olaraq, çıxış rəqəmsal pinimizin delay zamanını necə idarə edəcəyimizi öyrənərik. Analoq giriş olaraq dövrədə istəyə bağlı olaraq, LDR-fotorezistor, və ya Potensiometr ikisindən birini istifadə edə bilərsiz. Sxem:
  • 54. Sxemdə istifadə edilən elementlər: 1. LED 2. 220 Om müqavimət 3. Potensiometr Kodlar: int potensiometr = A0; int ledPin = 13; voidsetup() { pinMode(ledPin,OUTPUT); } voidloop() { int zaman =analogRead(potensiometr); digitalWrite(ledPin,HIGH); delay(zaman); digitalWrite(ledPin,LOW); delay(zaman); } Kodların izahı: int potensiometr = A0; A0 analoq pininə potensiometrin orta ayağı bağlanması, və bu pindən analoq dəyərin oxunması, potensiometr dəyişəninə mənimsədilməsi int ledPin = 13; 13 cü pin çıxış rəqəmsal pinimizdir, bu pinə LED bağlanacaqdır. ledPin dəyişəninə mənimsədilməsi voidsetup() {
  • 55. pinMode(ledPin,OUTPUT); } 13 cü pinimiz çıxışdır int zaman =analogRead(potensiometr); analogRead funksiyamız A0 dəyərini oxuyacaqdır, oxunan dəyər zaman dəyişəninə mənimsədiləcəkdir digitalWrite(ledPin,HIGH); digitalWrite funksiyası 13-cü pinimzi hıgh(məntiqi 1 və ya 5V) eləsin. LED yanacaq delay(zaman); delay() gecikmə funksiyası zaman dəyişəninin dəyərinə uyğun olaraq gözləmə verəcək digitalWrite(ledPin,LOW); Gözləmədən sonra, 13 cü pini LOW(məntiqi 0 və ya 0V ) edəcəkdir. LED sönmüş olacaq delay(zaman); Yenidən zaman dəyişəninin dəyərinə uyğun olaraq gözləmə və ya gecikmə olacaq. Bu zaman potensiometrin vəziyyətinə, doğru demiş olsaq müqavimətinə bağlıdır. Bu qaydada void loop-da dövr etmə gedəcəkdir. 11.16. LED-lərin parlaqlıqları artıb-azalaraq növbəli şəkildə yanıb-sönməsi Bu dərsimizdə, LED-in yanıb sönməsilə birgə, onların parlaqlıqlarını eyni dövrədə tətbiq edib öyrənərik. Dövrədə 12 ədəd LED növbəli şəkildə parlaqlığı artıb-azalaraq yanıb sönmüş olacaqdır. Sxem:
  • 56. Şəkil 11.16.1 Sxemdə istifadə olunan elementlər: 1. 12 ədəd LED 2. 12 ədəd 220 Om rezistor Kodlar: constint ikincipin = 2; constint onucuncupin = 13; voidsetup() { for (int i = ikincipin; i <= onucuncupin; i++) { pinMode(i,OUTPUT); }} voidloop() { for (int i = ikincipin; i <= onucuncupin; i++) { for (int parlaqliq = 0; parlaqliq < 255; parlaqliq++) { analogWrite(i, parlaqliq); delay(2); } for (int parlaqliq = 255; parlaqliq >= 0; parlaqliq--) { analogWrite(i, parlaqliq); delay(2); } delay(100); }} Kodların izahı: constint ikincipin = 2; constint onucuncupin = 13; Arduino kartının 2 ci və 13 rəqəmsal pinlərinin mənimsədilməsi voidsetup() {
  • 57. for (int i = ikincipin; i <= onucuncupin; i++) { pinMode(i,OUTPUT); }} setutp-quraşdırma hissəsində, for dövr etməsi daxilində ikinci pini hər hansı bir i dəyişəninə mənimsədilməsi, i dəyişənimiz 13cü pinə kiçik bərabər götürülür, bu o deməkdir ik i(və ya ikici pin) 13 cü pin arasında 12 ədəd pin var, daha sonra i++ yazırıq bunun mənası 2ci pindən 13 cu pinə qədər , 13 cu pin daxil olmaqla artan istiqamətə getsin, və for daxilində pinMode funksiyası ilə pinlərin çıxış olduğunu qeyd elədik. voidloop() { for (int i = ikincipin; i <= onucuncupin; i++) { Bu prosesin dövr etməsi üçün, loop daxilindədə eyni şeyi qey edirik for (int parlaqliq = 0; parlaqliq < 255; parlaqliq++) { for dövr etməsi daxilinə, led-in pwm şəkildə, yəni artan istiqamətdə parlamasını qeyd edirik, parlaqliq++ , 0-dan 255-ə qədər dytu cucle-imizin artmış olduğunu qeyd elədik. analogWrite(i, parlaqliq); analogWrite analoq funksiyası daxilinə i dəyişənimizin yəni, 2 ci pindən 13 cü pinə qədər bağlanan LED-lərin artan istiqamətdə, 0-255 aralığında pilləvari parlaqlığını artan istiqamətdə qeyd elədik. delay(2); 2 milli saniyə gözlənilsin for (int parlaqliq = 255; parlaqliq >= 0; parlaqliq--) { analogWrite(i, parlaqliq); delay(2); Bu səfər, azalan istiqamətdə kodları yazırıq, 255 - 0 aralığında azalma baş verəcək, LED-in parlaqlığı azalmağa başlayacaqdır. delay(100); 2 ci pindən 13 cü pinə kimi led-lərin parlaqlığı artıb azalaraq növbəli şəkildə artan istiqatdə yanıb söndükdən sonra, 100 mS sonra yenidən, bu prosesin təkrarlanması müddəti. Kodlanmada əsas fikir verilən məsələlər, for dövretmə funksiyasının daxilində yenidən for dövretməsi açılıbdır. Bu kodu daha da təkmilləşdirərək, LED-lərin sağa və sola hərəkət edərək, parlaqlıqlarını artırıb-azaldaraq yazmaq olar. Kodlar: constint ikincipin = 2; constint onucuncupin = 13; voidsetup() { for (int i = ikincipin; i <= onucuncupin; i++) { pinMode(i,OUTPUT); }} voidloop() { for (int i = ikincipin; i <= onucuncupin; i++) { for (int parlaqliq = 0; parlaqliq < 255; parlaqliq++) { analogWrite(i, parlaqliq); delay(2); } for (int parlaqliq = 255; parlaqliq >= 0; parlaqliq--) {
  • 58. analogWrite(i, parlaqliq); delay(2); } delay(200); } for (int i = onucuncupin; i >= ikincipin; i--) { for (int parlaqliq = 0; parlaqliq < 255; parlaqliq++) { analogWrite(i, parlaqliq); delay(2); } for (int parlaqliq = 255; parlaqliq >= 0; parlaqliq--) { analogWrite(i, parlaqliq); delay(2); } delay(200); }} Kodların izahı: Gördüyünz kimi, kodlar eyni şəkildə yazılıbdır, lakin for (int i = onucuncupin; i >= ikincipin; i--) { for dövretməsi daxilində LED-in yanıb-sönməsini geriyə azalan istiqamətdə yanıb sönməsi qeyd edilmişdir. 11.17. while(), constrain(). Analog qiymətin kalibrasiya olunması. while() dövretməsi. Bir otaqda 100 ədəd qutu olduğunu və bu qutuladan neçəsinin boş, neçəsinin dolu olduğunu öyrənmək istədiyimizi fərz edək. Bunun üçün qutuları bir-bir açıb qutuların dolu olub-olmadığına baxmalıyıq. Buna oxşar əməliyyatları proqramlaşdırmada da yerinə yetirərkən eyni üsuldan istifadə etməliyik. Yazacağımız xəyali proqram qutuları bir-bir açıb hansının dolu, hansının boş olmasını yoxlamalıdır. 100 dəfə qutuları yoxlamaq isə bir xeyli vaxtımızı alacaq. Proqramlaşdırmada sırf bu cür ardıcıl əməliyyatları qısa şəkildə yerinə yetirmək üçün, eyni bir əməliyyatı bir neçə dəfə təkrarlamaq üçün bir sıra operatorlar mövcuddur. Bu operatorlardan biri də while operatorudur. Bu operator, bir şərt ödəndiyi müddətcə bir əməliyyatı yerinə yetirmək üçündür. Operatorun istifadə qaydası if operatoruna oxşardır. Əvvəlcə operatorun adı yazılır, sonra mötərizə daxilində şərt, sonra isə fiqurlu mötərizələr arasında əməliyyatlar yazılır. Nümunə bir proqramda bu operatordan istifadə edək. Sintaks şəkli aşağıdakı kimidir: while(şərt) { şərt ödənilsə, bura yazılan kodlar işləsin. } int i=0; while(i<10){ Serial.println("While"); } Proqramı işlətdikdən sonra, alt-alta daima «While» sözünün çap olunduğunu görəcəyik. Çünki, operatorda şərt olaraq i dəyişəninin 10-dan kiçik olduğu halları yazmışıq. Bu dəyişən isə 0-a bərabərdir və həmişə 10-dan kiçikdir. Buna görə də operatorun daxilindəki əməliyyatlar
  • 59. həmişə, sonsuzluğa qədər işləməyə davam edəcək, yəni, ardıcıl monitorda sonsuz sayda alt-alta «While» yazısı çap olunacaq. «While» operatorunda ilk olaraq yazdığımız şərt yoxlanılır. Burada yazdığımız şərt i dəyişəninin 10-dan kiçik olmasıdır. Şərt ödəndiyi üçün ilk olaraq əməliyyatlar yerinə yetirilir. Əməliyyatlar bir dəfə yerinə yetirildikdən sonra, operator yenidən əvvələ qayıdaraq şərti bir daha yoxlayır. Şərt doğru olarsa yenidən əməliyyatlar aparılır. Bu proses daimi olaraq davam edir. Yuxarıdakı nümunədə də şərt həmişə ödənəcəyinə görə, əməliyyatlar həmişə yerinə yetirilir. İndi isə əməliyyatları sonsuz sayda yox, 5 dəfə yerinə yetirməyə çalışaq. Bunun üçün yuxarıdakı kodda kiçik bir dəyişiklik edəcəyik. int i=0; while(i<5){ Serial.println("While"); i++; } Burada ilk olaraq i dəyişəninin qiyməti 0-dır. İlk şərtdə dəyişənin qiymətinin 5-dən kiçik olub-olmaması yoxlanılır. Həqiqətən də 0 rəqəmi 5-dən kiçikdir. Şərt ödəndiyinə görə əməliyyatlar yerinə yetirilməyə başlanır. İlk əməliyyatımız sözün çap olunmasıdır. Sonrakı əməliyyatımız isə dəyişənin qiymətinin 1 vahid artmasıdır. İlk dövrün sonunda dəyişənin qiyməti 1 vahid artaraq 1 olur. Artıq əməliyyatlar 5 dəfə yerinə yetirilib və i dəyişəninin qiyməti 5-ə bərabər olub. 5-ci dəfə əməliyyatlar yerinə yetirildikdən sonra, operator yeindən əvvələ qayıdaraq i dəyişəninin qiymətinin 5-dən kiçik olub olmadığını yoxlayır. Bu dəfə i dəyişəninin qiyməti 5-dir və 5-dən kiçik deyil, 4 olsa idi doğru olacaqdı. Beləliklə şərt ödənmir, şərt ödənmədiyinə görə, görə operator bu dəfə əməliyyatları yerinə yetirmir və operatorun işi sona çatmış olur. Bundan sonra artıq operatordan sonrakı əməliyyatlar yerinə yetirilməyə başlayır. while dövretməsini, bir dəfə çalışdırmaq istədiyimiz programlar içərisinə qoyaraq, sonsuz dövretmə yara bilər və programın istənilən nöqtəsində Arduinonu bloklaya bilər. while(true); və ya while(1); ifadələrinin olduğu sətirdə sonsuz dövretməyə daxil olunur və program o nöqtədə bloklanır və while daxilində dövr etmə dayanmış olur, başa qayıtmır. Bunu aşağıdakı kod nümunəsində göstərə bilərik: voidsetup() { Serial.begin(9600); } voidloop() { int a = 0; while (a < 10){ a = a+1 ; Serial.println(a); delay(200); } Serial.println("donguden cıkıldı"); while(1); }
  • 60. constrain(x, a, b) riyazi funksiya. Verilən parametrlərə görə x dəyərinin a ilə b dəyərləri arasında olub olmadığını yoxlayır. Əgər x-in dəyəri a və b aralıqındadırsa, funksiya x dəyərini çevirir. a-dan kiçikdirsə, x-i a-ya çevirir, b-dən böyükdürsə b-yə çevirir. Sintaksis şəkli aşağıdakı kimidir: constrain(x, a, b); Analoq qiymətin kalibrasiya olunması. Bu dərsimizdə, analoq dəyəri müəyyən müddət ərzində, müəyyən dəyərə kalibrasiya edərək, rəqəmsal pindən alınan PWM dəyərini tənzimləməyi öyrənərik. Analoq giriş üçün həm LDR həm də potensiometr istifadə etmək olar, biz potensiometr istifadə edərik. Sxem:
  • 61. Şəkil 11.17.1. Sxemdə istifadə olunan elementlər: 1. 250 KOm potensiometr 2. 220 Om rezistor 3. LED Kodlar: constint potpin = A0; constint ledPin = 9; int potdanoxunan; int potMin = 0; int potMax = 1023; voidsetup() { pinMode(13,OUTPUT); digitalWrite(13,HIGH); while (millis() < 5000) { potdanoxunan =analogRead(potpin); if (potdanoxunan > potMax) { potMax = potdanoxunan; } if (potdanoxunan < potpin) { potMin = potdanoxunan; }} digitalWrite(13,LOW); } voidloop() {
  • 62. int potdanoxunan =analogRead(potpin); potdanoxunan =map(potdanoxunan, potMin, potMax, 0, 255); potdanoxunan =constrain(potdanoxunan, 0, 255); analogWrite(ledPin, potdanoxunan); } Kodların izahı: constint potpin = A0; constint ledPin = 9; A0 analoq pinini potpin(potensiometrin pini) sabit dəyişəninə mənimsədilməsi, 9 cu rəqəmsal pinin ledpin sabit dəyişəninə mənimsədilməsi. int potdanoxunan; Potensiometrdən oxunan adlı dəyişənin mənimsədilmsəi int potMin = 0; int potMax = 1023; Potensiometrin minimum və maksimum dəyişənlərinə minimum və maksimum dəyərlərin mənimsədilməsi voidsetup() { pinMode(13,OUTPUT); 13-cü pinin çıxış olunmasını qeyd etdik. digitalWrite(13, HIGH); 13 cu pin HIGH yəni məntiqi 1 olsun və ya 13 cü çıxış pinimiz 5V versin. while (millis() < 5000) { while dövretməsinə millis() funksiyası ilə arduinoya start veriləndən sonra, kodların oxunmasından 5 saniyə sonra şərtinin ödənilməsini qeyd elədik. millis(), delay gecikmə funksiyasından fərqli olaraq, həmdə kodların oxunma zamanını qeyd edir. Yəni 5 saniyə ərzində kalibrasiya etməlidir. potdanoxunan =analogRead(potpin); Potensiometrdən oxunan dəyər potdanoxunan dəyişəninə mənimsədildi if (potdanoxunan > potMax) { Əgər potdan oxunan dəyər, pot max=1023- dən böyükdürsə, maksimum dəyərin kalibrasiyaya alınması potMax = potdanoxunan; potesiometrdən oxunan dəyər, potensiometrin maksimum dəyəri olsun. if (potdanoxunan < potpin) { potMin = potdanoxunan; Əgər, oxunan dəyər potpin dəyərindən kiçikdirsə, minimum dəyərin kalibrasiyası, potensiometrdən oxunan dəyər potensiometrin minimum dəyəri olsun. digitalWrite(13,LOW); Kalibrasiya sona çatdıqdan sonra, 13 cü pindən gərginlik kəsilsin, və ya məntiqi 0 olsun. voidloop() { int potdanoxunan =analogRead(potpin); potdanoxunan =map(potdanoxunan, potMin, potMax, 0, 255); Analoq Read funksiyasının potensiometrdən oxunan dəyəri, potdan oxunan dəyişəninə mənimsədilsin, daha sonra bu dəyərin map() funksiyası ilə minimum maksimum dəyərləri arasında 0-255 aralıqlı dəyərə çevrilməsini qeyd elədik potdanoxunan =constrain(potdanoxunan, 0, 255);
  • 63. map ilə çevirdiyimiz 0 - 255 aralıqlı dəyəri yenidən constrain funksiyası ilə məhdudlaşmış şəkilə salırıq. Yəni, map ilə çevrilmiş potdan oxunan dəyər 0-255 aralğından kənardırsa 0-255 aralığına çevrilməsi baş versin. analogWrite(ledPin, potdanoxunan); Analoq write funksiyası məhz constrain funksiyasının aldığı dəyərə uyğun olaraq 9-cu rəqəmsal pinə bağlanan LED-ə PWM vermiş olacaqdır.