Arşiv

Posts Tagged ‘Sayısal’

Arduino ile Göstergeli ve Sesli Basit Park Sensörü

HC-SR04 mesafe sensörü, buzzer (minik hoparlör) ve 7 segment display kullanarak basit bir sayısal göstergeli park sensörü uygulaması yapılabilir. Uygulamadan önce HC-SR04 ile mesafe ölçümü ve 7 segment display kullanımının incelenmesinde fayda vardır.

Buzzer’lar basit sesler üretmek için kullanılabilen devre elemanlarıdır. Arduino tone() fonksiyonu ile istenen frekansta (hertz/int türünde) ses çıkışı alınabilir. noTone(pin) ile de ses çıkışı durdurulabilir.

tone(pin, frekans, süre)  /*süre ms ve isteğe bağlı*/

noTone(pin) /*süre belirtilmedi ise ses çıkışını durdurmak için*/

Alttaki devre tasarımında HC-SR04 yerine Ping mesafe sensörü kullanılmıştır. HC-SR04’de fazladan trig pini vardır. Uygulama HC-SR04 ile kodlanmış ve yapılmıştır. Sayısal gösterge ortak anot yapıdadır. Devre tasarımı şöyledir:

Kaynak kod:

/*Trig ve echo pinleri*/
int trig = 2;
int echo = 3;

/*Buzzer pini*/
int buzzer = 4;

/*Gösterge pinleri*/
int ust = 5;
int sagUst = 6;
int solUst = 7;
int orta = 8;
int alt = 9;
int solAlt = 10;
int sagAlt= 11;
int nokta = 12;

long sure;
long mesafe;

int frekans = 205;

void setup() {  
  pinMode(trig, OUTPUT);
  pinMode(echo, INPUT);

  pinMode(buzzer, OUTPUT);
  
  pinMode(ust, OUTPUT);
  pinMode(sagUst, OUTPUT);
  pinMode(solUst, OUTPUT);
  pinMode(orta, OUTPUT);
  pinMode(alt, OUTPUT);
  pinMode(solAlt, OUTPUT);
  pinMode(sagAlt, OUTPUT);
  pinMode(nokta, OUTPUT);
  
  Serial.begin(9600);
}

void loop() {
  /*10 mikrosaniye ses dalgası yolla*/
  digitalWrite(trig, HIGH);
  delayMicroseconds(10);
  digitalWrite(trig, LOW);

  //Gitme-gelme süresini ve mesafeyi hesapla
  sure = pulseIn(echo, HIGH); //mikrosaniye
  mesafe = sure / 29.13 / 2; //cm

  Serial.print(sure);
  Serial.print("-");
  Serial.println(mesafe);

  sesCikar(mesafe);
  mesafeGoster(mesafe);   
}

void sesCikar(long mesafe)
{
  if (mesafe<=20) //Mesafe 20cm'den küçükse ses çıksın
  {
    tone(buzzer, frekans, 100); //100ms ses süresi
  } else //Mesafe 20'den fazla ise 250ms bekle
  {
    delay(250);
  }
  
  if (mesafe<=5) //5'ten küçükse 200ms aralıkla ses çıksın
  {   
    delay(200);   
  } else if (mesafe<=10) //10'dan küçükse 350ms
  {    
    delay(350);   
  } else if (mesafe<=20) //20'den küçükse 750ms
  {    
    delay(750);   
  }
}

void mesafeGoster(long mesafe)
{
  /*Ortak anot için yanacak ledler LOW*/
  /*Ortak katot için yanacak ledler HIGH*/
  /*mesafe 0-9 arası değilse orta ve nokta yanacak*/
  switch (mesafe)
  {
    case 0: 
      digitalWrite(ust, LOW);
      digitalWrite(solUst,LOW);
      digitalWrite(sagUst, LOW);      
      digitalWrite(orta, HIGH); 
      digitalWrite(solAlt, LOW);
      digitalWrite(sagAlt, LOW);
      digitalWrite(alt, LOW);  
      digitalWrite(nokta, HIGH);   
      break;
    case 1:
      digitalWrite(ust, HIGH);
      digitalWrite(solUst, HIGH);
      digitalWrite(sagUst, LOW);      
      digitalWrite(orta, HIGH); 
      digitalWrite(solAlt, HIGH);
      digitalWrite(sagAlt, LOW);
      digitalWrite(alt, HIGH);  
      digitalWrite(nokta, HIGH);   
      break;
    case 2:
      digitalWrite(ust, LOW);
      digitalWrite(solUst, HIGH);
      digitalWrite(sagUst, LOW);      
      digitalWrite(orta, LOW); 
      digitalWrite(solAlt, LOW);
      digitalWrite(sagAlt, HIGH);
      digitalWrite(alt, LOW);  
      digitalWrite(nokta, HIGH);    
      break;
    case 3:
      digitalWrite(ust, LOW);
      digitalWrite(solUst, HIGH);
      digitalWrite(sagUst, LOW);      
      digitalWrite(orta, LOW); 
      digitalWrite(solAlt, HIGH);
      digitalWrite(sagAlt, LOW);
      digitalWrite(alt, LOW);
      digitalWrite(nokta, HIGH);      
      break;
    case 4:
      digitalWrite(ust, HIGH);
      digitalWrite(solUst, LOW);
      digitalWrite(sagUst, LOW);      
      digitalWrite(orta, LOW); 
      digitalWrite(solAlt, HIGH);
      digitalWrite(sagAlt, LOW);
      digitalWrite(alt, HIGH);  
      digitalWrite(nokta, HIGH);
      break;
    case 5:
      digitalWrite(ust, LOW);
      digitalWrite(solUst, LOW);
      digitalWrite(sagUst, HIGH);      
      digitalWrite(orta, LOW); 
      digitalWrite(solAlt, HIGH);
      digitalWrite(sagAlt, LOW);
      digitalWrite(alt, LOW);  
      digitalWrite(nokta, HIGH);    
      break;
    case 6:
      digitalWrite(ust, HIGH);
      digitalWrite(solUst, LOW);
      digitalWrite(sagUst, HIGH);      
      digitalWrite(orta, LOW); 
      digitalWrite(solAlt, LOW);
      digitalWrite(sagAlt, LOW);
      digitalWrite(alt, LOW);   
      digitalWrite(nokta, HIGH);   
      break;
    case 7:
      digitalWrite(ust, LOW);
      digitalWrite(solUst, HIGH);
      digitalWrite(sagUst, LOW);      
      digitalWrite(orta, HIGH); 
      digitalWrite(solAlt, HIGH);
      digitalWrite(sagAlt, LOW);
      digitalWrite(alt, HIGH);  
      digitalWrite(nokta, HIGH);    
      break;
    case 8:
      digitalWrite(ust, LOW);
      digitalWrite(solUst, LOW);
      digitalWrite(sagUst, LOW);      
      digitalWrite(orta, LOW); 
      digitalWrite(solAlt, LOW);
      digitalWrite(sagAlt, LOW);
      digitalWrite(alt, LOW);
      digitalWrite(nokta, HIGH);      
      break;
    case 9:
      digitalWrite(ust, LOW);
      digitalWrite(solUst, LOW);
      digitalWrite(sagUst, LOW);      
      digitalWrite(orta, LOW); 
      digitalWrite(solAlt, HIGH);
      digitalWrite(sagAlt, LOW);
      digitalWrite(alt, HIGH);  
      digitalWrite(nokta, HIGH);    
      break;
    default:
      digitalWrite(ust, HIGH);
      digitalWrite(solUst, HIGH);
      digitalWrite(sagUst, HIGH);      
      digitalWrite(orta, LOW); 
      digitalWrite(solAlt, HIGH);
      digitalWrite(sagAlt, HIGH);
      digitalWrite(alt, HIGH);          
      digitalWrite(nokta, LOW);
      break;
  }      
}

Kaynakça
http://www.electroschematics.com/wp-content/uploads/2013/07/HCSR04-datasheet-version-1.pdf
https://elecfreaks.com/estore/download/EF03085-HC-SR04_Ultrasonic_Module_User_Guide.pdf
https://www.arduino.cc/en/Reference.PulseIn
http://www.f15ijp.com/2012/09/arduino-ultrasonic-sensor-hc-sr04-or-hy-srf05/
https://gelecegiyazanlar.turkcell.com.tr/konu/arduino/egitim/arduino-301/arduino-ile-uzaklik-olcumu
http://www.elektrikport.com/teknik-kutuphane/pull-up-ve-pull-down-direnc-nedir/16930#ad-image-0
http://ufek.gazi.edu.tr/docs/UFEK2017_Ozetler/files/basic-html/page58.html
https://e-radionica.com/productdata/LD3361BS.pdf
http://www.elektrikport.com/teknik-kutuphane/7-segment-display-nedir/18475#ad-image-0
http://maker.robotistan.com/arduino-dersleri-9-buzzer-ile-ses-cikisi-alma-2/

 

Arduino ile 7 Segment Display Kullanımı

7 Segment Display devre elemanları led tabanlı sayısal göstergelerdir. Yapısında nokta ile birlikte 8 tane ufak led olup ledlerin herbirine segment denmektedir. Kullanımı RGB ledlerdeki gibi ortak anot veya ortak katot yapıda olma durumuna göredir. Veri sayfalarından (datasheet) veya ölçü aleti kullanarak ortak anot veya ortak katot yapıda olup olmadığı ve hangi pinin hangi ledi yaktığı tespit edilerek kullanılabilir.

Yukarıda ortak katot yapısında tek haneli bir sayısal göstergenin pin bağlantıları gösterilmiştir. 3 ve 8 numaralı pinler ortak katot bağlantısı içindir.

Hangi rakam oluşturulmak istenirse ona uygun ledlerin yanması sağlanmalı, diğer ledler söndürülmelidir. Örneğin ortak katot yapısında bir sayısal göstergede 1 rakamını göstermek için B ve C ledleri HIGH, diğer tüm ledler LOW konumuna getirilmelidir. Ortak anotta ise durum tam tersidir. Ledler düşük voltajlarda çalıştığı için önlerine mutlaka direnç yerleştirilmelidir.

Devre tasarımı (ortak anot):

Uygulamada sayısal göstergede hangi rakam görüntülenmek istenirse o rakam seri porttan veri olarak gönderilmektedir. Kaynak kod şöyledir:


/*Ledlerin bağlı oldukları digital pinler*/
int ust = 5;
int sagUst = 6;
int solUst = 7;
int orta = 8;
int alt = 9;
int solAlt = 10;
int sagAlt= 11;
int nokta = 12;

int sayi;

void setup() {  
  pinMode(ust, OUTPUT);
  pinMode(sagUst, OUTPUT);
  pinMode(solUst, OUTPUT);
  pinMode(orta, OUTPUT);
  pinMode(alt, OUTPUT);
  pinMode(solAlt, OUTPUT);
  pinMode(sagAlt, OUTPUT);
  pinMode(nokta, OUTPUT);
  
  Serial.begin(9600);
}

void loop() {
  
  if (Serial.available())
  {
    //Seri porttan veri oku ve integer'a dönüştür
    sayi = Serial.readString().toInt();  
  }

  /*Ortak anot için yanacak ledler LOW*/
  /*Ortak katot için yanacak ledler HIGH*/
  switch (sayi)
  {
    case 0: 
      digitalWrite(ust, LOW);
      digitalWrite(solUst,LOW);
      digitalWrite(sagUst, LOW);      
      digitalWrite(orta, HIGH); 
      digitalWrite(solAlt, LOW);
      digitalWrite(sagAlt, LOW);
      digitalWrite(alt, LOW);     
      break;
    case 1:
      digitalWrite(ust, HIGH);
      digitalWrite(solUst, HIGH);
      digitalWrite(sagUst, LOW);      
      digitalWrite(orta, HIGH); 
      digitalWrite(solAlt, HIGH);
      digitalWrite(sagAlt, LOW);
      digitalWrite(alt, HIGH);     
      break;
    case 2:
      digitalWrite(ust, LOW);
      digitalWrite(solUst, HIGH);
      digitalWrite(sagUst, LOW);      
      digitalWrite(orta, LOW); 
      digitalWrite(solAlt, LOW);
      digitalWrite(sagAlt, HIGH);
      digitalWrite(alt, LOW);      
      break;
    case 3:
      digitalWrite(ust, LOW);
      digitalWrite(solUst, HIGH);
      digitalWrite(sagUst, LOW);      
      digitalWrite(orta, LOW); 
      digitalWrite(solAlt, HIGH);
      digitalWrite(sagAlt, LOW);
      digitalWrite(alt, LOW);      
      break;
    case 4:
      digitalWrite(ust, HIGH);
      digitalWrite(solUst, LOW);
      digitalWrite(sagUst, LOW);      
      digitalWrite(orta, LOW); 
      digitalWrite(solAlt, HIGH);
      digitalWrite(sagAlt, LOW);
      digitalWrite(alt, HIGH);  
      break;
    case 5:
      digitalWrite(ust, LOW);
      digitalWrite(solUst, LOW);
      digitalWrite(sagUst, HIGH);      
      digitalWrite(orta, LOW); 
      digitalWrite(solAlt, HIGH);
      digitalWrite(sagAlt, LOW);
      digitalWrite(alt, LOW);      
      break;
    case 6:
      digitalWrite(ust, HIGH);
      digitalWrite(solUst, LOW);
      digitalWrite(sagUst, HIGH);      
      digitalWrite(orta, LOW); 
      digitalWrite(solAlt, LOW);
      digitalWrite(sagAlt, LOW);
      digitalWrite(alt, LOW);      
      break;
    case 7:
      digitalWrite(ust, LOW);
      digitalWrite(solUst, HIGH);
      digitalWrite(sagUst, LOW);      
      digitalWrite(orta, HIGH); 
      digitalWrite(solAlt, HIGH);
      digitalWrite(sagAlt, LOW);
      digitalWrite(alt, HIGH);      
      break;
    case 8:
      digitalWrite(ust, LOW);
      digitalWrite(solUst, LOW);
      digitalWrite(sagUst, LOW);      
      digitalWrite(orta, LOW); 
      digitalWrite(solAlt, LOW);
      digitalWrite(sagAlt, LOW);
      digitalWrite(alt, LOW);      
      break;
    case 9:
      digitalWrite(ust, LOW);
      digitalWrite(solUst, LOW);
      digitalWrite(sagUst, LOW);      
      digitalWrite(orta, LOW); 
      digitalWrite(solAlt, HIGH);
      digitalWrite(sagAlt, LOW);
      digitalWrite(alt, HIGH);      
      break;
  }
  digitalWrite(nokta, HIGH);  
}

Kaynakça
https://e-radionica.com/productdata/LD3361BS.pdf
http://www.elektrikport.com/teknik-kutuphane/7-segment-display-nedir/18475#ad-image-0