Olmak yada olmamak ! İşte bütün mesele bu.

Sayısal elektroniÄŸin temelinin sadece “1” bir ve “0” sıfırdan ibaret olması sokaktaki insan açısından bir ÅŸey ifade etmese de günümüzde hayatımız “1” ve “0” dan oluÅŸmuÅŸ bir dünya ile sarılmış durumda.

Aslında pratik açıdan baktığımızda bir ÅŸey ya vardır ya yoktur, ya açıktır yada kapalıdır veya çalışıyordur yada çalışmıyordur.  Matematik açısından “1” ve “0” dan oluÅŸmuÅŸ bu “ikili tabanda sayma düzeni” ile aklınıza gelebilecek her ÅŸeyi ifade etmek mümkündür.

İnsanoğlu aya ilk adımını bastığında nasıl çağ atlamışsa siz de Arduino kullanmaya başladığınızda şimdi yazacağım komutu kullanarak kendi dünyanızın uydusu aya ayak basmış olacaksınız.

İşte komut;  digitalWrite(13, HIGH);

Artık başınız göğe erdi bin türlü zahmete girerek aldığınız Arduinonun üstünde olan topu topu 1 adet (ışık yayan diyotu -ama siz öyle demeyin) LED i yakmayı başardınız 🙂

digitalWrite
komutunda 2 adet parametre olduÄŸunu görüyorsunuz; birinci parametre Arduinonun 13 numaralı bacağına iÅŸlem yapacağınızı ifade ederken sonraki parametre bu bacağın “1” mi “0” mı olacağını söylüyor “1” için HIGH “0” için LOW kullanıyoruz.

Arduinoda yazılan programa sketch deniyor, Arduino programınının menülerini kurcaladığınızda example/basics/blink sketch ini açtığınızda aşağıdaki sketch i göreceksiniz. Programda gerekli Türkçe açıklamaları da koydum.

Aşağıdaki blink programında
” /* ” ile baÅŸlayan satırlar dikkate alınmaz açıklama ve not satırlarıdır  ” */ ”  iÅŸaretine kadar hiç bir komut çalıştırılmaz birden fazla satırı kapsayabilir.
“//”  iÅŸareti de  programcının notları, açıklamalarıdır iÅŸaretten satır sonuna kadar yazılanlar çalıştırılmaz dikkate alınmaz.
void kelimesi program içindeki program parçacıklarını belirtmek için kullanılır yapısı “void kucukkodunAdı() { buraya komutlar gelir }”
Büyük parantezler “{…}” bir arada çalışacak kodları gruplamak için kullanılır.
“;” noktalı virgül iÅŸaretini her komuttan sonra kullanıyoruz.

/*
  Blink
  LED i devamlı 1 saniye yakar 1 saniye söndürürür.
  Turns on an LED on for one second, then off for one second, repeatedly.
 
  This example code is in the public domain.
 */
void setup() {
  // initialize the digital pin as an output.
  // Pin 13 has an LED connected on most Arduino boards:
  pinMode(13, OUTPUT); //13 numaralı bacağı çıkış olarak tanımladık
}

void loop() {
  digitalWrite(13, HIGH);   // 13 nolu bacağa bağlı LED i aç >> BAŞINIZ GÖĞE ERDİ Mİ :)
  delay(1000);              // bir saniye bekle, 1 saniye=1000 milisaniye
  digitalWrite(13, LOW);    // LED i kapat
  delay(1000);              // 1 saniye bekle
}

Yukarıdaki Loop() bölümü içindeki kodlar sonsuz döngüde devamlı çalıştırılır.
loop() dan önce görülen setup() bölümü program başlamadan önce yapılan ayarlamalar ve bildirimlerdir.
pinMode(13, OUTPUT); bildirimi 13 numaralı bacağın çıkış olarak kullanılacağını bildiriyor.

Bazı komutların büyük harf küçük harf karışık yazılmasının nedeni kodu okurken görsel olarak daha anlaşılır olması içindir bilgisayarın ilk icad edildiği yıllarda bir macar programcı bu yazım şeklini icad ettiğinden MacarKodlaması olarak da anılmaktadır.

İlk programla beraber başımız göğe erdi içimizdeki ayı feth ettik, şairin dediği gibi;

Olmak yada olmamak !  İşte bütün mesele bu.

 

Ömer Koman

Elektronik hakkında ilk hatırladığım şey 5-6 yaşlarımdayken babamın arkadaşı radyocunun tezgahına burnumu dayayıp lambalı radyoları tamir edişini izlemekti...

22 comments

  1. […] gibi bardağı azar azar doldurarak bir çok oransal/ölçülebilir deÄŸer oluÅŸturabiliriz. Daha önceki LED yakıp söndürdüğümüz yazımızda aslında oransal olarak ledi tam dolduruyorduk. Ama […]

  2. Mustafa AY dedi ki:

    Merhabalar,

    Sitede forum gibi soru sorabileceğim bir yet bulunmadığı için buradan sormak zorunda kaldım.

    Benim yapmak istediğim robot bir yere sensörleri aracılığıyla atıyorum 12 sn de vardı. Sonra geri dönerken de daha hızlı olması için delay(120) yapıp 12 saniye gitmesini istiyorum.

    Ancak robotun kaç saniye gittiğini nasıl hesaplayabileceğimi anlayamadım. SimpleTimer gibi kütüphaneler buldum ancak içindeki Serial.begin(9600) kısmını bir türlü çözemedim. Anlayamıyorum diyebilirim.

    • Ömer Koman dedi ki:

      Delay ile süre ölçemezsiniz delay iÅŸlemciyi verilen süre kadar bekletir. süre ölçümlerini milis() fonksiyonu ile yapın…

      Arduino Help kısmında Reference kısmına bakarsanız şöyle yazar:

      millis()
      Returns the number of milliseconds since the Arduino board began running the current program.

      milis() fonksiyonu arduinoya enerji verdiğiniz andan itibaren kaç milisaniye geçtiğini size söyler.

      Bu bilgiden faydalanarak harekete başladığınız anda milis() değerini saklayın hareket bittiğinde milis() okutup sakladığınız değeri son okuduğunuz milis() değerinden çıkarın, elde ettiğiniz değer geçen net süredir.
      (serial.begin ve serial.print komutları ile ilgili sitede yazılar var bir inceleyin derim)

      örnek

      unsigned long time1;
      unsigned long time2;

      void setup(){
      Serial.begin(9600);
      }
      void loop(){
      Serial.print("Başlama zamanı: ");
      time1 = millis();//hareket baslama anini sakla
      //prints time since program started
      Serial.println(time1);

      // wait a second so as not to send massive amounts of data
      delay(1000);//test için 1 saniye kadar beklettik. siz burada aracı hareket ettiriyorsunuz farzedin

      Serial.print("Bitiş zamanı: ");
      time2 = millis();
      Serial.println(time2);//hareket bitis

      Serial.print("Geçen süre: ");
      Serial.println(time2-time1);//hesapla yaz

      }

  3. Mustafa AY dedi ki:

    Merhabalar,

    milis() iÅŸlevinin ne iÅŸe yaradığını okudum ancak anlamadığım yer “Serial.begin(9600)” kısmıydı.

    Onu da internette daha önceden aradım ancak bulamadım serial nedir diye. Şimdi sitede anlatım var dediniz sağ üstteki aramaya basınca 4 tane sonuç çıktı ki onlar da anlatım değil, kodlarda kullanılan serial ler. RObot bilgisayara falan bağlı olmayacağı için bilemiyorum. Sanki serial bilgisayara takılı iken haberleşmeyi sağlıyor.

    Kendim ise şöyle bir yol buldum en sonunda:

    [code]
    void loop () {
    digitalWrite(solmotor = HIGH);
    digitalWrite(sagmotor = LOW);
    sureSay();
    }
    void sureSay( void ) {
    delay(100);
    sure += 100;
    }
    [/code]

  4. sabri dedi ki:

    milis() == Milisaniye çözünürlüğünde olan ve başlangıcı sistem start zamanına veya daha sonra resetlenmiş/işlenmiş data adres veya değişkenindeki toplam süredir.Komut iç döngü komutudur(zaten argüman olması gerekir öyle olmazsa). Ben arduino da yeniyim ama yaklaşık 8 yıldır python programcılığıyla uygulama yazmaktayım(kendine müslüman :=)).

  5. tutkun dedi ki:

    @Mustafa Ay,
    Programında mantık hatası var bence. Şöyle ki;

    void sureSay( void ) {
    delay(100); // 100 milisaniye bekletiyorsun
    sure += 100; // sonra tanımladığın değişkene 100 milisaniye olduğunu ekliyorsun
    }

    halbu ki şöyle yapabilirsin:

    void yapilanIslem(void) {
    // burada bir is yaptırıyorum
    }

    void loop() {
    baslangicSuresi = milis(); // Saat: 19:26
    yapilanIslem(); // işlem süresi ölçülecek işlemler
    bitisSuresi = milis(); // Saat: 19:27
    Serial.print("Toplam İş Süresi: ");
    Serial.print( bitisSuresi - baslangicSuresi ); // Süre: 19:27 - 19:26 = 00:01
    }

    Yukarıda ikinci süreden ilk süreyi çıkardık ve kalan süre, arada geçen süre olarak ekrana yazıldı.

    NOT: Tabii ki 19:27 gibi bir şey yok. Ben onu anlaşılır olması açısından yazdım 🙂 Bu değerler integer türündendir muhtemelen(hiç pic programlamamış biri olarak) 🙂

  6. […] parlamaya baÅŸlar eÄŸer ters baÄŸlarsanız birÅŸey olmaz parlamaz. Bu özelliÄŸi Arduino üzerinde ÅŸu yazımızda test […]

  7. Elgun dedi ki:

    Merhabalar. Ben arduinoyla kulucka makinesi yapmak istiyorum. Böyle bir kod yazdım. Şimdi bana bide belli bir zaman aralıklarında başka bir pine HİGH LOW vermek lazım. Yumurtalari çevirecek motoru açıp kapatmak için. Ama bu codlara karışmaması lazım. Zannımca bunu millis() fonksiyonuyla yapa bilirim. Biraz uğraştım. Bu kpnuda bi tavsiyede buluna bilirmisiniz.
    #include // dht11 kütüphanesini ekliyoruz.
    #define DHT11PIN 2 // DHT11PIN olarak Dijital 2’yi belirliyoruz.

    dht11 DHT11;
    int relay2 = 31;
    float istilik;
    float gerginlik;
    int istilikPini = 0;
    int rele = 30;

    void setup()
    {
    pinMode(rele,OUTPUT);
    pinMode(relay2,OUTPUT);
    Serial.begin(9600);
    }
    void loop()
    {
    gerginlik = analogRead(istilikPini);
    gerginlik = (gerginlik / 1023) * 5000;
    istilik = gerginlik / 10.0;

    Serial.println(“\n”);
    // Sensörün okunup okunmadığını konrol ediyoruz.
    // chk 0 ise sorunsuz okunuyor demektir. Sorun yaşarsanız
    // chk değerini serial monitörde yazdırıp kontrol edebilirsiniz.
    int chk = DHT11.read(DHT11PIN);
    Serial.print(“Nem (%): “);
    Serial.println((float)DHT11.humidity, 2);

    Serial.print(“Sicaklik (Celcius): “);
    Serial.println((float)DHT11.temperature, 2);

    // Çiğ Oluşma Noktası, Dew Point
    Serial.print(“Cig Olusma Noktasi: “);
    Serial.println(DHT11.dewPoint(), 2);
    Serial.print(“temperatur miqdari:”);
    Serial.print(istilik);
    Serial.println(” derece”);
    if (istilik 26)
    {
    digitalWrite(rele,LOW);
    }
    else if (DHT11.humidity 40)
    {
    digitalWrite(relay2,HIGH);
    }
    delay(1000);

    }

  8. Ömer Koman dedi ki:

    işleri bölümlere böl mesela 1.iş sıcaklık kontrol olsun sonra 2.iş motor çevir olsun. sırasıyla 1.işi yap sıcaklığı kontrol et, sonra 2.iş motor çevirme olacak ama motoru çevirmek için içerde bir sayaç yap mesela 100 kere ısı kontrolu yaptığında motoru 1 kere çevir filan gibi bir mantık olur herhalde. ayrıca projeyi beğendim bittikten sonra resimlerini filan yayınlarsanız yada sitemizde proje olarak koymak isterseniz yer veririz seve seve.

  9. Åžule dedi ki:

    Merhaba, ben kapasitif sensörle çalışan bir devre yapmak istiyorum. Kapasitif sensör için hangi Arduino’yu kullanacağıma karar veremedim, sizlerin bir önerisi var mı?

    • Ömer Koman dedi ki:

      elinizde ne varsa onunla çalışır hepsi ile çalışır yani. sonuçta kondansatörün dolup boşalma zamanı ölçülecek.

  10. Ä°smail dedi ki:

    Merhaba güzel bir yazı olmuş benim çok basit bir projem var 6dklık bır ışık gösterisi yapıcam bunu tek bir ışıkla yapıcam yani tek bir ledi 6 dk gibi bir sürede açıp kapatıcam bu belli zamanlarda çalışıcak belli sürelerde durucak bunun için kullanıcağım delay komutu 6dk süreceği için 6000 hatta 10000 lere kadar çıkması gerektiği için sıkıntı olurmu acaba ne yapmam gerekli

  11. Ömer Koman dedi ki:

    Delay (1000) kullanip while icinde döndurun. aşağıdaki kod 1 dk sayar, 1saat saymak için 3600 e kadar saymanız lazım

    int dksay=0
    while(dksay<60){
    delay(1000);
    dksay++;
    // zamanı sayarken kontrol etmeniz gereken şeyler varsa bu satırda yapın
    }

  12. alperen dedi ki:

    hocam arduino ile araba yaptım arabama park sensörüde eklemek istiyorum fakat bir türlü gerçekleştiremedim kodlarda yardımcı olurmusunuz ?

  13. Emre dedi ki:

    Merhaba ben belirli sürelerle yanan Led yapmak istiyorum açıklamam gerekirse önce 5 saniye boyunca 1. Işık yanıcak 10 saniye 2. Işık devamında ise süreler değişecek bunu nasıl yapabilirim hiç anlamıyorum yardım eder misiniz lütfen

    • Ömer Koman dedi ki:

      void setup() {
      // initialize the digital pin as an output.
      // Pin 13 has an LED connected on most Arduino boards:
      pinMode(11, OUTPUT); //11 numaralı bacağı çıkış olarak tanımladık
      pinMode(12, OUTPUT); //12 numaralı bacağı çıkış olarak tanımladık

      }

      void loop() {
      digitalWrite(11, HIGH); // 1.led yaktık
      delay(5000); // 5sn bekle
      digitalWrite(11, LOW); // 1.led sondur
      digitalWrite(12, HIGH); // 2.led yaktık
      delay(5000); //
      delay(5000); // toplam 10sn bekle
      digitalWrite(12, LOW); // 2.led sondur
      // buradan tekrar başa döner
      }

  14. recep dedi ki:

    ISR methodunda bır voltaj olcum yapmak ıstıyorum.daha dogrusu voltaj aldıgı zaman aralıgını gormek ıstıyorum ama orda mıllıs ı kullanamadım son zamanı almıyor..Yardımcı olursanız sevınırım..sımdıden tesekkur ederım..

    • Ömer Koman dedi ki:

      zaman1=millis();
      bir iÅŸlem
      zaman2=millis();

      gecen_zaman=zaman2-zaman1

      buna benzer bir yapı kurmanız lazım

  15. recep dedi ki:

    ISR metodunda millis komutunu kullanamadım tam olark sadece bır sarta baglı olarak belırlı bır sure aralıgını bulmak ıstıyorum..yardımcı olursanız sevınırım..soyledıgınız yapıyı bılıyorum ama bu yapıyı belırledıgım sarta baglı olarak kuramadım o yuzden yardımlarınızı beklıyorum..tesekkur ederım..

  16. Ömer Koman dedi ki:

    kurdugunuz yapı hakkında fıkrım yok ıkı adc arasındaki okuma suresi çok düşüktür yada programınzın uzunluguna gore ıkı adc arasındakı olcum suresı değişir tabi.

    ISR oluştugundada diyelim ıdşarıdan bır kesme oluştu bu anda zamanı kaydedın tekrar oluştugunda ıse bır oncekını saklayım sonuncusunu da saklayın ve aradakı farkı yukarıda dedıgım gıbı saklayın

    ISR dışındaki kodunuzda da bu fark zamanını ve adc voltajını bırlıkte kontrol edersınız. foruma gelin

  17. zeki dedi ki:

    hocam bir sistem tasarladım sıcaklık 25 derece ıken devre normal 27 oldugunda 1.valf 20sn cıkıs veriyor 2 valf 10 sn sonuk kaldıktan sonra oda cıkış verıyor 10 sn boyunca yanı ıkısı bırlıkte 10 sn yanıyor sonra ıkı valf de aynı anda off duruma gecıyor bunu delay komutu ıle yaptım calıstı ama delay sistemi kıtlıyor 20 sn boyunca cıkıs olçemıyorım bu 20snlik süreci millis komutu ıle yaptım bu sefer ılk valf actı ıkıncı valfte 10 sn sonra oda actı ıkısı bırlıkte 10 sn acık kaldıktan sonra ıkısınınde kapanması off olması gerekıyor ama valflerı kapatma ıslemını yapmıyor ıstersenız kodları paylasabılırım saygılarımla.

E-posta adresiniz gösterilmeyecek. Gerekli alanlar * ile işaretlidir.

*



Sosyal AÄŸlar