3 Kasım 2026 Salı


Programlama Kodları

//AÇIKLAMA
//Bu uygulamada sensör renkleri okur ve ham değerler seri port ekranına yazdırılır.

#define S0 4
#define S1 5
#define S2 6
#define S3 7
#define sensor_out 8

int red_ham = 0;
int green_ham = 0;
int blue_ham = 0;

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

  pinMode(S0, OUTPUT);
  pinMode(S1, OUTPUT);
  pinMode(S2, OUTPUT);
  pinMode(S3, OUTPUT);
  pinMode(sensor_out, INPUT);

  //sensörün çıkış frekansını %20 olarak ölçeklendirme
  digitalWrite(S0, HIGH);
  digitalWrite(S1, LOW);
}

void loop()
{
  //kırmızı renk okuma
  red_ham = kirmizi_ham_oku();
  delay(200);

  //yeşil renk okuma
  green_ham = yesil_ham_oku();
  delay(200);

  //mavi renk okuma
  blue_ham = mavi_ham_oku();
  delay(200);

  Serial.print("Kırmızı = ");  Serial.print(red_ham);     Serial.print(" | ");
  Serial.print("Yeşil = ");    Serial.print(green_ham);   Serial.print(" | ");
  Serial.print("Mavi = ");     Serial.println(blue_ham);

}

int kirmizi_ham_oku()
{
  int ham;
  digitalWrite(S2, LOW);
  digitalWrite(S3, LOW);
  ham = pulseIn(sensor_out, LOW);
  return ham;
}

int yesil_ham_oku()
{
  int ham;
  digitalWrite(S2, HIGH);
  digitalWrite(S3, HIGH);
  ham = pulseIn(sensor_out, LOW);
  return ham;
}

int mavi_ham_oku()
{
  int ham;
  digitalWrite(S2, LOW);
  digitalWrite(S3, HIGH);
  ham = pulseIn(sensor_out, LOW);
  return ham;
}



Devre Şeması



2 Kasım 2026 Pazartesi

TCS3200 / TCS230 Renk Sensörü

Renk sensörleri, karmaşık otomasyon sorunlarına daha güvenilir çözümler sunar. Gıda ve içecek, otomotiv ve imalat sanayi, giyim imalat sektöründe kumaşın rengini tespit etmek gibi çeşitli sektörlerde malzeme tespiti, parçalar üzerindeki renk işaretlerinin tespiti, üretim sürecindeki adımların doğrulanması gibi amaçlarla kullanılırlar. Pahalı renk sensörleri endüstriyel uygulamalarda kullanılırken, TCS3200/TCS230 renk sensörü gibi ucuz sensörler daha az katı gereksinimlere sahip uygulamalar için kullanılabilir.

TCS3200 renk sensörü, üzerindeki foto diyotlar aracılığıyla gördüğü rengi algılayıp çıkış veren bir sensördür. TCS3200, bir nesnenin yansıttığı veya yaydığı ışığın rengini ölçmek için tasarlanmıştır. Dalga boylarına bağlı olarak çok çeşitli renkleri algılayabilir. Sensör, TCS3200 ya da TCS230 olarak adlandırılır.




1 Kasım 2026 Pazar


Bu programda Proteus'ta Atmega328P'ye bağlı ledlerin sırayla yakıp söndürme işlemleri yapılmıştır.


Programlama Kodları

void setup() 
{
  pinMode(8,OUTPUT); //Arduino pin8   = ATMEGA328 PB0
  pinMode(9,OUTPUT); //Arduino pin9   = ATMEGA328 PB1
  pinMode(10,OUTPUT); //Arduino pin10 = ATMEGA328 PB2
  pinMode(11,OUTPUT); //Arduino pin11 = ATMEGA328 PB3
  pinMode(12,OUTPUT); //Arduino pin12 = ATMEGA328 PB4
  pinMode(13,OUTPUT); //Arduino pin13 = ATMEGA328 PB5
}

void loop() 
{
  digitalWrite(8,HIGH);//HIGH yerine 1 yazılabilir.
  delay(500);
  digitalWrite(8,LOW); //LOW yerine 0 yazılabilir.
  digitalWrite(9,HIGH);
  delay(500);
  digitalWrite(9,LOW);
  digitalWrite(10,HIGH);
  delay(500);
  digitalWrite(10,LOW);
  digitalWrite(11,HIGH);
  delay(500);
  digitalWrite(11,LOW);
  digitalWrite(12,HIGH);
  delay(500);
  digitalWrite(12,LOW);
  digitalWrite(13,HIGH);
  delay(500);
  digitalWrite(13,LOW);
}



Devre Şeması




Atmega32u4 Mikrodenetleyici Özellikleri


ATmega32u4, Atmel (günümüzde Microchip) firması tarafından üretilen, AVR RISC mimarisine sahip 8-bitlik yüksek performanslı bir mikrodenetleyicidir. Onu standart Arduino Uno'da kullanılan popüler ATmega328P işlemcisinden ayıran en büyük ve en kritik özellik, dâhili (Native) USB Desteğine sahip olmasıdır. Klasik kartlarda bilgisayarla haberleşmek için harici bir USB-Serial dönüştürücü çip (CH340 veya ATmega16U2 gibi) gerekirken, ATmega32u4 bu yeteneği doğrudan kendi içinde barındırır.






Teknik Özellikleri

  • Çekirdek Mimarisi: 8-bit AVR RISC.

  • Çalışma Voltajı: 5V (Bazı özel model ve klonlarda 3.3V sürümleri de bulunur).

  • Saat Hızı (Clock Speed): 16 MHz.

  • Flash Bellek: 32 KB (Bunun 4 KB kısmı bootloader için kullanılır).

  • SRAM (RAM): 2.5 KB (ATmega328P'ye göre daha geniş bir RAM alanı sunar)

  • EEPROM: 1 KB

  • Dijital Giriş/Çıkış Pinleri: Toplamda 20 pindir. Modeline göre değişmekle birlikte Leonardo/Pro Micro standardında 20 pindir. 

  • PWM (Darbe Genişlik Modülasyonu) Pinleri: 7 adet.

  • Analog Giriş Pinleri: 12 adet (10-bit çözünürlüğe sahip zengin analog kanal desteği).

  • Donanımsal İletişim Arayüzleri: 1 adet UART (Seri Haberleşme), 1 adet I2C, 1 adet SPI.

  • 135 güçlü komut.

  • 32 x 8 Genel Amaçlı register.

  • Yazma/Silme Döngüleri: 10.000 (Flash) / 100.000 (EEPROM).

  • Yazılım güvenliği için programlama kilidi.

  • 12 Mbit/s ve 1,5 Mbit/s'ye kadar veri aktarım hızları.

  • USB Veri Yolu Sıfırlama (Bus Reset) algılandığında CPU sıfırlama imkânı.

  • 10-bit yüksek hızlı Zamanlayıcı/Sayıcı.

  • 10-bit ADC.

  • Dahili analog karşılaştırıcı.

  • Dahili sıcaklık sensörü

  • Pin değişiminde kesme (interrupt) ve uyandırma (wake-up) özelliği.

  • Altı Farklı Uyku Modu: Boşta (Idle), ADC Gürültü Azaltma (ADC Noise Reduction), Güç Tasarrufu (Power-save), Güç Kapatma (Power-down), Bekleme (Standby) ve Genişletilmiş Bekleme (Extended Standby).


ATmega32u4'ü öne çıkaran en büyük avantaj USB HID (Klavye & Fare Simülasyonu) özelliğine sahip olmasıdır. ATmega32u4 işlemcisini kullanan kartlar (örneğin Arduino Leonardo veya Arduino Pro Micro), doğrudan USB protokolünü desteklediği için bilgisayara takıldıklarında sıradan bir seri aygıt olarak görünmezler. Bilgisayar onları doğrudan bir Klavye, Fare (Mouse) veya Oyun Kumandası (Joystick) olarak algılar. Kod yazarak bilgisayarınıza otomatik klavye tuşları bastırabilir, fare imlecini hareket ettirebilirsiniz.

ATmega32u4 kompakt yapısına rağmen Uno'ya kıyasla daha fazla analog pin (12 adet) ve daha geniş SRAM (2.5 KB) sunar. Dahili USB nedeniyle, bazen kod yüklerken kartın portu anlık olarak değişebilir. Yükleme sırasında sorun yaşanırsa, kart üzerindeki reset butonuna doğru zamanda basmak gerekebilir.

NOT: Eğer projeniz sadece sensörlerden veri okuyup ekrana yazmakla kalmayacak, aynı zamanda bilgisayarı klavye veya fare gibi yönlendirecekse, kalbinde ATmega32u4 taşıyan bir kart (Leonardo veya Pro Micro) seçmeniz doğru olur. 


Block Diagramı
























31 Ekim 2026 Cumartesi

Arduino


Arduino Nedir?

Arduino, açık kaynaklı bir mikrodenetleyici platformudur. En basit tanımıyla üzerine bağlanan sensörlerden (sıcaklık, ışık, mesafe vb.) aldığı verileri işleyen ve bu verilere göre motorları, ışıkları veya ekranları kontrol edebilen "küçük bir bilgisayar beyni" dir.

Açık kaynaklı olması, kartın tasarım planlarının herkese açık olduğu anlamına gelir. Bu sayede hem orijinal İtalyan üretimi kartları hem de farklı firmaların ürettiği daha uygun fiyatlı "klon" kartları piyasada bulmak mümkündür.


Çeşitli Arduino Modelleri

1. Arduino Uno -R3


İşlemci: ATmega328P (8-bit)

Çalışma Voltajı / Saat Hızı: 5V, 16 MHz

Giriş/Çıkış: 14 Dijital (6 PWM), 6 Analog Giriş

Bellek: 32 KB Flash, 2 KB SRAM, 1 KB EEPROM

Özellik ve Kullanım Alanı: En popüler ve standart Arduino modelidir. Genellikle eğitim, hobi projeleri ve prototipleme için temel kart olarak kullanılır. Üzerinde tak-çıkat kılıfta (veya SMD) ATmega328P bulunur.



30 Ekim 2026 Cuma


Programlama Kodları

//AÇIKLAMA
//Bu uygulamada okutulan kartın belirlediğimiz kart UID'si ile aynı olup olmadığını test ettik.
//Aynıysa doğru, aynı değilse yanlış ifadesini seri port ekanına yazdırdık.

#include<SPI.h>
#include<MFRC522.h>

#define SS_PIN 10
#define RST_PIN 9

MFRC522 rfid(SS_PIN, RST_PIN);

String kart_ID = "6934CE06";
String okunan_ID = "";
int i;

void setup()
{
  Serial.begin(9600);
  SPI.begin();
  rfid.PCD_Init();
  Serial.println("MIFARE Classic Kart/Etiket Bekleniyor...");
}

void loop()
{
  //__________________________________Kart/Etiket kontrolü_______________________________
  //If'in içerisinde return kullanmamızın nedeni: If içi 1(true) olduğunda programın, loop
  //döngüsünün başına gitmesini sağlamak içindir.
  if (!rfid.PICC_IsNewCardPresent())  //Yeni bir kart/etiket algılanıp algılanmadığını kontrol eder.
  {
    return;
  }

  if (!rfid.PICC_ReadCardSerial())  //Kartın/etiketin UID (Benzersiz Kimlik)’sinin okunup okunamadığını belirler.
  {
    return;
  }
  Serial.println("Kart/Etiket Algılandı.");

  okunan_ID = ""; //Stringi boşalt.

  //__________________UID'yi bayt bayt okuma, birleştirme, büyük harfe çevirme____________________
  for (i = 0; i < 4; i++)
  {
    if (rfid.uid.uidByte[i] < 0x10)
    {
      okunan_ID += "0";   // Tek haneli sayıların başına 0 ekleme.
    }
    okunan_ID.concat(String(rfid.uid.uidByte[i], HEX)); //"rfid.uid.uidByte[i]" komutuyla sayı olarak okuduğumuz baytı, HEX'e çevir ve ardından String yap. ardından, "concat" komutu ile okunan_ID stringinin son haliyle birleştir. for döngüsü ile bu durumu 4 sefer tekrarla.
  }

  okunan_ID.toUpperCase();  //büyük harfe çevir. kart_ID değişkenindeki harfler büyüktür. Ancak üstteki komutla HEX e dönüştürüldüğünde UID içerisindeki harfler küçülür. bu nedenle büyük harfe çevirme işlemi yapıldı.
  Serial.print("Kart UID: ");   Serial.println(okunan_ID);


  //__________________Okunan UID ile tanımlanan ID'yi karşılaştır____________________
  if (kart_ID == okunan_ID)
  {
    Serial.println("Okunan UID DOĞRU.");
    delay(1000);
  }
  else
  {
    Serial.println("Okunan UID YANLIŞ!.");
    delay(1000);
  }

  rfid.PCD_StopCrypto1(); //okuyucu (PCD) ile kart/etiket(PICC) arasındaki şifreli iletişimi (Crypto1) güvenli bir şekilde kapat.

}



Devre Şeması




Seri Port Ekran Görüntüsü





Programlama Kodları

//AÇIKLAMA
//Bu uygulamada "MEHMET-GOKDAG-78" yazısı kartın 2. bloğuna yazılır ve ardından okunarak seri port ekranına yazdırılır. Ardından
//Kartın/Etiketin Bellek Dökümünü/Haritası ekrana seri port ekranına yazdırılır.

#include <SPI.h>
#include <MFRC522.h>

#define SS_PIN 10
#define RST_PIN 9

MFRC522 rfid(SS_PIN, RST_PIN);
MFRC522::MIFARE_Key key;  //'key' adında bir MIFARE_Key yapısı değişkeni oluşturuldu. Bu değişkeni, güvenlik anahtarını programa bildirmek için kullanacağız. 6 bayttır.

int blok = 2;  //Bu, içine yazıp sonra okuyacağımız blok numarasıdır.0. sektör 2. blok anlamındadır.
byte gonderilen_veri[16] = {"MEHMET-GOKDAG-78"};  //Bloğa yazdıracağımız verilerimizi belirlemek için, 16 baytlık bir dizi tanımlayıp, içerisine yazı yazıyoruz. Eğer bir bloğun içini silmek istiyorsak; {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; dizisinin o bloğa yazdırılması yeterlidir.
byte okunan_veri[18];   //Bloktaki verileri okuduktan sonra kaydedeceğimiz diziyi tanımlıyoruz. Okuyacağımız veri 16 bayt olmasına rağmen diziyi 18 elemanlı tanımladık. Bunun nedeni, MFRC522 kütüphanesindeki MIFARE_Read fonksiyonunun en az 18 baytlık bir tampon gerektirmesidir.

void setup()
{
  Serial.begin(9600);
  SPI.begin();
  rfid.PCD_Init();
  Serial.println("MIFARE Classic Kart/Etiket Bekleniyor...");

  //_______________________Güvenlik Anahtarını Kütüphaneye Bildirme____________________
  //Yukarıda tanımladığımız 'key' adındaki 6 baytlık değişkeni kullanarak, güvenlik anahtarını kütüphaneye bildiririz.
  //Güvenlik anahtarı aşağıdaki for döngüsünde görüldüğü üzere her biri 1 baytlık olan 6 adet "0xFF" verisinden oluşur.
  //Yeni RFID kartlarının tümünün güvenlik anahtarı varsayılan olarak 0xFF olarak belirlenir.
  for (byte i = 0; i < 6; i++)
  {
    key.keyByte[i] = 0xFF;
  }
}

void loop()
{
  //If'in içerisinde return kullanmamızın nedeni: If içi 1(true) olduğunda programın, loop
  //döngüsünün başına gitmesini sağlamak içindir.
  if (!rfid.PICC_IsNewCardPresent())
  {
    return;
  }

  if (!rfid.PICC_ReadCardSerial())
  {
    return;
  }
  Serial.println("Kart/Etiket Algılandı.");

  veriyaz(blok, gonderilen_veri);  //"gonderilen_veri" dizisinde tanımlanan veri 2 numaralı bloğa yazılır.

  verioku(blok, okunan_veri);  //2 numaralı bloktaki veri okunarak "okunan_veri" dizisine kaydedilir.

  //Bloktan okunan veri seri port ekranına yazdırılır.
  Serial.print("Bloktan Okunan Veri: ");
  for (int j = 0; j < 16; j++) {
    Serial.write(okunan_veri[j]);
  }
  Serial.println("");

  //Kart/etiket hakkında tüm bilgileri seri port ekranına yazdırır.
  Serial.println(" ");
  Serial.print("_________________");  Serial.print("Kartın/Etiketin Bellek Dökümünü/Haritası"); Serial.println("__________________");
  rfid.PICC_DumpToSerial(&(rfid.uid));

  rfid.PCD_StopCrypto1(); //okuyucu (PCD) ile kart/etiket(PICC) arasındaki şifreli iletişimi (Crypto1) güvenli bir şekilde kapat. 
}

//_______________________Bloğa Veri Yazma Fonksiyonu____________________
int veriyaz(int blok_no, byte gon_veri_dizisi[])
{
  //Bu kısımda trailer(son) blok değeri belirlenir ve blok kontrolü yapılır. Verilen blok numarasının veri bloğuna mı yoksa sonlandırıcı bloğa mı karşılık geldiği kontrol edilir. Verilen blok numarası bir veri bloğuna karşılık gelmiyorsa, fonksiyon bir hata mesajı döndürür.
  int sayi_tam_kisim = blok_no / 4 * 4;   //blok_no önce 4'e bölünür sonra 4 ile çarpılır. Fakat değişkenler int türünden tanımlandığı için blok_no 4'e bölündüğünde sonuç virgüllü çıksa bile sadece tam kısmı alınır. Örn: 7/4=1,25 olarak değil sadece tam kısmı alınacağından bölüm sonucu 1 olur.
  int trailer_blok = sayi_tam_kisim + 3;  //Sektör için trailer(son) blok değerini belirleyin.
  if (blok_no > 2 && (blok_no + 1) % 4 == 0)
  {
    Serial.print(blok_no);
    Serial.println(" numaralı blok trailer bloğudur.");
    return 2;
  }
  Serial.print(blok_no);
  Serial.println(" numaralı blok veri bloğudur.");

  //Bu kısımda bloğa erişim için key doğrulaması yapılır. Doğrulama başarısız olursa, fonksiyon bir hata mesajı döndürür.
  byte status = rfid.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailer_blok, &key, &(rfid.uid));
  if (status != MFRC522::STATUS_OK)
  {
    Serial.print("Key doğrulama hatası: ");
    Serial.println(rfid.GetStatusCodeName(status));
    return 3;  //return "3" as error message
  }

  //Bu kısımda belirlenen veri olan "MEHMET-GOKDAG-78" yazısı bloğa yazılır.
  status = rfid.MIFARE_Write(blok_no, gon_veri_dizisi, 16);
  if (status != MFRC522::STATUS_OK)
  {
    Serial.print("MIFARE_Write() Yazma Hatası: ");
    Serial.println(rfid.GetStatusCodeName(status));
    return 4;  //return "4" as error message
  }
  Serial.println("Bloğa yazma işlemi yapıldı.");
}

//_______________________Bloktan Veri Okuma Fonksiyonu____________________
int verioku(int blok_no, byte okunan_veri_dizisi[])
{
  //Bu kısımda trailer(son) blok değeri belirlenir
  int sayi_tam_kisim = blok_no / 4 * 4;
  int trailer_blok = sayi_tam_kisim + 3;  //Sektör için trailer(son) blok değerini belirleyin.

  //Bu kısımda bloğa erişim için key doğrulaması yapılır. Doğrulama başarısız olursa, fonksiyon bir hata mesajı döndürür.
  byte status = rfid.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailer_blok, &key, &(rfid.uid));
  if (status != MFRC522::STATUS_OK)
  {
    Serial.print("Key doğrulama hatası: ");
    Serial.println(rfid.GetStatusCodeName(status));
    return 3;  //return "3" as error message
  }

  //Bu kısımda bloktan veri okunur.
  byte dizi_boyutu = 18;  //"okunan_veri_dizisi" dizinin boyutunu belirlemek ve boyut değişkeninin adresini kütüphaneye bildirebilmek için değişken tanımlandı. boyut değişkeninin adresi, "&" işaretçisi kullanılarak kütüphaneye bildirilir.
  status = rfid.MIFARE_Read(blok_no, okunan_veri_dizisi, &dizi_boyutu);
  if (status != MFRC522::STATUS_OK)
  {
    Serial.print("MIFARE_read() Okuma Hatası: ");
    Serial.println(rfid.GetStatusCodeName(status));
    return 4;  //return "4" as error message
  }
  Serial.println("Blok Okundu");
}



Devre Şeması




Seri Port Ekran Görüntüsü





Programlama Kodları

#include <SPI.h>
#include <MFRC522.h>

#define RST 9
#define SS  10

MFRC522 rfid(SS, RST);

byte piccType;

void setup()
{
  Serial.begin(9600);
  SPI.begin();
  rfid.PCD_Init();  //“rfid” nesnesini başlatır.
  delay(4); //Bazı kartların hazır hale gelmesi için başlatıldıktan sonra daha fazla zamana ihtiyacı vardır.
  rfid.PCD_DumpVersionToSerial(); //RC522 kart/etiket okuyucu modülün bilgilerini gösterir.
}

void loop()
{
  //If'in içerisinde return kullanmamızın nedeni: If içi 1(true) olduğunda programın, loop
  //döngüsünün başına gitmesini sağlamak içindir.
  if (!rfid.PICC_IsNewCardPresent())  //Yeni bir kart/etiket algılanıp algılanmadığını kontrol eder.
  {
    return;
  }
  if (!rfid.PICC_ReadCardSerial())  //Kartın/etiketin UID (Benzersiz Kimlik)’sinin okunup okunamadığını belirler.
  {
    return;
  }

  Serial.print("Kart UID: ");
  Serial.print(rfid.uid.uidByte[0],HEX);  Serial.print(" ");
  Serial.print(rfid.uid.uidByte[1],HEX);  Serial.print(" ");
  Serial.print(rfid.uid.uidByte[2],HEX);  Serial.print(" ");
  Serial.println(rfid.uid.uidByte[3],HEX);

  delay(1000);
}



Devre Şeması




Seri Port Ekran Görüntüsü





Programlama Kodları

#include <SPI.h>
#include <MFRC522.h>

#define RST 9
#define SS  10

MFRC522 rfid(SS, RST);

byte piccType;

void setup()
{
  Serial.begin(9600);
  SPI.begin();
  rfid.PCD_Init();  //“rfid” nesnesini başlatır.
  delay(4); //Bazı kartların hazır hale gelmesi için başlatıldıktan sonra daha fazla zamana ihtiyacı vardır.
  rfid.PCD_DumpVersionToSerial(); //RC522 kart/etiket okuyucu modülün bilgilerini gösterir.
}

void loop()
{
  //If'in içerisinde return kullanmamızın nedeni: If içi 1(true) olduğunda programın, loop
  //döngüsünün başına gitmesini sağlamak içindir.
  if (!rfid.PICC_IsNewCardPresent())  //Yeni bir kart/etiket algılanıp algılanmadığını kontrol eder.
  {
    return;
  }
  if (!rfid.PICC_ReadCardSerial())  //Kartın/etiketin UID (Benzersiz Kimlik)’sinin okunup okunamadığını belirler.
  {
    return;
  }

  piccType = rfid.PICC_GetType(rfid.uid.sak);
  Serial.print("Kart Tipi: ");
  Serial.println(rfid.PICC_GetTypeName(piccType));
  delay(1000);
}



Devre Şeması




Seri Port Ekran Görüntüsü




Arduino Eğitimi Konu - 7

Toplam Sayfa Görüntüleme Sayısı

Sensörler ve Aygıtların Arduino İle Kullanımı

Popular Posts

Yararlanılan Kaynaklar

İletişim

gokdag17@gmail.com