Rehberler · 12 dk okuma

Yapay Zeka ile Arduino Kodu Yazma: İstem, Doğrulama ve Hatalar

Yapay zeka ile Arduino kodu yazarken iyi istem nasıl yazılır? Kodu doğrulama adımları, uydurma fonksiyonlar, yanlış pin, delay() kilitlenmesi ve 220 V uyarısı.

Yapay zeka ile Arduino kodu yazma, ChatGPT, Gemini, Claude ya da Copilot gibi bir sohbet asistanına projeni anlatıp ondan Arduino, ESP32 veya Raspberry Pi Pico için çalışan bir kod istemektir. Doğru kullanıldığında saatler süren bir işi dakikalara indirir: boş bir sayfadan başlamak yerine elinde derlenmeye hazır bir taslak olur. Ama yapay zeka devreni göremez, masandaki kartı bilmez ve yanlış bir şeyi de çok emin bir dille söyleyebilir. Olmayan bir kütüphane fonksiyonu uydurabilir, yanlış pin seçebilir ya da her şeyi kilitleyen delay() döngüleri yazabilir. Bu yüzden asıl beceri kodu istemek değil, iyi istemek ve gelen kodu doğrulamaktır.

Bu rehberde bir yapay zeka asistanının Arduino kodunu nasıl ürettiğini ve neden yanıldığını, kartı, pinleri, kütüphaneleri ve beklenen davranışı içeren iyi bir istemin (prompt) nasıl yazıldığını ve üretilen kodu karta yüklemeden önce hangi adımlarla doğrulaman gerektiğini göreceksin. En sık görülen üç hatayı gerçek derleyici mesajları ve düzeltilmiş kodlarla ele alacağız. Ardından derleme hatasını yapıştırıp düzelttirmenin doğru yolunu, 220 V şebeke gerilimiyle çalışırken neden yapay zekaya güvenmemen gerektiğini ve öğrenmeyi bırakmadan bu araçları nasıl kullanacağını anlatacağız.

Arduino Uno R3 kartı
Yapay zeka kod yazabilir ama kartını, kablolarını ve kullandığın modülleri göremez; bu bilgileri isteminde senin vermen gerekir.

Yapay zeka Arduino kodunu nasıl yazar, neden yanılır?

ChatGPT gibi büyük dil modelleri (LLM) kodu bir derleyici gibi çalıştırarak değil, eğitim sırasında gördüğü milyonlarca örnekten yola çıkıp en olası devamı tahmin ederek yazar. İnternette çok örneği olan konularda (LED yakmak, DHT11 okumak, servo döndürmek) bu yöntem çok iyi sonuç verir. Ancak modelin bilgisi belli bir tarihte donmuştur ve kütüphanelerin yeni sürümlerinde değişen fonksiyonları bilmeyebilir. Aynı adı taşıyan iki farklı kütüphanenin fonksiyonlarını birbirine karıştırabilir. En önemlisi, bilmediği bir şey için "bilmiyorum" demek yerine akla yatkın görünen bir cevap uydurabilir; buna halüsinasyon denir. Model senin devreni görmediği için pin numaralarını, gerilim seviyelerini ve modül sürümünü ya senin yazdıklarından ya da kendi tahmininden çıkarır.

İşYapay zeka ne kadar iyi?Neden?
Basit örnek kod (LED, buton, sensör okuma)Çok iyiİnternette binlerce benzer örnek var
Var olan kodu satır satır açıklamakÇok iyiKodu okuyup anlatmak tahmin gerektirmez
Derleme hatasının sebebini bulmakİyiHata mesajları kalıplıdır ve modeller bu kalıpları tanır
Kütüphanenin en yeni sürümüne uygun kodZayıfBilgisi belli bir tarihte donmuştur; yeni fonksiyonları bilmeyebilir
Senin devrene uygun pin seçimiZayıfKartını ve kablolamanı görmez, varsayımla seçer
Zamanlama ve aynı anda birkaç işOrtaÖrneklerin çoğu delay() ile yazıldığı için kilitlenen kod üretir
220 V, akü ve yüksek akımlı devrelerGüvenilmezHatanın bedeli yanık, yangın ya da çarpılmadır; model sorumluluk alamaz

İyi bir istem (prompt) nasıl yazılır?

Yapay zekanın verdiği kodun kalitesi, ona verdiğin bilginin kalitesini geçemez. "Arduino ile sıcaklık ölçen kod yaz" gibi tek cümlelik bir istekte model hangi kartı, hangi sensörü, hangi pini ve hangi kütüphaneyi kullanacağını kendisi seçer. Seçtikleri senin elindekilerle tutmazsa kod ya derlenmez ya da derlenip çalışmaz. İyi bir istem, projeyi ilk kez duyan bir arkadaşına telefonda anlatır gibi yazılır: kart, bileşenler, bağlantılar, kütüphaneler, beklenen davranış ve kısıtlar tek tek söylenir. Aşağıdaki tablo bir Arduino isteminde bulunması gereken bilgileri özetliyor:

İstemde ne olmalı?Neden önemli?Örnek
Kartın tam adıUno, ESP32 ve Pico'da pinler, gerilim ve komutlar farklıdırArduino Uno R3 (ATmega328P)
IDE ve çekirdek sürümüESP32'de 2.x ile 3.x arasında fonksiyonlar değiştiArduino IDE 2.3, esp32 çekirdeği 3.x
Bileşenlerin model numarasıDHT11 ile DHT22, SG90 ile MG996R aynı değildirDHT22, I2C'li 16x2 LCD (PCF8574, adres 0x27)
Pin bağlantılarıModel pin uydurmaz, senin kablolamana uyarDHT22 DATA → D2, buton D3 ile GND arasında
Kütüphanenin adı ve yazarıAynı adlı farklı kütüphaneler farklı fonksiyonlar kullanırAdafruit DHT sensor library, Frank de Brabander LiquidCrystal I2C
Sayılarla beklenen davranış"Isınınca öt" belirsizdir, "30 °C'nin üstünde" ölçülebilir2 saniyede bir ölç, 30 °C'yi geçince buzzer'ı 3 kez öttür
KısıtlarModelin kötü alışkanlıklarını baştan engellerdelay() kullanma, millis() kullan
Çıktı biçimiKodu ve kurulum bilgisini birlikte alırsınTek .ino dosyası, Türkçe yorumlar, gereken kütüphanelerin listesi

Örneğin şu istem, tek cümlelik bir istekten çok daha iyi sonuç verir: "Arduino Uno R3 ve Arduino IDE 2.3 kullanıyorum. DHT22 sensörünün DATA pini D2'de, aktif buzzer D8'de, I2C'li 16x2 LCD'nin (PCF8574, adres 0x27) SDA'sı A4'te, SCL'si A5'te. Adafruit DHT sensor library ve Frank de Brabander'ın LiquidCrystal I2C kütüphanesi kurulu. Her 2 saniyede bir sıcaklık ve nemi LCD'ye yaz, sıcaklık 30 °C'yi geçerse buzzer'ı kısa kısa öttür. delay() yerine millis() kullan, satırlara Türkçe yorum ekle. Kodun başında kurmam gereken kütüphaneleri, sonunda da yaptığın varsayımları listele." Bu istemde modelin tahmin etmesi gereken neredeyse hiçbir şey kalmaz.

Kod istemeden önce "Bu projeyi yazmak için eksik bilgi var mı? Önce bana soru sor" diye ekle. İyi bir model besleme gerilimini, sensörün çıplak mı yoksa modül üzerinde mi olduğunu ya da LCD adresini soracaktır. Wi-Fi şifreni, API anahtarını ya da bot belirtecini ise isteme asla yazma; bunların yerine "SIFRE_BURAYA" gibi yer tutucular kullan ve gerçek değerleri koda en son kendin gir.

Yapay zekanın ürettiği kodu doğrulama adımları

Gelen kod ne kadar düzgün görünürse görünsün, karta yüklemeden önce bir kontrol listesinden geçir. Bu adımların çoğu birkaç dakika sürer ve yanlış bağlanmış bir pin yüzünden yanan bir modülden çok daha ucuzdur:

  1. Önce yalnızca derle: Kartı takmadan Doğrula (onay işareti) düğmesine bas. Hata çıkarsa aşağıdaki yöntemle düzelttir; mesajların anlamı için Arduino derleme hataları yazısına bak.
  2. Kütüphaneleri tek tek doğrula: Koddaki her #include satırını Kütüphane Yöneticisi'nde ara ve adı, yazarı ve örnekleri kodla uyuşan kütüphaneyi kur. Kurulumu bilmiyorsan Arduino kütüphane ekleme rehberi adım adım anlatıyor.
  3. Pinleri karşılaştır: Koddaki her pin numarasını kendi kablolamanla ve kartın pin haritasıyla karşılaştır. PWM pinleri ve kullanılmaması gereken pinler için Pinout aracını kullan.
  4. Elektriksel değerleri hesapla: Önerilen direnç değerini LED direnci hesaplayıcısıyla kontrol et. 5 V çıkışlı bir sensör 3,3 V'luk ESP32 ya da Pico'ya bağlanacaksa araya gerilim bölücü koy.
  5. Simülatörde dene: Kodu gerçek devreye bağlamadan önce Wokwi ya da Tinkercad üzerinde çalıştır; mantık hatalarını hiçbir parçayı riske atmadan yakalarsın.
  6. Parça parça test et: Bütün projeyi tek seferde yükleme. Önce yalnızca sensörü okuyup Seri Monitör'e yazan küçük bir kod dene, sonra ekranı, en son buzzer'ı ya da röleyi ekle.
  7. Seri Monitör ile izle: Önemli noktalara Serial.println() ekleyerek değişkenlerin beklediğin değerleri alıp almadığını gör ve baud hızının koddaki Serial.begin() değeriyle aynı olduğundan emin ol. Ayrıntılar Arduino Serial Monitor yazısında.
  8. Kodu açıklat: Anlamadığın her satırı "bu satır ne yapıyor, silersem ne olur?" diye sor. Açıklayamadığın bir kodu karta yükleme.

Sık hata 1: Olmayan kütüphane fonksiyonları

Yapay zekanın en sinsi hatası, gerçekte var olmayan ama adı çok mantıklı görünen fonksiyonlar yazmasıdır. Örneğin standart Servo kütüphanesinde attach(), write(), writeMicroseconds(), read() ve detach() vardır ama hız ayarlayan bir setSpeed() fonksiyonu yoktur; model "servo yavaş dönsün" isteğine bunu uydurabilir. Bazen fonksiyon gerçekten vardır ama başka bir kartta: Serial.printf() ESP32'de çalışır, Arduino Uno'da ise derlenmez. Bazen de fonksiyon eski bir sürümde kalmıştır: ESP32 Arduino çekirdeğinin 2024'te çıkan 3.x sürümünde ledcSetup() ve ledcAttachPin() kaldırıldı, ama modellerin çoğu hâlâ bunlarla kod yazar. Bir de aynı başlık dosyasını kullanan farklı kütüphaneler var: LiquidCrystal_I2C.h adlı bir kütüphanede ekran lcd.init() ile, aynı adı taşıyan bir başkasında lcd.begin() ile başlatılır. Derleme çıktısında "Multiple libraries were found" uyarısı görürsen bu karışıklıktan şüphelen.

Yapay zekanın yazdığıDerleyici mesajı ya da belirtiGerçek çözüm
Uno'da Serial.printf("%d", x)'class HardwareSerial' has no member named 'printf'; did you mean 'print'?Serial.print() ile parça parça yaz ya da metni önce snprintf() ile hazırla
Uno'da sprintf(buf, "%.1f", t)Derlenir ama sayının yerine ? yazarAVR'de printf ailesi ondalık sayıyı desteklemez; dtostrf(t, 4, 1, buf) kullan
servo.setSpeed(10)'class Servo' has no member named 'setSpeed'Açıyı bir döngüde küçük adımlarla değiştir
ESP32 3.x'te ledcSetup(0, 5000, 8)'ledcSetup' was not declared in this scopeledcAttach(pin, frekans, çözünürlük) ve ledcWrite(pin, değer) kullan
Yalnızca DHT kütüphanesi kurulufatal error: Adafruit_Sensor.h: No such file or directoryAdafruit Unified Sensor kütüphanesini de kur
Kurulu kütüphaneye uymayan lcd.begin()no matching function for call to 'LiquidCrystal_I2C::begin()'Kurulu kütüphanenin kendi örneğini aç ve onun başlatma komutunu (lcd.init() gibi) kullan
Uno'da analogReadResolution(12)'analogReadResolution' was not declared in this scopeUno'nun ADC'si 10 bittir; satırı sil, değerler 0–1023 arasındadır

ESP32'de eski fonksiyon tuzağı: ledcSetup yerine ledcAttach

ESP32 ile LED parlaklığı ya da motor hızı ayarlayan bir kod istediğinde yapay zeka büyük ihtimalle ledcSetup(kanal, frekans, çözünürlük), ledcAttachPin(pin, kanal) ve ledcWrite(kanal, değer) üçlüsünü yazar. Bu kod çekirdeğin 2.x sürümünde çalışır. 3.x sürümünde ise kanallar otomatik atanır: ledcAttach(pin, frekans, çözünürlük) pini tek seferde hazırlar, ledcWrite(pin, değer) de artık kanal yerine pin numarası alır. Hangi sürümün kurulu olduğunu Kart Yöneticisi'nde esp32 paketinin yanında görebilirsin. Aşağıdaki kod sürümü derleme sırasında kontrol eder, böylece iki çekirdekte de çalışır:

C++ (Arduino IDE)
1// ESP32 PWM: çekirdek 2.x ve 3.x ile uyumlu LED soldurma / LED fade for both core 2.x and 3.x
2#include <esp_arduino_version.h>   // ESP_ARDUINO_VERSION_MAJOR için / for ESP_ARDUINO_VERSION_MAJOR
3
4const int LED_PIN = 2;             // çoğu DevKit'te dahili LED / onboard LED on most DevKits
5const uint32_t FREKANS = 5000;     // PWM frekansı, Hz / PWM frequency, Hz
6const uint8_t COZUNURLUK = 8;      // 8 bit: 0-255 / 8-bit: 0-255
7
8#if ESP_ARDUINO_VERSION_MAJOR >= 3
9// Çekirdek 3.x: kanal otomatik seçilir, fonksiyonlar pin alır / Core 3.x: channel is automatic, functions take the pin
10void pwmBaslat() { ledcAttach(LED_PIN, FREKANS, COZUNURLUK); }
11void pwmYaz(uint32_t deger) { ledcWrite(LED_PIN, deger); }
12#else
13// Çekirdek 2.x: önce kanal kurulur, sonra pine bağlanır / Core 2.x: set up a channel, then attach the pin
14const uint8_t KANAL = 0;
15void pwmBaslat() { ledcSetup(KANAL, FREKANS, COZUNURLUK); ledcAttachPin(LED_PIN, KANAL); }
16void pwmYaz(uint32_t deger) { ledcWrite(KANAL, deger); }
17#endif
18
19void setup() {
20  Serial.begin(115200);
21  Serial.print("ESP32 Arduino cekirdegi / core: ");
22  Serial.println(ESP_ARDUINO_VERSION_MAJOR);
23  pwmBaslat();
24}
25
26void loop() {
27  // Tek iş yaptığı için burada delay() sorun değil / delay() is fine here: only one task
28  for (int d = 0; d <= 255; d++) { pwmYaz(d); delay(4); }   // yavaşça yan / fade in
29  for (int d = 255; d >= 0; d--) { pwmYaz(d); delay(4); }   // yavaşça sön / fade out
30}

Buradaki ders yalnızca ESP32'ye özgü değil: isteminde çekirdek ve kütüphane sürümünü yazarsan model doğru fonksiyonları seçme şansı bulur. Sürümü belirttiğin hâlde eski fonksiyonlar kullanıyorsa kütüphanenin Dosya > Örnekler menüsündeki resmi örneklerinden birini aç ve "bu örnekteki fonksiyonlarla yeniden yaz" diyerek isteme yapıştır. Resmi örnekler her zaman kurulu sürümle uyumludur. PWM'in nasıl çalıştığını merak ediyorsan PWM nedir? yazısına göz at.

Sık hata 2: Yanlış pin seçimi

Kod derlenip yüklense bile yanlış pin, sessizce çalışmayan bir devre ya da yanan bir modül demektir. Derleyici bunu yakalayamaz, çünkü onun için pin numarası yalnızca bir sayıdır. Yapay zekanın en sık yaptığı pin hataları kartlara göre şöyle:

KartYapay zekanın sık hatasıNe olur?Doğrusu
Arduino UnoanalogWrite() için PWM olmayan bir pin (ör. D7)LED kısılmaz; 128'in altında söner, 128 ve üstünde tam yanarPWM pinleri: 3, 5, 6, 9, 10, 11
Arduino UnoModülü D0 ya da D1'e bağlamakKod yüklenemeyebilir, Seri Monitör bozuk karakter gösterebilirD0 ve D1 USB seri hattıdır; D2'den başla
Arduino NanoA6 ve A7'yi dijital pin olarak kullanmakdigitalRead() ve digitalWrite() çalışmazA6 ve A7 yalnızca analog giriştir
ESP32GPIO 6–11'i kullanmakKart çöker ya da sürekli yeniden başlarBu pinler flaş belleğe bağlıdır; GPIO 4, 5, 16–19, 21–23 gibi güvenli pinleri seç
ESP32GPIO 34–39'u çıkış yapmakLED yanmaz; buton dahili pull-up olmadan kararsız okunurBu pinler yalnızca giriştir ve dahili pull-up dirençleri yoktur
ESP32Wi-Fi açıkken ADC2 pinlerinden analog okumakanalogRead() okuma yapamaz ya da anlamsız değer döndürürAnalog sensörü ADC1 pinlerine (GPIO 32–39) bağla
Raspberry Pi Pico WDahili LED için Pin(25)LED yanmazPico W'da LED kablosuz yongaya bağlıdır; Pin("LED") kullan
Yapay zeka çoğu zaman gerilim seviyelerini hesaba katmaz. ESP32 ve Raspberry Pi Pico'nun pinleri 3,3 V ile çalışır ve 5 V'a dayanıklı değildir; 5 V çıkış veren bir sensörü doğrudan bağlamak pini kalıcı olarak bozabilir. Arduino Uno'nun bir pininden de sürekli en fazla 20 mA çekmelisin (mutlak sınır 40 mA). Motor, röle bobini ya da uzun bir LED şeridi doğrudan pine bağlanmaz; araya transistör ya da sürücü konur. Kartının pin yerleşimi için Arduino Uno pinleri yazısına bakabilirsin.

Sık hata 3: delay() kilitlenmesi

İnternetteki Arduino örneklerinin çoğu delay() ile yazıldığı için yapay zeka da varsayılan olarak delay() kullanır. delay(1000) çalışırken işlemci bir saniye boyunca başka hiçbir şey yapmaz: butonları okumaz, sensörlere bakmaz, ekranı güncellemez. Tek iş yapan bir kodda bu sorun değildir. Ama "LED yanıp sönsün, butona basınca da buzzer ötsün" gibi iki işi birlikte isteyince çoğu zaman aşağıdaki gibi bir kod çıkar:

C++ (Arduino IDE)
1// Yapay zekanın sık ürettiği, kilitlenen kod / Blocking code that AI often produces
2const int BUTON_PIN = 2;    // buton: D2 ile GND arası / button between D2 and GND
3const int LED_PIN = 13;     // dahili LED / onboard LED
4const int BUZZER_PIN = 8;   // aktif buzzer / active buzzer
5
6void setup() {
7  pinMode(BUTON_PIN, INPUT_PULLUP);
8  pinMode(LED_PIN, OUTPUT);
9  pinMode(BUZZER_PIN, OUTPUT);
10}
11
12void loop() {
13  digitalWrite(LED_PIN, HIGH);
14  delay(1000);                          // 1 sn boyunca buton okunmaz / button is not read for 1 s
15  digitalWrite(LED_PIN, LOW);
16  delay(1000);                          // 1 sn daha kör bekleme / another blind second
17
18  if (digitalRead(BUTON_PIN) == LOW) {  // yalnızca tam bu anda basılıysa / only if pressed right now
19    digitalWrite(BUZZER_PIN, HIGH);
20    delay(200);
21    digitalWrite(BUZZER_PIN, LOW);
22  }
23}

Bu kod hatasız derlenir, ama butona bastığında çoğu zaman hiçbir şey olmaz. loop() turunun yaklaşık 2 saniyesi iki delay() içinde geçer ve buton yalnızca bu beklemelerin arasındaki birkaç mikrosaniyelik anda okunur. Kısa bir basış neredeyse her zaman bu anı kaçırır; buzzer'ın kesin ötmesi için butonu 2 saniyeden uzun basılı tutman gerekir. Çözüm beklemek değil, saati kontrol etmektir: millis() kartın açılışından beri geçen milisaniyeyi verir, her iş kendi zamanının gelip gelmediğine bakar ve loop() saniyede binlerce kez döner:

C++ (Arduino IDE)
1// millis() ile kilitlenmeyen sürüm / Non-blocking version with millis()
2const int BUTON_PIN = 2;    // buton: D2 ile GND arası / button between D2 and GND
3const int LED_PIN = 13;     // dahili LED / onboard LED
4const int BUZZER_PIN = 8;   // aktif buzzer / active buzzer
5
6const unsigned long LED_ARALIK = 1000;  // LED değişim aralığı, ms / LED toggle interval, ms
7const unsigned long BIP_SURE = 200;     // bip süresi, ms / beep length, ms
8const unsigned long SICRAMA = 30;       // debounce süresi, ms / debounce time, ms
9
10unsigned long ledZaman = 0;     // LED'in son değiştiği an / last LED toggle
11unsigned long bipZaman = 0;     // bipin başladığı an / beep start
12unsigned long butonZaman = 0;   // butonun son değiştiği an / last button change
13bool ledDurum = false;
14bool bipCaliyor = false;
15int oncekiButon = HIGH;         // önceki buton seviyesi / previous button level
16
17void setup() {
18  pinMode(BUTON_PIN, INPUT_PULLUP);
19  pinMode(LED_PIN, OUTPUT);
20  pinMode(BUZZER_PIN, OUTPUT);
21}
22
23void loop() {
24  unsigned long simdi = millis();
25
26  // 1) LED: zamanı geldiyse durum değiştir / toggle the LED when its time has come
27  if (simdi - ledZaman >= LED_ARALIK) {
28    ledZaman = simdi;
29    ledDurum = !ledDurum;
30    digitalWrite(LED_PIN, ledDurum ? HIGH : LOW);
31  }
32
33  // 2) Buton: yalnızca basıldığı anı yakala / catch only the moment of the press
34  int buton = digitalRead(BUTON_PIN);
35  if (buton != oncekiButon && simdi - butonZaman >= SICRAMA) {
36    butonZaman = simdi;
37    oncekiButon = buton;
38    if (buton == LOW && !bipCaliyor) {  // HIGH -> LOW: yeni basış / new press
39      bipCaliyor = true;
40      bipZaman = simdi;
41      digitalWrite(BUZZER_PIN, HIGH);
42    }
43  }
44
45  // 3) Buzzer: süre dolunca sustur / silence it when the time is up
46  if (bipCaliyor && simdi - bipZaman >= BIP_SURE) {
47    bipCaliyor = false;
48    digitalWrite(BUZZER_PIN, LOW);
49  }
50}

Bu sürümde LED, buton ve buzzer birbirini beklemeden çalışır. simdi - ledZaman >= LED_ARALIK biçimindeki çıkarma, millis() yaklaşık 49,7 günde bir sıfıra döndüğünde bile doğru sonuç verir; yapay zekanın bazen yazdığı millis() > hedefZaman karşılaştırması ise bu taşmada bozulur. Butonun HIGH'tan LOW'a geçtiği anı yakalamak, buton basılı tutulduğunda buzzer'ın tekrar tekrar ötmesini önler; 30 ms'lik bekleme de kontak sıçramasını (debounce) süzer. Konunun tamamı için Arduino millis() ve delay() rehberine, buton bağlantısı için Arduino'ya buton nasıl bağlanır? yazısına bakabilirsin.

İsteminde baştan "delay() kullanma, her işi millis() ile zamanla" yazarsan bu sorunla hiç karşılaşmazsın. Kontrol etmen gereken iki kilitlenme kalıbı daha var: Leonardo ve Micro gibi doğrudan USB'li kartlarda while (!Serial); satırı, kart bilgisayara bağlı değilken programı sonsuza kadar bekletir. Kesme fonksiyonunun (ISR) içine yazılan delay() ise millis() kesme sırasında ilerlemediği için programı takılı bırakabilir.

Derleme hatasını yapıştırıp düzelttirmek

Yapay zeka derleme hatalarını açıklamakta gerçekten iyidir; yeter ki ona hatanın tamamını ve bağlamını ver. Yalnızca "kod çalışmıyor" yazmak, modeli tahmin yürütmeye zorlar. Şu sırayı izle:

  1. Arduino IDE 2'de derleme hatası çıktığında sağ altta beliren bildirimdeki Hata mesajlarını kopyala düğmesine bas ya da çıktı panelindeki metnin tamamını seçip kopyala. Son satırdaki exit status 1 tek başına işe yaramaz; asıl sebep yukarıdaki error: satırındadır.
  2. İsteminde sırasıyla şunlar olsun: kart ve çekirdek sürümü, kodun tamamı, hata mesajının tamamı, kurulu kütüphanelerin adları ve sürümleri.
  3. Düzeltme istemeden önce "Önce hatanın sebebini açıkla, sonra yalnızca değişmesi gereken satırları göster" diye yaz. Böylece model bütün kodu baştan yazıp yeni hatalar eklemez, sen de neyin neden değiştiğini öğrenirsin.
  4. Önerilen değişikliği uygula ve yeniden derle. Yeni bir hata çıkarsa yine en üstteki error: satırını yapıştır; her seferinde tek bir hatayı çöz.
  5. Aynı hata iki üç turdan sonra hâlâ düzelmiyorsa döngüyü kır ve kütüphanenin resmi örneğini derle. Örnek de derlenmiyorsa sorun kodda değil kurulumdadır: yanlış kart seçimi, eksik kütüphane ya da aynı adlı iki kütüphanenin çakışması.

Hata derlemede değil yükleme aşamasındaysa ("avrdude: stk500_recv(): programmer is not responding" ya da ESP32'de "Failed to connect to ESP32" gibi), kodu değiştirmenin faydası olmaz; port, kablo, sürücü ve kart seçimine bakman gerekir. Bu durumlar için Arduino kod yüklenmiyor yazısı adım adım çözüm sunuyor. Yapay zekaya yükleme hatasını sorarken de mesajın tamamını ve kullandığın işletim sistemini yaz.

Raspberry Pi Pico ve MicroPython kodu yazdırırken

MicroPython kodu isterken de aynı kurallar geçerlidir, ama burada yapay zeka bir de platformları karıştırabilir. Raspberry Pi bilgisayarlar için yazılmış RPi.GPIO ya da gpiozero kodları Pico'da çalışmaz; Pico'da MicroPython'un machine modülü kullanılır. CircuitPython'a ait board ve digitalio modülleri de MicroPython'da yoktur. Bu yüzden istemine "Raspberry Pi Pico W, MicroPython, Thonny" gibi net bir bilgi yaz. Aşağıdaki kod hem Pico'da hem Pico W'da çalışır ve beklemek yerine ticks_ms() ile zamanlar:

MicroPython
1# Pico ve Pico W: bekletmeden LED + buton / Pico and Pico W: LED + button without blocking
2from machine import Pin
3import time
4
5led = Pin("LED", Pin.OUT)             # Pico W'da Pin(25) çalışmaz / Pin(25) does not work on Pico W
6buton = Pin(14, Pin.IN, Pin.PULL_UP)  # buton: GP14 ile GND arası / button between GP14 and GND
7
8ARALIK = 500                          # LED değişim aralığı, ms / LED toggle interval, ms
9SICRAMA = 30                          # debounce süresi, ms / debounce time, ms
10son = time.ticks_ms()                 # LED'in son değiştiği an / last LED toggle
11degisim = time.ticks_ms()             # butonun son değiştiği an / last button change
12onceki = 1                            # önceki buton seviyesi / previous button level
13sayac = 0
14
15while True:
16    simdi = time.ticks_ms()
17    if time.ticks_diff(simdi, son) >= ARALIK:      # taşmada da doğru / correct even on overflow
18        son = simdi
19        led.toggle()
20    deger = buton.value()
21    if deger != onceki and time.ticks_diff(simdi, degisim) >= SICRAMA:
22        degisim = simdi
23        onceki = deger
24        if deger == 0:                # basıldığı an / moment of the press
25            sayac += 1
26            print("Basma / press:", sayac)

Kod Thonny ile çalıştırıldığında dahili LED yarım saniyede bir yanıp söner ve butona her basışta Shell penceresine artan bir sayı yazılır. time.ticks_diff() zaman sayacı başa döndüğünde bile doğru farkı verir; yapay zekanın sık yazdığı düz time.ticks_ms() - son çıkarması ise uzun süre çalışan bir kodda yanlış sonuç verebilir. Pico'ya yeni başlıyorsan Raspberry Pi Pico nedir? yazısından başlayabilirsin.

220 V ile çalışırken yapay zekaya güvenme

Yapay zeka bir röleyle 220 V'luk lamba, priz ya da ısıtıcı kontrol eden kodu saniyeler içinde yazar ve bağlantıyı da kendinden emin bir dille anlatır. Ama şebeke gerilimi öldürebilir; yanlış bir bağlantı ya da gevşek bir kablo çarpılmaya ve yangına yol açar. Model anlattığı bağlantıyı ölçemez, devreni göremez ve sonucun sorumluluğunu alamaz. 220 V ile ilgili hiçbir bağlantıyı yalnızca yapay zekanın tarifine göre yapma; 18 yaşından küçüksen bu işi mutlaka bir yetişkin ya da elektrik bilgisi olan biriyle birlikte yap.

Şebekeyle çalışacak bir proje yapıyorsan önce düşük gerilimde dene: lamba yerine bir LED, priz yerine 12 V'luk bir LED şerit kullan. Sistem gerçekten 220 V'u anahtarlamak zorundaysa bazı kurallar pazarlık konusu değildir. Devre üzerinde çalışırken fişi çek. Röle nötrü değil fazı (L) kessin. Röle modülünün üzerinde yazan akım ve gerilim sınırını (çoğu modülde 10 A 250 VAC) aşma ve yüksek gerilim tarafını kapalı, yalıtkan bir kutuya al. Ucuz röle modüllerinde düşük ve yüksek gerilim tarafları arasındaki mesafe çoğu zaman yetersizdir; mümkünse hazır ve sertifikalı akıllı priz ya da röle kutularını tercih et. Röle modülünün bağlantısını Röle modülü nedir? yazısında ayrıntılı bulabilirsin.

Öğrenmeyi bırakmadan yapay zekayı kullanmak

Yapay zeka her kodu senin yerine yazarsa, kod çalışmadığı ilk gün ne yapacağını bilemezsin. Amacın elektronik ve programlama öğrenmekse onu bir kod makinesi gibi değil, sabırlı bir öğretmen gibi kullan:

  • Önce kendin yaz: Kodu kendin dene, sonra yapay zekadan "hataları göster ama düzeltilmiş kodu verme" diyerek incelemesini iste.
  • Cevap değil ipucu iste: Takıldığında "bana yalnızca bir sonraki adım için ipucu ver" de.
  • Satır satır açıklat: Gelen kodu açıklattıktan sonra aynı mantığı kendi cümlelerinle anlatmayı dene; anlatamadığın yer, henüz öğrenmediğin yerdir.
  • Kopyalamak yerine yaz: Kodu yapıştırmak yerine elle yazmak, söz dizimini ve fonksiyon adlarını çok daha hızlı öğretir.
  • Tahmin et, sonra dene: Bir değeri değiştirmeden önce ne olacağını tahmin et (ör. LED_ARALIK 200 olursa), sonra karta yükleyip kontrol et.
  • Kendini sınat: Yapay zekadan öğrendiğin konu hakkında sana beş soru sormasını iste; temelleri tazelemek için Arduino programlama temelleri yazısını kullan.
  • Kurallara uy: Okul ödevlerinde ve TÜBİTAK gibi yarışmalarda yapay zeka kullanımıyla ilgili kurallara uy ve kullandıysan bunu açıkça belirt.

Yapay zekayla deneyebileceğin ilk projeler

  • Sıcaklık göstergesi: DHT11 ile ölçülen değerleri I2C LCD ekrana yazdır; isteminde LCD adresini ve kütüphanenin yazarını belirt.
  • Park sensörü: HC-SR04 ile mesafeyi ölç ve engel yaklaştıkça buzzer'ı hızlandır; zamanlamayı millis() ile yapmasını iste.
  • Gece lambası: LDR ile ortam karardığında LED'i yak; eşik değerini önce Seri Monitör'den okuyup isteminde sayı olarak ver.
  • Wi-Fi ile LED kontrolü: ESP32 ile telefondan açılan bir sayfadan LED'i yak ve söndür; isteminde çekirdek sürümünü belirt.
  • Kendi fikrin: Arduino proje fikirleri listesinden bir proje seç ve bu rehberdeki istem şablonuyla yapay zekaya anlat.

Yapay zeka, Arduino öğrenirken elinin altındaki en hızlı yardımcı olabilir; yeter ki ona doğru bilgiyi ver, gelen kodu derle, pinleri kontrol et, parça parça test et ve anlamadığın hiçbir satırı karta yükleme. Yapay zekanın yazdığı kodu karşılaştırabileceğin güvenilir örnekler arıyorsan, BlueGrays uygulamasında LED, buton, DHT11, ESP32 PWM ve Pico projelerini adım adım devre şemaları ve test edilmiş kodlarıyla bulabilirsin.

Sıkça sorulan sorular

Yapay zeka ile Arduino kodu yazılır mı?

Evet. ChatGPT, Gemini, Claude ve Copilot gibi asistanlar Arduino, ESP32 ve Raspberry Pi Pico için basit projelerin çoğunda çalışan kod üretebilir. Ancak kodu karta yüklemeden önce derleyip pinleri, kütüphaneleri ve gerilim seviyelerini kendin kontrol etmelisin; yapay zeka devreni göremez ve yanılabilir.

Arduino kodu yazmak için en iyi yapay zeka hangisi?

Tek bir doğru cevap yok; güncel büyük modeller basit Arduino kodlarında birbirine yakın sonuç verir. Fark çoğu zaman modelden değil istemden gelir: kartı, pin bağlantılarını, kütüphaneleri ve beklenen davranışı net yazan bir istem, hangi asistanı kullanırsan kullan daha iyi kod getirir.

ChatGPT'nin yazdığı Arduino kodu neden çalışmıyor?

En sık sebepler var olmayan ya da başka bir karta ait fonksiyonlar, kütüphanenin farklı bir sürümüne göre yazılmış kod, yanlış pin seçimi ve her şeyi bekleten delay() kullanımıdır. Önce kodu derle; hata varsa mesajın tamamını kart ve sürüm bilgisiyle birlikte yapıştır. Kod derleniyor ama çalışmıyorsa Seri Monitör'e ara değerler yazdırarak sorunun yerini bul.

Arduino derleme hatası yapay zekaya nasıl sorulur?

Kart adını, çekirdek ve kütüphane sürümlerini, kodun tamamını ve çıktı panelindeki hata mesajının tamamını tek mesajda ver. "Önce sebebini açıkla, sonra yalnızca değişecek satırları göster" diye eklersen hem doğru düzeltmeyi alırsın hem de hatanın nedenini öğrenirsin.

Yapay zekanın verdiği 220 V röle bağlantısına güvenilir mi?

Hayır, tek başına güvenilmez. Kod çoğu zaman sorunsuzdur ama tehlike bağlantıdadır; yapay zeka devreni göremez ve tarifinin doğruluğunu garanti edemez. 220 V tarafını yalnızca bilgili biriyle, fiş çekiliyken, fazı kesen ve kapalı kutuda duran bir röle düzeneğiyle kur; mümkünse hazır ve sertifikalı bir akıllı priz kullan.

Yapay zeka kullanmak Arduino öğrenmeye zarar verir mi?

Kodu anlamadan kopyalarsan evet; ilk hatada ne yapacağını bilemezsin. Önce kendin yazıp yapay zekaya incelettiğinde, satır satır açıklattığında ve cevap yerine ipucu istediğinde ise öğrenmeyi hızlandırır. Kural basit: açıklayamadığın bir satırı karta yükleme.

Tüm projeleri gör
Led Yakma
#1Başlangıç

Led Yakma

Elektroniğin ilk merhabası: tek bir LED'i yakıp söndürmek. Arduino LED'i çok kısa aralıklarla yakıp söndürür, ışık hızlı hızlı göz kırpar. Kartın bir ışığı nasıl yönettiğini en sade haliyle görür, son

4.6(188)
1127
Buton İle Led Yakma (Push)
#9Başlangıç

Buton İle Led Yakma (Push)

Kapı zili gibi: bastığın sürece ışık yanar, bırakınca söner. Arduino butonu sürekli dinler; butona basılıyken LED'i yakar, elini çektiğin an söndürür. Kartın dışarıdan gelen bir dokunuşu nasıl hissett

4.8(113)
229
DHT11 İle Sıcaklık Ve Nem
#55Orta

DHT11 İle Sıcaklık Ve Nem

Odan kaç derece, hava nemli mi, kuru mu? DHT11 sensörü sıcaklığı ve nemi ölçer, Arduino da bu değerleri iki satırlık LCD ekrana yazar ve birkaç saniyede bir yeniler. Sensöre bir şey olursa ekranda hat

4.7(47)
73
ESP32 ile LED Yakma
#103Başlangıç

ESP32 ile LED Yakma

ESP32 ile temel GPIO çıkışı kullanımını öğretir. Bir LED'i dijital pinden açıp kapatarak yanıp sönme efekti elde ederiz. Arduino UNO'daki klasik blink projesinin ESP32 versiyonu; Arduino ortamındaki temel blink komutları aynıdır, ancak ESP32'nin pin yerleşimi ve 3,3 V GPIO seviyeleri Arduino UNO'dan farklıdır.

4.7(37)
99
Raspberry Pi Pico Dahili LED Yakma (Pico ve Pico W)
#147Başlangıç

Raspberry Pi Pico Dahili LED Yakma (Pico ve Pico W)

Raspberry Pi Pico serisinin açılış projesi! Pico'nun üzerindeki yeşil dahili LED'i yakıp söndürerek kartın çalıştığını doğruluyoruz — klasik "Hello World" tarzı ilk deney. Harici bileşene ihtiyaç YOK, sadece Pico ve USB kablosu yeterli. Kod MicroPython ile yazıldı (Raspberry Pi Vakfı'nın resmi olarak desteklediği dil). Thonny IDE ile Pico'yu programlarken machine.Pin sınıfı, Pin.OUT mode, led.on()/off() metodları ve time.sleep() fonksiyonlarını kavrarsın. Seri

5.0(1)
10
ESP32 PWM ile LED Soldurma (Fade)
#110Başlangıç

ESP32 PWM ile LED Soldurma (Fade)

LED'in parlaklığını yumuşak şekilde 0'dan max'a, max'tan 0'a değiştirme. Arduino'daki gibi analogWrite() ile PWM kontrolü yapıyoruz — ESP32 Arduino Core 3.0+ ile aynı syntax sorunsuz çalışır. Pin tanımı + pinMode + analogWrite yeterli.

4.8(36)
54
Raspberry Pi Pico PWM ile LED Fade (Nefes Efekti)
#160Başlangıç

Raspberry Pi Pico PWM ile LED Fade (Nefes Efekti)

LED artık sadece yanıp sönmüyor — nefes alıyor! Raspberry Pi Pico'nun PWM (Pulse Width Modulation — darbe genişlik modülasyonu) özelliğiyle LED'in parlaklığı yavaş yavaş artar, sonra yavaş yavaş azalır. Uyku modundaki MacBook ışığı gibi sakin bir "nefes" efekti. Öğrenme: machine.PWM sınıfı (pini PWM çıkışına çevirme), duty_u16() (0–65535 arası 16-bit parlaklık değeri), PWM frekansı (freq(1000) — saniyede 1000 kez aç-kapa, göz titremeyi görmez), range() ile adım adım döngü

0.0(0)
4
I2C İle LCD Ekran Kullanımı
#32Başlangıç
Premium

I2C İle LCD Ekran Kullanımı

Arduino'ya kendi ekranını kazandır ve ilk mesajını yazdır. İki satırlık LCD ekran yalnızca birkaç kabloyla bağlanır; önce üst satıra bir selam, ardından alt satıra ikinci bir yazı gelir, ekran temizle

4.8(53)
70