C'de Stringler #C7


 Bu yazının konusu C programlama string kullanımıdır. C'ye yeni baÅŸlayanların zorlandığı konulardan biridir. Bu nedenle stringleri ayrı bir bölümde incelemenin daha iyi olacağını düşündük. 



String Nedir?

C programlamada "iki tırnak içerisindeki ifadelere" string ifadeleri ya da kısaca stringler denir. Örneğin;

"İstanbul"
"sayi = %d\n"
"Lütfen bir sayı giriniz:"
...

ifadeleri birer stringtir.

C'de stringler aslında karakter gösteren birer adrestir. C derleyicileri, derleme aÅŸamasında bir stringle karşılaÅŸtığında, önce onu belleÄŸin güvenli bir bölgesine yerleÅŸtirir,  sonuna NULL karakteri ekler ve daha sonra string yerine yerleÅŸtirildiÄŸi yerin baÅŸlangıç adresini koyar. Bu durumda string ifadeleri aslında stringlerin bellekteki baÅŸlangıç yerini gösteren karakter türünden bir adrestir. ÖrneÄŸin;

char *p;
...
p= "Deneme";

gibi bir kodun derlemesi sırasında, derleyici önce "Deneme" stringini belleğin güvenli bir bölgesine yerleştirir, daha sonra yerleştirdiği yerin başlangıç adresini string ifadesi ile değiştirir.

String ifadeleri karakter türünden göstericilere atanmalıdır. String ifadeleri dizi isimlerine atanamaz. Aşağıdaki örneği inceleyiniz;

char s[20];
...
s = "İstanbul";

Bu ifade s bir nesne olmadığı için geçersizdir. Ancak bu durumu dizilere iki tırnak içerisinde ilk değer verme işlemi karıştırmayınız..!

char s[20] = "İstanbul";

Çünkü dizilere ilk değer verme işleminde derleyici önce diziyi belirtilen uzunlukta açar, daha sonra iki tırnak içerisindeki ifadeleri -NULL karakter dahil olmak üzere- dizi elemanlarına sırasıyla yerleştirir. Yani dizilere ilk değer verme işleminde derleyici, string ifadelerinde olduğu gibi bir adres yerleştirmez.


Stringlerin Ömürleri

  • C'de nesneler ömür bakımından 4 gruba ayrılır. Bunlar;
  • Otomatik Ömür (Automatic Storage Duration): Bildirildikleri blokta, bildirildikleri yerde ömürleri baÅŸlayıp bildirildikleri bloÄŸun sonunda ömürleri sonlanan nesnelerdir. ÖrneÄŸin bir fonksiyon içinde tanımlanan yerel deÄŸiÅŸkenler bu tip bir ömre sahiptirler.
  • Statik Ömür (Static Storage Duration): Programın çalışmaya baÅŸlaması ile bellekte yer edinip programın sonlanmasıyla bellekten silinen nesnelerdir.
  • Thread Ömrü (Thread Storage Duration): Ã–mrü bir Thread’in çalışmaya baÅŸlamasından sonlanana kadar olan ve o Thread’e özel olan nesnelerdir. Bu ömür C11 standartları ile dile eklenmiÅŸtir. Bu ömre sahip olan nesnelerin incelenmesi bu yazının kapsamı dışındadır.
  • Dinamik Ömür (Dynamic/Allocated Storage Duration): Ä°steÄŸe göre bellekten yer verilebilen ve bellekten silinebilen nesnelerdir. Bu ömre sahip olan nesnelerin incelenmesi bu yazının kapsamı dışındadır.

Stringler statik ömürlü nesnelerdir. Tıpkı global değişkenler gibi programın yüklenmesiyle yaratılır, programın icrası bittiğinde silinirler. Dolayısıyla stringler çalışabilen kodu büyütürler. Birçok sistemde statik verilerin toplam uzunluğunda belli bir sınırlama söz konusudur.

Stringlerin BirleÅŸtirilmesi 

Stringleri aşağıdaki gibi parçalayamayız:

char *p;
...
p = "Bu gün hava
            çok güzel";

Ancak string ifadeleri büyüdükçe bunu tek bir satırda yazmak hem sıkıntı yaratmakta hem de okunabilirliÄŸi bozmaktadır. Uzun stringlerin parçalanmasına olanak vermek amacıyla derleyiciler yan yana yazılan string ifadelerini birleÅŸtirirler. 

Örneğin;

p = "Bu gün hava"
        " çok güzel"; 

geçerli bir ifadedir. Bu durumda iki string ifadesi birleştirilecek ve aşağıdaki biçime getirilecektir;

p = "Bu gün hava çok güzel";

İki string arasında hiçbir operatör bulunmadığına dikkat ediniz:

p = "Ankara," "İstanbul";

ifadesi ile 

p = "Ankara, İstanbul";

ifadesi eÅŸdeÄŸerdir.

Birleştirmenin yanı sıra tek bir ters bölü ile satır sonlandırılarak sonraki satıra geçiş sağlanabilir. Örneğin;

p = "Bu gün \"
    "hava çok güzel";

ifadesi ile 

p = "Bu gün hava çok güzel";

ifadesi eşdeğerdir. Ters bölü işaretinden sonra stringin aşağıdaki satırı başından itibaren devam edildiğine dikkat ediniz.

Ancak ters bölü karakteri ile sonraki satırın başından devam etme standart olarak her C derleyicisinde geçerli olmayabilir.

Stringlerde Ters Bölü Karakterlerinin Kullanılması

Stirngler içerisinde ters bölü karakter sabitleri de kullanılabilir. Derleyiciler string içerisinde bir ters bölü karakteri gördüklerinde, onu yanındaki karakter ile birlikte tek bir karakter  olarak ele alır. ÖrneÄŸin;

p = "Adı\nSoyadı"; // Adı Soyadı

benzer biçimde:

p = "Adı\tSoyadı"; // Adı    Soyadı

\n ile tek bir karakter, \t ile tab karakter.

Stringlerle Göstericilere İlk Değer Verilmesi

Stringler kullanılarak göstericilere doğrudan ilk değer verilebilir. Örneğin:

char *p = "Istanbul";
char *err = "Bellek yetersiz";
char *s = "Devam etmek için bir tusa basiniz";
...

String ifadeleri aslında karakteri gösteren birer adres olduğuna göre ilk değer verilen göstericilerin de karakter türünden göstericiler olması gerekir. İki tırnak içerisinde dizilere ilk değer vermeyle göstericilere ilk değer verme arasındaki ayrıma tekrar dikkatinizi çekmek istiyoruz.

char *p = "Deneme";
char s[10] = "Deneme";

Göstericilere ilk değer verildiğinde derleyici bunu bir string ifadesi olarak ele almaktadır. Yani string belleğe yerleştirildikten sonra başlangıç adresi göstericiye atanır. Oysa dizilerde önce dizi açılır, daha sonra karakterler tek tek dizi elemanlarına yerleştirilir. Dizilere ilk değer verirken kullandığımız iki tırnak ifadeleri adres belirtmezler.


Örnek

Aşağıdaki örnekte stringin, uzunluğu, kelime sayısı, cümle sayısı, sayı sayısı, girilen harfin indisi, girilen kelimeden sonraki kısmını bulan program vardır:

#include<stdio.h>
#include<string.h>


int uzunluk(const char *);
int kelime( const char*, int);
int cumle(const char*, int);
int sayi(const char*, int);
int indis(const char*, char);
const char* my_strchr(const char*,const char);

int main() {
const char* c = "Bu gun hava cok guzel ama yaz mevsimi icin biraz serin.\
 Bu sene bir turlu yaz gelemedi. Gelse ne olacak ki? Salgin yuzunden kimse bir\
 yere gidemiyor. Kalabaliklardan uzak durmak zorunda olmak berbat bir sey. Bu gun gunlerden Persembe.\
 Bu gun pazara gittim. Ben pazardan 3 kg elma, 2 kg portakal aldim. Saat 9 da geldim. Ben 1999 yilinda dogdum.";
const char* r = "Merhaba";
const char s = 'z';
int t = 0;
int uzk = uzunluk(c);
int klm = kelime(c, uzk);
int cml = cumle(c, uzk);
int syi = sayi(c, uzk);
int x = indis(c, s);
const char* q = my_strchr(c, s);

printf("Girilen kelimeden sonraki kisim = %s\n", q);
printf("Uzunluk = %d\n", uzk);
printf("Kelime sayisi = %d\n", klm);
printf("Cumle sayisi = %d\n", cml);
printf("Sayi sayisi = %d\n", syi);
printf("Harf indisi= %d\n", x);
return 0;
}

// stringin uzunuÄŸu bulunur
int uzunluk(const char *c) {
int uzunluk = 0;
for (int i = 0; c[i]!= '\0'; i++) {
uzunluk = uzunluk + 1;
}
//printf("Uzunluk = %d\n", uzunluk);
return uzunluk;
}

// kelime sayısı bulunur
int kelime(const char* c, int uzk) {
int kelime = 0;
for (int i = 0; i<uzk; i++)
{
if (c[i] == ' ') {
kelime = kelime + 1;
}
if (c[i] == '.' || c[i] == '?') {
if (c[i + 1] != ' ') {
kelime = kelime + 1;
}
}
}
//printf("Kelime sayisi = %d\n", kelime);
return kelime;
}

// Cümle sayısı
int cumle(const char* c, int uzk) {
int cumle = 0;
for (int i = 0; c[i] != '\0'; i++)
{
if (c[i] == '.' || c[i] == '?') {
cumle = cumle + 1;
}
}
//printf("Cumle sayisi = %d\n", cumle);
return cumle;
}

// cümlede geçen sayıların kaç tane olduğunun bulunması
int sayi(const char* c, int uzk) {
int sayi = 0;
for (int i = 0; i < uzk; i++) {
if (c[i] == '1' || c[i] == '2' || c[i] == '3' ||c[i] == '4' ||
c[i] == '5' || c[i] == '6' || c[i] == '7' || c[i] == '8' ||
c[i] == '9') {
if (c[i - 1] == '1' || c[i - 1] == '2' || c[i - 1] == '3' || c[i - 1] == '4' ||
c[i - 1] == '5' || c[i - 1] == '6' || c[i - 1] == '7' || c[i - 1] == '8' ||
c[i - 1] == '9')
sayi = sayi - 1;
sayi = sayi + 1;
}
}
return sayi;
}
// gönderilen kelimenin indisini bulur
int indis(const char* c, char s) {
int sayac = 0;
int u = strlen(c);

for (int i = 0; i < u; i++)
{
if (c[i] == s) {
sayac = i;
break;
}
}
return sayac;
}
// strhcr aynı işlevi yapar
const char* my_strchr(const char* c, const char s)
{
//const char* t = NULL;
if (c != NULL)
{
do
{
if (*c == s)
{
return c;// t = c;
//break;
}
} while (*c++);
}
return NULL;
}

Örnekler

Buradaki örnekler string fonksiyonları ile ilgilidir;

1)  strchr - Program strchr() fonksiyonu ile bir karakter dizisi içinde 's' karakterini arar. Karakterin bulunduÄŸu yerden itibaren dizi içeriÄŸini ekrana yazar.

#include <stdio.h>
#include <string.h>

int main( void )
{
    const char cdizi[] = "Bilgisayar";
    char *ret;

    ret = strchr(cdizi, 's');

    printf("Bulunan karakterden itibaren dizi içeriği: %s", ret);

    return 0;
}

Çıktı:

Bulunan karakterden itibaren dizi içeriği: sayar

2) strcmp - Program strcmp() fonksiyonu ile iki karakter dizisini karşılaÅŸtırarak elde ettiÄŸi sonucu ekrana yazar.

#include <stdio.h>
#include <string.h>

int main( void )
{
    const char *cp1 = "Bilgisayar";
    const char *cp2 = "Bilgileri";
    int ret;

    ret = strcmp(cp1, cp2);

    if(ret<0) printf("cp1 karakter dizisi cp2 karakter dizisinden küçüktür!");
    else if(ret>0) printf("cp2 karakter dizisi cp1 karakter dizisinden küçüktür!");
    else printf("cp1 karakter dizisi cp2 karakter dizisine eÅŸittir!");

    return 0;
}

Çıktı:

cp2 karakter dizisi cp1 karakter dizisinden küçüktür!

3) strlen - Program strlen() fonksiyonu ile bir karakter dizisinin uzunluÄŸunu elde ederek, elde ettiÄŸi deÄŸeri ekrana yazar.

#include <stdio.h>
#include <string.h>

int main( void )
{
    const char *cp = "Bilgisayar";
    int ret;

    ret = strlen(cp);

    printf("%s karakter dizisinin uzunluÄŸu: %d\n", cp, ret);

    return 0;
}

Çıktı:

Bilgisayar karakter dizisinin uzunluÄŸu: 10

4) strcpy - Program strcpy() fonksiyonu ile bir karakter dizisinin içeriÄŸini diÄŸer bir karakter dizisinin üzerine kopyaladıktan sonra elde edilen yeni karakter dizisini ekrana yazar.

#include <stdio.h>
#include <string.h>

int main( void )
{
    char cdizi1[] = "Bilgisayar";
    const char cdizi2[] = "Programlama";

    strcpy(cdizi1, cdizi2);

    printf("cdizi1 bellek içeriği: %s\n", cdizi1);

    return 0;
}

Çıktı:

cdizi1 bellek içeriği: Programlama



C programlama ile ilgili olan diğer konulara aşağıdaki linkten ulaşabilirsiniz:


Kaynaklar:

A'dan Z'ye C programlama
https://www.bilgigunlugum.net/prog/cprog/c_stdkut/string
https://www.mustafayemural.com/cpp-my000047/
Bu yazıda, C programlama dilinin en güçlü özelliklerinden biri olan göstericilere değineceğiz. Göstericiler, C'nin yönetilmesi en zor yeteneklerinden biridir. Göstericiler, programların referansa göre çağırma yapmasını ve bağlı listeler, sıralar, yığınlar ve ağaçlar gibi büyüyüp küçülebilen dinamik veri yapılarının oluşturulmasıyla, yönetilmesini sağlar. Bu yazıda, temel gösterici kavramlarına değineceğiz. Hadi başlayalım :)



Gösterici DeÄŸiÅŸkenlerini Bildirmek 

Göstericiler, adres bilgilerini saklamak ve adreslerle ilgili işlemler yapmak için kullanılan nesnelerdir. Normalde bir değişken doğrudan kesin bir değer içerir. Göstericiler ise kesin bir değer tutan değişkenlerin adresini içerir. Bu durumda, bir değişken ismi bir değeri doğrudan belirtirken, göstericiler değerleri dolaylı yoldan belirtir.

Gösterici bildirimlerinin genel biçimi şöyledir:

<tür> * <gösterici_ismi>;

<tür> göstericinin (içerisindeki adresin) türüdür. char, floan, int ... gibi herhangi bir türdür.
Burada * göstericiyi ya da adresi temsil etmektedir.

int *sayiciPtr, sayici;
Biçiminde bir bildirim, sayiciPtr değişkenini int * (bir tamsayıyı gösteren gösterici) tipinde bildirir. Bu bildirim "sayiciPtr bir int göstericisidir" ya da "sayiciPtr, tamsayı tipinde bir nesneyi gösterir" biçiminde okunur. Ayrıca, sayici değişkeni de bir tamsayı olarak bildirilmiştir. Bildirim içindeki * yalnızca sayiciPtr'ye uygulanır

Örnek gösterici bildirimleri:

float *f;
char *s;
int *dizi;
...

Gösterici Operatörleri

& ya da adres operatörü, operandının adresini döndüren bir tekli operatördür. ÖrneÄŸin;

int y = 5;
int *yPtr;

bildirimlerini ele aldığımızda

yPtr = &y;

ifadesi, y değişkeninin adresini yPtr gösterici değişkenine atar. Buna, yPtr değişkeni y'yi göstermektedir denir.

Örnek:

#include <stdio.h> // Ekran girdi ve çıktılarını sağlamak için fonksiyon kütüphanemizi çağırıyoruz


    int main(){//ana fonksiyonumuzu baÅŸlatıyoruz.
        char degisken='a';
        char *gosterici=&degisken;

        printf("Ilk gosterici degeri : %X\n",gosterici);
        gosterici++;

        printf("Bir sonraki gosterici degeri : %X\n",gosterici);
        gosterici+=5;

        printf("Alti sonraki gosterici degeri : %X\n",gosterici);
        
        /*
        Ekran Çıktısı :
        Ilk gosterici degeri : 62FE17
        Bir sonraki gosterici degeri : 62FE18
        Alti sonraki gosterici degeri : 62FE1D
        */

        return 0; // programın sorusuz çalıştığını iÅŸletim sistemine bildiriyoruz.
    }

Fonksiyonları Referansa Göre Çağırmak

Bir fonksiyona argüman geçirmenin iki yolu vardır: deÄŸere göre ve referansa göre çağırma. Bir çok fonksiyon, çağırıcıdaki bir ya da birden Ã§ok deÄŸiÅŸkeni deÄŸiÅŸtirebilme yeteneÄŸine veya deÄŸere göre çağırmanın yükünden (bu nesnenin bir kopyasının oluÅŸturulmasını gerektirir) kurtulmak için büyük bir veri nesnesini gösteren göstericiyi geçirmeye ihtiyaç duyarlar. Bu amaçlar için C, referansa göre çağırma yeteneklerini sunar.

Örnek:

#include <stdio.h>
int degereGoreKup ( int ); /* prototip */

int main( ){

    int sayi = 5;

    printf( "Sayının esas deÄŸeri %d", sayi);
    sayi = degereGoreKup ( sayi );
    printf( "\nSayının yeni deÄŸeri %d\n", sayi);

    return 0;
}
int degereGoreKup( int n )
{
    return n * n * n; /* yerel deÄŸiÅŸken n’in küpünü al*/
}

Çıktı:

Sayının esas değeri 5
Sayının yeni değeri 125


Göstericilerin Artırılması ve Eksiltilmesi

Göstericiler *,/,%,... gibi aritmetik operatörlerle ve bit operatörleriyle kullanılmazlar. Fakat, bir gösterici tamsayılı artırılabilir ya da eksiltilebilir. Örneğin p bir gösterici olmak üzere aşağıdaki ifadelerin hepsi geçerlidir.

++p;
p = p - 2;
p += 4;
p -= 10;
--p;
...

Göstericiler yalnızca tamsayılı sabitleri ile değil tamsayı değişkenleriyle de artırılıp azaltılabilir.

char *p;
int a;
...
p = p + a;
p = p - 2;
p += a;
p = p + a + 10;

Göstericiler ve Diziler Arasındaki İliÅŸki   

Diziler ve göstericiler, C‘de özel bir biçimde iliÅŸkilidirler ve birbirleri yerine hemen hemen
her yerde kullanılabilirler. Bir dizi ismi, sabit bir gösterici olarak düşünülebilir. Göstericiler,
dizilerin belirteçlerle gösterimi de dahil olmak üzere her işlemde kullanılabilir.

b[5] tamsayı dizisinin ve bPtr tamsayı göstericisinin bildirildiğini varsayalım. Bir belirteç
kullanmayan dizi isminin, dizinin ilk elemanını gösteren bir gösterici olduğunu bildiğimize
göre, bPtr ‘yi b dizisinin ilk elemanına aÅŸağıdaki ifade ile eÅŸitleyebiliriz.

bPtr =b;

Bu ifade, dizinin ilk elemanının adresini aşağıdaki biçimde almakla eşdeğerdir.

bPtr = &b[0];

b[3] dizi elemanı, alternatif bir biçimde;

*(bPtr+3)

gösterici deyimi ile belirtilebilir.

Yukarıdaki deyimde 3, göstericinin offsetidir. Gösterici, dizinin başlangıç adresini
gösterirken, offset dizinin hangi elemanının kullanılacağını belirtir ve offset değeri dizi
belirteciyle eştir. Az önceki gösterime gösterici/offset gösterimi denir. Parantezler gereklidir
çünkü * operatörünün önceliği + operatörünün önceliğinden yüksektir. Parantezler olmadan
yukarıdaki ifade, *bPtr‘ye 3 eklerdi. (yani, bPtr‘nin dizinin baÅŸlangıcını gösterdiÄŸi
düşünülürse, b[0] 'a 3 eklenirdi.) Dizi elemanlarının, gösterici deyimleri ile belirtilebilmesi
gibi

&b[3]
adresi de

bPtr+3

biçimindeki gösterici deyimi ile belirtilebilir.
Dizinin kendisine de bir gösterici olarak davranılabilir ve göstericiği aritmetiğinde
kullanılabilir. Örneğin,

*(b+3)

deyimi de b[3] dizi elemanını belirtir. Genelde belirteç kullanan tüm dizi deyimleri, gösterici
ve offset ile yazılabilir. Bu durumda, gösterici/offset gösterimi, dizinin ismini gösterici olarak
kullanır. Az önceki ifadenin, dizinin ismini değiştirmediğine dikkat ediniz. b, hala dizinin ilk
elemanını göstermektedir.
Göstericiler de diziler gibi belirteçlerle kullanılabilir. Örneğin,

bPtr[1]

deyimi, b[1] dizi elemanını belirtir. Buna, gösterici/belirteç gösterimi denir.

Dizi isminin, her zaman dizinin başlangıcını gösteren sabit bir gösterici olduğunu hatırlayınız.
Bu sebepten,

b+=3

deyimi geçersizdir çünkü dizi isminin değerini, gösterici aritmetiği kullanarak değiştirmeye
çalışmaktadır.

Örnek:

#include <stdio.h>

int main( )
{
int b[ ] = { 10, 20, 30, 40 };
int *bPtr = b; /* bPtr b dizisini göstersin */
int i, offset;
printf( "b dizisi asağıdaki metodla yazılmıstır:\n"
"Dizi belirteçleri yöntemi\n" );
for ( i = 0; i < 4; i++ )
printf( "b[ %d ] = %d\n", i, b[ i ] );

printf( "\nGösterici/offset yöntemi,\n"
"gösterici dizinin ismidir\n" );

for ( offset = 0; offset < 4; offset++ )
printf( "*( b + %d ) = %d\n", offset, *( b + offset ) );

printf( "\nGösterici belirteç yöntemi\n" );

for ( i = 0; i < 4; i++ )
printf( " bPtr[ %d ] = %d\n", i, bPtr[ i ] );
printf( "\nGösterici/offset yöntemi\n" );

for ( offset = 0; offset < 4; offset++ )
printf( "*( bPtr + %d ) = %d\n", offset, *( bPtr + offset ) );
return 0;
}

Çıktı:

b dizisi aĢağıdaki metodla yazılmıĢtır:
Dizi belirteçleri yöntemi
b[0] = 10
b[1] = 20
b[2] = 30
b[3] = 40
Gösterici/offset yöntemi
gösterici dizinin ismidir
*(b + 0) = 10
*(b + 1) = 20
*(b + 2) = 30
*(b + 3) = 40
Gösterici belirteç yöntemi
bPtr[0] = 10
bPtr[0] = 20
bPtr[0] = 30
bPtr[0] = 40
Gösterici/offset yöntemi
*(bPtr + 0) = 10
*(bPtr + 1) = 20
*(bPtr + 1) = 30
*(bPtr + 1) = 40


C programlama ile ilgili olan diğer konulara aşağıdaki linkten ulaşabilirsiniz:

Kaynaklar:
A'dan Z'ye C Kılavuzu 
Deitel C/C++
 Bu yazıda HC-SR04 ultrasonik sensörün nasıl çalıştığını ve Arduino ile nasıl kullanılacağına deÄŸineceÄŸiz. Bu sensör, Arduino ile mesafeyi ölçmek ve engellerden kaçınan robotlar yapmak için en popüler sensördür.

HC-SR04 Donanıma Genel Bakış

HC-SR04, 2 cm ila 400 cm (yaklaşık bir inç ila 13 fit) aralığına sahip, uygun fiyatlı ve kullanımı kolay bir mesafe ölçüm sensörüdür.

Sensör, iki ultrasonik dönüştürücüden oluşur. Biri ultrasonik ses darbeleri veren verici, diğeri ise yansıyan dalgaları dinleyen alıcıdır. Temel olarak denizaltılarda su altı nesnelerini tespit etmek için kullanılan bir SONAR'dır.


İşte ana özellikleri:

Operating Voltage5V DC
Operating Current15mA
Operating Frequency40KHz
Min Range2cm / 1 inch
Max Range400cm / 13 feet
Accuracy3mm
Measuring Angle<15°
Dimension45 x 20 x 15mm

HC-SR04 Ultrasonik Sensör Pinleri

İşte sensörün pin çıkışı:



Sensörün 4 pini vardır. VCC ve GND, Arduino'daki 5V ve GND pinlerine, Trig ve Echo ise herhangi bir dijital Arduino pinine gider. Trig pinini kullanarak vericiden ultrason dalgasını göndeririz ve Echo pini ile yansıyan sinyali dinleriz.

HC-SR04 Ultrasonik Sensör Arduino Kodu

İşte HC-SR04 ultrasonik sensör ve Arduino kullanarak mesafeyi ölçmek için bir kod.

// defines pins numbers const int trigPin = 9; const int echoPin = 10; // defines variables long duration; int distance; void setup() { pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output pinMode(echoPin, INPUT); // Sets the echoPin as an Input Serial.begin(9600); // Starts the serial communication } void loop() { // Clears the trigPin digitalWrite(trigPin, LOW); delayMicroseconds(2); // Sets the trigPin on HIGH state for 10 micro seconds digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); // Reads the echoPin, returns the sound wave travel time in microseconds duration = pulseIn(echoPin, HIGH); // Calculating the distance distance = duration * 0.034 / 2 ;
// Prints the distance on the Serial Monitor Serial.print("Distance: "); Serial.println(distance); }

Kod Açıklama

Öncelikle Trig ve Echo pinlerini tanımlamamız gerekiyor. Bu durumda Arduino Board üzerindeki 9 ve 10 numaralı pinlerdir ve trigPin ve echoPin olarak adlandırılırlar. Ardından sensörden alacağımız seyahat süresi için “duration” adında bir long deÄŸiÅŸkenine ve mesafe için bir tamsayı deÄŸiÅŸkenine ihtiyacımız var.

// defines pins numbers const int trigPin = 9; const int echoPin = 10; // defines variables long duration; int distance;

Kurulumda trigPin'i çıkış olarak ve echoPin'i Giriş olarak tanımlamalı ve sonuçları seri monitörde göstermek için seri iletişimi başlatmalıyız.

void setup() { pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output pinMode(echoPin, INPUT); // Sets the echoPin as an Input Serial.begin(9600); // Starts the serial communication }

Döngüde ilk önce trigPin'in temiz olduğundan emin olmalıyız, bu nedenle bu pimi sadece 2 µs için LOW Duruma ayarlamanız gerekir. Şimdi Ultra ses dalgasını oluşturmak için trigPin'i 10 µs için HIGH Duruma ayarlamamız gerekiyor.

// Clears the trigPin digitalWrite(trigPin, LOW); delayMicroseconds(2); // Sets the trigPin on HIGH state for 10 micro seconds digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW);

pulseIn() iÅŸlevini kullanarak seyahat süresini okuruz ve bu deÄŸeri “duration” deÄŸiÅŸkenine koyarız. Bu fonksiyonun 2 parametresi vardır, birincisi Echo pininin adı, ikincisi ise okuduÄŸumuz darbenin LOW veya HIGH durumudur.

// Reads the echoPin, returns the sound wave travel time in microseconds duration = pulseIn(echoPin, HIGH);

Mesafeyi bulmak için süreyi 0.034 ile çarpacağız ve daha önce bu denklemi açıkladığımız gibi 2'ye böleceğiz.

// Calculating the distance distance= duration*0.034/2; // Prints the distance on the Serial Monitor Serial.print("Distance: "); Serial.println(distance);

Sonunda mesafenin değerini Seri Monitöre yazdıracağız.


Kaynak:
https://howtomechatronics.com/tutorials/arduino/ultrasonic-sensor-hc-sr04/
https://www.tutorialspoint.com/arduino/arduino_ultrasonic_sensor.htm#