Temeller · 9 dk okuma

Blok Kodlamadan Arduino Koduna Geçiş: C++ ve MicroPython Tablosu

Blok kodlamadan Arduino koduna geçiş tablosu: 34 satırda blok, C++ ve MicroPython karşılığı, sık hatalar, 4 aşamalı yöntem ve üç hâliyle bir örnek program.

Blok kodlamadan Arduino koduna geçiş için en hızlı yol, her bloğun gerçek kodda hangi satıra denk geldiğini gösteren tek sayfalık bir karşılık tablosunu yanında tutmaktır. Kısa cevap şu: bloklar yeni bir dil değil, Arduino C++ satırlarının görsel hâlidir. "13 numaralı pini ÇIKIŞ olarak ayarla" bloğu pinMode(13, OUTPUT); satırıdır, "1000 ms bekle" bloğu delay(1000); satırıdır, "eğer … yap" bloğu da if yapısıdır. Aşağıdaki tabloda BlueGrays uygulamasındaki blokların gerçek Türkçe etiketleri, Arduino C++ karşılıkları ve Raspberry Pi Pico'da MicroPython karşılıkları yan yana duruyor.

Bu sayfa bir ders değil, bir başvuru kâğıdı. Tabloyu yazdırıp masanın yanına koyabilir, bir projenin bloklarına bakarken hangi satırın neye denk geldiğini oradan kontrol edebilirsin. Tablonun ardından geçişte en sık yapılan hataları, blokları bırakıp koda geçmek için dört aşamalı bir yöntemi ve aynı programın blok, C++ ve MicroPython hâllerini bulacaksın. Örnek program Arduino IDE'de derlenir, Pico'da Thonny ile çalışır.

Blokları adım adım öğrenmek istersen Bloktan Koda serisi var: blok kodlama nedir, bloklarla LED yakma, eğer bloğu, döngü ve değişkenler ve bloklarla sensör okuma ve MicroPython. Bu yazı o derslerin hepsini tek tabloda toplar.
Buzzer İle Frekans Ayarı projesinin Türkçe blokları: genel değişkenler, kurulumda dört buton pini GİRİŞ, sürekli tekrarla içinde eğer blokları, sınırla ve ses çal blokları
Buzzer İle Frekans Ayarı projesinin blokları. Tabloda geçen tanımla, GİRİŞ olarak ayarla, pini oku, ata, sınırla, ses çal ve sesi durdur bloklarının hepsi bu tek programda var.

Tabloyu okumadan önce: üç dil arasındaki dört fark

Blok, C++ ve MicroPython aynı fikri anlatır ama yazım kuralları farklıdır. Tabloyu okurken en çok şu dört farka takılırsın. Birincisi yapı: Arduino C++'ta program setup() ve loop() adlı iki parçadan oluşur, bloklarda bunlar "kurulum (bir kez çalışır)" ve "sürekli tekrarla" diye görünür. MicroPython'da ayrı bir setup yoktur; dosya yukarıdan aşağı bir kez çalışır ve tekrar eden kısım while True: döngüsünün içine yazılır. İkincisi tipler: C++'ta her değişkenin tipi yazılır (int, float, bool), bloklarda bu "tanımla: tam sayı (int)" seçeneğidir, Python'da ise tip hiç yazılmaz.

Üçüncü fark sayı aralıklarıdır. Arduino Uno'da analog okuma 0–1023, PWM 0–255 arasındadır; ESP32'de analog okuma 0–4095'e çıkar; Pico'da MicroPython hem okumayı hem PWM doluluğunu 0–65535 aralığında verir. Bu yüzden bir eşik değerini karttan karta olduğu gibi taşıyamazsın. Dördüncü fark zaman birimidir: delay() milisaniye ister, time.sleep() saniye ister. Yarım saniye C++'ta delay(500), MicroPython'da time.sleep(0.5) olur. Bu dört kuralı aklında tutarsan tablodaki satırların çoğu kendiliğinden yerine oturur.

  • Tablodaki sayılar örnektir: blokta 13 yazan yerde senin projende 7 de olabilir, kod satırında da aynı sayı değişir.
  • MicroPython sütunundaki pinler Pico'nun GP numaralarıdır (GP14, GP15, GP26). Uno'daki pin numarasıyla aynı olmaları gerekmez; devre şemasına bak.
  • "Pico'da blok yok" yazan satırlar, o bloğun Pico projelerinde kullanılmadığını gösterir; MicroPython'da aynı işi gören kod yine de verildi.
  • ESP32 de Arduino C++ ile programlanır; C++ sütunu ESP32 için de geçerlidir, yalnız analog aralık ve bazı pin numaraları farklıdır.

Blok, Arduino C++ ve MicroPython karşılık tablosu

Tablo 12 gruba ayrıldı: program yapısı, pinler, zaman, koşul, döngü, değişkenler, matematik, seri port, analog ve PWM, ses, servo ve sensör. Blok sütunundaki metinler uygulamadaki blokların üzerinde yazan etiketlerdir, "…" ve "?" işaretleri başka bir bloğun takıldığı yuvayı gösterir. Bir satırda birden fazla blok varsa nokta ile ayrıldı.

GrupBlok (uygulamadaki etiket)Arduino C++MicroPython (Pico)
Yapıkurulum (bir kez çalışır)void setup() { … }while True: satırından önceki satırlar
Yapısürekli tekrarlavoid loop() { … }while True: (içi 4 boşluk girintili)
Yapıgenel değişkenler (en başta)Dosyanın en üstü, setup() öncesiimport satırlarından sonraki ilk satırlar
Yapıişlev blinkTwicevoid blinkTwice() { … } · çağrı: blinkTwice();def blinkTwice(): · çağrı: blinkTwice()
Pinler13 numaralı pini ÇIKIŞ olarak ayarlapinMode(13, OUTPUT);led = Pin(15, Pin.OUT)
Pinler2 numaralı pini GİRİŞ (PULLUP) olarak ayarlapinMode(2, INPUT_PULLUP);btn = Pin(14, Pin.IN, Pin.PULL_UP)
Pinler13 numaralı pine YÜKSEK yaz · 13 numaralı pine DÜŞÜK yazdigitalWrite(13, HIGH); · digitalWrite(13, LOW);led.value(1) · led.value(0)
Pinler2 numaralı pini okudigitalRead(2) → HIGH (1) ya da LOW (0)btn.value() → 1 ya da 0
Pinler (yalnız Pico)led adlı pin: GP 14, ÇIKIŞ · led pinini aç (on) / kapat (off)Karşılığı pinMode() + digitalWrite()led = Pin(14, Pin.OUT) · led.on() / led.off()
Zaman1000 ms bekle · 0.5 saniye bekle (Pico)delay(1000); · delay(500);time.sleep_ms(1000) · time.sleep(0.5)
Zaman10 µs bekledelayMicroseconds(10);time.sleep_us(10)
Zamanaçılıştan beri geçen msmillis() (unsigned long)time.ticks_ms()
Koşuleğer … yap … değilse eğer … değilse …if (…) { … } else if (…) { … } else { … }if …: · elif …: · else:
Koşul? = ? (≠, <, ≤, >, ≥)== != < <= > >=== != < <= > >=
Koşul? ve ? · ? veya ? · ? değil&& · || · !xand · or · not x
Döngü3 kez tekrarla yapfor (int i = 0; i < 3; i++) { … }for i in range(3):
Döngüi değişkeniyle say: 0 ile 5 arası, adım 1for (i = 0; i <= 5; i++) (5 dahil, 6 tur)for i in range(0, 6): (6 dahil değil)
Döngüşu doğruyken tekrarla:while (…) { … }while …:
Döngüdöngüden çıkbreak;break
Değişkentanımla: tam sayı (int) delayTime = 60int delayTime = 60;delayTime = 60 (tip yazılmaz)
Değişkentanımla: ondalıklı (float) voltage = 0.0float voltage = 0.0;voltage = 0.0
Değişkenx değişkenine 0 ata · x değişkenine 1 eklex = 0; · x += 1; (ya da x++;)x = 0 · x += 1 (x++ yoktur)
Değişkendizi 2 3 4 · ledPins dizisinden öğe 0int ledPins[] = {2, 3, 4}; · ledPins[0]ledPins = [2, 3, 4] · ledPins[0]
Matematik1 + 1 (ayrıca −, ×, ÷)+ - * / · iki int ile 7 / 2 = 3+ - * / · 7 / 2 = 3.5, tam bölme 7 // 2 = 3
Matematik10 ÷ 3 işleminden kalan10 % 310 % 3
Matematikx değerini eşle: 0 – 1023 → 0 – 255map(x, 0, 1023, 0, 255)Hazırı yok; arduino_map() işlevi yazılır
Matematik50 değerini 0 ile 100 arasında sınırlaconstrain(50, 0, 100)min(max(50, 0), 100)
Seri portseri portu 9600 baud ile başlatSerial.begin(9600);Gerekmez, print() USB üzerinden gider
Seri portseri porta yaz … alt satıra geç · aynı satırda kalSerial.println(x); · Serial.print(x);print(x) · print(x, end="")
Analog ve PWManalog oku A0analogRead(A0) → 0–1023 (ESP32'de 0–4095)ADC(26).read_u16() → 0–65535
Analog ve PWM9 numaralı pine PWM 128 yaz · led adlı PWM: GP 14, frekans 1000 Hz (Pico)analogWrite(9, 128); (0–255)led = PWM(Pin(14)) · led.freq(1000) · led.duty_u16(32768) (0–65535)
Ses8 numaralı pinde 440 Hz ses çal · 8 numaralı pinde sesi durdurtone(8, 440); · noTone(8);Pico'da blok yok: bz = PWM(Pin(16)) · bz.freq(440) · bz.duty_u16(32768) · durdur: bz.duty_u16(0)
ServomyServo servosunu 9 numaralı pine bağla · myServo servosunu 90 dereceye döndür#include <Servo.h> · Servo myServo; · myServo.attach(9); · myServo.write(90);Pico'da blok yok: s = PWM(Pin(16)) · s.freq(50) · s.duty_ns(1500000) (yaklaşık 90°)
Sensör12 numaralı pinde YÜKSEK darbe süresi (µs)pulseIn(12, HIGH)machine.time_pulse_us(Pin(12, Pin.IN), 1)

Tablonun bazı satırları ilk bakışta birebir görünse de dikkat ister. "i değişkeniyle say: 0 ile 5 arası" bloğunda 5 dahildir, döngü 6 kez döner; C++'ta bu yüzden < değil <= yazılır, Python'da range(0, 6) gerekir çünkü range bitiş sayısını dahil etmez. Bölme bloğu da tuzaklıdır: iki tam sayıyı böldüğünde C++ küsuratı atar ve 7 / 2 sonucu 3 olur, Python ise 3.5 verir. Python'da C++ gibi tam bölme istersen // kullanırsın. "x değerini eşle" bloğunun karşılığı olan map() MicroPython'da hazır gelmez; aşağıdaki örnekte iki satırlık bir arduino_map() işleviyle aynı hesabı yapıyoruz.

Arduino'dan Pico'ya geçerken eşikleri ve gerilimi yeniden hesapla. Uno'da 400 olan ışık eşiği Pico'da yaklaşık 25600'e karşılık gelir (400 × 65535 / 1023). Pico 3,3 V ile çalışır: sensör bölücülerini 3V3(OUT) pininden besle, GPIO ya da ADC pinlerine 5 V verme.

İç içe bloklar koda nasıl dönüşür?

Tek tek blokları bilmek yetmez; asıl beceri, iç içe geçmiş blokları tek bir satıra çevirebilmektir. Bunun için bloklarda iki şekli ayırt et. Alt alta dizilen, kenarında çıkıntı olan bloklar komuttur ve her biri kodda bir satır olur. Oval ya da köşeli, başka bir bloğun yuvasına takılan bloklar değerdir; bunlar kodda bir parantezin içine, bir eşittirin sağına ya da bir koşulun içine yerleşir. Aşağıdaki satırlar ücretsiz Buzzer İle Frekans Ayarı projesinden: dört buton frekansı açıp kapatır, artırıp azaltır, değer 50 ile 5000 Hz arasında tutulur.

Blok (Buzzer İle Frekans Ayarı)C++ satırıOkuma kuralı
state değişkenine 1 atastate = 1;Alt alta dizilen her komut bloğu bir satırdır ve noktalı virgülle biter.
eğer (btnOn numaralı pini oku = YÜKSEK) yap …if (digitalRead(btnOn) == HIGH) { … }Oval değer bloğu parantezin içine girer; bloktaki = karşılaştırması kodda == olur.
frequency değişkenine (frequency + 50) atafrequency = frequency + 50;İçteki blok önce hesaplanır, sonuç dıştaki bloğa verilir.
frequency değişkenine (frequency değerini 50 ile 5000 arasında sınırla) atafrequency = constrain(frequency, 50, 5000);Bloğun boş yuvaları, kodda virgülle ayrılan argümanlardır.
buzzerPin numaralı pinde frequency Hz ses çaltone(buzzerPin, frequency);Kodda sıra sabittir: önce pin, sonra değer. Bloktaki sözcük sırası dile göre değişebilir.
eğer (state = 1) yap … değilse …if (state == 1) { … } else { … }"yap" ağzındaki bloklar ilk { } içine, "değilse" ağzındakiler else { } içine girer.

Bu tabloyu okurken bir alışkanlık edin: önce en içteki bloğu çevir, sonra dışarı doğru ilerle. "frequency değişkenine (frequency değerini 50 ile 5000 arasında sınırla) ata" satırında en içte constrain(frequency, 50, 5000) vardır, dıştaki ata bloğu bunu frequency = … biçimine sokar. Değer bloğu tek başına satır olamaz; ona noktalı virgül koyup bırakırsan derleyici hata vermeyebilir ama sonuç hiçbir yere kaydedilmez.

Bloktan koda geçişte sık yapılan hatalar

Blok editörü bu hataların çoğunu yapmana izin vermez; parçaların şekli yanlış yere takılmayı engeller. Kodda bu koruma kalktığı için geçişin ilk haftalarında aşağıdaki hatalar neredeyse herkesin karşısına çıkar. Hata mesajı İngilizce gelir ama kalıpları azdır; birkaç kez gördükten sonra tanırsın.

HataBelirtiDoğrusu
Satır sonunda noktalı virgül yok"expected ';' before …" hatası; derleyici çoğu zaman bir alt satırı gösterirHer komut satırını ; ile bitir. if, for ve while satırlarının sonuna ; koyma.
Süslü parantez eksik ya da fazla"expected '}' at end of input" ya da kodun beklenmedik yerde çalışmasıHer { için bir } olmalı. Arduino IDE'de Ctrl+T (otomatik biçimlendirme) girintiyi düzeltir, eksik parantez hemen göze çarpar.
Koşulda = yazmakif (state = 1) her seferinde doğru sayılır, state de 1 olur; Python'da SyntaxErrorKarşılaştırma ==, atama =. Bloktaki = karşılaştırması kodda her zaman == olur.
Ondalıklı değeri int'e koymakint volt = 3.7; satırı 3 saklar; 5 / 2 sonucu 2 çıkarOndalıklı değerler için float kullan, bölmede sayılardan birini 5.0 diye yaz.
digitalRead değerini yanlış beklemekif (digitalRead(2) == 5) hiç çalışmaz; pull-up'lı butonda mantık ters işlerdigitalRead yalnız HIGH (1) ya da LOW (0) döndürür. INPUT_PULLUP'ta buton basılıyken LOW okunur.
Büyük-küçük harfi karıştırmak'digitalwrite' was not declared in this scope; Python'da NameErrordigitalWrite, pinMode, Serial harfi harfine yazılır. Python'da True ve False büyük harfle başlar.
Sayma döngüsünü eksik çevirmekBlokta 6 kez dönen döngü kodda 5 kez döner, son LED hiç yanmaz"0 ile 5 arası" bitişi dahil eder: C++'ta i <= 5, Python'da range(0, 6).
Python girintisini kaydırmakIndentationError ya da döngünün dışında kalan satırwhile ve if altındaki satırları aynı 4 boşlukla başlat; sekmeyle boşluğu karıştırma.
Python'da süreyi ms sanmaktime.sleep(500) yaklaşık 8 dakika beklertime.sleep(0.5) ya da time.sleep_ms(500) yaz.
C++ alışkanlığını Python'a taşımakx++, && ya da satır sonundaki ; yüzünden SyntaxErrorPython'da x += 1, and, or kullanılır; satır sonu işareti yoktur.
Derleyici bir satırı gösterdiğinde hep bir üst satıra da bak. Noktalı virgül ya da kapanmamış parantez hatası çoğu zaman sorunun bir satır altında yakalanır. Aynı anda birden fazla hata listelenirse yalnız ilkini düzelt ve yeniden derle; geri kalanlar çoğu zaman ilk hatanın yankısıdır.

Blokları bırakıp koda geçmek: 4 aşamalı yöntem

Geçişi tek seferde yapmaya çalışmak yorucudur. Aşağıdaki dört aşama, okumaktan yazmaya doğru küçük adımlarla ilerler. Her aşamaya bir iki proje ayırmak yeterli; bir sonrakine geçme ölçütü, o aşamadaki işi tabloya bakmadan yapabilmektir.

  1. Yan yana oku. Bir projenin bloklarını ve kodunu aynı anda aç, her bloğun kodda hangi satıra denk geldiğini parmağınla eşleştir. Bu aşamada tablo hep yanında dursun. Ölçüt: koddaki her satırı bir bloğa bağlayabilmek.
  2. Blokları kapat, tahmin et. Önce bloklara bak, sonra blok görünümünü kapat ve kodu görmeden o blokların C++ hâlini kâğıda yaz. Ardından gerçek kodla karşılaştır. Tersini de dene: kodu oku, blokları tahmin et.
  3. Değeri kodda değiştir. Kodu bilgisayarına al ve yalnız bir sayıyı değiştir: bekleme süresini 100'den 500'e, eşiği 400'den 600'e çıkar. Yükle, farkı gözünle gör. Derleme hatası alırsan yukarıdaki hata tablosuna dön.
  4. Yeni satır yaz. Bloklarda olmayan bir satırı kendin ekle: değeri Seri Monitör'e yazdıran bir Serial.println(), ikinci bir LED ya da butonla çalışan bir if. Artık bloktan çeviri yapmıyor, kodu doğrudan yazıyorsun.

Bu aşamaların derslerdeki karşılığı serinin yazılarında var. İlk aşama için bloklarla LED yakma yazısındaki blok-satır tablosu iyi bir başlangıçtır. İkinci ve üçüncü aşamada koşul ve döngülerle çalışmak için eğer bloğu ve döngü ve değişkenler yazılarına bak. Pico ile MicroPython'a geçeceksen bloklardan MicroPython'a geçiş yazısı Thonny kurulumunu da anlatır. Sınıfta bu geçişi haftalara yaymak istersen 8 haftalık robotik kodlama planı hazır bir sıra sunar.

BlueGrays uygulamasında blok ve kodu yan yana açmak

Bu tabloyu en çok, gerçek bir projenin blokları ile kodu arasında gidip gelirken kullanırsın. BlueGrays uygulamasında 100'ü aşkın projenin blok görünümü var; ücretsiz projelerin 30'u aşkınında bloklar da açık, Premium projelerde bloklar Premium ile açılır. Bloklar okumak içindir: uygulamada blok düzenlenmez ve bloklar karta yüklenmez. Karta giden her zaman gerçek koddur; onu Kopyala ya da bilgisayarda açmak için Linki Kopyala ile alıp Arduino IDE'ye ya da Pico için Thonny'ye yapıştırırsın.

  • Bloklarla göster: Proje sayfasındaki kaynak kodun yanında bu anahtarı açınca aynı program, uygulamanın dilinde blok görseli olarak görünür. Görsele dokununca tam ekran açılır; anahtarı kapatıp açarak birinci ve ikinci aşamayı uygularsın.
  • Blokları anla: Blok görünümü açıkken "Kodu anla" sekmesi bu adı alır. Program adım adım parçalara ayrılır; her adımda ilgili parça ve açıklaması yer alır. Sondaki "Kendin dene" görevi dördüncü aşama için hazır bir alıştırmadır.
  • Kod rehberi: Öğren bölümündeki 36 kartın (18 Arduino C++, 18 MicroPython) her birinde örnek, Blok, Arduino ve MicroPython sekmeleriyle üç hâlde gösterilir. Tablodaki bir satırı daha ayrıntılı görmek istersen ilgili karta bak.
  • Blok kodlu projeler: Keşfet > Projeler bölümünde Filtrele içindeki bu seçenek, yalnız blok görünümü olan projeleri listeler; geçiş için proje seçerken işini kolaylaştırır.

Kod rehberinin nasıl ilerlediğini kod rehberi yazısında, "Kodu anla" ve "Kendin dene" bölümlerini de kodu anla rehberinde ayrıntılı anlattık. Komutların tek tek açıklaması için Arduino komutları listesi de bu tabloyla birlikte iyi çalışır.

Örnek program üç hâliyle: ışığa göre kısılan gece lambası

Tabloyu bir arada görmek için küçük bir program kuralım. Bir LDR ışığı ölçer; oda aydınlıkken LED kapalı kalır, karanlık arttıkça LED yavaş yavaş parlar. Program değişken, analog okuma, koşul, eşleme, PWM, seri port ve bekleme bloklarını kullanır; yani tablonun yarısından fazlası tek örnekte geçer. Fikir ücretsiz Ldr İle Gece Lambası projesine dayanıyor; orada LED yalnız yanar ya da söner, burada PWM ile kısılır. LDR'nin bağlantısı için Ldr İle Işık Şiddeti Okuma projesinin devre şemasına da bakabilirsin.

BağlantıArduino UnoRaspberry Pi Pico
LDR'nin 1. bacağı5V3V3(OUT), fiziksel pin 36
LDR'nin 2. bacağı + 10 kΩ direncin bir ucu (orta nokta)A0GP26 / ADC0, fiziksel pin 31
10 kΩ direncin diğer ucuGNDGND, fiziksel pin 38
LED'in uzun bacağı (220 Ω direnç üzerinden)D9 (PWM pini)GP15, fiziksel pin 20
LED'in kısa bacağıGNDGND, fiziksel pin 18
Okunan ışık değeri / PWM aralığı0–1023 / 0–2550–65535 / 0–65535

Önce blok hâli. Uygulamadaki etiketlerle program şu bloklardan oluşur; her madde, aşağıdaki C++ kodunda bir ya da birkaç satıra denk gelir:

  1. genel değişkenler (en başta): tanımla: tam sayı (int) lightValue = 0 ve tanımla: tam sayı (int) brightness = 0
  2. kurulum (bir kez çalışır): seri portu 9600 baud ile başlat, ardından 9 numaralı pini ÇIKIŞ olarak ayarla
  3. sürekli tekrarla: lightValue değişkenine (analog oku A0) ata
  4. eğer (lightValue < 400) yap: brightness değişkenine (lightValue değerini eşle: 0 – 400 → 255 – 0) ata; değilse: brightness değişkenine 0 ata
  5. 9 numaralı pine PWM brightness yaz
  6. seri porta yaz "Light: " aynı satırda kal, seri porta yaz lightValue aynı satırda kal, seri porta yaz " PWM: " aynı satırda kal, seri porta yaz brightness alt satıra geç
  7. 200 ms bekle
C++ (Arduino IDE)
1// ─────────────────────────────────────────
2//   BlueGrays · bluegrays.com
3//   Işığa göre kısılan gece lambası / Dimming night light
4// ─────────────────────────────────────────
5
6int lightValue = 0;   // LDR okuması / LDR reading (0-1023)
7int brightness = 0;   // LED parlaklığı / LED brightness (0-255)
8
9void setup() {
10  Serial.begin(9600);   // Seri port 9600 baud / Serial at 9600 baud
11  pinMode(9, OUTPUT);   // LED, PWM pini D9 / LED on PWM pin D9
12}
13
14void loop() {
15  lightValue = analogRead(A0);   // Az ışık = küçük değer / Little light = small value
16
17  if (lightValue < 400) {
18    // Karanlık arttıkça LED parlar / The darker it gets, the brighter the LED
19    brightness = map(lightValue, 0, 400, 255, 0);
20  } else {
21    brightness = 0;   // Oda aydınlık, LED kapalı / Room is bright, LED off
22  }
23
24  analogWrite(9, brightness);   // PWM 0-255 / PWM 0-255
25
26  Serial.print("Light: ");
27  Serial.print(lightValue);
28  Serial.print("  PWM: ");
29  Serial.println(brightness);
30
31  delay(200);   // 0,2 sn bekle / Wait 0.2 s
32}
33
MicroPython
1# ─────────────────────────────────────────
2#   BlueGrays · bluegrays.com
3#   Işığa göre kısılan gece lambası / Dimming night light
4# ─────────────────────────────────────────
5from machine import Pin, ADC, PWM
6import time
7
8ldr = ADC(26)                # GP26 = ADC0 / GP26 = ADC0
9led = PWM(Pin(15))           # LED, GP15 / LED on GP15
10led.freq(1000)               # PWM frekansı 1000 Hz / PWM frequency 1000 Hz
11
12THRESHOLD = 25600            # Uno'daki 400'ün karşılığı / Same as 400 on the Uno
13
14
15def arduino_map(x, in_min, in_max, out_min, out_max):
16    # Arduino map() ile aynı hesap / Same math as Arduino map()
17    return (x - in_min) * (out_max - out_min) // (in_max - in_min) + out_min
18
19
20while True:
21    light_value = ldr.read_u16()          # 0-65535 / 0-65535
22
23    if light_value < THRESHOLD:
24        # Karanlık arttıkça LED parlar / The darker it gets, the brighter the LED
25        brightness = arduino_map(light_value, 0, THRESHOLD, 65535, 0)
26    else:
27        brightness = 0                    # Oda aydınlık, LED kapalı / Room is bright, LED off
28
29    led.duty_u16(brightness)              # PWM 0-65535 / PWM 0-65535
30
31    print("Light:", light_value, " PWM:", brightness)
32
33    time.sleep(0.2)                       # 0,2 sn bekle / Wait 0.2 s
34

İki kodu satır satır karşılaştırınca tablodaki farkların hepsi görünür. C++'taki setup() Python'da while True'dan önceki satırlardır ve Serial.begin() hiç yoktur. analogRead(A0) yerine ADC(26).read_u16() gelir ve aralık 0–1023'ten 0–65535'e çıkar; bu yüzden eşik 400 yerine 25600'dür. analogWrite(9, …) yerine önce PWM nesnesi kurulur, parlaklık duty_u16() ile 0–65535 arasında verilir. map() hazır olmadığı için arduino_map() işlevi yazılır; içindeki // tam bölme, C++'taki tam sayı bölmesinin aynısıdır. Dört ayrı Serial.print() yerine tek bir print() yeter, delay(200) da time.sleep(0.2) olur.

Üçüncü aşamayı bu örnekle hemen dene: Uno'da eşiği 400'den 600'e çıkar, LED daha erken yanmaya başlasın. Aynı değişikliği Pico'da yapmak için THRESHOLD değerini yaklaşık 38400 yap. Seri Monitör'de (9600 baud) ya da Thonny'nin kabuğunda Light değerini izleyerek odana uygun eşiği bul.

Blok kodlamadan Arduino C++'a geçiş, yeni bir şey ezberlemekten çok zaten bildiğin blokların yazılı hâlini tanımaktır. Bu tabloyu yanında tut, her projede önce yan yana oku, sonra blokları kapatıp kendin yaz. Tablodaki satırları gerçek projelerde görmek istersen BlueGrays uygulamasında blok görünümü olan projeleri açıp Bloklarla göster anahtarıyla aynı programın iki hâli arasında geçiş yapabilirsin.

Sıkça sorulan sorular

Blok kodlamadan sonra hangi dili öğrenmeliyim: C++ mı, Python mu?

Elindeki karta göre seç. Arduino Uno ve ESP32 projelerinin çoğu Arduino C++ ile yazılır; Raspberry Pi Pico'da MicroPython yaygındır. Blokların mantığı ikisinde de aynıdır, bu yüzden birini öğrendikten sonra diğerine geçmek çok daha kısa sürer.

Blok kodlamadan Arduino koduna geçmek ne kadar sürer?

Kişiye göre değişir, ama haftada birkaç proje üzerinde düzenli çalışan biri birkaç hafta içinde kısa programları okuyup küçük değişiklikler yapabilir. Önce kodu blokların yanında okumak, sonra tek bir değeri değiştirmek, en sonda yeni satır eklemek geçişi kolaylaştırır.

Arduino Uno'yu Python ile programlayabilir miyim?

Arduino Uno MicroPython çalıştıramaz; Uno, Arduino IDE'de C++ ile programlanır. MicroPython için Raspberry Pi Pico gibi daha güçlü bir kart gerekir. Bilgisayarda çalışan bir Python programıyla Uno'ya seri porttan komut göndermek ise mümkündür.

BlueGrays'te blokları düzenleyip karta yükleyebilir miyim?

Hayır. BlueGrays'teki bloklar okumak ve kodu anlamak içindir; uygulamada blok düzenlenmez ve karta yüklenmez. Karta yüklenen her zaman projenin gerçek kodudur ve onu Arduino IDE ya da Thonny ile yüklersin.

Blok kodlama ile yazılan program gerçek kod mu?

Bloklar gerçek kodun görsel hâlidir; her blok bir ya da birkaç kod satırına karşılık gelir. BlueGrays'te blok görünümü olan projelerde bloklar ile karta yüklenen Arduino C++ ya da MicroPython kodu aynı programı anlatır.

digitalRead neden 1 ya da 0 döndürür, HIGH ile 1 aynı mı?

Evet, Arduino'da HIGH 1'e, LOW 0'a eşittir ve digitalRead yalnız bu iki değerden birini döndürür. INPUT_PULLUP ile bağlanan bir buton basılıyken LOW, bırakılmışken HIGH okunur. MicroPython'da pin.value() de aynı şekilde 1 ya da 0 verir.

Tüm projeleri gör
Buzzer İle Frekans Ayarı
#14Orta

Buzzer İle Frekans Ayarı

Dört butonla bir buzzer'dan çıkan sesi yönetirsin: biri sesi başlatır, biri susturur, diğer ikisi sesi inceltip kalınlaştırır. Artırma ya da azaltma butonunu basılı tuttukça ses adım adım değişir ve s

4.6(69)
118
Ldr İle Gece Lambası
#12Başlangıç

Ldr İle Gece Lambası

Hava karardığında kendiliğinden yanan, sabah olunca sönen küçük bir gece lambası. Işık sensörü odadaki aydınlığı ölçer; Arduino ortam yeterince karanlıksa LED'i yakar, aydınlanınca söndürür. Sokak lam

4.8(102)
205
Ldr İle Işık Şiddeti Okuma
#11Başlangıç

Ldr İle Işık Şiddeti Okuma

Odanın ne kadar aydınlık olduğunu sayıyla görmek ister misin? Işığa duyarlı küçük bir parça olan LDR ortam ışığını ölçer ve Arduino bu değeri yarım saniyede bir bilgisayar ekranına yazar. Elinle üstün

4.6(81)
139
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
Buton İle Led Yakma (On Off)
#10Başlangıç

Buton İle Led Yakma (On Off)

Bir butona bir kez basınca ışık yanar, bir daha basınca söner; tıpkı odandaki lamba düğmesi gibi. Arduino her basışı fark edip LED'in durumunu tersine çevirir, düğme içindeki minik titreşimler ışığı k

4.8(100)
167
Hız Ayarlı Yürüyen Led
#7Orta

Hız Ayarlı Yürüyen Led

Altı LED sırayla yanıp söner ve ışık sanki bir uçtan öbür uca koşar. Potansiyometrenin düğmesini çevirdikçe bu koşunun hızı anında değişir: bir yöne çevirince ışık uçar, öbür yöne çevirince her LED bi

4.6(72)
146
HC-SR04 Mesafe Ölçme (Serial Ekran)
#27Başlangıç

HC-SR04 Mesafe Ölçme (Serial Ekran)

Yarasalar karanlıkta yollarını nasıl buluyorsa HC-SR04 sensörü de öyle çalışır: duyamadığın bir ses gönderir, yankısını dinler ve önündeki cismin ne kadar uzakta olduğunu ölçer. Arduino bu mesafeyi sa

4.6(46)
71
Raspberry Pi Pico Harici LED Yakma (Breadboard)
#148Başlangıç

Raspberry Pi Pico Harici LED Yakma (Breadboard)

Pico'nun dahili LED'inden sonraki adım: breadboard'a harici LED bağlayıp GP14 pini üzerinden kontrol etmek. Bu proje ile Pico'nun herhangi bir genel amaçlı GPIO pinini output olarak nasıl kullanacağını, LED'in polaritesini (uzun bacak = anot/+, kısa bacak = katot/–) ve neden akım sınırlama direnci (220Ω) şart olduğunu öğreniyorsun. Direnci koymazsan LED'e aşırı akım gider ve yanabilir. Devre çok basit: Pico GP14 → 220Ω direnç → LED (+) → LED (–) → Pico GND. Wokwi'de simüle edebilir, gerçek bread

4.5(2)
7