Arduino - Hızlı Kılavuz

Arduino, kullanımı kolay bir donanım ve yazılıma dayalı bir prototip platformudur (açık kaynak). Programlanabilen (mikrodenetleyici olarak anılan) bir devre kartı ve bilgisayar kodunu fiziksel karta yazmak ve yüklemek için kullanılan Arduino IDE (Entegre Geliştirme Ortamı) adlı hazır bir yazılımdan oluşur.

Temel özellikler şunlardır:

  • Arduino kartları, farklı sensörlerden gelen analog veya dijital giriş sinyallerini okuyabilir ve bir motoru çalıştırma, LED'i açma / kapama, buluta bağlanma ve diğer birçok işlem gibi bir çıkışa dönüştürebilir.

  • Arduino IDE (yükleme yazılımı olarak anılır) aracılığıyla kart üzerindeki mikro denetleyiciye bir dizi talimat göndererek kart işlevlerinizi kontrol edebilirsiniz.

  • Önceki programlanabilir devre kartlarının çoğunun aksine, Arduino'nun karta yeni bir kod yüklemek için fazladan bir donanıma (programcı adı verilir) ihtiyacı yoktur. Sadece bir USB kablosu kullanabilirsiniz.

  • Ek olarak, Arduino IDE, C ++ 'ın basitleştirilmiş bir sürümünü kullanır ve bu da programlamayı öğrenmeyi kolaylaştırır.

  • Son olarak, Arduino, mikro denetleyicinin işlevlerini daha erişilebilir bir pakete bölen standart bir form faktörü sağlar.

Pano Türleri

Kullanılan farklı mikrodenetleyicilere bağlı olarak çeşitli Arduino kartları mevcuttur. Ancak, tüm Arduino kartlarının ortak bir yönü vardır: Arduino IDE aracılığıyla programlanırlar.

Farklılıklar, giriş ve çıkışların sayısına (tek bir kart üzerinde kullanabileceğiniz sensör, LED ve düğme sayısı), hız, çalışma voltajı, form faktörü vb. ayrı olarak satın almanız gereken arabirim (donanım). Bazıları doğrudan 3.7V pil ile çalışabilirken, diğerleri en az 5V'a ihtiyaç duyar.

İşte mevcut farklı Arduino kartlarının bir listesi.

Arduino boards based on ATMEGA328 microcontroller

Kurul adı Çalışma Volt Saat hızı Dijital g / ç Analog Girişler PWM UART Programlama Arayüzü
Arduino Uno R3 5V 16 MHz 14 6 6 1 ATMega16U2 üzerinden USB
Arduino Uno R3 SMD 5V 16 MHz 14 6 6 1 ATMega16U2 üzerinden USB
Kırmızı tahta 5V 16 MHz 14 6 6 1 FTDI üzerinden USB
Arduino Pro 3.3v / 8 MHz 3.3V 8 MHz 14 6 6 1 FTDI Uyumlu Başlık
Arduino Pro 5V / 16MHz 5V 16 MHz 14 6 6 1 FTDI Uyumlu Başlık
Arduino mini 05 5V 16 MHz 14 8 6 1 FTDI Uyumlu Başlık
Arduino Pro mini 3.3v / 8mhz 3.3V 8 MHz 14 8 6 1 FTDI Uyumlu Başlık
Arduino Pro mini 5v / 16mhz 5V 16 MHz 14 8 6 1 FTDI Uyumlu Başlık
Arduino Ethernet 5V 16 MHz 14 6 6 1 FTDI Uyumlu Başlık
Arduino Fio 3.3V 8 MHz 14 8 6 1 FTDI Uyumlu Başlık
LilyPad Arduino 328 ana kartı 3.3V 8 MHz 14 6 6 1 FTDI Uyumlu Başlık
LilyPad Arduino basit kurulu 3.3V 8 MHz 9 4 5 0 FTDI Uyumlu Başlık

Arduino boards based on ATMEGA32u4 microcontroller

Kurul adı Çalışma Volt Saat hızı Dijital g / ç Analog Girişler PWM UART Programlama Arayüzü
Arduino Leonardo 5V 16 MHz 20 12 7 1 Yerel USB
Pro mikro 5V / 16MHz 5V 16 MHz 14 6 6 1 Yerel USB
Pro micro 3.3V / 8MHz 5V 16 MHz 14 6 6 1 Yerel USB
LilyPad Arduino USB 3.3V 8 MHz 14 6 6 1 Yerel USB

Arduino boards based on ATMEGA2560 microcontroller

Kurul adı Çalışma Volt Saat hızı Dijital g / ç Analog Girişler PWM UART Programlama Arayüzü
Arduino Mega 2560 R3 5V 16 MHz 54 16 14 4 ATMega16U2B üzerinden USB
Mega Pro 3.3V 3.3V 8 MHz 54 16 14 4 FTDI Uyumlu Başlık
Mega Pro 5V 5V 16 MHz 54 16 14 4 FTDI Uyumlu Başlık
Mega Pro Mini 3.3V 3.3V 8 MHz 54 16 14 4 FTDI Uyumlu Başlık

Arduino boards based on AT91SAM3X8E microcontroller

Kurul adı Çalışma Volt Saat hızı Dijital g / ç Analog Girişler PWM UART Programlama Arayüzü
Arduino Mega 2560 R3 3.3V 84 MHz 54 12 12 4 USB yerel

Bu bölümde, Arduino kartındaki farklı bileşenleri öğreneceğiz. Arduino UNO kartını inceleyeceğiz çünkü Arduino anakart ailesindeki en popüler karttır. Ek olarak, elektronik ve kodlamaya başlamak için en iyi karttır. Bazı anakartlar aşağıda verilenden biraz farklı görünür, ancak çoğu Arduino bu bileşenlerin çoğuna ortaktır.

Power USB

Arduino kartı, bilgisayarınızdan USB kablosu kullanılarak çalıştırılabilir. Tek yapmanız gereken USB kablosunu USB bağlantısına bağlamaktır (1).

Power (Barrel Jack)

Arduino kartları, Namlu Jakına (2) bağlanarak doğrudan AC ana güç kaynağından çalıştırılabilir.

Voltage Regulator

Voltaj regülatörünün işlevi, Arduino kartına verilen voltajı kontrol etmek ve işlemci ve diğer elemanlar tarafından kullanılan DC voltajlarını dengelemektir.

Crystal Oscillator

Kristal osilatör, Arduino'nun zaman sorunlarıyla başa çıkmasına yardımcı olur. Arduino zamanı nasıl hesaplar? Cevap, kristal osilatörü kullanmaktır. Arduino kristalinin üstüne basılan sayı 16.000H9H'dir. Bize frekansın 16.000.000 Hertz veya 16 MHz olduğunu söyler.

Arduino Reset

Arduino kartınızı sıfırlayabilirsiniz, yani programınızı baştan başlatabilirsiniz. UNO kartını iki şekilde sıfırlayabilirsiniz. İlk olarak kart üzerindeki sıfırlama düğmesini (17) kullanarak. İkinci olarak, RESET (5) etiketli Arduino pinine harici bir sıfırlama düğmesi bağlayabilirsiniz.

Pins (3.3, 5, GND, Vin)

  • 3,3V (6) - Besleme 3,3 çıkış volt

  • 5V (7) - Besleme 5 çıkış volt

  • Arduino kartı ile kullanılan bileşenlerin çoğu 3,3 volt ve 5 volt ile sorunsuz çalışıyor.

  • GND (8) (Toprak) - Arduino'da, herhangi biri devrenizi topraklamak için kullanılabilecek birkaç GND pini vardır.

  • Vin (9) - Bu pin, Arduino kartına AC ana güç kaynağı gibi harici bir güç kaynağından güç sağlamak için de kullanılabilir.

Analog pins

Arduino UNO kartında A0'dan A5'e kadar altı analog giriş pini bulunur. Bu pinler, nem sensörü veya sıcaklık sensörü gibi analog bir sensörden gelen sinyali okuyabilir ve mikroişlemci tarafından okunabilen dijital bir değere dönüştürebilir.

Main microcontroller

Her Arduino kartının kendi mikrodenetleyicisi vardır (11). Tahtanızın beyni olarak varsayabilirsiniz. Arduino'daki ana IC (entegre devre), karttan panele biraz farklıdır. Mikrodenetleyiciler genellikle ATMEL Company'ye aittir. Arduino IDE'den yeni bir program yüklemeden önce kartınızın hangi IC'ye sahip olduğunu bilmelisiniz. Bu bilgi IC'nin üstünde mevcuttur. IC yapısı ve işlevleri hakkında daha fazla ayrıntı için, veri sayfasına başvurabilirsiniz.

ICSP pin

Çoğunlukla ICSP (12), MOSI, MISO, SCK, RESET, VCC ve GND'den oluşan Arduino için küçük bir programlama başlığı olan bir AVR'dir. Çıkışın bir "genişlemesi" olarak düşünülebilecek bir SPI (Seri Çevresel Arayüz) olarak adlandırılır. Aslında, çıkış cihazını SPI veriyolunun ana birimine bağlıyorsunuz.

Power LED indicator

Arduino'nuzu bir güç kaynağına taktığınızda, kartınızın doğru şekilde güç verildiğini belirtmek için bu LED yanmalıdır. Bu ışık yanmazsa, bağlantıda bir sorun var demektir.

TX and RX LEDs

Anakartınızda iki etiket bulacaksınız: TX (iletme) ve RX (alma). Arduino UNO kartında iki yerde görünürler. İlk olarak, seri iletişimden sorumlu pinleri göstermek için 0 ve 1 dijital pinlerinde. İkincisi, TX ve RX led (13). TX ledi seri veri gönderilirken farklı hızda yanıp söner. Yanıp sönme hızı, kartın kullandığı baud hızına bağlıdır. Alım işlemi sırasında RX yanıp söner.

Digital I/O

Arduino UNO kartı 14 dijital I / O pinine (15) (6 tanesi PWM (Darbe Genişliği Modülasyonu) çıkışı sağlar.Bu pinler mantık değerlerini (0 veya 1) okumak için giriş dijital pinleri olarak veya dijital olarak çalışacak şekilde yapılandırılabilir. LED'ler, röleler, vb. gibi farklı modülleri sürmek için çıkış pinleri. "~" etiketli pinler PWM oluşturmak için kullanılabilir.

AREF

AREF, Analog Referans anlamına gelir. Bazen, analog giriş pinleri için üst limit olarak harici bir referans voltajı (0 ile 5 Volt arasında) ayarlamak için kullanılır.

Arduino UNO kartının ana parçalarını öğrendikten sonra, Arduino IDE'yi nasıl kuracağımızı öğrenmeye hazırız. Bunu öğrendikten sonra, programımızı Arduino kartına yüklemeye hazır olacağız.

Bu bölümde, kolay adımlarla, Arduino IDE'yi bilgisayarımıza nasıl kuracağımızı ve kartı USB kablosuyla programı alacak şekilde hazırlayacağız.

Step 1- Öncelikle Arduino kartınıza (favori kartınızı seçebilirsiniz) ve bir USB kablosuna sahip olmalısınız. Arduino UNO, Arduino Duemilanove, Nano, Arduino Mega 2560 veya Diecimila kullanıyorsanız, aşağıdaki resimde gösterildiği gibi bir USB yazıcıya bağlayacağınız türde standart bir USB kablosuna (A fişinden B fişine) ihtiyacınız olacaktır.

Arduino Nano kullanıyorsanız, aşağıdaki resimde gösterildiği gibi bir A'dan Mini-B'ye kabloya ihtiyacınız olacaktır.

Step 2 − Download Arduino IDE Software.

Arduino IDE'nin farklı sürümlerini Arduino Resmi web sitesindeki İndirme sayfasından edinebilirsiniz . İşletim sisteminizle (Windows, IOS veya Linux) uyumlu olan yazılımınızı seçmelisiniz. Dosya indirme işleminiz tamamlandıktan sonra, dosyayı açın.

Step 3 − Power up your board.

Arduino Uno, Mega, Duemilanove ve Arduino Nano, bilgisayara USB bağlantısından veya harici bir güç kaynağından otomatik olarak güç çeker. Bir Arduino Diecimila kullanıyorsanız, kartın USB bağlantısından güç çekecek şekilde yapılandırıldığından emin olmalısınız. Güç kaynağı, USB ile güç jakları arasındaki üç pinin ikisine uyan küçük bir plastik parçası olan bir atlama kablosuyla seçilir. USB bağlantı noktasına en yakın iki pim üzerinde olduğunu kontrol edin.

Arduino kartını USB kablosunu kullanarak bilgisayarınıza bağlayın. Yeşil güç LED'i (PWR etiketli) yanmalıdır.

Step 4 − Launch Arduino IDE.

Arduino IDE yazılımınız indirildikten sonra, klasörü açmanız gerekir. Klasörün içinde, sonsuzluk etiketiyle (application.exe) uygulama simgesini bulabilirsiniz. IDE'yi başlatmak için simgeye çift tıklayın.

Step 5 − Open your first project.

Yazılım başladıktan sonra iki seçeneğiniz vardır -

  • Yeni bir proje oluşturun.
  • Mevcut bir proje örneğini açın.

Yeni bir proje oluşturmak için Dosya → New.

Mevcut bir proje örneğini açmak için Dosya → Örnek → Temel → Yanıp Sönme'yi seçin.

Burada, ismindeki örneklerden sadece birini seçiyoruz Blink. Bir süre gecikmeli olarak LED'i açar ve kapatır. Listeden başka herhangi bir örneği seçebilirsiniz.

Step 6 − Select your Arduino board.

Programınızı panele yüklerken herhangi bir hatayı önlemek için, bilgisayarınıza bağlı kartla eşleşen doğru Arduino kartı adını seçmelisiniz.

Araçlar → Pano'ya gidin ve panonuzu seçin.

Burada eğitimimize göre Arduino Uno kartını seçtik, ancak kullandığınız kartla eşleşen adı seçmelisiniz.

Step 7 − Select your serial port.

Arduino kartının seri cihazını seçin. GitTools → Serial PortMenü. Bu muhtemelen COM3 veya üstüdür (COM1 ve COM2 genellikle donanım seri portları için ayrılmıştır). Bunu öğrenmek için Arduino kartınızın bağlantısını kesebilir ve menüyü yeniden açabilirsiniz, kaybolan giriş Arduino kartında olmalıdır. Kartı yeniden bağlayın ve bu seri bağlantı noktasını seçin.

Step 8 − Upload the program to your board.

Programımızı panele nasıl yükleyebileceğimizi açıklamadan önce, Arduino IDE araç çubuğunda görünen her bir sembolün işlevini göstermeliyiz.

A - Herhangi bir derleme hatası olup olmadığını kontrol etmek için kullanılır.

B - Arduino kartına bir program yüklemek için kullanılır.

C - Yeni bir eskiz oluşturmak için kullanılan kısayol.

D - Örnek taslaklardan birini doğrudan açmak için kullanılır.

E - Eskizinizi kaydetmek için kullanılır.

F - Karttan seri veri almak ve seri veriyi panoya göndermek için kullanılan seri monitör.

Şimdi, ortamdaki "Yükle" düğmesini tıklamanız yeterlidir. Birkaç saniye bekleyin; kart üzerinde RX ve TX LED'lerinin yanıp söndüğünü göreceksiniz. Yükleme başarılı olursa, durum çubuğunda "Yükleme tamamlandı" mesajı görünecektir.

Note - Bir Arduino Mini, NG veya başka bir kartınız varsa, Arduino Yazılımındaki yükleme düğmesine tıklamadan hemen önce panodaki sıfırlama düğmesine fiziksel olarak basmanız gerekir.

Bu bölümde Arduino program yapısını derinlemesine inceleyeceğiz ve Arduino dünyasında kullanılan daha yeni terminolojileri öğreneceğiz. Arduino yazılımı açık kaynaklıdır. Java ortamı için kaynak kodu GPL altında yayınlanır ve C / C ++ mikro denetleyici kitaplıkları LGPL altındadır.

Sketch - İlk yeni terminoloji, "" adlı Arduino programıdır.sketch”.

Yapısı

Arduino programları üç ana bölüme ayrılabilir: Structure, Values (değişkenler ve sabitler) ve Functions. Bu eğitimde, Arduino yazılım programını adım adım ve herhangi bir sözdizimi veya derleme hatası olmadan programı nasıl yazabileceğimizi öğreneceğiz.

İle başlayalım Structure. Yazılım yapısı iki ana işlevden oluşur -

  • Kurulum () işlevi
  • Döngü () işlevi
Void setup ( ) {

}
  • PURPOSE - setup()fonksiyon eskiz başladığında çağrılır. Değişkenleri, pin modlarını başlatmak, kitaplıkları kullanmaya başlamak, vb. İçin kullanın. Kurulum işlevi Arduino kartının her açılışından veya sıfırlanmasından sonra yalnızca bir kez çalışacaktır.

  • INPUT - -

  • OUTPUT - -

  • RETURN - -

Void Loop ( ) {

}
  • PURPOSE - oluşturduktan sonra setup() ilk değerleri başlatan ve ayarlayan işlev, loop()işlev, adından da anlaşılacağı gibi tam olarak yapar ve arka arkaya döngü yaparak programınızın değişmesine ve yanıt vermesine izin verir. Arduino kartını aktif olarak kontrol etmek için kullanın.

  • INPUT - -

  • OUTPUT - -

  • RETURN - -

C'deki veri türleri, farklı türlerdeki değişkenleri veya işlevleri bildirmek için kullanılan kapsamlı bir sistemi ifade eder. Bir değişkenin türü, depoda ne kadar yer kapladığını ve depolanan bit deseninin nasıl yorumlandığını belirler.

Aşağıdaki tablo, Arduino programlaması sırasında kullanacağınız tüm veri türlerini göstermektedir.

geçersiz Boole kömür İmzasız karakter bayt int İmzasız int kelime
uzun İmzasız uzun kısa yüzen çift dizi Dize-karakter dizisi Dize nesnesi

geçersiz

Void anahtar sözcüğü yalnızca işlev bildirimlerinde kullanılır. İşlevin çağrıldığı işleve hiçbir bilgi döndürmemesinin beklendiğini belirtir.

Misal

Void Loop ( ) {
   // rest of the code
}

Boole

Bir Boole, iki değerden birini tutar, doğru veya yanlış. Her Boolean değişkeni bir bayt bellek kaplar.

Misal

boolean val = false ; // declaration of variable with type boolean and initialize it with false
boolean state = true ; // declaration of variable with type boolean and initialize it with true

Char

Bir karakter değerini saklayan bir bayt bellek alan bir veri türü. Karakter değişmezleri şu şekilde tek tırnak içinde yazılır: 'A' ve birden çok karakter için dizeler çift tırnak kullanır: "ABC".

Ancak karakterler sayı olarak saklanır. ASCII grafiğinde belirli kodlamayı görebilirsiniz . Bu, karakterin ASCII değerinin kullanıldığı karakterler üzerinde aritmetik işlemler yapmanın mümkün olduğu anlamına gelir. Örneğin, büyük harf A'nın ASCII değeri 65 olduğundan 'A' + 1, 66 değerine sahiptir.

Misal

Char chr_a = ‘a’ ;//declaration of variable with type char and initialize it with character a
Char chr_c = 97 ;//declaration of variable with type char and initialize it with character 97

imzasız karakter

Unsigned charbir bayt bellek kaplayan işaretsiz bir veri türüdür. İşaretsiz karakter veri türü, 0 ile 255 arasındaki sayıları kodlar.

Misal

Unsigned Char chr_y = 121 ; // declaration of variable with type Unsigned char and initialize it with character y

bayt

Bir bayt, 0 ile 255 arasında 8 bitlik işaretsiz bir sayı depolar.

Misal

byte m = 25 ;//declaration of variable with type byte and initialize it with 25

int

Tam sayılar, sayı depolaması için birincil veri türüdür. int 16 bitlik (2 bayt) bir değer depolar. Bu, -32.768 ila 32.767 aralığında bir sonuç verir (minimum değer -2 ^ 15 ve maksimum değer (2 ^ 15) - 1).

intboyut tahtadan tahtaya değişir. Örneğin, Arduino Due üzerinde birint32 bitlik (4 bayt) bir değer depolar. Bu, -2.147.483.648 ile 2.147.483.647 arasında bir aralık verir (minimum -2 ^ 31 değeri ve maksimum (2 ^ 31) - 1 değeri).

Misal

int counter = 32 ;// declaration of variable with type int and initialize it with 32

İmzasız int

İmzasız tamsayılar (işaretsiz tamsayılar), 2 baytlık bir değeri saklama şekillerinde int ile aynıdır. Negatif sayıları saklamak yerine, yalnızca pozitif değerleri saklarlar ve 0 ile 65.535 (2 ^ 16) - 1) aralığında yararlı bir aralık sağlarlar. Due, 0 ile 4.294.967.295 (2 ^ 32 - 1) arasında değişen 4 baytlık (32 bit) bir değer depolar.

Misal

Unsigned int counter = 60 ; // declaration of variable with 
   type unsigned int and initialize it with 60

Kelime

Uno ve diğer ATMEGA tabanlı kartlarda, bir kelime 16 bitlik işaretsiz bir sayı depolar. Due ve Zero'da 32 bitlik işaretsiz bir sayı depolar.

Misal

word w = 1000 ;//declaration of variable with type word and initialize it with 1000

Uzun

Uzun değişkenler, sayı saklama için genişletilmiş boyut değişkenleridir ve -2.147.483.648'den 2.147.483.647'ye 32 bit (4 bayt) depolar.

Misal

Long velocity = 102346 ;//declaration of variable with type Long and initialize it with 102346

imzasız uzun

İmzalanmamış uzun değişkenler, sayı saklama ve 32 bit (4 bayt) için genişletilmiş boyut değişkenleridir. Standart uzunlardan farklı olarak, işaretsiz uzunlar negatif sayıları saklamaz, bu da aralıklarını 0 - 4.294.967.295 (2 ^ 32 - 1) yapar.

Misal

Unsigned Long velocity = 101006 ;// declaration of variable with 
   type Unsigned Long and initialize it with 101006

kısa

Kısa, 16 bitlik bir veri türüdür. Tüm Arduino'larda (ATMega ve ARM tabanlı), kısa bir 16 bitlik (2 bayt) değer depolar. Bu, -32.768 ila 32.767 aralığında bir sonuç verir (minimum değer -2 ^ 15 ve maksimum değer (2 ^ 15) - 1).

Misal

short val = 13 ;//declaration of variable with type short and initialize it with 13

yüzen

Kayan noktalı sayı için veri türü, ondalık noktası olan bir sayıdır. Kayan nokta sayıları, tam sayılardan daha yüksek çözünürlüğe sahip olduklarından, analog ve sürekli değerleri yaklaşık olarak tahmin etmek için sıklıkla kullanılır.

Kayan nokta sayıları 3.4028235E + 38 kadar büyük ve -3.4028235E + 38 kadar düşük olabilir. 32 bit (4 bayt) bilgi olarak saklanırlar.

Misal

float num = 1.352;//declaration of variable with type float and initialize it with 1.352

çift

Uno ve diğer ATMEGA tabanlı kartlarda, Çift duyarlıklı kayan nokta sayısı dört baytı kaplar. Yani, çift gerçekleme, kesinlik kazancı olmaksızın float ile tamamen aynıdır. Arduino Due'de, çiftler 8 bayt (64 bit) hassasiyete sahiptir.

Misal

double num = 45.352 ;// declaration of variable with type double and initialize it with 45.352

Değişken türlerini açıklamaya başlamadan önce, emin olmamız gereken çok önemli bir konu, tam olarak anlıyorsunuz. variable scope.

Değişken Kapsam nedir?

Arduino'nun kullandığı C programlama dilindeki değişkenlerin kapsam adı verilen bir özelliği vardır. Kapsam, programın bir bölgesidir ve değişkenlerin bildirilebileceği üç yer vardır. Onlar -

  • Bir işlevin veya bloğun içinde adı verilen local variables.
  • Fonksiyon parametrelerinin tanımında adı verilen formal parameters.
  • Denen tüm fonksiyonların dışında global variables.

Yerel Değişkenler

Bir fonksiyon veya blok içinde bildirilen değişkenler yerel değişkenlerdir. Yalnızca o işlev veya kod bloğunun içindeki ifadeler tarafından kullanılabilirler. Yerel değişkenlerin kendi dışında çalıştıkları bilinmemektedir. Yerel değişkenlerin kullanıldığı örnek aşağıdadır -

Void setup () {

}

Void loop () {
   int x , y ;
   int z ; Local variable declaration
   x = 0;
   y = 0; actual initialization
   z = 10;
}

Global Değişkenler

Global değişkenler, tüm fonksiyonların dışında, genellikle programın en üstünde tanımlanır. Global değişkenler, programınızın ömrü boyunca değerlerini koruyacaktır.

Global bir değişkene herhangi bir işlevle erişilebilir. Diğer bir deyişle, global bir değişken, bildiriminden sonra tüm programınız boyunca kullanılabilir.

Aşağıdaki örnek, global ve yerel değişkenleri kullanır -

Int T , S ;
float c = 0 ; Global variable declaration

Void setup () {

}

Void loop () {
   int x , y ;
   int z ; Local variable declaration
   x = 0;
   y = 0; actual initialization
   z = 10;
}

Operatör, derleyiciye belirli matematiksel veya mantıksal işlevleri gerçekleştirmesini söyleyen bir semboldür. C dili yerleşik operatörler açısından zengindir ve aşağıdaki operatör türlerini sağlar -

  • Aritmetik operatörler
  • Karşılaştırma Operatörleri
  • Boole Operatörleri
  • Bitsel Operatörler
  • Bileşik Operatörler

Aritmetik operatörler

A değişkeninin 10, B değişkeninin 20 tuttuğunu varsayalım -

Örnek Göster

Operatör ismi Operatör basit Açıklama Misal
atama operatörü = Eşittir işaretinin solundaki değişkendeki eşittir işaretinin sağındaki değeri depolar. A = B
ilave + İki işlenen ekler A + B 30 verecek
çıkarma - İlk işlenenden ikinci işleneni çıkarır A - B -10 verir
çarpma işlemi * Her iki işlenenle çarpın A * B 200 verecek
bölünme / Payı paydaya böl B / A 2 verecek
modulo % Modül İşleci ve bir tamsayı bölmesinden sonra kalanı B% A 0 verir

Karşılaştırma Operatörleri

A değişkeninin 10, B değişkeninin 20 tuttuğunu varsayalım -

Örnek Göster

Operatör ismi Operatör basit Açıklama Misal
eşittir == İki işlenenin değerinin eşit olup olmadığını kontrol eder, evet ise koşul doğru olur. (A == B) doğru değil
eşit değil ! = İki işlenenin değerinin eşit olup olmadığını kontrol eder, değerler eşit değilse koşul doğru olur. (A! = B) doğrudur
daha az < Soldaki işlenenin değerinin sağ işlenenin değerinden küçük olup olmadığını kontrol eder, evet ise koşul doğru olur. (A <B) doğru
daha büyük > Soldaki işlenenin değerinin sağ işlenenin değerinden büyük olup olmadığını kontrol eder, evet ise koşul doğru olur. (A> B) doğru değil
küçüktür veya eşittir <= Sol işlenenin değerinin sağ işlenenin değerinden küçük veya ona eşit olup olmadığını kontrol eder, evet ise koşul doğru olur. (A <= B) doğrudur
büyük veya eşit > = Sol işlenenin değerinin sağ işlenenin değerinden büyük veya ona eşit olup olmadığını kontrol eder, evet ise koşul doğru olur. (A> = B) doğru değil

Boole Operatörleri

A değişkeninin 10, B değişkeninin 20 tuttuğunu varsayalım -

Örnek Göster

Operatör ismi Operatör basit Açıklama Misal
ve && Mantıksal AND operatörü çağrıldı. Her iki işlenen de sıfır değilse, o zaman koşul doğru olur. (A && B) doğru
veya || Mantıksal VEYA Operatörü çağrıldı. İki işlenenden herhangi biri sıfır değilse, o zaman koşul doğru olur. (A || B) doğru
değil ! Mantıksal NOT Operatörü olarak adlandırıldı. İşleneninin mantıksal durumunu tersine çevirmek için kullanın. Bir koşul doğruysa, Mantıksal NOT operatörü yanlış yapar. ! (A && B) yanlıştır

Bitsel Operatörler

A değişkeninin 60, B değişkeninin 13 olduğunu varsayalım -

Örnek Göster

Operatör ismi Operatör basit Açıklama Misal
ve & İkili VE İşleci, her iki işlenende de varsa sonuca bir bit kopyalar. (A & B) 0000 1100 olan 12 verecek
veya | İkili VEYA İşleci, işlenenlerden herhangi birinde varsa bir bit kopyalar (A | B) 0011 1101 olan 61 verir
Xor ^ İkili XOR İşleci, bir işlenen içinde ayarlanmışsa, ancak her ikisinde birden değil ise biti kopyalar. (A ^ B), 0011 0001 olan 49 verecek
değil ~ İkili Birler Tamamlayıcı Operatörü tekli ve bitleri 'çevirme' etkisine sahiptir. (~ A) 1100 0011 olan -60 verir
sola kay << İkili Sol Kaydırma Operatörü. Soldaki işlenenler değeri, sağ işlenen tarafından belirtilen bit sayısı kadar sola taşınır. Bir << 2, 1111 0000 olan 240 değerini verir
sağa kaydır >> İkili Sağ Shift Operatörü. Soldaki işlenenler değeri, sağ işlenen tarafından belirtilen bit sayısı kadar sağa taşınır. A >> 2, 0000 1111 olan 15 verir

Bileşik Operatörler

A değişkeninin 10, B değişkeninin 20 tuttuğunu varsayalım -

Örnek Göster

Operatör ismi Operatör basit Açıklama Misal
artış ++ Arttırma operatörü, tamsayı değerini bir artırır A ++, 11 verecek
azalma - İşleci azalt, tamsayı değerini bir azaltır A-- 9 verecek
bileşik ekleme + = AND atama operatörü ekleyin. Sol operanda sağ operandı ekler ve sonucu sol operanda atar B + = A, B = B + A'ya eşdeğerdir
bileşik çıkarma - = Çıkarma VE atama operatörü. Sağ operandı sol operanddan çıkarır ve sonucu sol operanda atar B - = A, B = B - A'ya eşdeğerdir
bileşik çarpma * = AND atama operatörünü çarpın. Sağ operandı sol operandla çarpar ve sonucu sol operanda atar B * = A, B = B * A'ya eşdeğerdir
bileşik bölüm / = VE atama işlecini böl. Sol operandı sağ operandla böler ve sonucu sol operanda atar B / = A, B = B / A'ya eşdeğerdir
bileşik modulo % = Modül VE atama operatörü. İki işlenen kullanarak modülü alır ve sonucu sol işlenenlere atar B% = A eşdeğerdir B = B% A
bitsel bileşik veya | = bitsel kapsayıcı OR ve atama operatörü A | = 2, A = A | ile aynıdır | 2
bitsel bileşik ve & = Bitsel AND atama operatörü A & = 2, A = A & 2 ile aynıdır

Karar verme yapıları, programcının program tarafından değerlendirilecek veya test edilecek bir veya daha fazla koşul belirlemesini gerektirir. Koşulun doğru olduğu belirlenirse yürütülecek bir ifade veya ifadelerle ve isteğe bağlı olarak, koşulun yanlış olduğu belirlenirse yürütülecek diğer ifadelerle birlikte olmalıdır.

Aşağıda, programlama dillerinin çoğunda bulunan tipik bir karar verme yapısının genel biçimi verilmiştir -

Kontrol İfadeleri, program yürütme akışını kontrol eden Kaynak Koddaki öğelerdir. Onlar -

S.NO. Kontrol İfadesi ve Açıklama
1

If ifadesi

Parantez içinde bir ifade ve bir ifade veya ifade bloğu alır. İfade doğruysa, ifade veya ifade bloğu yürütülür, aksi takdirde bu ifadeler atlanır.

2

If ... else ifadesi

Bir if ifadesinin ardından, ifade yanlış olduğunda yürütülen isteğe bağlı bir else ifadesi gelebilir.

3

If… else if… else ifadesi

if ifadenin ardından isteğe bağlı bir else if...else tek if ... else if ifadesi kullanarak çeşitli koşulları test etmek için çok kullanışlıdır.

4

case deyimini değiştir

İf ifadelerine benzer şekilde, switch...case programcıların çeşitli koşullarda çalıştırılması gereken farklı kodları belirlemelerine izin vererek programların akışını kontrol eder.

5

Koşullu Operatör? :

Koşullu işleç mi? : C'deki tek üçlü operatördür.

Programlama dilleri, daha karmaşık yürütme yollarına izin veren çeşitli kontrol yapıları sağlar.

Bir döngü deyimi, bir deyimi veya deyim grubunu birden çok kez yürütmemize olanak tanır ve aşağıdaki programlama dillerinin çoğunda bir döngü deyiminin genel biçimidir -

C programlama dili, döngü gereksinimlerini karşılamak için aşağıdaki döngü türlerini sağlar.

S.NO. Döngü ve Açıklama
1

döngü sırasında

while döngüler, parantez içindeki ifade () yanlış olana kadar sürekli ve sonsuz döngüye girer. Bir şey test edilen değişkeni değiştirmelidir, aksi takdirde while döngüsü asla çıkmaz.

2

yap ... döngü sırasında

do…whiledöngü while döngüsüne benzer. While döngüsünde, döngü devam koşulu, döngünün gövdesi gerçekleştirilmeden önce döngünün başlangıcında test edilir.

3

döngü için

Bir for loopifadeleri önceden belirlenmiş sayıda yürütür. Döngü için kontrol ifadesi tamamen for döngüsü parantezleri içinde başlatılır, test edilir ve işlenir.

4

İç içe Döngü

C dili, bir döngüyü başka bir döngü içinde kullanmanıza izin verir. Aşağıdaki örnek kavramı göstermektedir.

5

Sonsuz döngü

Sonlandırma koşulu olmayan döngüdür, bu nedenle döngü sonsuz olur.

Fonksiyonlar, programları ayrı görevleri gerçekleştirmek için kod segmentleri halinde yapılandırmaya izin verir. Bir işlev oluşturmanın tipik durumu, bir kişinin aynı eylemi bir programda birden çok kez gerçekleştirmesi gerektiğidir.

Kod parçalarını işlevlere göre standartlaştırmanın çeşitli avantajları vardır -

  • Fonksiyonlar programcının düzenli kalmasına yardımcı olur. Genellikle bu, programı kavramsallaştırmaya yardımcı olur.

  • İşlevler, bir eylemi tek bir yerde kodlar, böylece işlevin yalnızca bir kez düşünülmesi ve hata ayıklanması gerekir.

  • Bu, kodun değiştirilmesi gerekiyorsa, değişiklik sırasında hata olasılığını da azaltır.

  • Kod bölümleri birçok kez yeniden kullanıldığından, işlevler tüm çizimi daha küçük ve daha kompakt hale getirir.

  • Kodu diğer programlarda modüler hale getirerek yeniden kullanmayı kolaylaştırırlar ve işlevleri kullanmak genellikle kodu daha okunaklı hale getirir.

Bir Arduino taslağında veya bir programda iki gerekli işlev vardır, yani setup () ve loop (). Diğer işlevler, bu iki işlevin parantezlerinin dışında oluşturulmalıdır.

Bir işlevi tanımlamak için en yaygın sözdizimi -

İşlev Beyanı

Bir işlev, diğer işlevlerin dışında, döngü işlevinin üstünde veya altında bildirilir.

İşlevi iki farklı şekilde açıklayabiliriz -

İlk yol, işlevin adı verilen kısmını yazmaktır. a function prototype aşağıdakilerden oluşan döngü işlevinin üstünde -

  • İşlev dönüş türü
  • Fonksiyon adı
  • Fonksiyon argüman türü, argüman adını yazmaya gerek yok

İşlev prototipinin ardından noktalı virgül (;) gelmelidir.

Aşağıdaki örnek, birinci yöntemi kullanarak işlev bildiriminin gösterimini gösterir.

Misal

int sum_func (int x, int y) // function declaration {
   int z = 0;
   z = x+y ;
   return z; // return the value
}

void setup () {
   Statements // group of statements
}

Void loop () {
   int result = 0 ;
   result = Sum_func (5,6) ; // function call
}

İşlev tanımı veya bildirimi olarak adlandırılan ikinci bölüm, aşağıdakilerden oluşan döngü işlevinin altında bildirilmelidir:

  • İşlev dönüş türü
  • Fonksiyon adı
  • Fonksiyon argüman türü, buraya argüman adını eklemelisiniz
  • İşlev gövdesi (işlev çağrıldığında çalışan işlevin içindeki ifadeler)

Aşağıdaki örnek, ikinci yöntemi kullanarak işlev bildirimini gösterir.

Misal

int sum_func (int , int ) ; // function prototype

void setup () {
   Statements // group of statements
}

Void loop () {
   int result = 0 ;
   result = Sum_func (5,6) ; // function call
}

int sum_func (int x, int y) // function declaration {
   int z = 0;
   z = x+y ;
   return z; // return the value
}

İkinci yöntem, yalnızca döngü işlevinin üzerindeki işlevi bildirir.

Dizeler, metni saklamak için kullanılır. Bir LCD'de veya Arduino IDE Seri Monitör penceresinde metin görüntülemek için kullanılabilirler. Dizeler, kullanıcı girdisini saklamak için de kullanışlıdır. Örneğin, bir kullanıcının Arduino'ya bağlı bir tuş takımına yazdığı karakterler.

Arduino programlamada iki tür dizi vardır -

  • C programlamada kullanılan dizelerle aynı olan karakter dizileri.
  • Bir taslakta bir string nesnesi kullanmamızı sağlayan Arduino String.

Bu bölümde Dizeleri, nesneleri ve dizelerin Arduino eskizlerinde kullanımını öğreneceğiz. Bölümün sonunda, bir çizimde hangi tür ipin kullanılacağını öğreneceksiniz.

Dize Karakter Dizileri

İlk öğreneceğimiz dizge türü, türün bir dizi karakteri olan dizedir. char. Bir önceki bölümde dizinin ne olduğunu öğrendik; bellekte depolanan aynı tip değişkenin ardışık bir dizisi. Bir dizge, char değişkenlerinden oluşan bir dizidir.

Dize, dizenin sonunda her zaman 0 (sıfır) değerine sahip fazladan bir eleman bulunan özel bir dizidir. Bu, "boş sonlandırılmış dizge" olarak bilinir.

Dize Karakter Dizisi Örneği

Bu örnek, bir dizinin nasıl oluşturulacağını ve seri monitör penceresine nasıl yazdırılacağını gösterecektir.

Example

void setup() {
   char my_str[6]; // an array big enough for a 5 character string
   Serial.begin(9600);
   my_str[0] = 'H'; // the string consists of 5 characters
   my_str[1] = 'e';
   my_str[2] = 'l';
   my_str[3] = 'l';
   my_str[4] = 'o';
   my_str[5] = 0; // 6th array element is a null terminator
   Serial.println(my_str);
}

void loop() { 

}

Aşağıdaki örnek bir dizenin neyden oluştuğunu gösterir; dizenin bittiği yerin bu olduğunu göstermek için dizinin son öğesi olarak yazdırılabilir karakterler ve 0 içeren bir karakter dizisi. Dizi, kullanılarak Arduino IDE Seri Monitör penceresine yazdırılabilir.Serial.println() ve dizenin adını iletmek.

Aynı örnek, aşağıda gösterildiği gibi daha uygun bir şekilde yazılabilir -

Example

void setup() {
   char my_str[] = "Hello";
   Serial.begin(9600);
   Serial.println(my_str);
}

void loop() {

}

Bu çizimde, derleyici dize dizisinin boyutunu hesaplar ve ayrıca dizeyi otomatik olarak sıfır ile sonlandırır. Altı eleman uzunluğunda ve beş karakterden ve ardından sıfırdan oluşan bir dizi, önceki çizimdekiyle tamamen aynı şekilde oluşturulur.

Dize Dizilerini Düzenleme

Aşağıdaki çizimde gösterildiği gibi bir çizim içindeki bir dizi dizisini değiştirebiliriz.

Misal

void setup() {
   char like[] = "I like coffee and cake"; // create a string
   Serial.begin(9600);
   // (1) print the string
   Serial.println(like);
   // (2) delete part of the string
   like[13] = 0;
   Serial.println(like);
   // (3) substitute a word into the string
   like[13] = ' '; // replace the null terminator with a space
   like[18] = 't'; // insert the new word
   like[19] = 'e';
   like[20] = 'a';
   like[21] = 0; // terminate the string
   Serial.println(like);
}

void loop() {

}

Sonuç

I like coffee and cake
I like coffee
I like coffee and tea

Çizim şu şekilde çalışır.

Dizeyi Oluşturma ve Yazdırma

Yukarıda verilen çizimde, yeni bir dizi oluşturulur ve ardından Seri Monitör penceresinde görüntülenmek üzere yazdırılır.

İpin Kısaltılması

Dize, dizedeki 14. karakterin boş sonlu sıfır (2) ile değiştirilmesiyle kısaltılır. Bu, 0'dan sayılan dize dizisindeki 13 numaralı öğedir.

Dizi yazdırıldığında, tüm karakterler sıfırla biten yeni boş değerine kadar yazdırılır. Diğer karakterler kaybolmaz; hala bellekte varlar ve dizi dizisi hala aynı boyuttadır. Tek fark, dizelerle çalışan herhangi bir işlevin dizeyi yalnızca ilk boş sonlandırıcıya kadar görecek olmasıdır.

Dizedeki Bir Kelimeyi Değiştirme

Son olarak taslak, "kek" kelimesini "çay" (3) ile değiştirir. İlk önce, [13] gibi boş sonlandırıcıyı bir boşlukla değiştirmelidir, böylece dizge orijinal olarak oluşturulan biçime geri yüklenir.

Yeni karakterler "çay" kelimesinin "kek" kelimesinin "cak" ının üzerine yazılır. Bu, tek tek karakterlerin üzerine yazılarak yapılır. "Pasta" nın 'e', ​​yeni bir boş sonlandırma karakteri ile değiştirilir. Sonuç, dizgenin gerçekte iki boş karakterle sonlandırılmasıdır; orijinal karakter dizenin sonunda ve yenisi "pasta" daki 'e' harfinin yerini alır. Bu, yeni dizge yazdırıldığında hiçbir fark yaratmaz çünkü dizeyi yazdıran işlev, ilk boş sonlandırıcıyla karşılaştığında dize karakterlerini yazdırmayı durdurur.

Dize Dizilerini Yönetme İşlevleri

Önceki çizim, dizedeki karakterlere ayrı ayrı erişerek dizeyi manuel bir şekilde değiştirdi. Dize dizilerini değiştirmeyi kolaylaştırmak için, bunu yapmak için kendi işlevlerinizi yazabilir veya dosyadaki dize işlevlerinden bazılarını kullanabilirsiniz.C dil kitaplığı.

S.No. Fonksiyonlar ve Açıklama
1

String()

0019 sürümünden itibaren çekirdeğin bir parçası olan String sınıfı, metin dizelerini karakter dizilerinden daha karmaşık şekillerde kullanmanıza ve değiştirmenize olanak tanır. Dizeleri birleştirebilir, onlara ekleyebilir, alt dizeleri arayabilir ve değiştirebilir ve daha fazlasını yapabilirsiniz. Basit bir karakter dizisinden daha fazla bellek gerektirir, ancak aynı zamanda daha kullanışlıdır.

Referans için, karakter dizileri küçük 's' içeren dizeler olarak adlandırılır ve String sınıfının örnekleri büyük S ile Dizeler olarak adlandırılır. String sınıfının örnekleri değil

2

charAt()

String'in belirli bir karakterine erişin.

3

compareTo()

Birinin diğerinden önce mi sonra mı geldiğini veya eşit olup olmadıklarını test ederek iki Dizeyi karşılaştırır. Karakterlerin ASCII değerleri kullanılarak dizeler karakter karakter karşılaştırılır. Bu, örneğin "a" nın "b" den önce, "A" dan sonra geldiği anlamına gelir. Sayılar harflerden önce gelir.

4

concat()

Parametreyi bir String'e ekler.

5

c_str()

Bir dizenin içeriğini C-stili, boş sonlu bir dizge olarak dönüştürür. Bunun dahili String tamponuna doğrudan erişim sağladığını ve dikkatli kullanılması gerektiğini unutmayın. Özellikle, döndürülen işaretçi aracılığıyla dizeyi asla değiştirmemelisiniz. String nesnesini değiştirdiğinizde veya yok edildiğinde, önceden c_str () tarafından döndürülen herhangi bir işaretçi geçersiz hale gelir ve artık kullanılmamalıdır.

6

endsWith()

Bir String'in başka bir String'in karakterleriyle bitip bitmediğini test eder.

7

equals()

Eşitlik için iki dizeyi karşılaştırır. Karşılaştırma büyük / küçük harfe duyarlıdır, yani "merhaba" Dizesi "HELLO" dizesine eşit değildir.

8

equalsIgnoreCase()

Eşitlik için iki dizeyi karşılaştırır. Karşılaştırma büyük / küçük harfe duyarlı değildir, yani Dize ("merhaba"), Dize'ye ("HELLO") eşittir.

9

getBytes()

Dizenin karakterlerini sağlanan arabelleğe kopyalar.

10

indexOf()

Başka bir Dize içinde bir karakter veya Dize bulur. Varsayılan olarak, Dize'nin başından itibaren arama yapar, ancak belirli bir dizinden başlayarak karakterin veya Dize'nin tüm örneklerini bulmaya izin verir.

11

lastIndexOf()

Başka bir Dize içinde bir karakter veya Dize bulur. Varsayılan olarak, String'in sonundan arama yapar, ancak aynı zamanda belirli bir dizinden geriye doğru çalışarak karakterin veya String'in tüm örneklerini bulmaya izin verir.

12

length()

Karakter cinsinden String'in uzunluğunu döndürür. (Bunun sondaki bir boş karakter içermediğini unutmayın.)

13

remove()

Yerinde değiştirin, karakterleri sağlanan dizinden dizenin sonuna veya sağlanan dizinden dizine artı saymaya kadar kaldırın.

14

replace()

String replace () işlevi, belirli bir karakterin tüm örneklerini başka bir karakterle değiştirmenize olanak sağlar. Bir dizenin alt dizelerini farklı bir alt dizeyle değiştirmek için de değiştir seçeneğini kullanabilirsiniz.

15

reserve()

String rezerv () işlevi, dizeleri işlemek için bellekte bir arabellek ayırmanıza izin verir.

16

setCharAt()

String'in bir karakterini ayarlar. Dize'nin mevcut uzunluğu dışındaki indisler üzerinde etkisi yoktur.

17

startsWith()

Bir String'in başka bir String'in karakterleriyle başlayıp başlamadığını test eder.

18

toCharArray()

Dizenin karakterlerini sağlanan arabelleğe kopyalar.

19

substring()

Bir String'in alt dizesini alın. Başlangıç ​​dizini kapsayıcıdır (karşılık gelen karakter alt dizeye dahil edilmiştir), ancak isteğe bağlı bitiş dizini özeldir (karşılık gelen karakter alt dizeye dahil edilmez). Bitiş dizini atlanırsa, alt dize Dizenin sonuna kadar devam eder.

20

toInt()

Geçerli bir Stringi bir tamsayıya dönüştürür. Girdi dizesi bir tamsayı ile başlamalıdır. Dize tam sayı olmayan sayılar içeriyorsa, işlev dönüştürmeyi durdurur.

21

toFloat()

Geçerli bir String'i bir float'a dönüştürür. Giriş dizisi bir rakamla başlamalıdır. Dize rakam olmayan karakterler içeriyorsa, işlev dönüştürmeyi durdurur. Örneğin, "123.45", "123" ve "123fish" dizeleri sırasıyla 123.45, 123.00 ve 123.00'a dönüştürülür. "123.456" değerinin yaklaşık olarak 123.46 olduğuna dikkat edin. Ayrıca kayan sayıların yalnızca 6-7 ondalık basamak hassasiyetine sahip olduğunu ve daha uzun dizelerin kesilebileceğini unutmayın.

22

toLowerCase()

Bir String'in küçük harfli sürümünü edinin. 1.0 itibariyle, toLowerCase () dizeyi yeni bir.

23

toUpperCase()

Bir String'in büyük harfli versiyonunu alın. 1.0 itibariyle, toUpperCase () yeni bir tane döndürmek yerine dizeyi yerinde değiştirir.

24

trim()

Baştaki ve sondaki beyaz boşlukların kaldırıldığı Dize'nin bir sürümünü alın. 1.0 itibariyle, trim () yeni bir tane döndürmek yerine dizeyi yerinde değiştirir.

Sonraki taslak bazı C string fonksiyonlarını kullanır.

Misal

void setup() {
   char str[] = "This is my string"; // create a string
   char out_str[40]; // output from string functions placed here
   int num; // general purpose integer
   Serial.begin(9600);

   // (1) print the string
   Serial.println(str);

   // (2) get the length of the string (excludes null terminator)
   num = strlen(str);
   Serial.print("String length is: ");
   Serial.println(num);

   // (3) get the length of the array (includes null terminator)
   num = sizeof(str); // sizeof() is not a C string function
   Serial.print("Size of the array: ");
   Serial.println(num);

   // (4) copy a string
   strcpy(out_str, str);
   Serial.println(out_str);

   // (5) add a string to the end of a string (append)
   strcat(out_str, " sketch.");
   Serial.println(out_str);
   num = strlen(out_str);
   Serial.print("String length is: ");
   Serial.println(num);
   num = sizeof(out_str);
   Serial.print("Size of the array out_str[]: ");
   Serial.println(num);
}

void loop() {

}

Sonuç

This is my string
String length is: 17
Size of the array: 18
This is my string
This is my string sketch.
String length is: 25
Size of the array out_str[]: 40

Çizim şu şekilde çalışır.

Dizeyi Yazdır

Yeni oluşturulan dizi, önceki çizimlerde yapıldığı gibi Seri Monitör penceresine yazdırılır.

İpin Uzunluğunu Alın

Strlen () işlevi dizenin uzunluğunu elde etmek için kullanılır. Dizenin uzunluğu yalnızca yazdırılabilir karakterler içindir ve boş sonlandırıcıyı içermez.

Dize 17 karakter içerir, bu nedenle Seri Monitör penceresinde 17 yazdırıldığını görüyoruz.

Dizinin Uzunluğunu Öğrenin

Sizeof () operatörü, dizeyi içeren dizinin uzunluğunu elde etmek için kullanılır. Uzunluk, boş sonlandırıcıyı içerir, bu nedenle uzunluk, dizenin uzunluğundan bir fazladır.

sizeof () bir işlev gibi görünür, ancak teknik olarak bir operatördür. C dize kitaplığının bir parçası değildir, ancak çizimde dizinin boyutu ile dizenin boyutu (veya dizi uzunluğu) arasındaki farkı göstermek için kullanılmıştır.

Bir Dizeyi Kopyala

Strcpy () işlevi str [] dizesini out_num [] dizisine kopyalamak için kullanılır. Strcpy () işlevi, kendisine iletilen ikinci dizeyi birinci dizeye kopyalar. Dizenin bir kopyası artık çıkış_sayısı [] dizisinde var, ancak dizinin yalnızca 18 elemanını alıyor, dolayısıyla dizide hala 22 serbest karakter elemanımız var. Bu ücretsiz öğeler, bellekteki dizeden sonra bulunur.

Dize, dizinin sonuna bir dize ekleyen çizimin bir sonraki bölümünde kullanmak üzere dizide fazladan boşluk olacak şekilde diziye kopyalandı.

Bir Dizeye Dize Ekleme (Birleştirme)

Çizim, bitiştirme olarak bilinen bir dizeyi diğerine birleştirir. Bu, strcat () işlevi kullanılarak yapılır. Strcat () işlevi, kendisine iletilen ikinci dizeyi, kendisine geçirilen ilk dizenin sonuna koyar.

Birleştirmeden sonra, dizenin uzunluğu yeni dizi uzunluğunu göstermek için yazdırılır. Dizinin uzunluğu daha sonra 40 eleman uzunluğunda bir dizide 25 karakter uzunluğunda bir dizimiz olduğunu göstermek için yazdırılır.

25 karakter uzunluğundaki dizenin, sıfır sonlandırması nedeniyle, dizinin 26 karakterini aldığını unutmayın.

Dizi Sınırları

Dizeler ve dizilerle çalışırken, dizelerin veya dizilerin sınırları içinde çalışmak çok önemlidir. Örnek çizimde, dizeleri işlemek için kullanılabilecek belleği ayırmak için 40 karakter uzunluğunda bir dizi oluşturuldu.

Dizi çok küçük yapıldıysa ve diziden daha büyük bir dizeyi ona kopyalamaya çalışsaydık, dizi dizinin sonuna kopyalanacaktı. Dizinin sonunun ötesindeki bellek, çizimde kullanılan diğer önemli verileri içerebilir ve bunlar daha sonra dizimiz tarafından üzerine yazılır. Dizenin sonunun ötesindeki bellek aşılırsa, çizimi çökertebilir veya beklenmeyen davranışlara neden olabilir.

Arduino programlamada kullanılan ikinci dizi türü String Object'tir.

Nesne nedir?

Nesne, hem verileri hem de işlevleri içeren bir yapıdır. Bir String nesnesi, tıpkı bir değişken gibi oluşturulabilir ve bir değer veya dize atanabilir. String nesnesi, String nesnesinin içerdiği dize verileri üzerinde çalışan işlevler (nesne yönelimli programlamada (OOP) "yöntemler" olarak adlandırılır) içerir.

Aşağıdaki çizim ve açıklama, bir nesnenin ne olduğunu ve String nesnesinin nasıl kullanıldığını açıklığa kavuşturacaktır.

Misal

void setup() { 
   String my_str = "This is my string.";
   Serial.begin(9600);

   // (1) print the string
   Serial.println(my_str);

   // (2) change the string to upper-case
   my_str.toUpperCase();
   Serial.println(my_str);

   // (3) overwrite the string
   my_str = "My new string.";
   Serial.println(my_str);

   // (4) replace a word in the string
   my_str.replace("string", "Arduino sketch");
   Serial.println(my_str);

   // (5) get the length of the string
   Serial.print("String length is: ");
   Serial.println(my_str.length());
}

void loop() { 

}

Sonuç

This is my string.
THIS IS MY STRING.
My new string.
My new Arduino sketch.
String length is: 22

Bir dizgi nesnesi oluşturulur ve çizimin üstünde bir değer (veya dize) atanır.

String my_str = "This is my string." ;

Bu, adıyla bir String nesnesi oluşturur my_str ve ona "Bu benim dizim" değerini verir.

Bu, bir değişken oluşturmak ve ona bir tamsayı gibi bir değer atamakla karşılaştırılabilir -

int my_var = 102;

Çizim şu şekilde çalışır.

Dizeyi Yazdırma

Dize, tıpkı bir karakter dizisi dizesi gibi Seri İzleme penceresine yazdırılabilir.

Dizeyi Büyük Harfe Dönüştür

Oluşturulan my_str dize nesnesi, üzerinde çalıştırılabilecek bir dizi işleve veya yönteme sahiptir. Bu yöntemler, nesne adı ve ardından nokta operatörü (.) Ve ardından kullanılacak işlevin adı kullanılarak çağrılır.

my_str.toUpperCase();

toUpperCase() işlev, içerdiği dizede çalışır my_strString türünde olan ve nesnenin içerdiği dize verilerini (veya metni) büyük harf karakterlerine dönüştüren nesne. String sınıfının içerdiği işlevlerin bir listesi Arduino String referansında bulunabilir. Teknik olarak, String bir sınıf olarak adlandırılır ve String nesneleri oluşturmak için kullanılır.

Bir Dizenin Üzerine Yaz

Atama operatörü, yeni bir dize atamak için kullanılır. my_str eski dizenin yerini alan nesne

my_str = "My new string." ;

Atama operatörü, karakter dizisi dizelerinde kullanılamaz, ancak yalnızca String nesnelerinde çalışır.

Dizedeki Bir Kelimeyi Değiştirme

Replace () işlevi, kendisine iletilen ilk dizeyi, kendisine iletilen ikinci dizeyle değiştirmek için kullanılır. replace (), String sınıfında yerleşik olan ve bu nedenle my_str String nesnesinde kullanılabilen başka bir işlevdir.

Dizenin Uzunluğunu Alma

Stringin uzunluğunu elde etmek, length () kullanılarak kolayca yapılır. Örnek çizimde, length () tarafından döndürülen sonuç, bir ara değişken kullanılmadan doğrudan Serial.println () öğesine iletilir.

String Nesnesi Ne Zaman Kullanılmalı

Bir String nesnesinin kullanımı, bir string karakter dizisinden çok daha kolaydır. Nesne, dizeler üzerinde bir dizi işlem gerçekleştirebilen yerleşik işlevlere sahiptir.

String nesnesini kullanmanın ana dezavantajı, çok fazla bellek kullanması ve Arduino'nun beklenmedik şekilde takılmasına, çökmesine veya davranmasına neden olabilecek Arduinos RAM belleğini hızlı bir şekilde kullanabilmesidir. Bir Arduino'daki bir çizim küçükse ve nesnelerin kullanımını kısıtlıyorsa, o zaman sorun olmamalıdır.

Karakter dizisi dizgilerinin kullanımı daha zordur ve bu tür dizgelerde çalışmak için kendi işlevlerinizi yazmanız gerekebilir. Bunun avantajı, yaptığınız dizge dizilerinin boyutu üzerinde kontrole sahip olmanızdır, böylece bellekten tasarruf etmek için dizileri küçük tutabilirsiniz.

Dize dizileriyle dizi sınırlarının ötesine yazmadığınızdan emin olmanız gerekir. String nesnesinin bu sorunu yoktur ve üzerinde çalışması için yeterli bellek olması koşuluyla, sizin için dize sınırlarını halledecektir. String nesnesi, bellek tükendiğinde var olmayan belleğe yazmaya çalışabilir, ancak üzerinde çalıştığı dizenin sonuna asla yazmaz.

Dizelerin Kullanıldığı Yer

Bu bölümde dizgeleri, bellekte nasıl davrandıklarını ve işleyişlerini inceledik.

Dizilerin pratik kullanımları, Seri Monitör penceresinden kullanıcı girdisinin nasıl alınacağını ve girdiyi bir dizede nasıl kaydedeceğimizi incelediğimizde, bu kursun sonraki bölümünde ele alınacaktır.

Arduino, dört farklı zaman işleme işlevi sağlar. Onlar -

S.No. İşlev ve Açıklama
1

gecikme () işlevi

Yolu delay()fonksiyon çalışması oldukça basittir. Tek bir tam sayı (veya sayı) bağımsız değişkenini kabul eder. Bu sayı, zamanı temsil eder (milisaniye cinsinden ölçülür).

2

delayMicroseconds () işlevi

delayMicroseconds()işlev, tek bir tamsayı (veya sayı) bağımsız değişkeni kabul eder. Bir milisaniyede bin mikrosaniye ve saniyede bir milyon mikrosaniye vardır.

3

milis () işlevi

Bu fonksiyon, o andaki milisaniye sayısını döndürmek için kullanılır, Arduino kartı mevcut programı çalıştırmaya başlar.

4

micros () işlevi

Micros () işlevi zamandan mikrosaniye sayısını döndürür, Arduino kartı mevcut programı çalıştırmaya başlar. Bu sayı aşar yani yaklaşık 70 dakika sonra sıfıra döner.

Bir dizi, aynı türde olan ardışık bir bellek konumu grubudur. Dizideki belirli bir konuma veya öğeye başvurmak için, dizinin adını ve dizideki belirli öğenin konum numarasını belirtiriz.

Aşağıda verilen çizim, 11 eleman içeren C adlı bir tamsayı dizisini göstermektedir. Dizi adını ve ardından köşeli parantez ([]) içinde belirli öğenin konum numarasını vererek bu öğelerden herhangi birine başvurursunuz. Konum numarası daha resmi olarak alt simge veya dizin olarak adlandırılır (bu sayı, dizinin başından itibaren öğelerin sayısını belirtir). İlk elemanın alt simgesi 0 (sıfır) vardır ve bazen sıfır elemanı olarak adlandırılır.

Böylece, C dizisinin elemanları C [0] ("C alt sıfır" olarak okunur), C [1], C [2] ve benzeridir. C dizisindeki en yüksek alt simge 10'dur ve bu, dizideki (11) öğelerin sayısından 1 küçüktür. Dizi adları, diğer değişken adlarıyla aynı kuralları izler.

Alt simge bir tamsayı veya tamsayı ifadesi olmalıdır (herhangi bir integral türü kullanılarak). Bir program bir ifadeyi alt simge olarak kullanıyorsa, o zaman program, alt simgeyi belirlemek için ifadeyi değerlendirir. Örneğin, a değişkeninin 5'e ve b değişkeninin 6'ya eşit olduğunu varsayarsak, ifade C [11] dizi elemanına 2 ekler.

Bir indisli dizi adı bir ldeğerdir, tıpkı dizi olmayan değişken adlarının yapabildiği gibi bir atamanın sol tarafında kullanılabilir.

Verilen şekilde C dizisini daha yakından inceleyelim. Tüm dizinin adı C'dir. 11 öğesi C [0] ila C [10] olarak adlandırılır. C [0] 'ın değeri -45, C [1]' in değeri 6, C [2] 'nin değeri 0, C [7]' nin değeri 62 ve C [10] 'un değeri 78.

C dizisinin ilk üç öğesinde bulunan değerlerin toplamını yazdırmak için şunu yazardık -

Serial.print (C[ 0 ] + C[ 1 ] + C[ 2 ] );

C [6] 'nın değerini 2'ye bölmek ve sonucu x değişkenine atamak için şunu yazardık -

x = C[ 6 ] / 2;

Dizileri Bildirme

Diziler bellekte yer kaplar. Elemanların türünü ve bir dizinin gerektirdiği eleman sayısını belirtmek için, formun bir bildirimini kullanın -

type arrayName [ arraySize ] ;

Derleyici uygun miktarda bellek ayırır. (Belleği ayıran bir bildirimin daha doğru bir şekilde tanım olarak bilindiğini hatırlayın). ArraySize, sıfırdan büyük bir tamsayı sabiti olmalıdır. Örneğin, derleyiciye C tamsayı dizisi için 11 öğe ayırmasını söylemek için, bildirimi kullanın -

int C[ 12 ]; // C is an array of 12 integers

Diziler, herhangi bir referans olmayan veri türünün değerlerini içerecek şekilde bildirilebilir. Örneğin, karakter dizelerini saklamak için dizge türünde bir dizi kullanılabilir.

Dizileri Kullanan Örnekler

Bu bölüm dizilerin nasıl bildirileceğini, başlatılacağını ve işleneceğini gösteren birçok örnek verir.

Örnek 1: Bir Dizi Bildirme ve Dizinin Öğelerini Başlatmak için Döngü Kullanma

Program 10 elemanlı bir tamsayı dizisi bildiriyor n. A – b satırları a kullanırFordizi elemanlarını sıfır olarak başlatmak için ifade. Diğer otomatik değişkenler gibi, otomatik diziler de dolaylı olarak sıfıra başlatılmaz. İlk çıktı deyimi (satır c), diziyi tablo biçiminde yazdıran, sonraki for deyiminde (d – e satırları) yazdırılan sütun başlıklarını görüntüler.

Example

int n[ 10 ] ; // n is an array of 10 integers

void setup () {

}

void loop () {
   for ( int i = 0; i < 10; ++i ) // initialize elements of array n to 0 {
      n[ i ] = 0; // set element at location i to 0
      Serial.print (i) ;
      Serial.print (‘\r’) ;
   }
   for ( int j = 0; j < 10; ++j ) // output each array element's value {
      Serial.print (n[j]) ;
      Serial.print (‘\r’) ;
   } 
}

Result - Aşağıdaki sonucu üretecektir -

Element Value

0

1

2

3

4

5

6

7

8

9

0

0

0

0

0

0

0

0

0

0

Örnek 2: Başlatıcı Listesiyle Bir Bildirgedeki Diziyi Başlatma

Bir dizinin öğeleri, dizi adının ardından eşittir işareti ve virgülle ayrılmış başlatıcı listesiyle birlikte başlatılabilir. Program, 10 değerli bir tamsayı dizisini başlatmak için bir başlatıcı listesi kullanır (satır a) ve diziyi tablo biçiminde (satır b – c) yazdırır.

Example

// n is an array of 10 integers
int n[ 10 ] = { 32, 27, 64, 18, 95, 14, 90, 70, 60, 37 } ;

void setup () {

}

void loop () {
   for ( int i = 0; i < 10; ++i ) {
      Serial.print (i) ;
      Serial.print (‘\r’) ;
   }
   for ( int j = 0; j < 10; ++j ) // output each array element's value {
      Serial.print (n[j]) ;
      Serial.print (‘\r’) ;
   } 
}

Result - Aşağıdaki sonucu üretecektir -

Element Value

0

1

2

3

4

5

6

7

8

9

32

27

64

18

95

14

90

70

60

37

Örnek 3: Bir Dizinin Öğelerini Toplama

Genellikle, bir dizinin elemanları bir hesaplamada kullanılacak bir dizi değeri temsil eder. Örneğin, bir dizinin öğeleri sınav notlarını temsil ediyorsa, bir profesör dizinin öğelerini toplamayı ve sınavın sınıf ortalamasını hesaplamak için bu toplamı kullanmak isteyebilir. Program, 10 elemanlı tamsayı dizisinde bulunan değerleri toplara.

Example

const int arraySize = 10; // constant variable indicating size of array
int a[ arraySize ] = { 87, 68, 94, 100, 83, 78, 85, 91, 76, 87 };
int total = 0;

void setup () {

}
void loop () {
   // sum contents of array a
   for ( int i = 0; i < arraySize; ++i )
      total += a[ i ];
   Serial.print (“Total of array elements : ”) ;
   Serial.print(total) ;
}

Result - Aşağıdaki sonucu üretecektir -

Total of array elements: 849

Diziler Arduino için önemlidir ve çok daha fazla dikkat gerektirmelidir. Dizi ile ilgili aşağıdaki önemli kavramlar bir Arduino için açık olmalıdır -

S.NO. Konsept ve Açıklama
1 Dizileri İşlevlere Aktarma

Bir dizi argümanını bir işleve geçirmek için, dizinin adını köşeli parantez olmadan belirtin.

2 Çok Boyutlu Diziler

İki boyutlu diziler (yani alt simgeler) genellikle satırlar ve sütunlar halinde düzenlenmiş bilgilerden oluşan değer tablolarını temsil eder.

Arduino kartındaki pinler, giriş veya çıkış olarak yapılandırılabilir. Bu modlarda pinlerin işleyişini açıklayacağız. Arduino analog pinlerinin çoğunun dijital pinlerle tamamen aynı şekilde yapılandırılabileceğini ve kullanılabileceğini unutmamak önemlidir.

INPUT olarak yapılandırılmış pinler

Arduino pinleri varsayılan olarak giriş olarak yapılandırılmıştır, bu nedenle açık bir şekilde giriş olarak bildirilmelerine gerek yoktur. pinMode()bunları girdi olarak kullandığınızda. Bu şekilde yapılandırılan pinlerin yüksek empedans durumunda olduğu söylenir. Giriş pinleri, örnekledikleri devrede, pinin önündeki 100 megaohm'luk bir seri dirence eşdeğer, son derece küçük taleplerde bulunur.

Bu, giriş pinini bir durumdan diğerine geçirmek için çok az akım gerektiği anlamına gelir. Bu, pimleri, kapasitif bir dokunma sensörü uygulama veya bir LED'i fotodiyot olarak okuma gibi görevler için kullanışlı hale getirir.

PinMode (pin, INPUT) olarak yapılandırılmış pinler, kendilerine bağlı hiçbir şey olmadan veya bunlara bağlı olmayan diğer devrelere bağlı olmayan kablolarla, pin durumunda görünüşte rastgele değişiklikleri bildirir, çevreden elektriksel gürültüyü alır veya durumu kapasitif olarak birleştirir yakındaki bir pinin.

Çekme Dirençleri

Yukarı çekme dirençleri, giriş yoksa, bir giriş pinini bilinen bir duruma yönlendirmek için genellikle kullanışlıdır. Bu, girişe bir çekme direnci (+ 5V'ye) veya bir aşağı çekme direnci (toprağa direnç) eklenerek yapılabilir. 10K direnç, çekme veya aşağı çekme direnci için iyi bir değerdir.

Giriş Olarak Yapılandırılmış Pimlerle Dahili Çekme Direncinin Kullanılması

Yazılımdan erişilebilen, Atmega yongasında yerleşik 20.000 kaldırma direnci vardır. Bu yerleşik kaldırma dirençlerine,pinMode()INPUT_PULLUP olarak. Bu, INPUT modunun davranışını etkili bir şekilde tersine çevirir; burada HIGH, sensörün KAPALI olduğu ve DÜŞÜK, sensörün AÇIK olduğu anlamına gelir. Bu yukarı çekmenin değeri, kullanılan mikro denetleyiciye bağlıdır. Çoğu AVR tabanlı kartta, değerin 20kΩ ile 50kΩ arasında olması garanti edilir. Arduino Due'de 50kΩ ile 150kΩ arasındadır. Tam değer için kartınızdaki mikro denetleyicinin veri sayfasına bakın.

INPUT_PULLUP ile yapılandırılmış bir pime bir sensör bağlarken, diğer ucun toprağa bağlanması gerekir. Basit bir anahtar durumunda, bu, anahtar açıkken pimin YÜKSEK ve düğmeye basıldığında DÜŞÜK okumasına neden olur. Çekme dirençleri, giriş olarak yapılandırılmış bir pime zayıf bir şekilde bağlanmış bir LED'i yakmak için yeterli akım sağlar. Bir projedeki LED'ler çalışıyor gibi görünüyorsa, ancak çok belirsizse, muhtemelen olan budur.

Bir pinin YÜKSEK veya DÜŞÜK olup olmadığını kontrol eden aynı yazmaçlar (dahili yonga bellek konumları) çekme dirençlerini kontrol eder. Sonuç olarak, pin INPUT modundayken yukarı çekme dirençleri açık olacak şekilde yapılandırılmış bir pin, pin daha sonra pinMode () ile bir OUTPUT moduna geçirilirse, pin HIGH olarak yapılandırılmış olacaktır. Bu, diğer yönde de çalışır ve YÜKSEK durumda bırakılan bir çıkış pini, pinMode () ile bir girişe geçilirse yukarı çekme direncine sahip olacaktır.

Example

pinMode(3,INPUT) ; // set pin to input without using built in pull up resistor
pinMode(5,INPUT_PULLUP) ; // set pin to input using built in pull up resistor

OUTPUT olarak Yapılandırılan Pinler

PinMode () ile OUTPUT olarak yapılandırılan pinlerin düşük empedans durumunda olduğu söylenir. Bu, diğer devrelere önemli miktarda akım sağlayabilecekleri anlamına gelir. Atmega pinleri, diğer cihazlara / devrelere 40 mA'ya (miliamper) kadar akım kaynağı (pozitif akım sağlar) veya düşürür (negatif akım sağlar). Bu, bir LED'i parlak bir şekilde yakmak (seri direnci unutmayın) veya birçok sensörü çalıştırmak için yeterli, ancak röleleri, solenoidleri veya motorları çalıştırmak için yeterli akım değildir.

Çıkış pinlerinden yüksek akım cihazları çalıştırmaya çalışmak, pin içindeki çıkış transistörlerine zarar verebilir veya yok edebilir veya tüm Atmega çipine zarar verebilir. Çoğunlukla bu, mikro denetleyicide "ölü" bir pimle sonuçlanır, ancak kalan yongalar yine de yeterince çalışır. Bu nedenle, belirli bir uygulama için pinlerden çekilen maksimum akım gerekmedikçe, OUTPUT pinlerini 470Ω veya 1k dirençler aracılığıyla diğer cihazlara bağlamak iyi bir fikirdir.

pinMode () İşlevi

PinMode () işlevi, belirli bir pini bir giriş veya çıkış olarak davranacak şekilde yapılandırmak için kullanılır. INPUT_PULLUP modu ile dahili kaldırma dirençlerini etkinleştirmek mümkündür. Ek olarak, INPUT modu dahili çekimleri açıkça devre dışı bırakır.

pinMode() Function Syntax

Void setup () {
   pinMode (pin , mode);
}
  • pin − the number of the pin whose mode you wish to set

  • mode − INPUT, OUTPUT, or INPUT_PULLUP.

Example

int button = 5 ; // button connected to pin 5
int LED = 6; // LED connected to pin 6

void setup () {
   pinMode(button , INPUT_PULLUP); 
   // set the digital pin as input with pull-up resistor
   pinMode(button , OUTPUT); // set the digital pin as output
}

void setup () {
   If (digitalRead(button ) == LOW) // if button pressed {
      digitalWrite(LED,HIGH); // turn on led
      delay(500); // delay for 500 ms
      digitalWrite(LED,LOW); // turn off led
      delay(500); // delay for 500 ms
   }
}

digitalWrite() Function

The digitalWrite() function is used to write a HIGH or a LOW value to a digital pin. If the pin has been configured as an OUTPUT with pinMode(), its voltage will be set to the corresponding value: 5V (or 3.3V on 3.3V boards) for HIGH, 0V (ground) for LOW. If the pin is configured as an INPUT, digitalWrite() will enable (HIGH) or disable (LOW) the internal pullup on the input pin. It is recommended to set the pinMode() to INPUT_PULLUP to enable the internal pull-up resistor.

If you do not set the pinMode() to OUTPUT, and connect an LED to a pin, when calling digitalWrite(HIGH), the LED may appear dim. Without explicitly setting pinMode(), digitalWrite() will have enabled the internal pull-up resistor, which acts like a large current-limiting resistor.

digitalWrite() Function Syntax

Void loop() {
   digitalWrite (pin ,value);
}
  • pin − the number of the pin whose mode you wish to set

  • value − HIGH, or LOW.

Example

int LED = 6; // LED connected to pin 6

void setup () {
   pinMode(LED, OUTPUT); // set the digital pin as output
}

void setup () { 
   digitalWrite(LED,HIGH); // turn on led
   delay(500); // delay for 500 ms
   digitalWrite(LED,LOW); // turn off led
   delay(500); // delay for 500 ms
}

analogRead( ) function

Arduino is able to detect whether there is a voltage applied to one of its pins and report it through the digitalRead() function. There is a difference between an on/off sensor (which detects the presence of an object) and an analog sensor, whose value continuously changes. In order to read this type of sensor, we need a different type of pin.

In the lower-right part of the Arduino board, you will see six pins marked “Analog In”. These special pins not only tell whether there is a voltage applied to them, but also its value. By using the analogRead() function, we can read the voltage applied to one of the pins.

This function returns a number between 0 and 1023, which represents voltages between 0 and 5 volts. For example, if there is a voltage of 2.5 V applied to pin number 0, analogRead(0) returns 512.

analogRead() function Syntax

analogRead(pin);
  • pin − the number of the analog input pin to read from (0 to 5 on most boards, 0 to 7 on the Mini and Nano, 0 to 15 on the Mega)

Example

int analogPin = 3;//potentiometer wiper (middle terminal) 
   // connected to analog pin 3 
int val = 0; // variable to store the value read

void setup() {
   Serial.begin(9600); // setup serial
} 

void loop() {
   val = analogRead(analogPin); // read the input pin
   Serial.println(val); // debug value
}

In this chapter, we will learn some advanced Input and Output Functions.

analogReference() Function

Configures the reference voltage used for analog input (i.e. the value used as the top of the input range). The options are −

  • DEFAULT − The default analog reference of 5 volts (on 5V Arduino boards) or 3.3 volts (on 3.3V Arduino boards)

  • INTERNAL − An built-in reference, equal to 1.1 volts on the ATmega168 or ATmega328 and 2.56 volts on the ATmega8 (not available on the Arduino Mega)

  • INTERNAL1V1 − A built-in 1.1V reference (Arduino Mega only)

  • INTERNAL2V56 − A built-in 2.56V reference (Arduino Mega only)

  • EXTERNAL − The voltage applied to the AREF pin (0 to 5V only) is used as the reference

analogReference() Function Syntax

analogReference (type);

type − can use any type of the follow (DEFAULT, INTERNAL, INTERNAL1V1, INTERNAL2V56, EXTERNAL)

Do not use anything less than 0V or more than 5V for external reference voltage on the AREF pin. If you are using an external reference on the AREF pin, you must set the analog reference to EXTERNAL before calling the analogRead() function. Otherwise, you will short the active reference voltage (internally generated) and the AREF pin, possibly damaging the microcontroller on your Arduino board.

Alternatively, you can connect the external reference voltage to the AREF pin through a 5K resistor, allowing you to switch between external and internal reference voltages.

Note that the resistor will alter the voltage that is used as the reference because there is an internal 32K resistor on the AREF pin. The two act as a voltage divider. For example, 2.5V applied through the resistor will yield 2.5 * 32 / (32 + 5) = ~2.2V at the AREF pin.

Example

int analogPin = 3;// potentiometer wiper (middle terminal) connected to analog pin 3 
int val = 0; // variable to store the read value

void setup() {
   Serial.begin(9600); // setup serial
   analogReference(EXTERNAL); // the voltage applied to the AREF pin (0 to 5V only) 
      // is used as the reference.
}

void loop() {
   val = analogRead(analogPin); // read the input pin
   Serial.println(val); // debug value
}

All data is entered into computers as characters, which includes letters, digits and various special symbols. In this section, we discuss the capabilities of C++ for examining and manipulating individual characters.

The character-handling library includes several functions that perform useful tests and manipulations of character data. Each function receives a character, represented as an int, or EOF as an argument. Characters are often manipulated as integers.

Remember that EOF normally has the value –1 and that some hardware architectures do not allow negative values to be stored in char variables. Therefore, the character-handling functions manipulate characters as integers.

The following table summarizes the functions of the character-handling library. When using functions from the character-handling library, include the <cctype> header.

S.No. Prototype & Description
1

int isdigit( int c )

Returns 1 if c is a digit and 0 otherwise.

2

int isalpha( int c )

Returns 1 if c is a letter and 0 otherwise.

3

int isalnum( int c )

Returns 1 if c is a digit or a letter and 0 otherwise.

4

int isxdigit( int c )

Returns 1 if c is a hexadecimal digit character and 0 otherwise.

(See Appendix D, Number Systems, for a detailed explanation of binary, octal, decimal and hexadecimal numbers.)

5

int islower( int c )

Returns 1 if c is a lowercase letter and 0 otherwise.

6

int isupper( int c )

Returns 1 if c is an uppercase letter; 0 otherwise.

7

int isspace( int c )

Returns 1 if c is a white-space character—newline ('\n'), space

(' '), form feed ('\f'), carriage return ('\r'), horizontal tab ('\t'), or vertical tab ('\v')—and 0 otherwise.

8

int iscntrl( int c )

Returns 1 if c is a control character, such as newline ('\n'), form feed ('\f'), carriage return ('\r'), horizontal tab ('\t'), vertical tab ('\v'), alert ('\a'), or backspace ('\b')—and 0 otherwise.

9

int ispunct( int c )

Returns 1 if c is a printing character other than a space, a digit, or a letter and 0 otherwise.

10

int isprint( int c )

Returns 1 if c is a printing character including space (' ') and 0 otherwise.

11

int isgraph( int c )

Returns 1 if c is a printing character other than space (' ') and 0 otherwise.

Examples

The following example demonstrates the use of the functions isdigit, isalpha, isalnum and isxdigit. Function isdigit determines whether its argument is a digit (0–9). The function isalpha determines whether its argument is an uppercase letter (A-Z) or a lowercase letter (a–z). The function isalnum determines whether its argument is an uppercase, lowercase letter or a digit. Function isxdigit determines whether its argument is a hexadecimal digit (A–F, a–f, 0–9).

Example 1

void setup () {
   Serial.begin (9600);
   Serial.print ("According to isdigit:\r");
   Serial.print (isdigit( '8' ) ? "8 is a": "8 is not a");
   Serial.print (" digit\r" );
   Serial.print (isdigit( '8' ) ?"# is a": "# is not a") ;
   Serial.print (" digit\r");
   Serial.print ("\rAccording to isalpha:\r" );
   Serial.print (isalpha('A' ) ?"A is a": "A is not a");
   Serial.print (" letter\r");
   Serial.print (isalpha('A' ) ?"b is a": "b is not a");
   Serial.print (" letter\r");
   Serial.print (isalpha('A') ?"& is a": "& is not a");
   Serial.print (" letter\r");
   Serial.print (isalpha( 'A' ) ?"4 is a":"4 is not a");
   Serial.print (" letter\r");
   Serial.print ("\rAccording to isalnum:\r");
   Serial.print (isalnum( 'A' ) ?"A is a" : "A is not a" );

   Serial.print (" digit or a letter\r" );
   Serial.print (isalnum( '8' ) ?"8 is a" : "8 is not a" ) ;
   Serial.print (" digit or a letter\r");
   Serial.print (isalnum( '#' ) ?"# is a" : "# is not a" );
   Serial.print (" digit or a letter\r");
   Serial.print ("\rAccording to isxdigit:\r");
   Serial.print (isxdigit( 'F' ) ?"F is a" : "F is not a" );
   Serial.print (" hexadecimal digit\r" );
   Serial.print (isxdigit( 'J' ) ?"J is a" : "J is not a" ) ;
   Serial.print (" hexadecimal digit\r" );
   Serial.print (isxdigit( '7' ) ?"7 is a" : "7 is not a" ) ;

   Serial.print (" hexadecimal digit\r" );
   Serial.print (isxdigit( '$' ) ? "$ is a" : "$ is not a" );
   Serial.print (" hexadecimal digit\r" );
   Serial.print (isxdigit( 'f' ) ? “f is a" : "f is not a");
   
}

void loop () {

}

Result

According to isdigit:
8 is a digit
# is not a digit
According to isalpha:
A is a letter
b is a letter
& is not a letter
4 is not a letter
According to isalnum:
A is a digit or a letter

8 is a digit or a letter
# is not a digit or a letter
According to isxdigit:
F is a hexadecimal digit
J is not a hexadecimal digit
7 is a hexadecimal digit

$ is not a hexadecimal digit
f is a hexadecimal digit

We use the conditional operator (?:) with each function to determine whether the string " is a " or the string " is not a " should be printed in the output for each character tested. For example, line a indicates that if '8' is a digit—i.e., if isdigit returns a true (nonzero) value—the string "8 is a " is printed. If '8' is not a digit (i.e., if isdigit returns 0), the string " 8 is not a " is printed.

Example 2

The following example demonstrates the use of the functions islower and isupper. The function islower determines whether its argument is a lowercase letter (a–z). Function isupper determines whether its argument is an uppercase letter (A–Z).

int thisChar = 0xA0;

void setup () {
   Serial.begin (9600);
   Serial.print ("According to islower:\r") ;
   Serial.print (islower( 'p' ) ? "p is a" : "p is not a" );
   Serial.print ( " lowercase letter\r" );
   Serial.print ( islower( 'P') ? "P is a" : "P is not a") ;
   Serial.print ("lowercase letter\r");
   Serial.print (islower( '5' ) ? "5 is a" : "5 is not a" );
   Serial.print ( " lowercase letter\r" );
   Serial.print ( islower( '!' )? "! is a" : "! is not a") ;
   Serial.print ("lowercase letter\r");

   Serial.print ("\rAccording to isupper:\r") ;
   Serial.print (isupper ( 'D' ) ? "D is a" : "D is not an" );
   Serial.print ( " uppercase letter\r" );
   Serial.print ( isupper ( 'd' )? "d is a" : "d is not an") ;
   Serial.print ( " uppercase letter\r" );
   Serial.print (isupper ( '8' ) ? "8 is a" : "8 is not an" );
   Serial.print ( " uppercase letter\r" );
   Serial.print ( islower( '$' )? "$ is a" : "$ is not an") ;
   Serial.print ("uppercase letter\r ");
}

void setup () {

}

Result

According to islower:
p is a lowercase letter
P is not a lowercase letter
5 is not a lowercase letter
! is not a lowercase letter

According to isupper:
D is an uppercase letter
d is not an uppercase letter
8 is not an uppercase letter
$ is not an uppercase letter

Example 3

The following example demonstrates the use of functions isspace, iscntrl, ispunct, isprint and isgraph.

  • The function isspace determines whether its argument is a white-space character, such as space (' '), form feed ('\f'), newline ('\n'), carriage return ('\r'), horizontal tab ('\t') or vertical tab ('\v').

  • The function iscntrl determines whether its argument is a control character such as horizontal tab ('\t'), vertical tab ('\v'), form feed ('\f'), alert ('\a'), backspace ('\b'), carriage return ('\r') or newline ('\n').

  • The function ispunct determines whether its argument is a printing character other than a space, digit or letter, such as $, #, (, ), [, ], {, }, ;, : or %.

  • The function isprint determines whether its argument is a character that can be displayed on the screen (including the space character).

  • The function isgraph tests for the same characters as isprint, but the space character is not included.

void setup () {
   Serial.begin (9600);
   Serial.print ( " According to isspace:\rNewline ") ;
   Serial.print (isspace( '\n' )? " is a" : " is not a" );
   Serial.print ( " whitespace character\rHorizontal tab") ;
   Serial.print (isspace( '\t' )? " is a" : " is not a" );
   Serial.print ( " whitespace character\n") ;
   Serial.print (isspace('%')? " % is a" : " % is not a" );
   
   Serial.print ( " \rAccording to iscntrl:\rNewline") ;
   Serial.print ( iscntrl( '\n' )?"is a" : " is not a" ) ;
   Serial.print (" control character\r");
   Serial.print (iscntrl( '$' ) ? " $ is a" : " $ is not a" );
   Serial.print (" control character\r");
   Serial.print ("\rAccording to ispunct:\r");
   Serial.print (ispunct(';' ) ?"; is a" : "; is not a" ) ;
   Serial.print (" punctuation character\r");
   Serial.print (ispunct('Y' ) ?"Y is a" : "Y is not a" ) ;
   Serial.print ("punctuation character\r");
   Serial.print (ispunct('#' ) ?"# is a" : "# is not a" ) ;
   Serial.print ("punctuation character\r");

   Serial.print ( "\r According to isprint:\r");
   Serial.print (isprint('$' ) ?"$ is a" : "$ is not a" );
   Serial.print (" printing character\rAlert ");
   Serial.print (isprint('\a' ) ?" is a" : " is not a" );
   Serial.print (" printing character\rSpace ");
   Serial.print (isprint(' ' ) ?" is a" : " is not a" );
   Serial.print (" printing character\r");
   
   Serial.print ("\r According to isgraph:\r");
   Serial.print (isgraph ('Q' ) ?"Q is a" : "Q is not a" );
   Serial.print ("printing character other than a space\rSpace ");
   Serial.print (isgraph (' ') ?" is a" : " is not a" );
   Serial.print ("printing character other than a space ");
}

void loop () {

}

Result

According to isspace:
Newline is a whitespace character
Horizontal tab is a whitespace character
% is not a whitespace character
According to iscntrl:
Newline is a control character
$ is not a control character
According to ispunct:
; is a punctuation character
Y is not a punctuation character
# is a punctuation character
According to isprint:
$ is a printing character
Alert is not a printing character
Space is a printing character
According to isgraph:
Q is a printing character other than a space
Space is not a printing character other than a space

The Arduino Math library (math.h) includes a number of useful mathematical functions for manipulating floating-point numbers.

Library Macros

Following are the macros defined in the header math.h −

Macros Value Description
M_E 2.7182818284590452354 The constant e.
M_LOG2E

1.4426950408889634074

/* log_2 e */

The logarithm of the e to base 2
M_1_PI

0.31830988618379067154

/* 1/pi */

The constant 1/pi
M_2_PI

0.63661977236758134308

/* 2/pi */

The constant 2/pi
M_2_SQRTPI

1.12837916709551257390

/* 2/sqrt(pi) */

The constant 2/sqrt(pi)
M_LN10

2.30258509299404568402

/* log_e 10 */

The natural logarithm of the 10
M_LN2

0.69314718055994530942

/* log_e 2 */

The natural logarithm of the 2
M_LOG10E

0.43429448190325182765

/* log_10 e */

The logarithm of the e to base 10
M_PI

3.14159265358979323846

/* pi */

The constant pi
M_PI_2

3.3V1.57079632679489661923

/* pi/2 */

The constant pi/2
M_PI_4

0.78539816339744830962

/* pi/4 */

The constant pi/4
M_SQRT1_2

0.70710678118654752440

/* 1/sqrt(2) */

The constant 1/sqrt(2)
M_SQRT2

1.41421356237309504880

/* sqrt(2) */

The square root of 2
acosf - The alias for acos() function
asinf - The alias for asin() function
atan2f - The alias for atan2() function
cbrtf - The alias for cbrt() function
ceilf - The alias for ceil() function
copysignf - The alias for copysign() function
coshf - The alias for cosh() function
expf - The alias for exp() function
fabsf - The alias for fabs() function
fdimf - The alias for fdim() function
floorf - The alias for floor() function
fmaxf - The alias for fmax() function
fminf - The alias for fmin() function
fmodf - The alias for fmod() function
frexpf - The alias for frexp() function
hypotf - The alias for hypot() function
INFINITY - INFINITY constant
isfinitef - The alias for isfinite() function
isinff - The alias for isinf() function
isnanf - The alias for isnan() function
ldexpf - The alias for ldexp() function
log10f - The alias for log10() function
logf - The alias for log() function
lrintf - The alias for lrint() function
lroundf - The alias for lround() function

Library Functions

The following functions are defined in the header math.h

S.No. Library Function & Description
1

double acos (double __x)

The acos() function computes the principal value of the arc cosine of __x. The returned value is in the range [0, pi] radians. A domain error occurs for arguments not in the range [-1, +1].

2

double asin (double __x)

The asin() function computes the principal value of the arc sine of __x. The returned value is in the range [-pi/2, pi/2] radians. A domain error occurs for arguments not in the range [-1, +1].

3

double atan (double __x)

The atan() function computes the principal value of the arc tangent of __x. The returned value is in the range [-pi/2, pi/2] radians.

4

double atan2 (double __y, double __x)

The atan2() function computes the principal value of the arc tangent of __y / __x, using the signs of both arguments to determine the quadrant of the return value. The returned value is in the range [-pi, +pi] radians.

5

double cbrt (double __x)

The cbrt() function returns the cube root of __x.

6

double ceil (double __x)

The ceil() function returns the smallest integral value greater than or equal to __x, expressed as a floating-point number.

7

static double copysign (double __x, double __y)

The copysign() function returns __x but with the sign of __y. They work even if __x or __y are NaN or zero.

8

double cos(double __x)

The cos() function returns the cosine of __x, measured in radians.

9

double cosh (double __x)

The cosh() function returns the hyperbolic cosine of __x.

10

double exp (double __x)

The exp() function returns the exponential value of __x.

11

double fabs (double __x)

The fabs() function computes the absolute value of a floating-point number __x.

12

double fdim (double __x, double __y)

The fdim() function returns max(__x - __y, 0). If __x or __y or both are NaN, NaN is returned.

13

double floor (double __x)

The floor() function returns the largest integral value less than or equal to __x, expressed as a floating-point number.

14

double fma (double __x, double __y, double __z)

The fma() function performs floating-point multiply-add. This is the operation (__x * __y) + __z, but the intermediate result is not rounded to the destination type. This can sometimes improve the precision of a calculation.

15

double fmax (double __x, double __y)

The fmax() function returns the greater of the two values __x and __y. If an argument is NaN, the other argument is returned. If both the arguments are NaN, NaN is returned.

16

double fmin (double __x, double __y)

The fmin() function returns the lesser of the two values __x and __y. If an argument is NaN, the other argument is returned. If both the arguments are NaN, NaN is returned.

17

double fmod (double __x, double__y)

The function fmod() returns the floating-point remainder of __x / __y.

18

double frexp (double __x, int * __pexp)

The frexp() function breaks a floating-point number into a normalized fraction and an integral power of 2. It stores the integer in the int object pointed to by __pexp. If __x is a normal float point number, the frexp() function returns the value v, such that v has a magnitude in the interval [1/2, 1) or zero, and __x equals v times 2 raised to the power __pexp. If __x is zero, both parts of the result are zero. If __x is not a finite number, the frexp() returns __x as is and stores 0 by __pexp.

Note − This implementation permits a zero pointer as a directive to skip a storing the exponent.

19

double hypot (double __x, double__y)

The hypot() function returns sqrt(__x*__x + __y*__y). This is the length of the hypotenuse of a right triangle with sides of length __x and __y, or the distance of the point (__x, __y) from the origin. Using this function instead of the direct formula is wise, since the error is much smaller. No underflow with small __x and __y. No overflow if result is in range.

20

static int isfinite (double __x)

The isfinite() function returns a nonzero value if __x is finite: not plus or minus infinity, and not NaN.

21

int isinf (double __x)

The function isinf() returns 1 if the argument __x is positive infinity, -1 if __x is negative infinity, and 0 otherwise.

Note − The GCC 4.3 can replace this function with inline code that returns the 1 value for both infinities (gcc bug #35509).

22

int isnan (double __x)

The function isnan() returns 1 if the argument __x represents a "not-a-number" (NaN) object, otherwise 0.

23

double ldexp (double __x, int __exp )

The ldexp() function multiplies a floating-point number by an integral power of 2. It returns the value of __x times 2 raised to the power __exp.

24

double log (double __x)

The log() function returns the natural logarithm of argument __x.

25

double log10(double __x)

The log10() function returns the logarithm of argument __x to base 10.

26

long lrint (double __x)

The lrint() function rounds __x to the nearest integer, rounding the halfway cases to the even integer direction. (That is both 1.5 and 2.5 values are rounded to 2). This function is similar to rint() function, but it differs in type of return value and in that an overflow is possible.

Returns

The rounded long integer value. If __x is not a finite number or an overflow, this realization returns the LONG_MIN value (0x80000000).

27

long lround (double __x)

The lround() function rounds __x to the nearest integer, but rounds halfway cases away from zero (instead of to the nearest even integer). This function is similar to round() function, but it differs in type of return value and in that an overflow is possible.

Returns

The rounded long integer value. If __x is not a finite number or an overflow was, this realization returns the LONG_MIN value (0x80000000).

28

double modf (double __x, double * __iptr )

The modf() function breaks the argument __x into integral and fractional parts, each of which has the same sign as the argument. It stores the integral part as a double in the object pointed to by __iptr.

The modf() function returns the signed fractional part of __x.

Note − This implementation skips writing by zero pointer. However, the GCC 4.3 can replace this function with inline code that does not permit to use NULL address for the avoiding of storing.

29

float modff (float __x, float * __iptr)

The alias for modf().

30

double pow (double __x, double __y)

The function pow() returns the value of __x to the exponent __y.

31

double round (double __x)

The round() function rounds __x to the nearest integer, but rounds halfway cases away from zero (instead of to the nearest even integer). Overflow is impossible.

Returns

The rounded value. If __x is an integral or infinite, __x itself is returned. If __x is NaN, then NaN is returned.

32

int signbit (double __x)

The signbit() function returns a nonzero value if the value of __x has its sign bit set. This is not the same as `__x < 0.0', because IEEE 754 floating point allows zero to be signed. The comparison `-0.0 < 0.0' is false, but `signbit (-0.0)' will return a nonzero value.

33

double sin (double __x)

The sin() function returns the sine of __x, measured in radians.

34

double sinh (double __x)

The sinh() function returns the hyperbolic sine of __x.

35

double sqrt (double __x)

The sqrt() function returns the non-negative square root of __x.

36

double square (double __x)

The function square() returns __x * __x.

Note − This function does not belong to the C standard definition.

37

double tan (double __x)

The tan() function returns the tangent of __x, measured in radians.

38

double tanh ( double __x)

The tanh() function returns the hyperbolic tangent of __x.

39

double trunc (double __x)

The trunc() function rounds __x to the nearest integer not larger in absolute value.

Misal

Aşağıdaki örnek, en yaygın math.h kitaplık işlevlerinin nasıl kullanılacağını gösterir -

double double__x = 45.45 ;
double double__y = 30.20 ;

void setup() {
   Serial.begin(9600);
   Serial.print("cos num = ");
   Serial.println (cos (double__x) ); // returns cosine of x
   Serial.print("absolute value of num = ");
   Serial.println (fabs (double__x) ); // absolute value of a float
   Serial.print("floating point modulo = ");
   Serial.println (fmod (double__x, double__y)); // floating point modulo
   Serial.print("sine of num = ");
   Serial.println (sin (double__x) ) ;// returns sine of x
   Serial.print("square root of num : ");
   Serial.println ( sqrt (double__x) );// returns square root of x
   Serial.print("tangent of num : ");
   Serial.println ( tan (double__x) ); // returns tangent of x
   Serial.print("exponential value of num : ");
   Serial.println ( exp (double__x) ); // function returns the exponential value of x.
   Serial.print("cos num : ");

   Serial.println (atan (double__x) ); // arc tangent of x
   Serial.print("tangent of num : ");
   Serial.println (atan2 (double__y, double__x) );// arc tangent of y/x
   Serial.print("arc tangent of num : ");
   Serial.println (log (double__x) ) ; // natural logarithm of x
   Serial.print("cos num : ");
   Serial.println ( log10 (double__x)); // logarithm of x to base 10.
   Serial.print("logarithm of num to base 10 : ");
   Serial.println (pow (double__x, double__y) );// x to power of y
   Serial.print("power of num : ");
   Serial.println (square (double__x)); // square of x
}

void loop() {

}

Sonuç

cos num = 0.10
absolute value of num = 45.45
floating point modulo =15.25
sine of num = 0.99
square root of num : 6.74
tangent of num : 9.67
exponential value of num : ovf
cos num : 1.55
tangent of num : 0.59
arc tangent of num : 3.82
cos num : 1.66
logarithm of num to base 10 : inf
power of num : 2065.70

Trigonometriyi, hareket eden nesnenin mesafesini veya açısal hızı hesaplamak gibi pratik olarak kullanmanız gerekir. Arduino, prototiplerini yazarak özetlenebilecek geleneksel trigonometrik fonksiyonlar (sin, cos, tan, asin, acos, atan) sağlar. Math.h, trigonometri fonksiyonunun prototipini içerir.

Trigonometrik Tam Sözdizimi

double sin(double x); //returns sine of x radians
double cos(double y); //returns cosine of y radians
double tan(double x); //returns the tangent of x radians
double acos(double x); //returns A, the angle corresponding to cos (A) = x
double asin(double x); //returns A, the angle corresponding to sin (A) = x
double atan(double x); //returns A, the angle corresponding to tan (A) = x

Misal

double sine = sin(2); // approximately 0.90929737091
double cosine = cos(2); // approximately -0.41614685058
double tangent = tan(2); // approximately -2.18503975868

Arduino Due, Atmel SAM3X8E ARM Cortex-M3 CPU tabanlı bir mikrodenetleyici kartıdır. 32-bit ARM çekirdekli mikrodenetleyiciye dayanan ilk Arduino kartıdır.

Önemli özellikler -

  • 54 dijital giriş / çıkış pinine sahiptir (12 tanesi PWM çıkışı olarak kullanılabilir)
  • 12 analog giriş
  • 4 UART (donanım seri bağlantı noktaları)
  • 84 MHz saat, USB OTG özellikli bağlantı
  • 2 DAC (dijitalden analoğa), 2 TWI, bir güç girişi, bir SPI başlığı, bir JTAG başlığı
  • Sıfırla düğmesi ve bir silme düğmesi

Arduino Due Board'un Özellikleri

Çalışma volt işlemci hızı Analog giriş / çıkış Dijital IO / PWM EEPROM [KB] SRAM [KB] Flash [KB] USB UART
3,3 Volt 84 Mhz 12/2 54/12 - 96 512 2 mikro 4

İletişim

  • 4 Donanım UARTları
  • 2 I2C
  • 1 CAN Arayüzü (Otomotiv iletişim protokolü)
  • 1 SPI
  • 1 Arayüz JTAG (10 pin)
  • 1 USB Ana Bilgisayar (Leonardo gibi)
  • 1 Programlama Portu

Çoğu Arduino kartının aksine, Arduino Due kartı 3,3V'de çalışır. G / Ç pimlerinin tolere edebileceği maksimum voltaj 3,3 V'tur. Herhangi bir G / Ç pinine 3,3V'den yüksek voltaj uygulamak panele zarar verebilir.

Kart, mikro denetleyiciyi desteklemek için gereken her şeyi içerir. Başlamak için bir mikro USB kablosuyla bir bilgisayara bağlayabilir veya bir AC-DC adaptörü veya pille çalıştırabilirsiniz. Due, 3.3V'de çalışan tüm Arduino shieldları ile uyumludur.

Arduino Zero

Sıfır, UNO tarafından oluşturulan platformun basit ve güçlü bir 32-bit uzantısıdır. Zero board, performansı artırarak, cihazlar için çeşitli proje fırsatları sağlayarak aileyi genişletir ve 32-bit uygulama geliştirme hakkında bilgi edinmek için harika bir eğitim aracı görevi görür.

Önemli özellikler -

  • Zero uygulamaları akıllı IoT cihazlarından, giyilebilir teknolojiden, yüksek teknolojili otomasyondan çılgın robotiklere kadar uzanıyor.

  • Anakart, 32-bit ARM Cortex® M0 + çekirdek içeren Atmel'in SAMD21 MCU'su tarafından desteklenmektedir.

  • En önemli özelliklerinden biri, ek donanıma ihtiyaç duymadan tam bir hata ayıklama arabirimi sağlayan ve yazılım hata ayıklama için kullanım kolaylığını önemli ölçüde artıran Atmel'in Gömülü Hata Ayıklayıcısı'dır (EDBG).

  • EDBG ayrıca aygıt ve önyükleyici programlaması için kullanılabilen sanal bir COM bağlantı noktasını da destekler.

Arduino Zero kartının özellikleri

Çalışma volt işlemci hızı Analog giriş / çıkış Dijital IO / PWM EEPROM [KB] SRAM [KB] Flash [KB] USB UART
3,3 Volt 48 Mhz 6/1 14/10 - 32 256 2 mikro 2

Çoğu Arduino ve Genuino kartının aksine, Zero 3,3V'de çalışır. G / Ç pimlerinin tolere edebileceği maksimum voltaj 3,3 V'tur. Herhangi bir G / Ç pinine 3,3V'den yüksek voltaj uygulamak panele zarar verebilir.

Kart, mikro denetleyiciyi desteklemek için gereken her şeyi içerir. Başlamak için bir mikro USB kablosuyla bir bilgisayara bağlayabilir veya bir AC-DC adaptörü veya pille çalıştırabilirsiniz. Zero, 3,3V'de çalışan tüm kalkanlarla uyumludur.

Darbe Genişliği Modülasyonu veya PWM, bir darbe dizisindeki darbelerin genişliğini değiştirmek için kullanılan yaygın bir tekniktir. PWM, servoları ve hız kontrol cihazlarını kontrol etmek, motorların ve LED'lerin etkin gücünü sınırlamak gibi birçok uygulamaya sahiptir.

PWM'nin Temel Prensibi

Darbe genişlik modülasyonu temelde, değişen yüksek ve düşük zamana sahip bir kare dalgadır. Aşağıdaki şekilde temel bir PWM sinyali gösterilmektedir.

PWM ile ilişkili çeşitli terimler vardır -

  • On-Time - Zaman sinyalinin süresi yüksek.

  • Off-Time - Zaman sinyalinin süresi düşük.

  • Period - PWM sinyalinin açık ve kapalı zamanlarının toplamı olarak temsil edilir.

  • Duty Cycle - PWM sinyali süresince açık kalan zaman sinyalinin yüzdesi olarak temsil edilir.

Periyot

Şekilde gösterildiği gibi, T on açık kalma süresini belirtir ve T off sinyalin kapalı kalma süresini belirtir. Periyot, hem açma hem de kapama sürelerinin toplamıdır ve aşağıdaki denklemde gösterildiği gibi hesaplanır -

Görev döngüsü

Görev döngüsü, sürenin açık olduğu süre olarak hesaplanır. Yukarıda hesaplanan süre kullanılarak görev döngüsü şu şekilde hesaplanır -

analogWrite () Fonksiyonu

analogWrite()işlevi bir pime bir analog değer (PWM dalgası) yazar. Değişken parlaklıkta bir LED'i yakmak veya bir motoru çeşitli hızlarda sürmek için kullanılabilir. AnalogWrite () işlevi çağrıldıktan sonra, pin, bir sonraki analogWrite () çağrısına veya aynı pin üzerindeki digitalRead () veya digitalWrite () çağrısına kadar belirtilen görev döngüsünün sabit bir kare dalgasını oluşturacaktır. Çoğu pimdeki PWM sinyalinin frekansı yaklaşık 490 Hz'dir. Uno ve benzeri kartlarda 5 ve 6 numaralı pinler yaklaşık 980 Hz frekansa sahiptir. Leonardo'daki 3 ve 11 numaralı pinler de 980 Hz'de çalışır.

Çoğu Arduino kartında (ATmega168 veya ATmega328'e sahip olanlar), bu işlev 3, 5, 6, 9, 10 ve 11 numaralı pinlerde çalışır. Arduino Mega'da 2 - 13 ve 44 - 46 pinlerinde çalışır. Daha eski Arduino yalnızca ATmega8 destekli anakartlar analogWrite() 9, 10 ve 11 numaralı pinlerde.

Arduino Due destekler analogWrite()2 ila 13 pinlerinde ve DAC0 ve DAC1 pinlerinde. PWM pinlerinden farklı olarak, DAC0 ve DAC1, Dijitalden Analog'a dönüştürücülerdir ve gerçek analog çıkışlar olarak işlev görür.

AnalogWrite () 'yı çağırmadan önce pin'i çıkış olarak ayarlamak için pinMode ()' u çağırmanıza gerek yoktur.

analogWrite () İşlev Sözdizimi

analogWrite ( pin , value ) ;

value - görev döngüsü: 0 (her zaman kapalı) ile 255 (her zaman açık) arasında.

Example

int ledPin = 9; // LED connected to digital pin 9
int analogPin = 3; // potentiometer connected to analog pin 3
int val = 0; // variable to store the read value

void setup() {
   pinMode(ledPin, OUTPUT); // sets the pin as output
}

void loop() {
   val = analogRead(analogPin); // read the input pin
   analogWrite(ledPin, (val / 4)); // analogRead values go from 0 to 1023, 
      // analogWrite values from 0 to 255
}

Rastgele sayılar oluşturmak için Arduino rastgele sayı işlevlerini kullanabilirsiniz. İki işlevimiz var -

  • randomSeed(seed)
  • random()

randomSeed (tohum)

RandomSeed (seed) işlevi, Arduino'nun sözde rasgele sayı üretecini sıfırlar. Random () tarafından döndürülen sayıların dağılımı esasen rasgele olmasına rağmen, dizi tahmin edilebilirdir. Jeneratörü rastgele bir değere sıfırlamalısınız. Bağlantısız bir analog pininiz varsa, çevredeki ortamdan rastgele gürültü alabilir. Bunlar radyo dalgaları, kozmik ışınlar, cep telefonlarından gelen elektromanyetik parazit, floresan ışıklar vb. Olabilir.

Misal

randomSeed(analogRead(5)); // randomize using noise from analog pin 5

rastgele ()

Rastgele işlevi, sözde rastgele sayılar üretir. Sözdizimi aşağıdadır.

random () İfadeler Sözdizimi

long random(max) // it generate random numbers from 0 to max
long random(min, max) // it generate random numbers from min to max

Misal

long randNumber;

void setup() {
   Serial.begin(9600);
   // if analog input pin 0 is unconnected, random analog
   // noise will cause the call to randomSeed() to generate
   // different seed numbers each time the sketch runs.
   // randomSeed() will then shuffle the random function.
   randomSeed(analogRead(0));
}

void loop() {
   // print a random number from 0 to 299
   Serial.print("random1=");
   randNumber = random(300);
   Serial.println(randNumber); // print a random number from 0to 299
   Serial.print("random2=");
   randNumber = random(10, 20);// print a random number from 10 to 19
   Serial.println (randNumber);
   delay(50);
}

Şimdi bitler ve baytlar gibi bazı temel kavramlar hakkındaki bilgilerimizi yenileyelim.

Bitler

Bir bit, sadece bir ikili rakamdır.

  • İkili sistem, 0 ve 1 olmak üzere iki basamak kullanır.

  • Bir sayının basamaklarının aynı değere sahip olmadığı ondalık sayı sistemine benzer şekilde, bir bitin 'anlamı' ikili sayıdaki konumuna bağlıdır. Örneğin, 666 ondalık sayısındaki basamaklar aynıdır, ancak farklı değerlere sahiptir.

Bayt

Bir bayt sekiz bitten oluşur.

  • Bir bit bir rakamsa, baytların sayıları temsil etmesi mantıklıdır.

  • Tüm matematiksel işlemler bunlar üzerinde gerçekleştirilebilir.

  • Bir bayttaki rakamlar da aynı anlama sahip değildir.

  • En soldaki bit, En Önemli Bit (MSB) adı verilen en büyük değere sahiptir.

  • En sağdaki bit en düşük değere sahiptir ve bu nedenle Least Significant Bit (LSB) olarak adlandırılır.

  • Sekiz sıfır ve bir baytın bir tanesi 256 farklı şekilde birleştirilebildiğinden, bir bayt ile temsil edilebilen en büyük ondalık sayı 255'tir (bir kombinasyon bir sıfırı temsil eder).

Kesintiler, Arduino'nun mevcut çalışmasını durdurur, böylece başka işler yapılabilir.

Diyelim ki evde oturuyorsunuz, biriyle sohbet ediyorsunuz. Aniden telefon çalıyor. Sohbeti bırakırsınız ve arayanla konuşmak için telefonu kaldırırsınız. Telefon görüşmenizi bitirdiğinizde, telefon çalmadan önce kişiyle sohbet etmeye geri dönersiniz.

Benzer şekilde, ana rutini biriyle sohbet etmek olarak düşünebilirsiniz, telefonun çalması sohbeti durdurmanıza neden olur. Kesinti hizmeti rutini, telefonda konuşma sürecidir. Telefon görüşmesi bittiğinde, ana sohbet rutininize geri dönersiniz. Bu örnek, bir kesmenin bir işlemcinin nasıl davranmasına neden olduğunu tam olarak açıklamaktadır.

Ana program çalışıyor ve bir devrede bazı işlevler gerçekleştiriyor. Bununla birlikte, bir kesinti meydana geldiğinde, başka bir rutin gerçekleştirilirken ana program durur. Bu rutin bittiğinde, işlemci ana rutine geri döner.

Önemli özellikler

Kesmelerle ilgili bazı önemli özellikler şunlardır:

  • Kesintiler çeşitli kaynaklardan gelebilir. Bu durumda, dijital pinlerden birindeki bir durum değişikliğiyle tetiklenen bir donanım kesintisi kullanıyoruz.

  • Çoğu Arduino tasarımında, sırasıyla dijital I / O pinleri 2 ve 3'e bağlanan iki donanım kesintisi ("interrupt0" ve "interrupt1" olarak adlandırılır) bulunur.

  • Arduino Mega, 21, 20, 19 ve 18 pinlerinde ek kesintiler ("interrupt2" - "interrupt5") dahil olmak üzere altı donanım kesintisine sahiptir.

  • "Interrupt Service Routine" (genellikle ISR olarak bilinir) adı verilen özel bir işlevi kullanarak bir rutin tanımlayabilirsiniz.

  • Rutini tanımlayabilir ve yükselen kenardaki, düşen kenardaki veya her ikisindeki koşulları belirleyebilirsiniz. Bu özel koşullarda, kesintiye hizmet verilecektir.

  • Bir giriş pininde her olay gerçekleştiğinde, bu fonksiyonun otomatik olarak yürütülmesi mümkündür.

Kesinti Türleri

İki tür kesinti vardır -

  • Hardware Interrupts - Yüksek veya alçak giden bir harici kesinti pimi gibi harici bir olaya yanıt olarak oluşurlar.

  • Software Interrupts- Yazılımda gönderilen bir talimata yanıt olarak oluşurlar. "Arduino dilinin" desteklediği tek kesme türü, attachInterrupt () işlevidir.

Arduino'da Kesintileri Kullanma

Kesmeler, zamanlama problemlerini çözmede yardımcı olduğu için Arduino programlarında çok kullanışlıdır. Bir kesmenin iyi bir uygulaması, bir döner kodlayıcı okumak veya bir kullanıcı girişini gözlemlemektir. Genel olarak, bir ISR olabildiğince kısa ve hızlı olmalıdır. Çiziminiz birden fazla ISR kullanıyorsa, aynı anda yalnızca biri çalıştırılabilir. Diğer kesintiler, sahip oldukları önceliğe bağlı olarak, mevcut kesinti tamamlandıktan sonra yürütülecektir.

Tipik olarak, genel değişkenler ISR ile ana program arasında veri iletmek için kullanılır. Bir ISR ile ana program arasında paylaşılan değişkenlerin doğru şekilde güncellendiğinden emin olmak için, bunları geçici olarak bildirin.

attachInterrupt İfadesi Sözdizimi

attachInterrupt(digitalPinToInterrupt(pin),ISR,mode);//recommended for arduino board
attachInterrupt(pin, ISR, mode) ; //recommended Arduino Due, Zero only
//argument pin: the pin number
//argument ISR: the ISR to call when the interrupt occurs; 
   //this function must take no parameters and return nothing. 
   //This function is sometimes referred to as an interrupt service routine.
//argument mode: defines when the interrupt should be triggered.

Aşağıdaki üç sabit, geçerli değerler olarak önceden tanımlanmıştır -

  • LOW pim düşük olduğunda kesmeyi tetiklemek için.

  • CHANGE pinin değeri her değiştiğinde kesmeyi tetiklemek için.

  • FALLING pim yüksekten düşüğe gittiğinde.

Example

int pin = 2; //define interrupt pin to 2
volatile int state = LOW; // To make sure variables shared between an ISR
//the main program are updated correctly,declare them as volatile.

void setup() {
   pinMode(13, OUTPUT); //set pin 13 as output
   attachInterrupt(digitalPinToInterrupt(pin), blink, CHANGE);
   //interrupt at pin 2 blink ISR when pin to change the value
} 
void loop() { 
   digitalWrite(13, state); //pin 13 equal the state value
} 

void blink() { 
   //ISR function
   state = !state; //toggle the state when the interrupt occurs
}

Bu veri alışverişini sağlamak için yüzlerce iletişim protokolü tanımlanmıştır. Her protokol iki kategoriden birine ayrılabilir: paralel veya seri.

Paralel İletişim

Arduino ve çevre birimleri arasında giriş / çıkış portları aracılığıyla paralel bağlantı, birkaç metreye kadar daha kısa mesafeler için ideal çözümdür. Ancak, daha uzun mesafeler için iki cihaz arasında iletişim kurulmasının gerekli olduğu diğer durumlarda paralel bağlantı kullanmak mümkün değildir. Paralel arabirimler aynı anda birden fazla bit aktarır. Genellikle veri yollarına ihtiyaç duyarlar - sekiz, on altı veya daha fazla kablo üzerinden iletilirler. Veriler 1'ler ve 0'ların büyük, çarpışan dalgaları halinde aktarılır.

Paralel İletişimin Avantajları ve Dezavantajları

Paralel iletişimin kesinlikle avantajları vardır. Seriden daha hızlıdır, basittir ve uygulaması nispeten kolaydır. Ancak, birçok giriş / çıkış (G / Ç) bağlantı noktası ve hattı gerektirir. Bir projeyi temel bir Arduino Uno'dan bir Mega'ya taşımak zorunda kaldıysanız, bir mikroişlemci üzerindeki I / O hatlarının değerli ve az olabileceğini bilirsiniz. Bu nedenle pin gayrimenkul için potansiyel hızdan ödün vererek seri iletişimi tercih ediyoruz.

Seri Haberleşme Modülleri

Günümüzde çoğu Arduino kartı, standart ekipman olarak seri iletişim için birkaç farklı sistemle üretilmiştir.

Bu sistemlerden hangisinin kullanıldığı aşağıdaki faktörlere bağlıdır -

  • Mikrodenetleyicinin veri alışverişi yapması gereken kaç cihaz var?
  • Veri alışverişi ne kadar hızlı olmalı?
  • Bu cihazlar arasındaki mesafe nedir?
  • Eşzamanlı olarak veri göndermek ve almak gerekli midir?

Seri iletişimle ilgili en önemli şeylerden biri, Protocolkesinlikle uyulmalıdır. Cihazların karşılıklı olarak değiş tokuş ettikleri verileri doğru şekilde yorumlayabilmeleri için uygulanması gereken bir dizi kuraldır. Neyse ki, Arduino bunu otomatik olarak halleder, böylece programcı / kullanıcının işi basit yazmaya (gönderilecek veri) ve okumaya (alınan veriler) indirgenir.

Seri İletişim Türleri

Seri iletişim ayrıca şu şekilde sınıflandırılabilir:

  • Synchronous - Senkronize edilen cihazlar aynı saati kullanır ve zamanlamaları birbirleriyle senkronize olur.

  • Asynchronous - Eşzamansız olan cihazların kendi saatleri vardır ve önceki durumun çıktısı tarafından tetiklenir.

Bir cihazın senkronize olup olmadığını anlamak kolaydır. Bağlı tüm cihazlara aynı saat verilirse bunlar senkron olur. Saat hattı yoksa, zaman uyumsuzdur.

Örneğin, UART (Universal Asynchronous Receiver Transmitter) modülü asenkrondur.

Eşzamansız seri protokolün bir dizi yerleşik kuralı vardır. Bu kurallar, sağlam ve hatasız veri aktarımlarını sağlamaya yardımcı olan mekanizmalardan başka bir şey değildir. Harici saat sinyalinden kaçınmak için elde ettiğimiz bu mekanizmalar -

  • Senkronizasyon bitleri
  • Veri bitleri
  • Eşlik bitleri
  • Baud hızı

Senkronizasyon Bitleri

Senkronizasyon bitleri, her veri paketiyle aktarılan iki veya üç özel bittir. Bunlar başlangıç ​​biti ve durdurma bitleridir. Adlarına sadık kalarak, bu bitler bir paketin sırasıyla başlangıcını ve sonunu işaretler.

Her zaman yalnızca bir başlangıç ​​biti vardır, ancak durdurma bitlerinin sayısı bir veya iki olarak konfigüre edilebilir (normalde birde bırakılmasına rağmen).

Başlangıç ​​biti her zaman 1'den 0'a giden boşta bir veri hattı ile gösterilirken, durdurma bit (ler) i hattı 1'de tutarak boşta duruma geri dönecektir.

Veri bitleri

Her paketteki veri miktarı 5 ila 9 bit arasında herhangi bir boyuta ayarlanabilir. Elbette, standart veri boyutu temel 8 bitlik baytınızdır, ancak diğer boyutların kullanımları vardır. 7 bitlik bir veri paketi, özellikle 7 bitlik ASCII karakterlerini aktarıyorsanız, 8'den daha verimli olabilir.

Eşlik Bitleri

Kullanıcı bir eşlik biti olup olmayacağını ve eğer varsa, eşlikin tek mi çift mi olacağını seçebilir. Veri bitleri arasındaki 1'lerin sayısı çift ise eşlik biti 0'dır. Tek parite bunun tam tersidir.

Baud Hızı

Baud hızı terimi, saniyede aktarılan bit sayısını [bps] belirtmek için kullanılır. Baytları değil bitleri ifade ettiğini unutmayın. Genellikle protokol tarafından her baytın birkaç kontrol biti ile birlikte aktarılması gerekir. Bu, seri veri akışındaki bir baytın 11 bitten oluşabileceği anlamına gelir. Örneğin, baud hızı 300 bps ise saniyede maksimum 37 ve minimum 27 bayt aktarılabilir.

Arduino UART

Aşağıdaki kod, Arduino'nun başladığında dünyaya merhaba göndermesini sağlayacaktır.

void setup() {
   Serial.begin(9600); //set up serial library baud rate to 9600
   Serial.println("hello world"); //print hello world
}

void loop() {

}

Arduino çizimi Arduino'ya yüklendikten sonra,

Arduino IDE'nin sağ üst kısmındaki Seri monitörü açın .

Seri Monitörün üst kutusuna herhangi bir şey yazın ve klavyenizde gönder veya enter tuşuna basın. Bu, Arduino'ya bir dizi bayt gönderecektir.

Aşağıdaki kod, girdi olarak aldığı her şeyi döndürür.

Aşağıdaki kod, sağlanan girişe bağlı olarak Arduino'nun çıktı vermesini sağlayacaktır.

void setup() {
   Serial.begin(9600); //set up serial library baud rate to 9600
}

void loop() {
   if(Serial.available()) //if number of bytes (characters) available for reading from { 
      serial port
      Serial.print("I received:"); //print I received
      Serial.write(Serial.read()); //send what you read
   }
}

Dikkat edin Serial.print ve Serial.println gerçek ASCII kodunu geri gönderecek, oysa Serial.writegerçek metni geri gönderecek. Daha fazla bilgi için ASCII kodlarına bakın.

Entegre devre (I2C), mikro denetleyiciler ve yeni nesil özel entegre devreler arasında seri veri alışverişi için bir sistemdir. Aralarındaki mesafe kısa olduğunda kullanılır (alıcı ve verici genellikle aynı basılı kart üzerindedir). Bağlantı iki iletken ile sağlanır. Biri veri aktarımı için kullanılırken, diğeri senkronizasyon (saat sinyali) için kullanılır.

Aşağıdaki şekilde görüldüğü gibi, bir cihaz her zaman bir ustadır. İletişim başlamadan önce bir bağımlı çipin adreslemesini gerçekleştirir. Bu şekilde bir mikrodenetleyici 112 farklı cihazla haberleşebilir. Baud hızı genellikle 100 Kb / sn (standart mod) veya 10 Kb / sn'dir (yavaş baud hızı modu). 3.4 Mb / sn baud hızına sahip sistemler yakın zamanda ortaya çıktı. Bir I2C veriyolu üzerinden iletişim kuran cihazlar arasındaki mesafe birkaç metre ile sınırlıdır.

Yönetim Kurulu I2C Pimleri

I2C veriyolu iki sinyalden oluşur - SCL ve SDA. SCL saat sinyalidir ve SDA veri sinyalidir. Mevcut veri yolu yöneticisi her zaman saat sinyalini üretir. Bazı bağımlı cihazlar, ana birimin daha fazla veri göndermesini geciktirmek için zaman zaman saati düşük seviyeye indirmeye zorlayabilir (veya ana birim veriyi saatini vermeyi denemeden önce verileri hazırlamak için daha fazla zaman gerektirebilir). Bu, "saat uzatma" olarak bilinir.

Aşağıdakiler farklı Arduino kartları için pimlerdir -

  • Uno, Pro Mini A4 (SDA), A5 (SCL)
  • Mega, Due 20 (SDA), 21 (SCL)
  • Leonardo, Yun 2 (SDA), 3 (SCL)

Arduino I2C

I2C kullanarak iki Arduino kartını bağlamak için iki modumuz var - ana kod ve köle kod -. Onlar -

  • Ana Verici / Bağımlı Alıcı
  • Ana Alıcı / Bağımlı Verici

Ana Verici / Bağımlı Alıcı

Şimdi ana verici ve ikincil alıcının ne olduğunu görelim.

Ana Verici

Wire kütüphanesini başlatmak ve I2C veriyolunu bir master veya slave olarak birleştirmek için aşağıdaki fonksiyonlar kullanılır. Bu normalde yalnızca bir kez çağrılır.

  • Wire.begin(address) - Bizim durumumuzda adres 7 bitlik slave adresidir çünkü master belirtilmemiştir ve bir master olarak veriyoluna katılacaktır.

  • Wire.beginTransmission(address) - Verilen adresle I2C bağımlı cihaza bir iletime başlayın.

  • Wire.write(value) - Ana cihazdan bağımlı cihaza aktarım için baytları kuyruğa alır (başlangıç ​​İletimi () ve iletim sonu () için aramalar arasında).

  • Wire.endTransmission() - beginTransmission () tarafından başlatılan bir bağımlı aygıta iletimi sonlandırır ve wire.write () tarafından sıraya alınan baytları iletir.

Example

#include <Wire.h> //include wire library

void setup() //this will run only once { 
   Wire.begin(); // join i2c bus as master
} 

short age = 0; 

void loop() {   
   Wire.beginTransmission(2); 
   // transmit to device #2
   Wire.write("age is = ");
   Wire.write(age); // sends one byte
   Wire.endTransmission(); // stop transmitting
   delay(1000); 
}

Slave Alıcı

Aşağıdaki işlevler kullanılır -

  • Wire.begin(address) - Adres, 7 bitlik slave adresidir.

  • Wire.onReceive(received data handler) - Bir ikincil cihaz ana cihazdan veri aldığında çağrılacak işlev.

  • Wire.available() - Wire.read () ile geri alınabilecek bayt sayısını döndürür Bu, Wire.onReceive () işleyicisinin içinde çağrılmalıdır.

Example

#include <Wire.h> //include wire library

void setup() {  //this will run only once
   Wire.begin(2); // join i2c bus with address #2
   Wire.onReceive(receiveEvent); // call receiveEvent when the master send any thing 
   Serial.begin(9600); // start serial for output to print what we receive 
}

void loop() {   
   delay(250); 
}

//-----this function will execute whenever data is received from master-----//

void receiveEvent(int howMany) { 
   while (Wire.available()>1) // loop through all but the last {
      char c = Wire.read(); // receive byte as a character
      Serial.print(c); // print the character
   }
}

Ana Alıcı / Bağımlı Verici

Şimdi ana alıcı ve yardımcı vericinin ne olduğunu görelim.

Ana Alıcı

Master, benzersiz bir şekilde adreslenmiş Slave Arduino'dan gönderilen veri baytlarını talep etmek ve sonra okumak üzere programlanmıştır.

Aşağıdaki işlev kullanılır -

Wire.requestFrom(address,number of bytes)- Master tarafından bir slave cihazdan bayt istemek için kullanılır. Baytlar daha sonra wire.available () ve wire.read () işlevleriyle alınabilir.

Example

#include <Wire.h> //include wire library void setup() { 
   Wire.begin(); // join i2c bus (address optional for master) 
   Serial.begin(9600); // start serial for output
} 

void loop() { 
   Wire.requestFrom(2, 1); // request 1 bytes from slave device #2
   while (Wire.available()) // slave may send less than requested {
      char c = Wire.read(); // receive a byte as character
      Serial.print(c); // print the character
   } 
   delay(500); 
}

Slave Verici

Aşağıdaki işlev kullanılır.

Wire.onRequest(handler) - Bir ana cihaz bu bağımlı cihazdan veri talep ettiğinde bir işlev çağrılır.

Example

#include <Wire.h> 

void setup() { 
   Wire.begin(2); // join i2c bus with address #2
   Wire.onRequest(requestEvent); // register event
} 

Byte x = 0;

void loop() { 
   delay(100); 
} 

// function that executes whenever data is requested by master
// this function is registered as an event, see setup()

void requestEvent() { 
   Wire.write(x); // respond with message of 1 bytes as expected by master
   x++; 
}

Bir Seri Çevre Birimi Arabirimi (SPI) veriyolu, genellikle üç olmak üzere dörde kadar iletken kullanan bir seri iletişim sistemidir. Bir iletken veri almak için, biri veri göndermek için, biri senkronizasyon için ve diğeri alternatif olarak iletişim kurmak için bir cihaz seçmek için kullanılır. Tam çift yönlü bir bağlantıdır, yani verilerin aynı anda gönderilip alındığı anlamına gelir. Maksimum baud hızı, I2C iletişim sistemindekinden daha yüksektir.

Yönetim Kurulu SPI Pimleri

SPI aşağıdaki dört kabloyu kullanır -

  • SCK - Bu, usta tarafından sürülen seri saattir.

  • MOSI - Bu, master tarafından sürülen ana çıkış / bağımlı girdidir.

  • MISO - Bu, master tarafından sürülen ana giriş / bağımlı çıkıştır.

  • SS - Bu, bağımlı seçim kablosudur.

Aşağıdaki işlevler kullanılır. SPI.h'yi eklemelisiniz.

  • SPI.begin() - SCK, MOSI ve SS'yi çıkışlara ayarlayarak, SCK ve MOSI düşük ve SS yüksek çekerek SPI veriyolunu başlatır.

  • SPI.setClockDivider(divider)- SPI saat bölücüsünü sistem saatine göre ayarlamak için. AVR tabanlı kartlarda, bölücüler 2, 4, 8, 16, 32, 64 veya 128'dir. Varsayılan ayar SPI saatini sistem saatinin dörtte birine ayarlayan SPI_CLOCK_DIV4'tür (5 Mhz için 20 MHz'de kartlar).

  • Divider - (SPI_CLOCK_DIV2, SPI_CLOCK_DIV4, SPI_CLOCK_DIV8, SPI_CLOCK_DIV16, SPI_CLOCK_DIV32, SPI_CLOCK_DIV64, SPI_CLOCK_DIV128) olabilir.

  • SPI.transfer(val) - SPI aktarımı, eşzamanlı gönderme ve alma işlemine dayanır: alınan veriler, ReceivedVal'e geri gönderilir.

  • SPI.beginTransaction(SPISettings(speedMaximum, dataOrder, dataMode)) - speedMaximum, saat, dataOrder (MSBFIRST veya LSBFIRST), dataMode (SPI_MODE0, SPI_MODE1, SPI_MODE2 veya SPI_MODE3) şeklindedir.

SPI'da aşağıdaki gibi dört çalışma modumuz var -

  • Mode 0 (the default) - Saat normalde düşüktür (CPOL = 0) ve veriler düşükten yükseğe geçişte (ön kenar) (CPHA = 0) örneklenir.

  • Mode 1 - Saat normalde düşüktür (CPOL = 0) ve veriler yüksekten düşüğe geçişte (arka kenar) (CPHA = 1) örneklenir.

  • Mode 2 - Saat normalde yüksektir (CPOL = 1) ve veriler yüksekten düşüğe geçişte örneklenir (ön kenar) (CPHA = 0).

  • Mode 3 - Saat normalde yüksektir (CPOL = 1) ve veriler düşükten yükseğe geçişte (arka kenar) (CPHA = 1) örneklenir.

  • SPI.attachInterrupt(handler) - Bir ikincil cihaz ana cihazdan veri aldığında çağrılacak işlev.

Şimdi iki Arduino UNO kartını birbirine bağlayacağız; biri efendi, diğeri köle olarak.

  • (SS): iğne 10
  • (MOSI): iğne 11
  • (MISO): iğne 12
  • (SCK): iğne 13

Zemin ortak. Aşağıda, her iki kart arasındaki bağlantının şematik gösterimi verilmiştir -

Master olarak SPI ve Slave olarak SPI örneklerini görelim.

MASTER olarak SPI

Misal

#include <SPI.h>

void setup (void) {
   Serial.begin(115200); //set baud rate to 115200 for usart
   digitalWrite(SS, HIGH); // disable Slave Select
   SPI.begin ();
   SPI.setClockDivider(SPI_CLOCK_DIV8);//divide the clock by 8
}

void loop (void) {
   char c;
   digitalWrite(SS, LOW); // enable Slave Select
   // send test string
   for (const char * p = "Hello, world!\r" ; c = *p; p++) {
      SPI.transfer (c);
      Serial.print(c);
   }
   digitalWrite(SS, HIGH); // disable Slave Select
   delay(2000);
}

SPI SLAVE olarak

Misal

#include <SPI.h>
char buff [50];
volatile byte indx;
volatile boolean process;

void setup (void) {
   Serial.begin (115200);
   pinMode(MISO, OUTPUT); // have to send on master in so it set as output
   SPCR |= _BV(SPE); // turn on SPI in slave mode
   indx = 0; // buffer empty
   process = false;
   SPI.attachInterrupt(); // turn on interrupt
}
ISR (SPI_STC_vect) // SPI interrupt routine { 
   byte c = SPDR; // read byte from SPI Data Register
   if (indx < sizeof buff) {
      buff [indx++] = c; // save data in the next index in the array buff
      if (c == '\r') //check for the end of the word
      process = true;
   }
}

void loop (void) {
   if (process) {
      process = false; //reset the process
      Serial.println (buff); //print the array on serial monitor
      indx= 0; //reset button to zero
   }
}

LED'ler, birçok farklı uygulamada kullanılan küçük, güçlü ışıklardır. Başlangıç ​​olarak, mikrodenetleyicilerin Merhaba Dünyası olan bir LED'in yanıp sönmesi üzerinde çalışacağız. Bir ışığı açıp kapatmak kadar basit. Bu önemli temeli oluşturmak, biz daha karmaşık deneyler üzerinde çalışırken size sağlam bir temel sağlayacaktır.

Gerekli Bileşenler

Aşağıdaki bileşenlere ihtiyacınız olacak -

  • 1 × Breadboard
  • 1 × Arduino Uno R3
  • 1 × LED
  • 1 × 330Ω Direnç
  • 2 × Atlamacı

Prosedür

Devre şemasını izleyin ve bileşenleri aşağıda verilen görüntüde gösterildiği gibi devre tahtasına bağlayın.

Note- Bir LED'in polaritesini bulmak için ona yakından bakın. İki ayağın daha kısa olanı, ampulün düz kenarına doğru negatif terminali gösterir.

Dirençler gibi bileşenlerin, devre tahtası soketlerine düzgün bir şekilde oturması için terminallerinin 90 ° açılarla bükülmesi gerekir. Ayrıca terminalleri daha kısa kesebilirsiniz.

Eskiz

Bilgisayarınızda Arduino IDE yazılımını açın. Arduino dilinde kodlama devrenizi kontrol edecektir. Yeni'ye tıklayarak yeni çizim Dosyasını açın.

Arduino Kodu

/*
   Blink
   Turns on an LED on for one second, then off for one second, repeatedly.
*/

// the setup function runs once when you press reset or power the board

void setup() {  // initialize digital pin 13 as an output.
   pinMode(2, OUTPUT);
}

// the loop function runs over and over again forever

void loop() {
   digitalWrite(2, HIGH); // turn the LED on (HIGH is the voltage level)
   delay(1000); // wait for a second
   digitalWrite(2, LOW); // turn the LED off by making the voltage LOW
   delay(1000); // wait for a second
}

Dikkat Edilecek Kod

pinMode(2, OUTPUT)- Arduino'nun pinlerinden birini kullanmadan önce Arduino Uno R3'e bunun bir GİRİŞ mi yoksa ÇIKIŞ mı olduğunu söylemeniz gerekir. Bunu yapmak için pinMode () adında yerleşik bir "işlev" kullanıyoruz.

digitalWrite(2, HIGH) - ÇIKIŞ olarak bir pin kullandığınızda, buna YÜKSEK (çıkış 5 volt) veya DÜŞÜK (çıkış 0 volt) komutunu verebilirsiniz.

Sonuç

LED'inizin açılıp kapandığını görmelisiniz. Gerekli çıktı görünmüyorsa, devreyi doğru bir şekilde monte ettiğinizden ve kodu doğrulayıp kartınıza yüklediğinizden emin olun.

Bu örnek, analogWrite () işlevinin bir LED'i sönük hale getirmede kullanımını gösterir. AnalogWrite, bir solma efekti oluşturmak için dijital bir pini çok hızlı bir şekilde açma ve kapatma arasında farklı oranlarla açıp kapatan darbe genişlik modülasyonu (PWM) kullanır.

Gerekli Bileşenler

Aşağıdaki bileşenlere ihtiyacınız olacak -

  • 1 × Breadboard
  • 1 × Arduino Uno R3
  • 1 × LED
  • 1 × 330Ω Direnç
  • 2 × Atlamacı

Prosedür

Devre şemasını izleyin ve bileşenleri aşağıda verilen görüntüde gösterildiği gibi devre tahtasına bağlayın.

Note- Bir LED'in polaritesini bulmak için ona yakından bakın. İki ayağın daha kısa olanı, ampulün düz kenarına doğru negatif terminali gösterir.

Dirençler gibi bileşenlerin, devre tahtası soketlerine düzgün bir şekilde oturması için terminallerinin 90 ° açılarla bükülmesi gerekir. Ayrıca terminalleri daha kısa kesebilirsiniz.

Eskiz

Bilgisayarınızda Arduino IDE yazılımını açın. Arduino dilinde kodlama devrenizi kontrol edecektir. Yeni'ye tıklayarak yeni çizim Dosyasını açın.

Arduino Kodu

/*
   Fade
   This example shows how to fade an LED on pin 9 using the analogWrite() function.

   The analogWrite() function uses PWM, so if you want to change the pin you're using, be
   sure to use another PWM capable pin. On most Arduino, the PWM pins are identified with
   a "~" sign, like ~3, ~5, ~6, ~9, ~10 and ~11.
*/

int led = 9; // the PWM pin the LED is attached to
int brightness = 0; // how bright the LED is
int fadeAmount = 5; // how many points to fade the LED by
// the setup routine runs once when you press reset:

void setup() {
   // declare pin 9 to be an output:
   pinMode(led, OUTPUT);
}

// the loop routine runs over and over again forever:

void loop() {
   // set the brightness of pin 9:
   analogWrite(led, brightness);
   // change the brightness for next time through the loop:
   brightness = brightness + fadeAmount;
   // reverse the direction of the fading at the ends of the fade:
   if (brightness == 0 || brightness == 255) {
      fadeAmount = -fadeAmount ;
   }
   // wait for 30 milliseconds to see the dimming effect
   delay(300);
}

Dikkat Edilecek Kod

Pin 9'u LED pininiz olarak tanımladıktan sonra, kodunuzun setup () fonksiyonunda yapacak bir şey yoktur. Kodunuzun ana döngüsünde kullanacağınız analogWrite () işlevi iki argüman gerektirir: Biri, hangi pinin yazılacağını işleve, diğeri ise hangi PWM değerinin yazılacağını belirtir.

LED'i kapatıp açmak için, döngüyü tamamlamak için PWM değerlerini kademeli olarak 0'dan (tamamen kapalı) 255'e (tamamen açık) ve ardından tekrar 0'a yükseltin. Yukarıda verilen çizimde, PWM değeri parlaklık adı verilen bir değişken kullanılarak ayarlanır. Döngü boyunca her seferinde, değişkenin değeri kadar artarfadeAmount.

Parlaklık, değerinin en uç noktasındaysa (0 veya 255), o zaman fadeAmount, negatifine değiştirilir. Başka bir deyişle, fadeAmount 5 ise, o zaman -5 olarak ayarlanır. -5 ise 5'e ayarlanır. Döngü boyunca bir sonraki sefer, bu değişiklik parlaklığın da yön değiştirmesine neden olur.

analogWrite()PWM değerini çok hızlı değiştirebilir, bu nedenle taslağın sonundaki gecikme solmanın hızını kontrol eder. Gecikmenin değerini değiştirmeyi deneyin ve bunun solma efektini nasıl değiştirdiğini görün.

Result

You should see your LED brightness change gradually.

This example will show you how to read an analog input on analog pin 0. The input is converted from analogRead() into voltage, and printed out to the serial monitor of the Arduino Software (IDE).

Components Required

You will need the following components −

  • 1 × Breadboard
  • 1 × Arduino Uno R3
  • 1 × 5K variable resistor (potentiometer)
  • 2 × Jumper

Procedure

Follow the circuit diagram and hook up the components on the breadboard as shown in the image given below.

Potentiometer

A potentiometer (or pot) is a simple electro-mechanical transducer. It converts rotary or linear motion from the input operator into a change of resistance. This change is (or can be) used to control anything from the volume of a hi-fi system to the direction of a huge container ship.

The pot as we know it was originally known as a rheostat (essentially a variable wirewound resistor). The variety of available pots is now quite astonishing, and it can be very difficult for the beginner (in particular) to work out which type is suitable for a given task. A few different pot types, which can all be used for the same task makes the job harder.

The image on the left shows the standard schematic symbol of a pot. The image on the right is the potentiometer.

Sketch

Open the Arduino IDE software on your computer. Coding in the Arduino language will control your circuit. Open a new sketch File by clicking New.

Arduino Code

/*
   ReadAnalogVoltage
   Reads an analog input on pin 0, converts it to voltage, 
   and prints the result to the serial monitor.
   Graphical representation is available using serial plotter (Tools > Serial Plotter menu)
   Attach the center pin of a potentiometer to pin A0, and the outside pins to +5V and ground.
*/

// the setup routine runs once when you press reset:

void setup() {
   // initialize serial communication at 9600 bits per second:
   Serial.begin(9600);
}

// the loop routine runs over and over again forever:

void loop() {
   // read the input on analog pin 0:
   int sensorValue = analogRead(A0);
   // Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):
   float voltage = sensorValue * (5.0 / 1023.0);
   // print out the value you read:
   Serial.println(voltage);
}

Code to Note

In the program or sketch given below, the first thing that you do in the setup function is begin serial communications, at 9600 bits per second, between your board and your computer with the line −

Serial.begin(9600);

In the main loop of your code, you need to establish a variable to store the resistance value (which will be between 0 and 1023, perfect for an int datatype) coming from your potentiometer −

int sensorValue = analogRead(A0);

To change the values from 0-1023 to a range that corresponds to the voltage, the pin is reading, you need to create another variable, a float, and do a little calculation. To scale the numbers between 0.0 and 5.0, divide 5.0 by 1023.0 and multiply that by sensorValue −

float voltage= sensorValue * (5.0 / 1023.0);

Finally, you need to print this information to your serial window. You can do this with the command Serial.println() in your last line of code −

Serial.println(voltage)

Now, open Serial Monitor in the Arduino IDE by clicking the icon on the right side of the top green bar or pressing Ctrl+Shift+M.

Result

You will see a steady stream of numbers ranging from 0.0 - 5.0. As you turn the pot, the values will change, corresponding to the voltage at pin A0.

This example shows you how to read an analog input at analog pin 0, convert the values from analogRead() into voltage, and print it out to the serial monitor of the Arduino Software (IDE).

Components Required

You will need the following components −

  • 1 × Breadboard
  • 1 × Arduino Uno R3
  • 1 × 5k ohm variable resistor (potentiometer)
  • 2 × Jumper
  • 8 × LED or you can use (LED bar graph display as shown in the image below)

Procedure

Follow the circuit diagram and hook up the components on the breadboard as shown in the image given below.

Sketch

Open the Arduino IDE software on your computer. Coding in the Arduino language will control your circuit. Open a new sketch File by clicking New.

10 Segment LED Bar Graph

These 10-segment bar graph LEDs have many uses. With a compact footprint, simple hookup, they are easy for prototype or finished products. Essentially, they are 10 individual blue LEDs housed together, each with an individual anode and cathode connection.

Sarı, kırmızı ve yeşil renklerde de mevcuttur.

Note- Bu çubuk grafiklerdeki pimler, veri sayfasında listelenenden farklı olabilir. Cihazı 180 derece döndürmek, değişikliği düzeltir ve 11 numaralı pini sıradaki ilk pim yapar.

Arduino Kodu

/*
   LED bar graph
   Turns on a series of LEDs based on the value of an analog sensor. 
   This is a simple way to make a bar graph display. 
   Though this graph uses 8LEDs, you can use any number by
      changing the LED count and the pins in the array.
   This method can be used to control any series of digital
      outputs that depends on an analog input.
*/

// these constants won't change:
const int analogPin = A0; // the pin that the potentiometer is attached to
const int ledCount = 8; // the number of LEDs in the bar graph
int ledPins[] = {2, 3, 4, 5, 6, 7, 8, 9}; // an array of pin numbers to which LEDs are attached

void setup() {
   // loop over the pin array and set them all to output:
   for (int thisLed = 0; thisLed < ledCount; thisLed++) {
      pinMode(ledPins[thisLed], OUTPUT);
   }
}

void loop() {
   // read the potentiometer:
   int sensorReading = analogRead(analogPin);
   // map the result to a range from 0 to the number of LEDs:
   int ledLevel = map(sensorReading, 0, 1023, 0, ledCount);
   // loop over the LED array:
   for (int thisLed = 0; thisLed < ledCount; thisLed++) {
      // if the array element's index is less than ledLevel,
      // turn the pin for this element on:
      if (thisLed < ledLevel) {
         digitalWrite(ledPins[thisLed], HIGH);
      }else { // turn off all pins higher than the ledLevel:
         digitalWrite(ledPins[thisLed], LOW);
      }
   }
}

Dikkat Edilecek Kod

Taslak şu şekilde çalışır: önce girdiyi okursunuz. Giriş değerini çıkış aralığına eşlersiniz, bu durumda on LED. Sonra bir kurarsınfor-loopçıktıları yinelemek için. Serideki çıkışın numarası eşlenen giriş aralığından daha düşükse, onu açarsınız. Değilse, kapatırsınız.

Sonuç

Analog okuma değeri arttığında LED'in birer birer Yandığını ve okuma azaldıkça birer birer KAPALI olduğunu göreceksiniz.

Bu örnek, ARDUINO UNO'daki pin 2'ye çekildiğinde bilgisayarınızdaki kullanıcı oturumunuzu kapatmak için Klavye kitaplığını kullanır. Çizim, aynı anda iki veya üç tuşa basma işlemini simüle eder ve kısa bir gecikmeden sonra bunları serbest bırakır.

Warning - kullandığınızda Keyboard.print()komutu, Arduino bilgisayarınızın klavyesini devralır. Bu işlevle bir çizim çalıştırırken bilgisayarınızın kontrolünü kaybetmemek için Keyboard.print () öğesini çağırmadan önce güvenilir bir kontrol sistemi kurun. Bu taslak, yalnızca bir iğne yere çekildikten sonra bir Klavye komutu göndermek için tasarlanmıştır.

Gerekli Bileşenler

Aşağıdaki bileşenlere ihtiyacınız olacak -

  • 1 × Breadboard
  • 1 × Arduino Leonardo, Micro veya Due kartı
  • 1 × basma düğmesi
  • 1 × Jumper

Prosedür

Devre şemasını takip edin ve bileşenleri aşağıdaki resimde gösterildiği gibi devre tahtasına bağlayın.

Eskiz

Bilgisayarınızda Arduino IDE yazılımını açın. Arduino dilinde kodlama devrenizi kontrol edecektir. Yeni'ye tıklayarak yeni bir çizim Dosyası açın.

Bu örnek için Arduino IDE 1.6.7 kullanmanız gerekiyor

Note- Klavye kitaplığını Arduino kitaplık dosyanıza eklemelisiniz. Aşağıdaki ekran görüntüsünde gösterildiği gibi, ad kitaplıklarıyla (vurgulanmış) dosyanın içindeki tuş takımı kitaplığı dosyasını kopyalayıp yapıştırın.

Arduino Kodu

/*
   Keyboard logout
   This sketch demonstrates the Keyboard library.
   When you connect pin 2 to ground, it performs a logout.
   It uses keyboard combinations to do this, as follows:
   On Windows, CTRL-ALT-DEL followed by ALT-l
   On Ubuntu, CTRL-ALT-DEL, and ENTER
   On OSX, CMD-SHIFT-q
   To wake: Spacebar.
   Circuit:
   * Arduino Leonardo or Micro
   * wire to connect D2 to ground.
*/

#define OSX 0
#define WINDOWS 1
#define UBUNTU 2

#include "Keyboard.h"

// change this to match your platform:
int platform = WINDOWS;

void setup() {
   // make pin 2 an input and turn on the
   // pullup resistor so it goes high unless
   // connected to ground:
   
   pinMode(2, INPUT_PULLUP);
   Keyboard.begin();
}

void loop() {
   while (digitalRead(2) == HIGH) {
      // do nothing until pin 2 goes low
      delay(500);
   }
   
   delay(1000);
   
   switch (platform) {
      case OSX:
      Keyboard.press(KEY_LEFT_GUI);
	  
      // Shift-Q logs out:
      Keyboard.press(KEY_LEFT_SHIFT);
      Keyboard.press('Q');
      delay(100);
	  
      // enter:
      Keyboard.write(KEY_RETURN);
      break;
	  
      case WINDOWS:
      // CTRL-ALT-DEL:
      Keyboard.press(KEY_LEFT_CTRL);
      Keyboard.press(KEY_LEFT_ALT);
      Keyboard.press(KEY_DELETE);
      delay(100);
      Keyboard.releaseAll();
	  
      //ALT-l:
      delay(2000);
      Keyboard.press(KEY_LEFT_ALT);
      Keyboard.press('l');
      Keyboard.releaseAll();
      break;
	  
      case UBUNTU:
      // CTRL-ALT-DEL:
      Keyboard.press(KEY_LEFT_CTRL);
      Keyboard.press(KEY_LEFT_ALT);
      Keyboard.press(KEY_DELETE);
	  
      delay(1000);
      Keyboard.releaseAll();
	  
      // Enter to confirm logout:
      Keyboard.write(KEY_RETURN);
      break;
   }
   
   // do nothing:
   while (true);
}

Keyboard.releaseAll();

   // enter:
      Keyboard.write(KEY_RETURN);
      break;
      case WINDOWS:
	  
   // CTRL-ALT-DEL:
      Keyboard.press(KEY_LEFT_CTRL);
      Keyboard.press(KEY_LEFT_ALT);
      Keyboard.press(KEY_DELETE);
      delay(100);
      Keyboard.releaseAll();
	  
   //ALT-l:
      delay(2000);
      Keyboard.press(KEY_LEFT_ALT);
      Keyboard.press('l');
      Keyboard.releaseAll();
      break;
	  
   case UBUNTU:
      // CTRL-ALT-DEL:
      Keyboard.press(KEY_LEFT_CTRL);
      Keyboard.press(KEY_LEFT_ALT);
      Keyboard.press(KEY_DELETE);
      delay(1000);
      Keyboard.releaseAll();
	  
      // Enter to confirm logout:
      Keyboard.write(KEY_RETURN);
      break;
   }
   
// do nothing:
   while (true);
}

Dikkat Edilecek Kod

Programı panonuza yüklemeden önce, şu anda kullandığınız doğru işletim sistemini platform değişkenine atadığınızdan emin olun.

Çizim çalışırken, düğmeye basmak pin 2'yi zemine bağlayacak ve kart çıkış sırasını USB bağlantılı PC'ye gönderecektir.

Sonuç

Pim 2'yi toprağa bağladığınızda, bir çıkış işlemi gerçekleştirir.

Oturumu kapatmak için aşağıdaki klavye kombinasyonlarını kullanır -

  • Açık Windows, CTRL-ALT-DEL ve ardından ALT-l

  • Açık Ubuntu, CTRL-ALT-DEL ve ENTER

  • Açık OSX, CMD-SHIFT-q

Bu örnekte, düğmeye basıldığında, bilgisayara klavye girişi olarak bir metin dizisi gönderilir. Dizi, düğmeye basılma sayısını bildirir. Leonardo'yu programlayıp bağladıktan sonra, sonuçları görmek için favori metin düzenleyicinizi açın.

Warning - kullandığınızda Keyboard.print()komutu, Arduino bilgisayarınızın klavyesini devralır. Bu işlevle bir çizim çalıştırırken bilgisayarınızın kontrolünü kaybetmemek için, aramadan önce güvenilir bir kontrol sistemi kurun.Keyboard.print(). Bu taslak, klavyeyi değiştirmek için bir basma düğmesi içerir, böylece yalnızca düğmeye basıldıktan sonra çalışır.

Gerekli Bileşenler

Aşağıdaki bileşenlere ihtiyacınız olacak -

  • 1 × Breadboard
  • 1 × Arduino Leonardo, Micro veya Due kartı
  • 1 × anlık buton
  • 1 × 10k ohm direnç

Prosedür

Devre şemasını izleyin ve bileşenleri aşağıda verilen görüntüde gösterildiği gibi devre tahtasına bağlayın.

Eskiz

Bilgisayarınızda Arduino IDE yazılımını açın. Arduino dilinde kodlama devrenizi kontrol edecektir. Yeni'ye tıklayarak yeni bir çizim Dosyası açın.

Arduino Kodu

/*
   Keyboard Message test For the Arduino Leonardo and Micro,
      Sends a text string when a button is pressed.
   The circuit:
   * pushbutton attached from pin 4 to +5V
   * 10-kilohm resistor attached from pin 4 to ground
*/

#include "Keyboard.h"
const int buttonPin = 4; // input pin for pushbutton
int previousButtonState = HIGH; // for checking the state of a pushButton
int counter = 0; // button push counter

void setup() {
   pinMode(buttonPin, INPUT); // make the pushButton pin an input:
   Keyboard.begin(); // initialize control over the keyboard:
}

void loop() {
   int buttonState = digitalRead(buttonPin); // read the pushbutton:
   if ((buttonState != previousButtonState)&& (buttonState == HIGH)) // and it's currently pressed: {
      // increment the button counter
      counter++;
      // type out a message
      Keyboard.print("You pressed the button ");
      Keyboard.print(counter);
      Keyboard.println(" times.");
   }
   // save the current button state for comparison next time:
   previousButtonState = buttonState;
}

Dikkat Edilecek Kod

Basma düğmesinin bir terminalini Arduino'daki pim 4'e takın. Diğer pimi 5V'a takın. Direnci pim 4'ten toprağa bağlayarak zemine bir referans sağlayarak aşağı çekme olarak kullanın.

Kartınızı programladıktan sonra, USB kablosunu çıkarın, bir metin düzenleyici açın ve metin imlecini yazma alanına yerleştirin. Kartı tekrar USB aracılığıyla bilgisayarınıza bağlayın ve belgeye yazmak için düğmeye basın.

Sonuç

Herhangi bir metin düzenleyiciyi kullanarak, Arduino üzerinden gönderilen metni gösterecektir.

Fare kütüphanesini kullanarak, bir bilgisayarın ekran imlecini bir Arduino Leonardo, Micro veya Due ile kontrol edebilirsiniz.

Bu özel örnek, ekrandaki imleci hareket ettirmek için beş düğme kullanır. Düğmelerden dördü yönlü (yukarı, aşağı, sol, sağ) ve biri sol fare tıklaması içindir. Arduino'dan imleç hareketi her zaman görecelidir. Bir giriş her okunduğunda, imlecin konumu mevcut konumuna göre güncellenir.

Yön düğmelerinden birine her basıldığında, Arduino fareyi hareket ettirecek ve YÜKSEK bir girişi uygun yönde 5 aralığına eşleyecektir.

Beşinci düğme, fareden sol tıklamayı kontrol etmek içindir. Düğme bırakıldığında, bilgisayar olayı tanıyacaktır.

Gerekli Bileşenler

Aşağıdaki bileşenlere ihtiyacınız olacak -

  • 1 × Breadboard
  • 1 × Arduino Leonardo, Micro veya Due kartı
  • 5 × 10k ohm direnç
  • 5 × anlık butonlar

Prosedür

Devre şemasını takip edin ve bileşenleri aşağıdaki resimde gösterildiği gibi devre tahtasına bağlayın.

Eskiz

Bilgisayarınızda Arduino IDE yazılımını açın. Arduino dilinde kodlama devrenizi kontrol edecektir. Yeni'ye tıklayarak yeni bir çizim Dosyası açın.

Bu örnek için Arduino IDE 1.6.7 kullanmanız gerekiyor

Arduino Kodu

/*
   Button Mouse Control
   For Leonardo and Due boards only .Controls the mouse from 
   five pushbuttons on an Arduino Leonardo, Micro or Due.
   Hardware:
   * 5 pushbuttons attached to D2, D3, D4, D5, D6
   The mouse movement is always relative. This sketch reads
   four pushbuttons, and uses them to set the movement of the mouse.
   WARNING: When you use the Mouse.move() command, the Arduino takes
   over your mouse! Make sure you have control before you use the mouse commands.
*/

#include "Mouse.h"
// set pin numbers for the five buttons:
const int upButton = 2;
const int downButton = 3;
const int leftButton = 4;
const int rightButton = 5;
const int mouseButton = 6;
int range = 5; // output range of X or Y movement; affects movement speed
int responseDelay = 10; // response delay of the mouse, in ms

void setup() {
   // initialize the buttons' inputs:
   pinMode(upButton, INPUT);
   pinMode(downButton, INPUT);
   pinMode(leftButton, INPUT);
   pinMode(rightButton, INPUT);
   pinMode(mouseButton, INPUT);
   // initialize mouse control:
   Mouse.begin();
}

void loop() {
   // read the buttons:
   int upState = digitalRead(upButton);
   int downState = digitalRead(downButton);
   int rightState = digitalRead(rightButton);
   int leftState = digitalRead(leftButton);
   int clickState = digitalRead(mouseButton);
   // calculate the movement distance based on the button states:
   int xDistance = (leftState - rightState) * range;
   int yDistance = (upState - downState) * range;
   // if X or Y is non-zero, move:
   if ((xDistance != 0) || (yDistance != 0)) {
      Mouse.move(xDistance, yDistance, 0);
   }

   // if the mouse button is pressed:
   if (clickState == HIGH) {
      // if the mouse is not pressed, press it:
      if (!Mouse.isPressed(MOUSE_LEFT)) {
         Mouse.press(MOUSE_LEFT);
      }
   } else {                           // else the mouse button is not pressed:
      // if the mouse is pressed, release it:
      if (Mouse.isPressed(MOUSE_LEFT)) {
         Mouse.release(MOUSE_LEFT);
      }
   }
   // a delay so the mouse does not move too fast:
   delay(responseDelay);
}

Dikkat Edilecek Kod

Kartınızı bir mikro USB kablosuyla bilgisayarınıza bağlayın. Düğmeler, 2 ila 6 numaralı pinlerden dijital girişlere bağlanır. 10k aşağı çekme dirençleri kullandığınızdan emin olun.

Bu örnek, seri bağlantı noktasından gelen bir baytı dinler. Kart, alındığında bilgisayara bir tuş vuruşu gönderir. Gönderilen tuş vuruşu alınandan bir fazladır, bu nedenle seri monitörden bir "a" gönderirseniz, bilgisayara bağlı karttan bir "b" alacaksınız. Bir "1", bir "2" döndürür ve böyle devam eder.

Warning - kullandığınızda Keyboard.print()komutu, Leonardo, Micro veya Due panosu bilgisayarınızın klavyesini devralır. Bu işlevle bir çizim çalıştırırken bilgisayarınızın kontrolünü kaybetmemek için Keyboard.print () öğesini çağırmadan önce güvenilir bir kontrol sistemi kurun. Bu taslak, kart seri bağlantı noktası üzerinden bir bayt aldıktan sonra yalnızca bir Klavye komutu göndermek için tasarlanmıştır.

Gerekli Bileşenler

Aşağıdaki bileşenlere ihtiyacınız olacak -

  • 1 × Arduino Leonardo, Micro veya Due kartı

Prosedür

Kartınızı USB kablosu kullanarak bilgisayara bağlamanız yeterlidir.

Eskiz

Bilgisayarınızda Arduino IDE yazılımını açın. Arduino dilinde kodlama devrenizi kontrol edecektir. Yeni'ye tıklayarak yeni bir çizim Dosyası açın.

Notes- Tuş takımı kitaplığını Arduino kitaplık dosyanıza eklemelisiniz. Tuş takımı kitaplık dosyasını sarı renkle vurgulanan 'kitaplıklar' adıyla dosyanın içine kopyalayıp yapıştırın.

Arduino Kodu

/*
   Keyboard test
   For the Arduino Leonardo, Micro or Due Reads
      a byte from the serial port, sends a keystroke back. 
   The sent keystroke is one higher than what's received, e.g. if you send a, you get b, send
      A you get B, and so forth.
   The circuit:
   * none
*/

#include "Keyboard.h"

void setup() {
   // open the serial port:
   Serial.begin(9600);
   // initialize control over the keyboard:
   Keyboard.begin();
}

void loop() {
   // check for incoming serial data:
   if (Serial.available() > 0) {
      // read incoming serial data:
      char inChar = Serial.read();
      // Type the next ASCII value from what you received:
      Keyboard.write(inChar + 1);
   }
}

Dikkat Edilecek Kod

Programlandıktan sonra, seri monitörünüzü açın ve bir bayt gönderin. Yönetim kurulu, bir sayı daha yüksek olan bir tuş vuruşuyla cevap verecektir.

Sonuç

Bir bayt gönderdiğinizde kart, Arduino IDE seri monitöründe bir sayı daha yüksek olan bir tuş vuruşuyla cevap verecektir.

Bu bölümde Arduino kartımızı farklı sensörlerle nasıl arayüzleyeceğimizi öğreneceğiz. Aşağıdaki sensörleri tartışacağız -

  • Nem sensörü (DHT22)
  • Sıcaklık sensörü (LM35)
  • Su dedektörü sensörü (Basit Su Tetikleyici)
  • PIR SENSÖRÜ
  • ULTRASONİK SENSÖR
  • GPS

Nem Sensörü (DHT22)

DHT-22 (AM2302 olarak da adlandırılır) bir dijital çıkış, bağıl nem ve sıcaklık sensörüdür. Çevreleyen havayı ölçmek için kapasitif bir nem sensörü ve bir termistör kullanır ve veri pinine dijital bir sinyal gönderir.

Bu örnekte, bu sensörü Arduino UNO ile nasıl kullanacağınızı öğreneceksiniz. Oda sıcaklığı ve nemi seri monitöre yazdırılacaktır.

DHT-22 Sensörü

Bağlantılar basit. Soldaki ilk pim 3-5V güce, ikinci pim veri giriş pimine ve en sağdaki pim toprağa.

Teknik detaylar

  • Power - 3-5V

  • Max Current - 2,5 mA

  • Humidity -% 0-100,% 2-5 doğruluk

  • Temperature - 40 ila 80 ° C, ± 0,5 ° C doğruluk

Gerekli Bileşenler

Aşağıdaki bileşenlere ihtiyacınız olacak -

  • 1 × Breadboard
  • 1 × Arduino Uno R3
  • 1 × DHT22
  • 1 × 10K ohm direnç

Prosedür

Devre şemasını takip edin ve bileşenleri aşağıdaki resimde gösterildiği gibi devre tahtasına bağlayın.

Eskiz

Bilgisayarınızda Arduino IDE yazılımını açın. Arduino dilinde kodlama devrenizi kontrol edecektir. Yeni'ye tıklayarak yeni bir çizim Dosyası açın.

Arduino Kodu

// Example testing sketch for various DHT humidity/temperature sensors

#include "DHT.h"
#define DHTPIN 2 // what digital pin we're connected to
// Uncomment whatever type you're using!
//#define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
// Connect pin 1 (on the left) of the sensor to +5V
// NOTE: If using a board with 3.3V logic like an Arduino Due connect pin 1
// to 3.3V instead of 5V!
// Connect pin 2 of the sensor to whatever your DHTPIN is
// Connect pin 4 (on the right) of the sensor to GROUND
// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor
// Initialize DHT sensor.
// Note that older versions of this library took an optional third parameter to
// tweak the timings for faster processors. This parameter is no longer needed
// as the current DHT reading algorithm adjusts itself to work on faster procs.
DHT dht(DHTPIN, DHTTYPE);

void setup() {
   Serial.begin(9600);
   Serial.println("DHTxx test!");
   dht.begin();
}

void loop() {
   delay(2000); // Wait a few seconds between measurements
   float h = dht.readHumidity();
   // Reading temperature or humidity takes about 250 milliseconds!
   float t = dht.readTemperature();
   // Read temperature as Celsius (the default)
   float f = dht.readTemperature(true);
   // Read temperature as Fahrenheit (isFahrenheit = true)
   // Check if any reads failed and exit early (to try again).
   if (isnan(h) || isnan(t) || isnan(f)) {
      Serial.println("Failed to read from DHT sensor!");
      return;
   }
   
   // Compute heat index in Fahrenheit (the default)
   float hif = dht.computeHeatIndex(f, h);
   // Compute heat index in Celsius (isFahreheit = false)
   float hic = dht.computeHeatIndex(t, h, false);
   Serial.print ("Humidity: ");
   Serial.print (h);
   Serial.print (" %\t");
   Serial.print ("Temperature: ");
   Serial.print (t);
   Serial.print (" *C ");
   Serial.print (f);
   Serial.print (" *F\t");
   Serial.print ("Heat index: ");
   Serial.print (hic);
   Serial.print (" *C ");
   Serial.print (hif);
   Serial.println (" *F");
}

Dikkat Edilecek Kod

DHT22 sensörü, panele aşağıdaki şekilde bağlanan dört terminale (V cc , DATA, NC, GND) sahiptir -

  • DATA pinini Arduino pin numarası 2'ye
  • 5 volt Arduino kartına V cc pin
  • Arduino kartının zeminine GND pini
  • DATA ile V cc pimi arasına 10k ohm direnç (yukarı çekme direnci) bağlamamız gerekir

Donanım bağlantıları yapıldıktan sonra, DHT22 kitaplığını daha önce açıklandığı gibi Arduino kitaplık dosyanıza eklemeniz gerekir.

Sonuç

Her 2 saniyede bir güncellenen seri port monitöründe sıcaklık ve nem göstergesini göreceksiniz.

Sıcaklık Sensörü LM35 serisi, Santigrat sıcaklığıyla doğrusal orantılı bir çıkış voltajına sahip hassas entegre devre sıcaklık cihazlarıdır.

Kullanıcının uygun Santigrat ölçeklendirmesi elde etmek için çıkıştan büyük bir sabit voltaj çıkarması gerekmediğinden, LM35 cihazı Kelvin'de kalibre edilmiş doğrusal sıcaklık sensörlerine göre bir avantaja sahiptir. LM35 cihazı, oda sıcaklığında ± ¼ ° C ve tam −55 ° C ila 150 ° C sıcaklık aralığında ± ¾ ° C tipik doğrulukları sağlamak için herhangi bir harici kalibrasyon veya düzeltme gerektirmez.

Teknik özellikler

  • Doğrudan Celsius (Santigrat) olarak kalibre edildi
  • Doğrusal + 10-mV / ° C ölçek faktörü
  • 0,5 ° C garantili doğruluk (25 ° C'de)
  • Tam −55 ° C ila 150 ° C aralığı için derecelendirilmiştir
  • Uzak uygulamalar için uygun

Gerekli Bileşenler

Aşağıdaki bileşenlere ihtiyacınız olacak -

  • 1 × Breadboard
  • 1 × Arduino Uno R3
  • 1 × LM35 sensörü

Prosedür

Devre şemasını izleyin ve bileşenleri aşağıda verilen görüntüde gösterildiği gibi devre tahtasına bağlayın.

Eskiz

Bilgisayarınızda Arduino IDE yazılımını açın. Arduino dilinde kodlama devrenizi kontrol edecektir. Yeni'ye tıklayarak yeni bir çizim Dosyası açın.

Arduino Kodu

float temp;
int tempPin = 0;

void setup() {
   Serial.begin(9600);
}

void loop() {
   temp = analogRead(tempPin);
   // read analog volt from sensor and save to variable temp
   temp = temp * 0.48828125;
   // convert the analog volt to its temperature equivalent
   Serial.print("TEMPERATURE = ");
   Serial.print(temp); // display temperature value
   Serial.print("*C");
   Serial.println();
   delay(1000); // update sensor reading each one second
}

Dikkat Edilecek Kod

LM35 sensörünün üç terminali vardır - V s , V çıkışı ve GND. Sensörü aşağıdaki gibi bağlayacağız -

  • + V bağlayın ler sizin Arduino gemide +5 V.
  • V çıkışını Arduino kartındaki Analog0 veya A0'a bağlayın .
  • GND'yi Arduino'daki GND ile bağlayın.

Analogdan Dijitale Dönüştürücü (ADC), ADC Değeri = örnek * 1024 / referans voltajı (+ 5v) formülüne dayalı olarak analog değerleri dijital bir yaklaşıma dönüştürür. Dolayısıyla, +5 voltluk bir referansla, dijital yaklaşım giriş voltajına * 205 eşit olacaktır.

Sonuç

Saniyede bir güncellenen seri bağlantı noktası monitöründe sıcaklık ekranını göreceksiniz.

Su sensörü tuğlası, yağmur, su seviyesi ve hatta sıvı sızıntısını algılamada yaygın olarak kullanılabilen su algılama için tasarlanmıştır.

Bir su sensörünü Arduino'ya bağlamak, bir sızıntı, dökülme, su baskını, yağmur vb. Algılamanın harika bir yoludur. Suyun varlığını, seviyesini, hacmini ve / veya yokluğunu tespit etmek için kullanılabilir. Bu, bitkilerinizi sulamanızı hatırlatmak için kullanılabilse de, bunun için daha iyi bir Grove sensörü var. Sensör, su algılandığında DÜŞÜK okuyan bir dizi açık izlere sahiptir.

Bu bölümde, su sensörünü Arduino'daki Digital Pin 8'e bağlayacağız ve su sensörünün bir su kaynağıyla ne zaman temas ettiğini belirlemeye yardımcı olmak için çok kullanışlı LED'i listeleyeceğiz.

Gerekli Bileşenler

Aşağıdaki bileşenlere ihtiyacınız olacak -

  • 1 × Breadboard
  • 1 × Arduino Uno R3
  • 1 × Su Sensörü
  • 1 × led
  • 1 × 330 ohm direnç

Prosedür

Devre şemasını izleyin ve bileşenleri aşağıda verilen görüntüde gösterildiği gibi devre tahtasına bağlayın.

Eskiz

Bilgisayarınızda Arduino IDE yazılımını açın. Arduino dilinde kodlama devrenizi kontrol edecektir. Yeni'ye tıklayarak yeni bir çizim Dosyası açın.

Arduino Kodu

#define Grove_Water_Sensor 8 // Attach Water sensor to Arduino Digital Pin 8
#define LED 9 // Attach an LED to Digital Pin 9 (or use onboard LED)

void setup() {
   pinMode(Grove_Water_Sensor, INPUT); // The Water Sensor is an Input
   pinMode(LED, OUTPUT); // The LED is an Output
}

void loop() {
   /* The water sensor will switch LOW when water is detected.
   Get the Arduino to illuminate the LED and activate the buzzer
   when water is detected, and switch both off when no water is present */
   if( digitalRead(Grove_Water_Sensor) == LOW) {
      digitalWrite(LED,HIGH);
   }else {
      digitalWrite(LED,LOW);
   }
}

Dikkat Edilecek Kod

Su sensörünün üç terminali vardır - S, V çıkışı (+) ve GND (-). Sensörü aşağıdaki şekilde bağlayın -

  • + V bağlayın ler sizin Arduino gemide +5 V.
  • S'yi Arduino kartındaki 8 numaralı dijital pime bağlayın.
  • GND'yi Arduino'daki GND ile bağlayın.
  • LED'i Arduino kartındaki 9 numaralı dijital pime bağlayın.

Sensör su algıladığında, Arduino'daki 8. pin DÜŞÜK olur ve ardından Arduino'daki LED AÇIK hale gelir.

Sonuç

Sensör su algıladığında gösterge LED'inin Yandığını göreceksiniz.

PIR sensörleri hareketi algılamanıza izin verir. Bir insanın sensörün menziline girip girmediğini tespit etmek için kullanılırlar. Genellikle evde veya işyerlerinde kullanılan aletlerde ve aletlerde bulunurlar. Genellikle PIR, "Pasif Kızılötesi", "Pyroelektrik" veya "IR hareket" sensörleri olarak adlandırılırlar.

PIR Sensörlerinin avantajları şunlardır -

  • Küçük boyutlu
  • Geniş lens aralığı
  • Arayüze kolay
  • Inexpensive
  • Low-power
  • Kullanımı kolay
  • Yıpranma

PIR'lar, kızılötesi radyasyon seviyelerini algılayabilen, ortasında dikdörtgen bir kristal bulunan yuvarlak bir metal kutu olan piroelektrik sensörlerden yapılmıştır. Her şey düşük seviyeli radyasyon yayar ve bir şey ne kadar sıcaksa, o kadar fazla radyasyon yayılır. Bir hareket dedektöründeki sensör iki yarıya bölünmüştür. Bu, ortalama IR seviyelerini değil, hareketi (değişimi) tespit etmek içindir. İki yarım, birbirlerini iptal edecek şekilde bağlanır. Yarısının yarısı diğerinden daha fazla veya daha az IR radyasyonu görürse, çıktı yüksek veya düşük sallanacaktır.

PIR'lerin ayarlanabilir ayarları vardır ve 3 pimli toprak / çıkış / güç pedlerine takılı bir başlığa sahiptir.

Bir kişinin bölgeden ne zaman ayrıldığını veya bölgeye girdiğini algılaması gereken birçok temel proje veya ürün için PIR sensörleri harikadır. PIR'lerin size çevrenizdeki insan sayısını veya sensöre yakınlıklarını söylemediğini unutmayın. Lens genellikle belirli bir mesafeden belirli bir taramaya sabitlenir ve bazen evdeki evcil hayvanlar tarafından fırlatılır.

Gerekli Bileşenler

Aşağıdaki bileşenlere ihtiyacınız olacak -

  • 1 × Breadboard
  • 1 × Arduino Uno R3
  • 1 × PIR Sensörü (MQ3)

Prosedür

Devre şemasını takip edin ve aşağıdaki resimde gösterildiği gibi bağlantıları yapın.

Eskiz

Bilgisayarınızda Arduino IDE yazılımını açın. Arduino dilinde kodlama devrenizi kontrol edecektir. Yeni'ye tıklayarak yeni bir çizim Dosyası açın.

Arduino Kodu

#define pirPin 2
int calibrationTime = 30;
long unsigned int lowIn;
long unsigned int pause = 5000;
boolean lockLow = true;
boolean takeLowTime;
int PIRValue = 0;

void setup() {
   Serial.begin(9600);
   pinMode(pirPin, INPUT);
}

void loop() {
   PIRSensor();
}

void PIRSensor() {
   if(digitalRead(pirPin) == HIGH) {
      if(lockLow) {
         PIRValue = 1;
         lockLow = false;
         Serial.println("Motion detected.");
         delay(50);
      }
      takeLowTime = true;
   }
   if(digitalRead(pirPin) == LOW) {
      if(takeLowTime){
         lowIn = millis();takeLowTime = false;
      }
      if(!lockLow && millis() - lowIn > pause) {
         PIRValue = 0;
         lockLow = true;
         Serial.println("Motion ended.");
         delay(50);
      }
   }
}

Dikkat Edilecek Kod

PIR sensörünün üç terminali vardır - V cc , OUT ve GND. Sensörü aşağıdaki şekilde bağlayın -

  • + V bağlayın cc Arduino gemide +5 V.
  • OUT'u Arduino kartındaki dijital pin 2'ye bağlayın.
  • GND'yi Arduino'daki GND ile bağlayın.

Sensör hassasiyetini ve gecikme süresini, sensör kartının altında bulunan iki değişken direnç aracılığıyla ayarlayabilirsiniz.

Sensör herhangi bir hareket algıladığında, Arduino bir hareketin algılandığını söylemek için seri port üzerinden bir mesaj gönderecektir. PIR algılama hareketi, yeni bir hareket olup olmadığını kontrol etmek için belirli bir süre erteleyecektir. Hareket algılanmazsa, Arduino hareketin sona erdiğini söyleyen yeni bir mesaj gönderecektir.

Sonuç

Bir hareket algılanırsa seri portunuzda bir mesaj ve hareket durduğunda başka bir mesaj göreceksiniz.

HC-SR04 ultrasonik sensör, yarasaların yaptığı gibi bir nesnenin mesafesini belirlemek için SONAR'ı kullanır. 2 cm ila 400 cm veya 1 inç ila 13 fit arasında kullanımı kolay bir pakette yüksek doğruluk ve kararlı okumalar ile mükemmel temassız mesafe tespiti sunar.

İşlem güneş ışığından veya siyah malzemeden etkilenmez, ancak akustik olarak kumaş gibi yumuşak malzemelerin algılanması zor olabilir. Ultrasonik verici ve alıcı modül ile birlikte gelir.

Teknik özellikler

  • Güç Kaynağı - + 5V DC
  • Sakin Akım - <2mA
  • Çalışma Akımı - 15mA
  • Etkili Açı - <15 °
  • Değişen Mesafe - 2cm - 400 cm / 1 ″ - 13ft
  • Çözünürlük - 0.3 cm
  • Ölçüm Açısı - 30 derece

Gerekli Bileşenler

Aşağıdaki bileşenlere ihtiyacınız olacak -

  • 1 × Breadboard
  • 1 × Arduino Uno R3
  • 1 × ULTRASONIC Sensör (HC-SR04)

Prosedür

Devre şemasını takip edin ve aşağıdaki resimde gösterildiği gibi bağlantıları yapın.

Eskiz

Bilgisayarınızda Arduino IDE yazılımını açın. Arduino dilinde kodlama devrenizi kontrol edecektir. Yeni'ye tıklayarak yeni bir çizim Dosyası açın.

Arduino Kodu

const int pingPin = 7; // Trigger Pin of Ultrasonic Sensor
const int echoPin = 6; // Echo Pin of Ultrasonic Sensor

void setup() {
   Serial.begin(9600); // Starting Serial Terminal
}

void loop() {
   long duration, inches, cm;
   pinMode(pingPin, OUTPUT);
   digitalWrite(pingPin, LOW);
   delayMicroseconds(2);
   digitalWrite(pingPin, HIGH);
   delayMicroseconds(10);
   digitalWrite(pingPin, LOW);
   pinMode(echoPin, INPUT);
   duration = pulseIn(echoPin, HIGH);
   inches = microsecondsToInches(duration);
   cm = microsecondsToCentimeters(duration);
   Serial.print(inches);
   Serial.print("in, ");
   Serial.print(cm);
   Serial.print("cm");
   Serial.println();
   delay(100);
}

long microsecondsToInches(long microseconds) {
   return microseconds / 74 / 2;
}

long microsecondsToCentimeters(long microseconds) {
   return microseconds / 29 / 2;
}

Dikkat Edilecek Kod

Ultrasonik sensörün dört terminali vardır - + 5V, Tetikleyici, Yankı ve GND aşağıdaki şekilde bağlanır -

  • Arduino kartınızdaki + 5V pinini + 5v'ye bağlayın.
  • Tetikleyiciyi Arduino kartınızdaki dijital pin 7'ye bağlayın.
  • Echo'yu Arduino kartınızdaki dijital pin 6'ya bağlayın.
  • GND'yi Arduino'daki GND ile bağlayın.

Programımızda sensörün seri port üzerinden ölçtüğü mesafeyi inç ve cm olarak görüntüledik.

Sonuç

Sensörün ölçtüğü mesafeyi inç ve cm cinsinden Arduino seri monitöründe göreceksiniz.

Düğmeler veya anahtarlar bir devrede iki açık terminali bağlar. Bu örnek, pin 8'e bağlı buton anahtara bastığınızda pin 2'deki LED'i açar.

Çekme Direnci

Aşağı çekme dirençleri, harici cihazların bağlantısı kesilirse veya yüksek empedansta ise Arduino girişlerinin beklenen mantık seviyelerine yerleşmesini sağlamak için elektronik mantık devrelerinde kullanılır. Bir giriş pinine hiçbir şey bağlı olmadığı için, mantıksal sıfır olduğu anlamına gelmez. Aşağı çekme dirençleri cihaz üzerindeki uygun pim ile toprak arasına bağlanır.

Aşağıdaki şekilde dijital bir devrede bir aşağı çekme direnci örneği gösterilmektedir. Besleme gerilimi ile bir mikro denetleyici pimi arasına bir basma düğmesi bağlanır. Böyle bir devrede, anahtar kapatıldığında, mikro denetleyici girişi mantıksal olarak yüksek bir değerdedir, ancak anahtar açıkken, aşağı çekme direnci giriş voltajını zemine çeker (mantıksal sıfır değeri), girişte tanımsız bir durum.

Aşağı çekme direnci, mantık devresinin empedansından daha büyük bir dirence sahip olmalıdır, aksi takdirde voltajı çok fazla aşağı çekebilir ve pimdeki giriş voltajı, anahtar konumu ne olursa olsun sabit bir mantıksal düşük değerde kalır.

Gerekli Bileşenler

Aşağıdaki bileşenlere ihtiyacınız olacak -

  • 1 × Arduino UNO kartı
  • 1 × 330 ohm direnç
  • 1 × 4.7K ohm direnç (aşağı çekin)
  • 1 × LED

Prosedür

Devre şemasını takip edin ve aşağıdaki resimde gösterildiği gibi bağlantıları yapın.

Eskiz

Bilgisayarınızda Arduino IDE yazılımını açın. Arduino dilinde kodlama devrenizi kontrol edecektir. Yeni'ye tıklayarak yeni bir çizim Dosyası açın.

Arduino Kodu

// constants won't change. They're used here to
// set pin numbers:
const int buttonPin = 8; // the number of the pushbutton pin
const int ledPin = 2; // the number of the LED pin
// variables will change:
int buttonState = 0; // variable for reading the pushbutton status

void setup() {
   // initialize the LED pin as an output:
   pinMode(ledPin, OUTPUT);
   // initialize the pushbutton pin as an input:
   pinMode(buttonPin, INPUT);
}

void loop() {
   // read the state of the pushbutton value:
   buttonState = digitalRead(buttonPin);
   // check if the pushbutton is pressed.
   // if it is, the buttonState is HIGH:
   if (buttonState == HIGH) {
      // turn LED on:
      digitalWrite(ledPin, HIGH);
   } else {
      // turn LED off:
      digitalWrite(ledPin, LOW);
   }
}

Dikkat Edilecek Kod

Anahtar açıkken (butona basılmadığında) butonun iki terminali arasında bağlantı yoktur, bu nedenle pim toprağa bağlanır (aşağı çekme direnci vasıtasıyla) ve bir DÜŞÜK okuruz. Anahtar kapatıldığında (butona basıldığında), iki terminali arasında bir bağlantı kurar, pimi 5 volta bağlar, böylece bir YÜKSEK okuruz.

Sonuç

Düğmeye basıldığında LED AÇIK, bırakıldığında KAPALI olur.

Bu bölümde, Arduino kartı (UNO) ile farklı motor türleri arasında arayüz oluşturacağız ve size motoru nasıl bağlayacağınızı ve kartınızdan nasıl süreceğinizi göstereceğiz.

Üç farklı motor türü vardır -

  • DC motoru
  • Servo motor
  • Step motor

Bir DC motor (Doğru Akım motoru) en yaygın motor türüdür. DC motorların normalde biri pozitif ve biri negatif olmak üzere yalnızca iki ucu vardır. Bu iki ucu doğrudan bir aküye bağlarsanız, motor dönecektir. Uçları değiştirirseniz, motor ters yönde dönecektir.

Warning- Motoru doğrudan Arduino kart pinlerinden sürmeyin. Bu, panele zarar verebilir. Bir sürücü Devresi veya bir IC kullanın.

Bu bölümü üç kısma ayıracağız -

  • Sadece motorunu döndür
  • Kontrol motor hızı
  • DC motorun dönüş yönünü kontrol edin

Gerekli Bileşenler

Aşağıdaki bileşenlere ihtiyacınız olacak -

  • 1x Arduino UNO kartı
  • 1x PN2222 Transistör
  • 1x Küçük 6V DC Motor
  • 1x 1N4001 diyot
  • 1x 270 Ω Direnç

Prosedür

Devre şemasını takip edin ve aşağıdaki resimde gösterildiği gibi bağlantıları yapın.

Önlemler

Bağlantıları yaparken aşağıdaki önlemleri alın.

  • Öncelikle, transistörün doğru şekilde bağlandığından emin olun. Düzenlemede gösterildiği gibi transistörün düz tarafı Arduino kartına bakmalıdır.

  • İkincisi, diyotun şeritli ucu resimde gösterilen düzenlemeye göre + 5V güç hattına doğru olmalıdır.

Spin Kontrolü Arduino Kodu

int motorPin = 3;

void setup() {

}

void loop() {
   digitalWrite(motorPin, HIGH);
}

Dikkat Edilecek Kod

Transistör, motora giden gücü kontrol eden bir anahtar görevi görür. Arduino pin 3, transistörü açıp kapatmak için kullanılır ve çizimde 'motorPin' adı verilir.

Sonuç

3 numaralı Arduino pini yükseldiğinde motor tam hızda dönecektir.

Motor Hız Kontrolü

Arduino kartına bağlı bir DC motorun şematik diyagramı aşağıdadır.

Arduino Kodu

int motorPin = 9;

void setup() {
   pinMode(motorPin, OUTPUT);
   Serial.begin(9600);
   while (! Serial);
   Serial.println("Speed 0 to 255");
}

void loop() {
   if (Serial.available()) {
      int speed = Serial.parseInt();
      if (speed >= 0 && speed <= 255) {
         analogWrite(motorPin, speed);
      }
   }
}

Dikkat Edilecek Kod

Transistör, motorun gücünü kontrol eden bir anahtar görevi görür. Arduino pin 3, transistörü açıp kapatmak için kullanılır ve çizimde 'motorPin' adı verilir.

Program başladığında, motorun hızını kontrol etmek için değerleri vermenizi ister. Seri Monitöre 0 ile 255 arasında bir değer girmeniz gerekir.

'Döngü' işlevinde 'Serial.parseInt' komutu, Seri Monitöre metin olarak girilen sayıyı okumak ve onu 'int' e dönüştürmek için kullanılır. Buraya herhangi bir sayı yazabilirsiniz. Bir sonraki satırdaki 'if' ifadesi, sayı 0 ile 255 arasındaysa, bu sayı ile bir analog yazma yapar.

Sonuç

DC motor, seri port üzerinden alınan değere (0 ila 250) göre farklı hızlarda dönecektir.

Sıkma Yönü Kontrolü

DC motorun dönüş yönünü, uçları değiştirmeden kontrol etmek için, bir devre adı verilen bir devre kullanabilirsiniz. H-Bridge. H köprüsü, motoru her iki yönde de çalıştırabilen bir elektronik devredir. H köprüleri birçok farklı uygulamada kullanılmaktadır. En yaygın uygulamalardan biri, robotlarda motorları kontrol etmektir. Şematik diyagram "H" gibi görünecek şekilde bağlanmış dört transistör kullandığından H köprüsü olarak adlandırılır.

Burada L298 H-Bridge IC'yi kullanacağız. L298, DC motorların ve kademeli motorların hızını ve yönünü kontrol edebilir ve iki motoru aynı anda kontrol edebilir. Akım değeri her motor için 2A'dır. Ancak bu akımlarda ısı alıcıları kullanmanız gerekecektir.

Gerekli Bileşenler

Aşağıdaki bileşenlere ihtiyacınız olacak -

  • 1 × L298 köprü IC
  • 1 × DC motor
  • 1 × Arduino UNO
  • 1 × devre tahtası
  • 10 × atlama teli

Prosedür

Arduino Uno kartına giden DC motor arayüzünün şematik diyagramı aşağıdadır.

Yukarıdaki şema, iki motoru kontrol etmek için L298 IC'nin nasıl bağlanacağını gösterir. Her motor için üç giriş pini vardır: Giriş1 (IN1), Giriş2 (IN2) ve Motor1 için Etkinleştirme1 (EN1) ve Motor2 için Giriş3, Giriş4 ve Etkinleştirme2.

Bu örnekte sadece bir motoru kontrol edeceğimiz için, Arduino'yu L298 IC'nin IN1 (pin 5), IN2 (pin 7) ve Enable1 (pin 6) 'sına bağlayacağız. Pin 5 ve 7 dijitaldir, yani ON veya OFF girişler, pin 6 ise motor hızını kontrol etmek için darbe genişliği modülasyonlu (PWM) bir sinyale ihtiyaç duyar.

Aşağıdaki tablo IN1 ve IN2 dijital değerlerine göre motorun hangi yöne döneceğini göstermektedir.

IN1 IN2 Motor Davranışı
FREN
1 İLERİ
1 GERİYE
1 1 FREN

IC L298'in pini IN1, Arduino'nun pim 8'ine bağlıyken, IN2 pim 9'a bağlıdır. Arduino'nun bu iki dijital pini motorun yönünü kontrol eder. IC'nin EN A pini, Arduino'nun PWM pini 2'ye bağlanır. Bu, motorun hızını kontrol edecektir.

Arduino pin 8 ve 9'un değerlerini ayarlamak için digitalWrite () fonksiyonunu kullandık ve pin 2'nin değerini ayarlamak için analogWrite () fonksiyonunu kullanmalıyız.

Bağlantı Adımları

  • Sırasıyla 5V ve IC'nin toprağını 5V'a ve Arduino'nun toprağına bağlayın.
  • Motoru IC'nin 2 ve 3 numaralı pinlerine bağlayın.
  • IC'nin IN1'ini Arduino'nun 8. pinine bağlayın.
  • IC'nin IN2'sini Arduino'nun 9. pinine bağlayın.
  • IC'nin EN1'i Arduino'nun 2. pinine bağlayın.
  • IC'nin SENS A pinini toprağa bağlayın.
  • Arduino USB kablosunu kullanarak Arduino'yu bağlayın ve programı Arduino IDE yazılımını kullanarak Arduino'ya yükleyin.
  • Güç kaynağı, pil veya USB kablosu kullanarak Arduino kartına güç sağlayın.

Arduino Kodu

const int pwm = 2 ; //initializing pin 2 as pwm
const int in_1 = 8 ;
const int in_2 = 9 ;
//For providing logic to L298 IC to choose the direction of the DC motor

void setup() {
   pinMode(pwm,OUTPUT) ; //we have to set PWM pin as output
   pinMode(in_1,OUTPUT) ; //Logic pins are also set as output
   pinMode(in_2,OUTPUT) ;
}

void loop() {
   //For Clock wise motion , in_1 = High , in_2 = Low
   digitalWrite(in_1,HIGH) ;
   digitalWrite(in_2,LOW) ;
   analogWrite(pwm,255) ;
   /* setting pwm of the motor to 255 we can change the speed of rotation
   by changing pwm input but we are only using arduino so we are using highest
   value to driver the motor */
   //Clockwise for 3 secs
   delay(3000) ;
   //For brake
   digitalWrite(in_1,HIGH) ;
   digitalWrite(in_2,HIGH) ;
   delay(1000) ;
   //For Anti Clock-wise motion - IN_1 = LOW , IN_2 = HIGH
   digitalWrite(in_1,LOW) ;
   digitalWrite(in_2,HIGH) ;
   delay(3000) ;
   //For brake
   digitalWrite(in_1,HIGH) ;
   digitalWrite(in_2,HIGH) ;
   delay(1000) ;
}

Sonuç

Motor önce 3 saniye saat yönünde (CW) ve ardından 3 saniye saat yönünün tersine (CCW) çalışacaktır.

Servo Motor, bir çıkış şaftına sahip küçük bir cihazdır. Bu şaft, servoya kodlanmış bir sinyal gönderilerek belirli açısal konumlara konumlandırılabilir. Kodlanmış sinyal giriş hattında olduğu sürece, servo şaftın açısal konumunu koruyacaktır. Kodlanmış sinyal değişirse, şaftın açısal konumu değişir. Pratikte servolar, radyo kontrollü uçaklarda asansörler ve dümenler gibi kontrol yüzeylerini konumlandırmak için kullanılır. Ayrıca radyo kontrollü arabalarda, kuklalarda ve elbette robotlarda da kullanılırlar.

Servolar robotikte son derece kullanışlıdır. Motorlar küçüktür, yerleşik kontrol devresine sahiptir ve boyutlarına göre son derece güçlüdür. Futaba S-148 gibi standart bir servo, boyutu için güçlü olan 42 oz / inç torka sahiptir. Ayrıca mekanik yük ile orantılı güç çeker. Hafif yüklü bir servo bu nedenle fazla enerji tüketmez.

Bir servo motorun bağırsakları aşağıdaki resimde gösterilmektedir. Kontrol devresini, motoru, bir takım dişlileri ve kasayı görebilirsiniz. Ayrıca dış dünyaya bağlanan 3 kabloyu da görebilirsiniz. Biri güç (+ 5 volt), toprak içindir ve beyaz kablo kontrol telidir.

Servo Motorun Çalışması

Servo motorda bazı kontrol devreleri ve çıkış miline bağlı bir potansiyometre (değişken bir direnç, diğer adıyla pot) bulunur. Yukarıdaki resimde pot, devre kartının sağ tarafında görülebilir. Bu pot, kontrol devresinin servo motorun mevcut açısını izlemesini sağlar.

Mil doğru açıda ise, motor kapanır. Devre açının doğru olmadığını tespit ederse motoru istenen açıya gelene kadar döndürür. Servonun çıkış mili, 180 derece civarında bir yere hareket edebilir. Genellikle 210 derece aralığında bir yerdedir, ancak üreticiye bağlı olarak değişir. Normal bir servo, 0 ila 180 derecelik bir açısal hareketi kontrol etmek için kullanılır. Ana çıkış dişlisine yerleştirilmiş mekanik bir durdurucu nedeniyle mekanik olarak daha fazla dönme kabiliyetine sahip değildir.

Motora uygulanan güç, gitmesi gereken mesafe ile orantılıdır. Dolayısıyla, şaftın büyük bir mesafe dönmesi gerekiyorsa, motor tam hızda çalışacaktır. Yalnızca küçük bir miktar döndürmesi gerekiyorsa, motor daha yavaş bir hızda çalışacaktır. Bu denirproportional control.

Servonun Dönmesi Gereken Açıyı Nasıl İletirsiniz?

Kontrol teli, açıyı iletmek için kullanılır. Açı, kontrol teline uygulanan bir darbenin süresine göre belirlenir. Bu denirPulse Coded Modulation. Servo, her 20 milisaniyede (.02 saniye) bir darbe görmeyi bekler. Darbenin uzunluğu, motorun ne kadar döneceğini belirleyecektir. Örneğin 1,5 milisaniyelik bir darbe, motorun 90 derecelik konuma (genellikle nötr konum olarak adlandırılır) dönmesini sağlar. Darbe 1,5 milisaniyeden kısaysa, motor mili 0 dereceye yaklaştıracaktır. Darbe 1,5 milisaniyeden uzunsa mil 180 dereceye yaklaşır.

Gerekli Bileşenler

Aşağıdaki bileşenlere ihtiyacınız olacak -

  • 1 × Arduino UNO kartı
  • 1 × Servo Motor
  • 1 × ULN2003 sürüş IC
  • 1 × 10 KΩ Direnç

Prosedür

Devre şemasını takip edin ve aşağıdaki resimde gösterildiği gibi bağlantıları yapın.

Eskiz

Bilgisayarınızda Arduino IDE yazılımını açın. Arduino dilinde kodlama devrenizi kontrol edecektir. Yeni'ye tıklayarak yeni bir çizim Dosyası açın.

Arduino Kodu

/* Controlling a servo position using a potentiometer (variable resistor) */

#include <Servo.h>
   Servo myservo; // create servo object to control a servo
   int potpin = 0; // analog pin used to connect the potentiometer
   int val; // variable to read the value from the analog pin

void setup() {
   myservo.attach(9); // attaches the servo on pin 9 to the servo object
}

void loop() {
   val = analogRead(potpin);
   // reads the value of the potentiometer (value between 0 and 1023)
   val = map(val, 0, 1023, 0, 180);
   // scale it to use it with the servo (value between 0 and 180)
   myservo.write(val); // sets the servo position according to the scaled value
   delay(15);
}

Dikkat Edilecek Kod

Servo motorların üç terminali vardır - güç, toprak ve sinyal. Güç kablosu tipik olarak kırmızıdır ve Arduino'daki 5V pinine bağlanmalıdır. Topraklama kablosu tipik olarak siyah veya kahverengidir ve ULN2003 IC'nin (10-16) bir terminaline bağlanmalıdır. Arduino kartınızı hasardan korumak için, bunu yapmak için bazı sürücü IC'lerine ihtiyacınız olacak. Burada servo motoru sürmek için ULN2003 IC'yi kullandık. Sinyal pini tipik olarak sarı veya turuncudur ve 9 numaralı Arduino pinine bağlanmalıdır.

Potansiyometreyi Bağlama

Bir voltaj bölücü / potansiyel bölücü, çıkış voltajını uygulanan giriş voltajının belirli bir oranına ölçeklendiren seri bir devrede bulunan dirençlerdir. Devre şeması aşağıdadır -

$$ V_ {out} = (V_ {in} \ times R_ {2}) / (R_ {1} + R_ {2}) $$

V out , serideki uygulanan giriş voltajına (V in ) ve dirençlere (R 1 ve R 2 ) bağlı olan çıkış potansiyelidir . Bu, R 1'den geçen akımın bölünmeden R 2'den de geçeceği anlamına gelir . R 'değeri olarak Yukarıdaki denklemde, içinde 2 değişiklik, V üzerinden buna göre giriş voltajına göre, V ile terazi olarak .

Tipik olarak, bir potansiyometre, devrenin çıkış voltajını, düğme kullanılarak ölçeklenen değişken direncin değerine göre ölçeklendirebilen bir potansiyel bölücüdür. Aşağıdaki şemada gösterildiği gibi üç pime sahiptir: GND, Sinyal ve + 5V -

Sonuç

Potun NOP konumunu değiştirerek, servo motor açısını değiştirecektir.

Bir Step Motor veya bir step motor, tam bir dönüşü birkaç adıma bölen fırçasız, senkronize bir motordur. Sabit bir DC gerilimi uygulandığında sürekli dönen fırçasız bir DC motorun aksine, bir adım motoru farklı adım açılarında döner.

Bu nedenle Kademeli Motorlar, devir başına 12, 24, 72, 144, 180 ve 200'lük adımlarla üretilir ve her adımda 30, 15, 5, 2.5, 2 ve 1.8 derecelik adım açıları ile sonuçlanır. Step motor geri beslemeli veya geri beslemesiz kontrol edilebilir.

RC uçakta bir motor hayal edin. Motor şu veya bu yönde çok hızlı dönüyor. Motora verilen güç miktarına göre hızı değiştirebilirsiniz, ancak pervaneye belirli bir konumda durmasını söyleyemezsiniz.

Şimdi bir yazıcı hayal edin. Bir yazıcının içinde motorlar dahil birçok hareketli parça vardır. Böyle bir motor, kağıt parçası üzerine mürekkep basıldıkça kağıt parçasını hareket ettiren dönen silindirler olan kağıt besleme işlevi görür. Bu motorun, bir sonraki metin satırını veya bir görüntünün sonraki satırını yazdırabilmek için kağıdı tam bir mesafe hareket ettirebilmesi gerekir.

Baskı kafasını ileri geri hareket ettiren dişli bir çubuğa bağlı başka bir motor vardır. Yine, bu dişli çubuğun bir harf ardı ardına yazdırmak için kesin bir miktarda hareket ettirilmesi gerekir. Step motorların kullanışlı olduğu yer burasıdır.

Step Motor Nasıl Çalışır?

Normal bir DC motor yalnızca yönde dönerken, Step motor hassas artışlarla dönebilir.

Kademeli motorlar, istenildiği gibi tam bir derece (veya adım) dönüştürebilir. Bu size motor üzerinde tam kontrol sağlayarak onu tam bir konuma taşımanıza ve o konumu korumanıza olanak tanır. Bunu, motorun içindeki bobinlere çok kısa süreler için güç vererek yapar. Dezavantajı, motoru istediğiniz konumda tutmak için her zaman çalıştırmanız gerektiğidir.

Şimdilik bilmeniz gereken tek şey, bir step motorunu hareket ettirmek için, ona belirli sayıda adımı bir yönde veya diğer yönde hareket ettirmesini söylemeniz ve ona bu yönde adım atması gereken hızı söylemenizdir. Çok sayıda step motor çeşidi vardır. Burada açıklanan yöntemler, bu eğitimde bahsedilmeyen diğer motorların ve sürücülerin nasıl kullanılacağını anlamak için kullanılabilir. Ancak, sahip olduğunuz modellere özgü motorların ve sürücülerin veri sayfalarına ve kılavuzlarına her zaman başvurmanız önerilir.

Gerekli Bileşenler

Aşağıdaki bileşenlere ihtiyacınız olacak -

  • 1 × Arduino UNO kartı
  • 1 × küçük bipolar step Motor aşağıda verilen resimde gösterildiği gibi
  • 1 × LM298 sürüş IC

Prosedür

Devre şemasını takip edin ve aşağıdaki resimde gösterildiği gibi bağlantıları yapın.

Eskiz

Bilgisayarınızda Arduino IDE yazılımını açın. Arduino dilinde kodlama devrenizi kontrol edecektir. Yeni'ye tıklayarak yeni bir çizim Dosyası açın.

Arduino Kodu

/* Stepper Motor Control */

#include <Stepper.h>
const int stepsPerRevolution = 90;
// change this to fit the number of steps per revolution
// for your motor
// initialize the stepper library on pins 8 through 11:
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);

void setup() {
   // set the speed at 60 rpm:
   myStepper.setSpeed(5);
   // initialize the serial port:
   Serial.begin(9600);
}

void loop() {
   // step one revolution in one direction:
   Serial.println("clockwise");
   myStepper.step(stepsPerRevolution);
   delay(500);
   // step one revolution in the other direction:
   Serial.println("counterclockwise");
   myStepper.step(-stepsPerRevolution);
   delay(500);
}

Dikkat Edilecek Kod

Bu program, tek kutuplu veya çift kutuplu bir step motoru çalıştırır. Motor, Arduino'nun 8-11 numaralı dijital pinlerine takılır.

Sonuç

Motor bir yönde bir tur, sonra diğer yönde bir tur atacaktır.

Bu bölümde Arduino Tone Library'yi kullanacağız. Herhangi bir Arduino pininde belirli bir frekansta (ve% 50 görev döngüsünde) kare dalga üreten bir Arduino Kitaplığından başka bir şey değildir. İsteğe bağlı olarak bir süre belirtilebilir, aksi takdirde dalga stop () işlevi çağrılana kadar devam eder. Pin, tonları çalmak için bir piezo zil veya hoparlöre bağlanabilir.

Warning- Pimi doğrudan herhangi bir ses girişine bağlamayın. Voltaj, standart hat seviyesi voltajlarından önemli ölçüde daha yüksektir ve ses kartı girişlerine vb. Zarar verebilir. Voltajı düşürmek için voltaj bölücü kullanabilirsiniz.

Gerekli Bileşenler

Aşağıdaki bileşenlere ihtiyacınız olacak -

  • 1 × 8 ohm hoparlör
  • 1 × 1k direnç
  • 1 × Arduino UNO kartı

Prosedür

Devre şemasını takip edin ve aşağıdaki resimde gösterildiği gibi bağlantıları yapın.

Eskiz

Bilgisayarınızda Arduino IDE yazılımını açın. Arduino dilinde kodlama devrenizi kontrol edecektir. Yeni'ye tıklayarak yeni bir çizim Dosyası açın.

Pitches.h dosyasını oluşturmak için ya seri monitör simgesinin hemen altındaki düğmeyi tıklayın ve "Yeni Sekme" yi seçin ya da Ctrl + Shift + N tuşlarını kullanın.

Ardından aşağıdaki kodu yapıştırın -

/*************************************************
* Public Constants
*************************************************/

#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

Yukarıda verilen kodu farklı kaydedin pitches.h

Arduino Kodu

#include "pitches.h"
// notes in the melody:
int melody[] = {
NOTE_C4, NOTE_G3,NOTE_G3, NOTE_GS3, NOTE_G3,0, NOTE_B3, NOTE_C4};
// note durations: 4 = quarter note, 8 = eighth note, etc.:

int noteDurations[] = {
   4, 8, 8, 4,4,4,4,4 
};

void setup() {
   // iterate over the notes of the melody:
   for (int thisNote = 0; thisNote < 8; thisNote++) {
      // to calculate the note duration, take one second
      // divided by the note type.
      //e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc.
      int noteDuration = 1000/noteDurations[thisNote];
      tone(8, melody[thisNote],noteDuration);
      //pause for the note's duration plus 30 ms:
      delay(noteDuration +30);
   }
}

void loop() {
   // no need to repeat the melody.
}

Dikkat Edilecek Kod

Kod fazladan bir dosya (pitches.h) kullanır. Bu dosya, tipik notlar için tüm perde değerlerini içerir. Örneğin, NOTE_C4 orta C'dir. NOTE_FS4, Keskindir ve bu böyle devam eder. Bu not tablosu orijinal olarak Tone () komutunun temel aldığı Brett Hagman tarafından yazılmıştır. Müzik notaları yazmak istediğinizde yararlı bulabilirsiniz.

Sonuç

Sahalarda kaydedilen müzik notalarını duyacaksınız. H. dosya.

Kablosuz verici ve alıcı modülleri 315 Mhz'de çalışır. Bir devre tahtasına kolayca sığabilir ve çok basit bir kablosuz veri bağlantısı oluşturmak için mikrodenetleyicilerle iyi çalışabilirler. Bir çift verici ve alıcıyla, modüller yalnızca tek yönlü veri iletişiminde çalışır, ancak bir verici / alıcı çifti olarak hareket etmek için iki çifte (farklı frekanslarda) ihtiyacınız olacaktır.

Note- Bu modüller gelişigüzeldir ve makul miktarda gürültü alır. Hem verici hem de alıcı ortak frekanslarda çalışır ve kimlikleri yoktur.

Alıcı Modül Özellikleri

  • Ürün Modeli - MX-05V
  • Çalışma gerilimi - DC5V
  • Sakin Akım - 4mA
  • Alma frekansı - 315Mhz
  • Alıcı hassasiyeti - -105DB
  • Boyut - 30 * 14 * 7mm

Verici Modül Özellikleri

  • Ürün Modeli - MX-FS-03V
  • Başlatma mesafesi - 20-200 metre (farklı voltaj, farklı sonuçlar)
  • Çalışma voltajı - 3.5-12V
  • Boyutlar - 19 * 19mm
  • Çalışma modu - AM
  • Aktarım hızı - 4KB / S
  • İletim gücü - 10mW
  • İletim frekansı - 315Mhz
  • Harici bir anten - 25 cm normal çok çekirdekli veya tek çekirdekli hat
  • Soldan → sağdan pin çıkışı - (DATA; V CC ; GND)

Gerekli Bileşenler

Aşağıdaki bileşenlere ihtiyacınız olacak -

  • 2 × Arduino UNO kartı
  • 1 × Rf bağlantı vericisi
  • 1 × Rf bağlantı alıcısı

Prosedür

Devre şemasını takip edin ve aşağıdaki resimde gösterildiği gibi bağlantıları yapın.

Eskiz

Bilgisayarınızda Arduino IDE yazılımını açın. Arduino dilinde kodlama devrenizi kontrol edecektir. Yeni'ye tıklayarak yeni bir çizim Dosyası açın.

Note- Tuş takımı kitaplığını Arduino kitaplık dosyanıza eklemelisiniz. VirtualWire.lib dosyasını, aşağıda verilen ekran görüntüsünde vurgulandığı gibi kütüphaneler klasörüne kopyalayıp yapıştırın.

Verici için Arduino Kodu

//simple Tx on pin D12
#include <VirtualWire.h>
char *controller;

void setup() {
   pinMode(13,OUTPUT);
   vw_set_ptt_inverted(true);
   vw_set_tx_pin(12);
   vw_setup(4000);// speed of data transfer Kbps
}

void loop() {
   controller="1" ;
   vw_send((uint8_t *)controller, strlen(controller));
   vw_wait_tx(); // Wait until the whole message is gone
   digitalWrite(13,1);
   delay(2000);
   controller="0" ;
   vw_send((uint8_t *)controller, strlen(controller));
   vw_wait_tx(); // Wait until the whole message is gone
   digitalWrite(13,0);
   delay(2000);
}

Dikkat Edilecek Kod

Bu basit bir koddur. İlk önce '1' karakterini gönderecek ve iki saniye sonra '0' karakterini gönderecektir vb.

Alıcı için Arduino Kodu

//simple Rx on pin D12
#include <VirtualWire.h>

void setup() {
   vw_set_ptt_inverted(true); // Required for DR3100
   vw_set_rx_pin(12);
   vw_setup(4000); // Bits per sec
   pinMode(5, OUTPUT);
   vw_rx_start(); // Start the receiver PLL running
}

void loop() {
   uint8_t buf[VW_MAX_MESSAGE_LEN];
   uint8_t buflen = VW_MAX_MESSAGE_LEN;
   if (vw_get_message(buf, &buflen)) // Non-blocking {
      if(buf[0]=='1') {
         digitalWrite(5,1);
      }
      if(buf[0]=='0') {
         digitalWrite(5,0);
      }
   }
}

Dikkat Edilecek Kod

Arduino kartında 5 numaralı pime bağlı olan LED, karakter '1' alındığında AÇIK hale gelir ve '0' karakteri alındığında KAPALI hale gelir.

Texas Instruments'ın CC3000 WiFi modülü, nihayet kullanımı kolay, uygun fiyatlı WiFi işlevselliğini Arduino projelerinize getiren küçük bir gümüş pakettir.

İletişim için SPI kullanır (UART değil!), Böylece verileri istediğiniz kadar hızlı veya istediğiniz kadar yavaş aktarabilirsiniz. IRQ pinli uygun bir kesme sistemine sahiptir, böylece asenkron bağlantılara sahip olabilirsiniz. 802.11b / g, açık / WEP / WPA / WPA2 güvenliğini, TKIP ve AES'i destekler. Bir "BSD soket" arayüzüne sahip yerleşik bir TCP / IP yığını, hem istemci hem de sunucu modunda TCP ve UDP'yi destekler.

Gerekli Bileşenler

Aşağıdaki bileşenlere ihtiyacınız olacak -

  • 1 × Arduino Uno
  • 1 × Adafruit CC3000 koparma kartı
  • 1 × 5V röle
  • 1 × Doğrultucu diyot
  • 1 × LED
  • 1 × 220 Ohm direnç
  • 1 × Breadboard ve bazı jumper kabloları

Bu proje için, normal Arduino IDE'ye, Adafruit'un CC3000 kitaplığına ve CC3000 MDNS kitaplığına ihtiyacınız var. Ayrıca, WiFi aracılığıyla röleye komutlar göndermek için aREST kitaplığını kullanacağız.

Prosedür

Devre şemasını takip edin ve aşağıdaki resimde gösterildiği gibi bağlantıları yapın.

Bu proje için donanım yapılandırması çok kolaydır.

  • CC3000 kartının IRQ pinini Arduino kartının 3 numaralı pinine bağlayın.
  • VBAT, pin 5'e ve CS, pin 10'a.
  • SPI pinlerini Arduino kartına bağlayın: MOSI, MISO ve CLK sırasıyla 11, 12 ve 13 pinlerine.
  • V girişi Arduino 5V'ye ve GND, GND'ye bağlanır.

Şimdi röleyi bağlayalım.

Röleyi devre tahtasına yerleştirdikten sonra röleniz üzerindeki iki önemli parçayı tanımlamaya başlayabilirsiniz: röleye komut veren bobin kısmı ve led'i bağlayacağımız anahtar kısmı.

  • Öncelikle Arduino kartının 8 numaralı pinini bobinin bir pinine bağlayın.
  • Diğer pini Arduino kartının topraklamasına bağlayın.

Ayrıca, röle anahtarlandığında devrenizi korumak için doğrultucu diyotu (toprak pimine bağlı anot) bobinin pimlerinin üzerine yerleştirmeniz gerekir.

  • Arduino kartının + 5V'unu rölenin anahtarının ortak pinine bağlayın.

  • Son olarak, anahtarın diğer pinlerinden birini (genellikle röle kapalıyken bağlı olmayan) 220 Ohm direnç ile LED'e seri olarak bağlayın ve LED'in diğer tarafını Arduino'nun topraklamasına bağlayın. yazı tahtası.

Bağımsız Bileşenleri Test Etme

Röleyi aşağıdaki çizimle test edebilirsiniz -

const int relay_pin = 8; // Relay pin

void setup() {
   Serial.begin(9600);
   pinMode(relay_pin,OUTPUT);
}

void loop() {
   // Activate relay
   digitalWrite(relay_pin, HIGH);
   // Wait for 1 second
   delay(1000);
   // Deactivate relay
   digitalWrite(relay_pin, LOW);
   // Wait for 1 second
   delay(1000);
}

Dikkat Edilecek Kod

Kod kendinden açıklamalıdır. Sadece panele yükleyebilirsiniz ve röle her saniye durum değiştirecek ve LED buna göre AÇIK ve KAPALI olacaktır.

WiFi Bağlantısı Ekleme

Şimdi CC3000 WiFi yongasını kullanarak röleyi kablosuz olarak kontrol edelim. Bu proje için yazılım, TCP protokolüne dayanmaktadır. Ancak, bu proje için Arduino kartı küçük bir web sunucusu çalıştıracak, böylece bilgisayardan gelen komutları "dinleyebiliriz". Önce Arduino çizimi ile ilgileneceğiz, ardından sunucu tarafı kodunun nasıl yazılacağını ve güzel bir arayüz oluşturmayı göreceğiz.

İlk olarak, Arduino çizimi. Buradaki amaç, WiFi ağınıza bağlanmak, bir web sunucusu oluşturmak, gelen TCP bağlantıları olup olmadığını kontrol etmek ve ardından rölenin durumunu buna göre değiştirmektir.

Kodun Önemli Parçaları

#include <Adafruit_CC3000.h>
#include <SPI.h>
#include <CC3000_MDNS.h>
#include <Ethernet.h>
#include <aREST.h>

Kodun içinde yapılandırmanıza özel olanı, yani Wi-Fi adı ve şifresini ve TCP iletişimleri için bağlantı noktasını tanımlamanız gerekir (burada 80 kullandık).

// WiFi network (change with your settings!)
   #define WLAN_SSID "yourNetwork" // cannot be longer than 32 characters!
   #define WLAN_PASS "yourPassword"
   #define WLAN_SECURITY WLAN_SEC_WPA2 // This can be WLAN_SEC_UNSEC, WLAN_SEC_WEP, 
   // WLAN_SEC_WPA or WLAN_SEC_WPA2

// The port to listen for incoming TCP connections
   #define LISTEN_PORT 80

Daha sonra CC3000 örneğini, sunucuyu ve aREST örneğini oluşturabiliriz -

// Server instance
   Adafruit_CC3000_Server restServer(LISTEN_PORT); // DNS responder instance
   MDNSResponder mdns; // Create aREST instance
   aREST rest = aREST();

Taslağın setup () kısmında artık CC3000 yongasını ağa bağlayabiliriz -

cc3000.connectToAP(WLAN_SSID, WLAN_PASS, WLAN_SECURITY);

Bilgisayar verileri nereye göndereceğini nasıl bilecek? Bunun bir yolu, çizimi bir kez çalıştırmak, ardından CC3000 kartının IP adresini almak ve sunucu kodunu tekrar değiştirmek olabilir. Ancak, daha iyisini yapabiliriz ve CC3000 MDNS kitaplığı burada devreye girer. Bu kütüphane ile CC3000 kartımıza sabit bir isim atayacağız, böylece bu ismi doğrudan sunucu koduna yazabiliriz.

Bu, aşağıdaki kod parçasıyla yapılır -

if (!mdns.begin("arduino", cc3000)) {
   while(1);
}

Ayrıca gelen bağlantıları dinlememiz gerekiyor.

restServer.begin();

Ardından, sürekli olarak yürütülecek eskizin loop () işlevini kodlayacağız. Önce mDNS sunucusunu güncellemeliyiz.

mdns.update();

Arduino kartında çalışan sunucu gelen bağlantıları bekleyecek ve talepleri karşılayacaktır.

Adafruit_CC3000_ClientRef client = restServer.available();
rest.handle(client);

Projeleri WiFi üzerinden test etmek artık oldukça kolay. Krokiyi kendi WiFi adınız ve şifrenizle güncellediğinizden ve çizimi Arduino kartınıza yüklediğinizden emin olun. Arduino IDE seri monitörünüzü açın ve kartınızın IP adresini arayın.

Geri kalanı için burada 192.168.1.103 gibi bir şey olduğunu varsayalım.

Ardından, favori web tarayıcınıza gidin ve şunu yazın -

192.168.1.103/digital/8/1

Aktarıcınızın otomatik olarak AÇIK hale geldiğini görmelisiniz.

Röle Arayüzünün Oluşturulması

Şimdi projenin arayüzünü kodlayacağız. Burada iki bölüm olacaktır: arayüzü içeren bir HTML dosyası ve arayüzdeki tıklamaları işlemek için istemci tarafı bir Javascript dosyası. Buradaki arayüz,aREST.js WiFi cihazlarını bilgisayarınızdan kolayca kontrol etmek için yapılan proje.

Önce interface.html adlı HTML dosyasını görelim. İlk bölüm, arayüz için gerekli tüm kitaplıkların içe aktarılmasını içerir -

<head>
   <meta charset = utf-8 />
   <title> Relay Control </title>
   <link rel = "stylesheet" type = "text/css" 
      href = "https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css">
   <link rel="stylesheet" type = "text/css" href = "style.css">
   <script type = "text/javascript" 
      src = "https://code.jquery.com/jquery-2.1.4.min.js"></script>
   <script type = "text/javascript" 
      src = "https://cdn.rawgit.com/Foliotek/AjaxQ/master/ajaxq.js"></script>
   <script type = "text/javascript" 
      src = "https://cdn.rawgit.com/marcoschwartz/aREST.js/master/aREST.js"></script>
   <script type = "text/javascript" 
      src = "script.js"></script>
</head>

Ardından, arayüzün içinde biri röleyi açmak ve diğeri tekrar kapatmak için iki düğme tanımlıyoruz.

<div class = 'container'>
   <h1>Relay Control</h1>
   <div class = 'row'>
      <div class = "col-md-1">Relay</div>
      <div class = "col-md-2">
         <button id = 'on' class = 'btn btn-block btn-success'>On</button>
      </div>
      <div class = "col-md-2">
         <button id = 'off' class = 'btn btn-block btn-danger'>On</button>
      </div>
   </div>
</div>

Şimdi, düğmelere yapılan tıklamaları işlemek için istemci tarafı bir Javascript dosyasına da ihtiyacımız var. Ayrıca Arduino cihazımızın mDNS adına bağlayacağımız bir cihaz da oluşturacağız. Bunu Arduino kodunda değiştirdiyseniz, burada da değiştirmeniz gerekecektir.

// Create device
var device = new Device("arduino.local");
// Button

$('#on').click(function() {
   device.digitalWrite(8, 1);
});

$('#off').click(function() {
   device.digitalWrite(8, 0);
});

Bu proje için tam kod şu adreste bulunabilir: GitHubdepo. Arayüz klasörüne gidin ve HTML dosyasını favori tarayıcınızla açın. Tarayıcınızın içinde benzer bir şey görmelisiniz -

Web arayüzünde bir düğmeyi tıklamayı deneyin; rölenin durumunu neredeyse anında değiştirmelidir.

Çalıştırmayı başardıysan, bravo! Wi-Fi kontrollü bir ışık anahtarı yaptınız. Elbette bu proje ile ışıklardan çok daha fazlasını kontrol edebilirsiniz. Aktarıcınızın kontrol etmek istediğiniz cihaz için gereken gücü desteklediğinden emin olun ve hazırsınız.