Rehberler · 13 dk okuma

Raspberry Pi Pico W Wi-Fi: MicroPython ile Web Sunucu Kurulumu

Raspberry Pi Pico W Wi-Fi rehberi: doğru UF2, network.WLAN ve durum kodları, LED aç/kapa web sunucu, canlı sensör sayfası, urequests ile API, NTP saat.

Raspberry Pi Pico W ile Wi-Fi kullanmak, telefonundan kontrol edebileceğin küçük bir cihaz yapmanın en ucuz ve en kolay yollarından biridir. Pico W, bildiğin Raspberry Pi Pico'ya 2,4 GHz Wi-Fi ve Bluetooth ekleyen sürümdür: MicroPython'da birkaç satır kodla ev ağına bağlanır, kendi web sayfasını yayınlar, internetten hava durumu ve saat bilgisi çeker. Bu rehberde Pico W'yi sıfırdan Wi-Fi'ye bağlayacak, telefonundan LED yakan bir web sunucusu kuracak, ardından sensör verisini canlı gösteren bir sayfa yapacaksın.

Yazının sonunda doğru UF2 dosyasını seçmeyi, network.WLAN ile bağlanıp durum kodlarını okumayı, urequests ile bir API'den veri almayı, NTP ile saati ayarlamayı ve aynı işi Arduino IDE ile yapmayı öğrenmiş olacaksın. Pico'ya yeniysen önce Raspberry Pi Pico Nedir? yazısına göz atman işini kolaylaştırır; MicroPython'un temel komutları için de MicroPython Nedir? rehberine bakabilirsin.

Raspberry Pi Pico WH: Wi-Fi'li ve pinleri lehimli Pico W
Raspberry Pi Pico WH: metal kapağın altında Infineon CYW43439 kablosuz yongası, kartın USB'ye karşı ucunda ise PCB anten bulunur. Adın sonundaki "H" pinlerin lehimli geldiğini gösterir.

Raspberry Pi Pico W nedir, Pico'dan farkı ne?

Pico W, Pico ile aynı RP2040 işlemcisini, aynı boyutu ve aynı 40 pinlik düzeni kullanır. Farkı, karta eklenen Infineon CYW43439 kablosuz yongasıdır: 802.11n standardında 2,4 GHz Wi-Fi ve Bluetooth 5.2 sağlar. İşlemci bu yongayla kartın içindeki bir SPI hattı üzerinden konuşur; sen yalnızca MicroPython'daki network modülünü kullanırsın. Raspberry Pi daha sonra RP2350 işlemcili Pico 2 W'yi çıkardı; kablosuz yonga aynı olduğu için bu yazıdaki kodların hepsi orada da çalışır.

ÖzellikPico WPico 2 WESP32 (WROOM-32)
İşlemciRP2040, çift çekirdek Cortex-M0+, 133 MHzRP2350, çift çekirdek Cortex-M33 (ya da RISC-V), 150 MHzXtensa LX6, çift çekirdek, 240 MHz
RAM264 KB520 KB520 KB
Flaş bellek2 MB4 MBGenellikle 4 MB
Wi-Fi2,4 GHz, 802.11n (CYW43439)2,4 GHz, 802.11n (CYW43439)2,4 GHz, 802.11 b/g/n (yonga içinde)
Bluetooth5.2 (Classic ve BLE)5.2 (Classic ve BLE)4.2 (Classic ve BLE)
Analog giriş3 kanal, 12 bit3 kanal, 12 bit18 kanal, 12 bit
MicroPython dosyasıRPI_PICO_W (.uf2)RPI_PICO2_W (.uf2)ESP32_GENERIC (.bin)

ESP32 kâğıt üstünde daha hızlıdır ve Arduino dünyasında daha fazla örneğe sahiptir. Pico W'nin artısı ise MicroPython desteğinin resmî ve olgun olması, belgelerinin düzenli olması ve pinlerinde "açılışta şu seviyede olmalı" gibi tuzaklar bulunmamasıdır. Python ile öğrenmeyi seviyorsan Pico W harika bir seçimdir; Arduino kodu ve hazır kütüphaneler senin için öncelikliyse ESP32 daha rahat olabilir. İki kart arasında kararsızsan Arduino mu ESP32 mi? karşılaştırması da yol gösterir.

Pico W'nin kablosuz yongası ve pin farkları

Pico W'nin dışarıya açılan pinleri Pico ile birebir aynıdır: GP0–GP22 ve GP26–GP28 serbestçe kullanılabilir, analog girişler yine GP26, GP27 ve GP28'dedir. Değişen, kartın içinde kalan dört pindir. Pico'da dahili LED, güç modu ve USB algılama için kullanılan bu pinler Pico W'de kablosuz yongayla haberleşmeye ayrılmıştır; LED de doğrudan kablosuz yongaya bağlanmıştır. Kartın tam pin haritasını Pinout aracında görebilirsin.

İç pinPico'daki göreviPico W'deki görevi
GP23Güç kaynağı modu (SMPS)Kablosuz yongayı açma (WL_ON)
GP24USB gerilimini algılama (VBUS)Kablosuz veri ve kesme hattı (WL_D)
GP25Dahili LEDKablosuz yonga seçimi (WL_CS)
GP29VSYS gerilimini ölçme (ADC3)Kablosuz saat hattı (WL_CLK) ve VSYS ölçümü
Dahili LEDGP25: Pin(25)Kablosuz yonganın WL_GPIO0 ucu: Pin("LED")
Pico W'de dahili LED'i Pin(25) ile yakmaya çalışma; bu pin artık kablosuz yonganın seçim hattıdır. Doğru yazım Pin("LED", Pin.OUT) şeklindedir ve aynı satır Pico, Pico W ve Pico 2 W'de çalışır. Ayrıca kartın ucundaki anten bölgesinin altına ve yakınına metal, pil ya da kablo yığını koyma; anten engellenirse sinyal belirgin şekilde zayıflar.

1. Adım: Pico W için doğru UF2 dosyasını yüklemek

En sık yapılan hata, Pico W'ye düz Pico'nun MicroPython dosyasını yüklemektir. Bu durumda kart çalışır, Thonny'nin Shell bölümünde komut istemini görürsün; ama import network yazdığında "ImportError: no module named 'network'" hatası alırsın, çünkü düz Pico sürümünde kablosuz sürücü yoktur. Her kartın kendi UF2 dosyası vardır:

KartMicroPython UF2 dosyasıBOOTSEL ile görünen disk
Raspberry Pi PicoRPI_PICO-….uf2RPI-RP2
Raspberry Pi Pico W / WHRPI_PICO_W-….uf2RPI-RP2
Raspberry Pi Pico 2RPI_PICO2-….uf2RP2350
Raspberry Pi Pico 2 WRPI_PICO2_W-….uf2RP2350
  1. micropython.org sitesinin indirme sayfasında RPI_PICO_W (Pico 2 W için RPI_PICO2_W) kartını bul ve en güncel kararlı, yani "preview" yazmayan .uf2 dosyasını indir.
  2. Pico W'nin üzerindeki BOOTSEL düğmesine basılı tutarken USB veri kablosunu bilgisayara tak, sonra düğmeyi bırak.
  3. Bilgisayarda RPI-RP2 adlı bir disk açılır. İndirdiğin dosyayı bu diske sürükle; kopyalama bitince disk kendiliğinden kaybolur ve kart MicroPython ile yeniden başlar.
  4. Thonny'yi aç ve sağ alttaki yorumlayıcı menüsünden MicroPython (Raspberry Pi Pico) seç. İstersen Thonny'nin "Install or update MicroPython" penceresinden Pico W / Pico WH varyantını seçerek aynı kurulumu tek tıkla da yapabilirsin.
  5. Shell'e import network yaz. Hata almıyorsan kablosuz destekli doğru firmware yüklüdür.
Hangi kartı ve hangi sürümü kullandığından emin değilsen Shell'e import os; print(os.uname()) yaz. Çıktının machine alanında "Raspberry Pi Pico W with RP2040" görüyorsan doğru yoldasın; release alanı ise MicroPython sürümünü gösterir. Firmware'i güncellemek için aynı UF2 adımlarını tekrarlaman yeterlidir; Pico'ya kaydettiğin dosyalar genellikle silinmez.

2. Adım: network.WLAN ile Wi-Fi'ye bağlanmak

Pico W'nin iki kablosuz arayüzü vardır: WLAN.IF_STA (istasyon) modunda evindeki modeme bir telefon gibi bağlanır, WLAN.IF_AP (erişim noktası) modunda ise kendi Wi-Fi ağını kurar. İstasyon moduyla başlayalım. Aşağıdaki kodu Thonny'de yeni bir dosyaya yapıştır, ağ adını ve şifreni yaz ve Pico'ya wifi.py adıyla kaydet. Sonraki bütün örnekler bu dosyayı import wifi ile kullanacak; böylece şifreni tek bir yerde tutmuş olursun. MicroPython 1.24'ten eski bir sürüm kullanıyorsan bu sabitleri network.STA_IF ve network.AP_IF olarak yaz; eski adlar yeni sürümlerde de çalışır.

Python
1# wifi.py: Pico W'ye bu adla kaydet / save it to the Pico W with this name
2import network
3import time
4
5SSID = "AgAdi"            # Wi-Fi adın / your Wi-Fi name
6PASSWORD = "Sifre123"     # Wi-Fi şifren / your Wi-Fi password
7HOSTNAME = "picow"        # http://picow.local adresi için / for http://picow.local
8
9STATUS = {
10    0: "Boşta / idle",
11    1: "Ağa katılıyor / joining",
12    2: "IP bekleniyor / waiting for IP",
13    3: "Bağlandı / connected",
14    -1: "Bağlantı başarısız / connection failed",
15    -2: "Ağ bulunamadı / network not found",
16    -3: "Şifre hatalı / wrong password",
17}
18
19
20def connect(timeout=20):
21    network.country("TR")             # ülke kodu / country code
22    network.hostname(HOSTNAME)        # ağdaki adı / name on the network
23    wlan = network.WLAN(network.WLAN.IF_STA)
24    wlan.active(True)
25    wlan.config(pm=network.WLAN.PM_NONE)   # güç tasarrufunu kapat / disable power saving
26    if not wlan.isconnected():
27        wlan.connect(SSID, PASSWORD)
28        for _ in range(timeout):
29            code = wlan.status()
30            print(code, STATUS.get(code, "?"))
31            if code < 0 or code == 3:
32                break
33            time.sleep(1)
34    if wlan.status() != 3:
35        raise RuntimeError("Wi-Fi: " + STATUS.get(wlan.status(), "?"))
36    print("IP:", wlan.ifconfig()[0])
37    return wlan
38
39
40if __name__ == "__main__":
41    connect()

Kodun önemli satırlarına bakalım. network.country("TR") kablosuz yongaya hangi ülkenin kanal kurallarına uyacağını söyler; bunu yapmazsan bazı modemlerin kullandığı 12 ve 13. kanallardaki ağları görmekte zorlanabilirsin (eski firmware'lerde aynı iş rp2.country("TR") ile yapılır). wlan.config(pm=network.WLAN.PM_NONE) güç tasarrufunu kapatır (eski örneklerde aynı ayar pm=0xa11140 olarak geçer): Pico W varsayılan olarak enerji tasarrufu yapar ve bu, web sunucusunun geç cevap vermesine ya da bağlantının saatler sonra kopmasına yol açabilir. Döngü her saniye durum kodunu yazdırır; 3'e ulaşınca ya da negatif bir hata kodu gelince durur. Böylece kart sonsuza kadar beklemez, sorunun ne olduğunu da ekranda görürsün.

wlan.status() durum kodları ne anlama gelir?

Bağlantı sorunlarının çoğu, wlan.status() fonksiyonunun döndürdüğü sayıya bakarak birkaç saniyede çözülür. MicroPython bu sayılar için network modülünde hazır sabitler de sunar; ikisini de aşağıdaki tabloda bulabilirsin:

KodSabitAnlamıNe yapmalısın?
0STAT_IDLEBağlantı yok, işlem başlamadıwlan.active(True) ve wlan.connect() çağrıldığından emin ol
1STAT_CONNECTINGAğa katılıyorBirkaç saniye bekle
2(sabiti yok)Ağa katıldı, modemden IP adresi bekliyorUzun sürerse modemin DHCP ayarını kontrol et
3STAT_GOT_IPBağlandı ve IP adresi aldıHazırsın
-1STAT_CONNECT_FAILBağlantı başarısızSinyali ve beslemeyi kontrol et, yeniden dene
-2STAT_NO_AP_FOUNDAğ bulunamadıAğ adını, 2,4 GHz bandını ve mesafeyi kontrol et
-3STAT_WRONG_PASSWORDKimlik doğrulama hatasıŞifreyi büyük-küçük harfe dikkat ederek yeniden yaz

-2 kodunu alıyorsan Pico W ağını göremiyor demektir. Çevredeki ağları listelemek sorunu hemen ortaya çıkarır: ağın listede yoksa ya 5 GHz'te yayın yapıyordur ya da sinyal çok zayıftır. RSSI değeri -70 dBm'den iyiyse (örneğin -55 dBm) sinyal rahattır; -80 dBm civarında bağlantı kopmaya başlar.

Python
1import network
2
3wlan = network.WLAN(network.WLAN.IF_STA)
4wlan.active(True)
5for ssid, bssid, channel, rssi, security, hidden in wlan.scan():
6    print(ssid.decode(), "| kanal / channel:", channel, "| RSSI:", rssi, "dBm")
Pico W yalnızca 2,4 GHz ağlara bağlanır. Modemin iki bandı aynı adla yayınlıyorsa ve bağlantı kurulamıyorsa telefonunun kişisel erişim noktasını (hotspot) 2,4 GHz'e ayarlayıp onunla dene; orada çalışıyorsa sorun koddan değil modem ayarlarındandır. Okul ve iş yerlerindeki kullanıcı adı isteyen (WPA2-Enterprise) ağlar Pico W'de desteklenmez. Daha fazla ipucu için ESP32 Wi-Fi Bağlanmıyor yazısındaki kontrol listesi Pico W için de geçerlidir.

3. Adım: MicroPython ile basit web sunucu (LED aç/kapa sayfası)

Şimdi Pico W'yi telefonundan açabileceğin küçük bir web sunucusuna çevirelim. Ek bir kütüphaneye gerek yok; MicroPython'daki socket modülü yeterli. Aşağıdaki kodu main.py adıyla kaydedip çalıştır. Shell'de görünen adresi (örneğin http://192.168.1.42) aynı Wi-Fi ağına bağlı telefonunun tarayıcısına yaz; sayfadaki AÇ ve KAPAT düğmeleri kartın üzerindeki LED'i yakıp söndürür.

MicroPython
1import socket
2from machine import Pin
3import wifi
4
5wlan = wifi.connect()
6led = Pin("LED", Pin.OUT)              # Pico W dahili LED / Pico W onboard LED
7led_on = False
8
9
10def page(on):
11    state = "AÇIK / ON" if on else "KAPALI / OFF"
12    return """<!DOCTYPE html>
13<html><head><meta charset="utf-8">
14<meta name="viewport" content="width=device-width, initial-scale=1">
15<title>Pico W LED</title></head>
16<body style="font-family:sans-serif;text-align:center">
17<h1>Pico W LED</h1>
18<p>Durum / State: <b>""" + state + """</b></p>
19<p><a href="/on"><button style="font-size:24px">AÇ / ON</button></a>
20<a href="/off"><button style="font-size:24px">KAPAT / OFF</button></a></p>
21</body></html>"""
22
23
24addr = socket.getaddrinfo("0.0.0.0", 80)[0][-1]
25server = socket.socket()
26server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)   # EADDRINUSE hatasını önler / prevents EADDRINUSE
27server.bind(addr)
28server.listen(2)
29print("Tarayıcıda aç / open in browser: http://" + wlan.ifconfig()[0])
30
31while True:
32    client, remote = server.accept()           # bir tarayıcı bekle / wait for a browser
33    try:
34        request = client.recv(1024)            # b"GET /on HTTP/1.1 ..."
35        parts = request.split(b" ")
36        path = parts[1] if len(parts) > 1 else b"/"
37        if path == b"/on":
38            led.on()
39            led_on = True
40        elif path == b"/off":
41            led.off()
42            led_on = False
43        if path in (b"/", b"/on", b"/off"):
44            client.sendall("HTTP/1.0 200 OK\r\nContent-Type: text/html; charset=utf-8\r\n\r\n")
45            client.sendall(page(led_on))
46        else:
47            client.sendall("HTTP/1.0 404 Not Found\r\n\r\n")   # ör. /favicon.ico / e.g. /favicon.ico
48    except OSError as e:
49        print("Bağlantı hatası / connection error:", e)
50    finally:
51        client.close()

Nasıl çalıştığına kısaca bakalım. bind ve listen ile Pico W 80 numaralı portu (HTTP) dinlemeye başlar, accept() ise bir tarayıcı bağlanana kadar bekler. Tarayıcının gönderdiği isteğin ilk satırı "GET /on HTTP/1.1" gibidir; kod bu satırı boşluklardan bölerek istenen adresi (/on) bulur ve LED'i ona göre ayarlar. Ardından önce HTTP başlığını ("HTTP/1.0 200 OK" ve içerik türü), sonra boş bir satırı, en son da HTML sayfasını gönderir ve bağlantıyı kapatır. Sayfadaki meta viewport satırı sayfanın telefonda düzgün ölçeklenmesini, charset=utf-8 ise Türkçe karakterlerin doğru görünmesini sağlar.

AdresNe yapar?
/Sayfayı ve LED'in son durumunu gösterir
/onLED'i yakar ve sayfayı yeniden gönderir
/offLED'i söndürür ve sayfayı yeniden gönderir
/favicon.ico ve diğerleri404 döner; tarayıcılar sekme simgesi için bu adresi kendiliğinden ister
Thonny'de kodu durdurup yeniden çalıştırdığında "OSError: [Errno 98] EADDRINUSE" hatası alabilirsin: önceki çalışmadan kalan soket 80 numaralı portu hâlâ tutuyordur. Koddaki SO_REUSEADDR satırı bunu çoğu zaman önler; yine de görürsen Shell'de Ctrl+D ile yazılımsal yeniden başlatma yap ya da kartın USB kablosunu çıkarıp yeniden tak.

LED yerine röle ya da harici LED bağlamak

Dahili LED ile denedikten sonra aynı sayfayla gerçek bir cihazı kontrol etmek için kodda yalnızca bir satırı değiştirirsin: Pin("LED", Pin.OUT) yerine örneğin Pin(16, Pin.OUT) yaz. Harici bir LED için doğru direnç değerini LED direnci aracıyla hesaplayabilirsin; 3,3 V'luk bir pin için 220–330 Ω yeterlidir. Röle modülü kullanacaksan modülü 5 V'luk VBUS pininden besle, IN ucunu GPIO'ya bağla. Birçok röle modülü LOW sinyalle çeker; bu durumda led.on() ve led.off() satırlarının yerini değiştirmen gerekir. Röle bağlantısının ayrıntıları için Röle Modülü Nedir? yazısına bakabilirsin.

ParçaParça piniPico W pini (fiziksel pin no.)
Harici LEDAnot (+), 220 Ω direnç üzerindenGP14 (19)
Harici LEDKatot (−)GND (18)
DHT22VCC / DATA / GND3V3(OUT) (36) / GP15 (20) / GND (38)
Röle modülüVCCVBUS, USB'den gelen 5 V (40)
Röle modülüINGP16 (21)
Röle modülüGNDGND (23)
Röleyle 220–230 V şebeke gerilimine bağlı bir lambayı kontrol edeceksen kabloları elektrik kesikken bağla, açıkta iletken bırakma ve devreyi kapalı bir kutuya yerleştir; şebeke gerilimi hayati tehlike taşır. Emin değilsen önce 12 V'luk bir LED şeritle dene. Bazı 5 V röle modülleri 3,3 V'luk sinyalle güvenilir çekmez; röle tıklamıyorsa araya bir transistör koy ya da 3,3 V uyumlu bir modül seç.

4. Adım: Sensör verisini web sayfasında canlı göstermek

LED sayfası her düğmeye basıldığında tamamen yeniden yükleniyordu. Ölçüm gösteren bir sayfada ise değerlerin sayfa yenilenmeden güncellenmesi çok daha şıktır. Bunun için iki adres kullanacağız: / adresi sayfanın kendisini, /data adresi ise yalnızca ölçümleri JSON biçiminde gönderir. Sayfadaki küçük JavaScript kodu iki saniyede bir /data adresini okuyup rakamları değiştirir. Örnek, ek parça gerektirmeyen dahili sıcaklık sensörünü ve Wi-Fi sinyal gücünü (RSSI) gösterir; sunucuyu da MicroPython'un asyncio modülüyle kurar, böylece Pico W istek beklerken ölçüm yapmaya da devam eder.

MicroPython
1import asyncio
2import json
3import time
4from machine import ADC, Pin
5import wifi
6
7wlan = wifi.connect()
8sensor = ADC(4)                        # dahili sıcaklık sensörü / internal temperature sensor
9led = Pin("LED", Pin.OUT)
10start = time.time()
11readings = {"temp": 0, "rssi": 0, "uptime": 0}
12
13HTML = """<!DOCTYPE html>
14<html><head><meta charset="utf-8">
15<meta name="viewport" content="width=device-width, initial-scale=1">
16<title>Pico W</title></head>
17<body style="font-family:sans-serif;text-align:center">
18<h1>Pico W</h1>
19<p>Sıcaklık / Temperature: <b id="t">-</b> °C</p>
20<p>Wi-Fi sinyali / signal: <b id="r">-</b> dBm</p>
21<p>Çalışma süresi / uptime: <b id="u">-</b> s</p>
22<script>
23async function update() {
24  try {
25    const d = await (await fetch("/data")).json();
26    document.getElementById("t").textContent = d.temp;
27    document.getElementById("r").textContent = d.rssi;
28    document.getElementById("u").textContent = d.uptime;
29  } catch (e) {}
30}
31update();
32setInterval(update, 2000);
33</script>
34</body></html>"""
35
36
37def read_temp():
38    volts = sensor.read_u16() * 3.3 / 65535
39    return round(27 - (volts - 0.706) / 0.001721, 1)
40
41
42async def measure():
43    while True:
44        readings["temp"] = read_temp()
45        readings["rssi"] = wlan.status("rssi")      # yalnız STA modunda / STA mode only
46        readings["uptime"] = time.time() - start
47        led.toggle()                                # kalp atışı / heartbeat
48        await asyncio.sleep(2)
49
50
51async def handle(reader, writer):
52    try:
53        line = await reader.readline()              # b"GET /data HTTP/1.1"
54        while True:                                 # başlıkları atla / skip the headers
55            header = await reader.readline()
56            if header in (b"\r\n", b""):
57                break
58        parts = line.split(b" ")
59        path = parts[1] if len(parts) > 1 else b"/"
60        if path == b"/":
61            writer.write(b"HTTP/1.0 200 OK\r\nContent-Type: text/html; charset=utf-8\r\n\r\n")
62            writer.write(HTML.encode())
63        elif path == b"/data":
64            writer.write(b"HTTP/1.0 200 OK\r\nContent-Type: application/json\r\n\r\n")
65            writer.write(json.dumps(readings).encode())
66        else:
67            writer.write(b"HTTP/1.0 404 Not Found\r\n\r\n")
68        await writer.drain()
69    except OSError as e:
70        print("Bağlantı hatası / connection error:", e)
71    finally:
72        writer.close()
73        await writer.wait_closed()
74
75
76async def main():
77    await asyncio.start_server(handle, "0.0.0.0", 80)
78    print("Tarayıcıda aç / open in browser: http://" + wlan.ifconfig()[0])
79    await measure()
80
81
82asyncio.run(main())

asyncio.start_server() her yeni tarayıcı bağlantısı için handle fonksiyonunu ayrı bir görev olarak çalıştırır; measure() görevi ise arka planda iki saniyede bir ölçüm yapıp dahili LED'i yakıp söndürür. LED'in yanıp sönmesinden kartın kilitlenmediğini de anlarsın. Dikkat: asyncio ile yazarken metinleri .encode() ile bayta çevirerek gönder, yoksa Türkçe karakterli sayfalarda hata alırsın. Dahili sıcaklık sensörü yonganın kendi sıcaklığını ölçtüğü için oda sıcaklığından birkaç derece farklı ve gürültülü değerler verir; koddaki 27 − (V − 0,706) / 0,001721 formülü RP2040 veri sayfasından gelir. Gerçek oda sıcaklığı için harici bir sensör kullanmalısın.

DHT22 (AM2302) sıcaklık ve nem sensörü modülü
DHT22 modülü üç pinlidir: VCC, DATA ve GND. Pin sırası üreticiye göre değişebileceği için kartın üzerindeki yazıyı oku; modül Pico W'nin 3,3 V'u ile doğrudan çalışır.

Gerçek sıcaklık ve nem için bir DHT22 bağla (DATA ucu GP15'e). DHT sensörlerinin sürücüsü Pico W firmware'inin içinde hazır gelir, ek dosya yüklemen gerekmez. Sensör kodundaki measure() fonksiyonunda readings["temp"] = read_temp() satırını aşağıdaki read_sensor() çağrısıyla değiştir ve HTML'e nem için bir satır daha ekle. DHT22 iki saniyeden sık okunmamalıdır; ölçüm döngüsü zaten bu hızda çalışıyor. Sensörün ayrıntıları için DHT11 Sıcaklık ve Nem Sensörü yazısına bakabilirsin.

MicroPython
1import dht
2from machine import Pin
3
4dht_sensor = dht.DHT22(Pin(15))        # DATA ucu GP15'te / DATA pin on GP15
5
6
7def read_sensor():
8    try:
9        dht_sensor.measure()            # ölçümü başlat / trigger a reading
10        readings["temp"] = dht_sensor.temperature()   # °C
11        readings["hum"] = dht_sensor.humidity()       # % bağıl nem / % relative humidity
12    except OSError as e:
13        print("DHT22 okunamadı / read failed:", e)

5. Adım: urequests ile API çağırmak (internetten veri çekmek)

Pico W yalnızca sunucu değil, istemci de olabilir: internetteki bir servise istek gönderip cevabını okuyabilir. Pico W firmware'inde requests modülü hazır gelir; eski örneklerde gördüğün urequests adı da aynı modüle yönlendiği için iki yazım da çalışır. Aşağıdaki örnek, anahtar (API key) gerektirmeyen ücretsiz Open-Meteo hava durumu servisinden İstanbul'un anlık sıcaklığını, nemini ve rüzgâr hızını alır. Kendi şehrin için LAT ve LON değerlerini değiştirmen yeterli.

Python
1import requests
2import wifi
3
4wifi.connect()
5
6# İstanbul; kendi konumunu yaz / Istanbul; put your own location
7LAT, LON = 41.01, 28.98
8URL = ("https://api.open-meteo.com/v1/forecast?latitude={}&longitude={}"
9       "&current=temperature_2m,relative_humidity_2m,wind_speed_10m").format(LAT, LON)
10
11response = requests.get(URL)
12try:
13    if response.status_code == 200:
14        current = response.json()["current"]
15        print("Sıcaklık / temperature:", current["temperature_2m"], "°C")
16        print("Nem / humidity:", current["relative_humidity_2m"], "%")
17        print("Rüzgâr / wind:", current["wind_speed_10m"], "km/h")
18    else:
19        print("HTTP hatası / HTTP error:", response.status_code)
20finally:
21    response.close()                   # soketi ve belleği serbest bırak / free the socket and memory

Bu kodda dikkat etmen gereken üç şey var. Birincisi, her cevaptan sonra response.close() çağır; kapatılmayan cevaplar soket ve bellek tüketir, birkaç istekten sonra "OSError: [Errno 12] ENOMEM" hatasıyla karşılaşırsın. İkincisi, response.json() cevabın tamamını belleğe alır; Pico W'de toplam 264 KB RAM olduğu için büyük JSON döndüren API'lerde yalnızca ihtiyaç duyduğun alanları isteyen adresler kullan (buradaki current parametresi gibi). Üçüncüsü, HTTPS bağlantısı şifreleme için ek bellek ister; döngü içinde düzenli istek atıyorsan aralarına gc.collect() eklemek bellek parçalanmasını azaltır. Aynı yöntemle Telegram'a mesaj gönderebilir, bir tabloya veri yazabilir ya da döviz kurunu çekebilirsin; Telegram tarafındaki bot kurulumu ESP32 Telegram Bot yazısındakiyle aynıdır.

6. Adım: NTP ile internetten doğru saat

Pico W'nin içinde bir gerçek zamanlı saat (RTC) vardır ama pil yedeği yoktur; kart her açıldığında saat 1 Ocak 2021'e döner. Wi-Fi'ye bağlıyken doğru saati internetteki NTP sunucularından almak çok kolaydır: firmware'deki ntptime modülünün settime() fonksiyonu dahili saati UTC olarak ayarlar. Türkiye yıl boyu UTC+3 kullandığı için yerel saati bulmak üzere 3 saat (10 800 saniye) eklemen yeterlidir.

Python
1import time
2import ntptime
3import wifi
4
5wifi.connect()
6ntptime.host = "pool.ntp.org"          # varsayılan sunucu / default server
7UTC_OFFSET = 3 * 3600                  # Türkiye UTC+3; kendi saat dilimini yaz / set your own time zone
8
9for attempt in range(5):
10    try:
11        ntptime.settime()              # dahili saati UTC'ye ayarlar / sets the internal clock to UTC
12        print("Saat ayarlandı / time set")
13        break
14    except OSError as e:
15        print("NTP hatası / NTP error:", e)
16        time.sleep(2)
17
18DAYS = ("Pzt/Mon", "Sal/Tue", "Çar/Wed", "Per/Thu", "Cum/Fri", "Cmt/Sat", "Paz/Sun")
19
20while True:
21    y, mo, d, h, mi, s, wd, yd = time.localtime(time.time() + UTC_OFFSET)
22    print("%02d.%02d.%d %s %02d:%02d:%02d" % (d, mo, y, DAYS[wd], h, mi, s))
23    time.sleep(1)

ntptime varsayılan olarak pool.ntp.org sunucusunu kullanır ve cevap için bir saniye bekler; cevap gelmezse "OSError: [Errno 110] ETIMEDOUT" hatası verir, bu yüzden kod beş kez dener. Dahili saat zamanla birkaç saniye kayabileceği için uzun süre çalışan projelerde settime() fonksiyonunu günde bir kez yeniden çağır. Yaz saati uygulanan ülkelerde fark yılda iki kez değişir; bunu kodda tarih kontrolüyle ayarlaman gerekir. Saati bir ekranda göstermek istersen OLED ekran ya da I2C LCD yazılarındaki MicroPython örneklerini bu kodla birleştirebilirsin; ESP32 tarafındaki karşılığı ise ESP32 NTP yazısında.

Kendi ağını kurmak (AP modu) ve picow.local adresi

Modem olmayan bir yerde, örneğin bir bilim fuarı standında ya da bahçede, Pico W kendi Wi-Fi ağını yayınlayabilir. Erişim noktası modunda telefonunu doğrudan "PicoW-BlueGrays" ağına bağlarsın ve sayfayı http://192.168.4.1 adresinden açarsın. Web sunucu kodları değişmeden çalışır; yalnızca wlan = wifi.connect() satırı yerine aşağıdaki satırları yazıp wlan = ap ekle. Şifre en az 8 karakter olmalıdır. Sensör örneğindeki RSSI satırı yalnızca istasyon modunda çalıştığı için AP modunda onu sil. Bu modda Pico W'nin internete erişimi olmaz, yani NTP ve API örnekleri çalışmaz.

Python
1import network
2
3ap = network.WLAN(network.WLAN.IF_AP)
4ap.config(ssid="PicoW-BlueGrays", password="bluegrays123")   # şifre en az 8 karakter / at least 8 characters
5ap.active(True)
6while not ap.active():
7    pass
8print("Ağ hazır / network ready:", ap.ifconfig()[0])          # genellikle 192.168.4.1 / usually 192.168.4.1

IP adresini her seferinde Shell'den okumak zahmetliyse bir isim kullanabilirsin. Güncel MicroPython sürümleri Pico W'de mDNS'i destekler: wifi.py'deki network.hostname("picow") satırı sayesinde kart ağda http://picow.local adıyla da bulunur. Bu adres Windows, macOS, Linux ve iPhone'larda genellikle çalışır; bazı Android telefonlarda .local adresleri açılmayabilir, o zaman IP adresini kullan. IP adresinin hiç değişmemesini istiyorsan en güvenilir yol, modeminin arayüzünden Pico W'nin MAC adresine sabit IP (DHCP rezervasyonu) atamaktır.

Pico 2 W notu: neler değişiyor?

Pico 2 W, Pico W ile aynı boyutta ve aynı pin dizilimindedir; aynı CYW43439 kablosuz yongasını kullanır, işlemcisi ise daha hızlı RP2350'dir. Yazılım tarafındaki tek fark doğru firmware'dir: micropython.org'dan RPI_PICO2_W dosyasını indirmelisin, BOOTSEL ile bağladığında da disk RP2350 adıyla görünür. Bu yazıdaki bütün MicroPython kodları değişmeden çalışır. 520 KB RAM sayesinde HTTPS istekleri, büyük JSON cevapları ve uzun HTML sayfaları Pico 2 W'de çok daha rahat sığar. Arduino IDE'de kart olarak Raspberry Pi Pico 2W seçilir. Bir not: RP2350'nin ilk sürümlerinde dahili pull-down dirençleriyle ilgili bilinen bir yonga hatası (E9) vardır; buton bağlarken GND'ye bağlayıp PULL_UP kullanmak en sorunsuz yoldur. İki çekirdek ve PIO gibi gelişmiş özellikler için Pico PIO ve iki çekirdek yazısına bakabilirsin.

Alternatif: Pico W'yi Arduino IDE (arduino-pico) ile programlamak

C++ ve Arduino kütüphaneleri sana daha tanıdık geliyorsa Pico W'yi Earle Philhower'ın arduino-pico paketiyle Arduino IDE'den programlayabilirsin. Bu paket ESP32'dekilere uyumlu WiFi ve WebServer kütüphaneleriyle gelir; yani ESP32 için yazılmış web sunucu kodları küçük değişikliklerle Pico W'de çalışır.

  1. Arduino IDE'de Dosya > Tercihler menüsündeki "Ek kart yöneticisi URL'leri" alanına https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json adresini ekle.
  2. Kart Yöneticisi'nde pico ara ve Earle F. Philhower'ın Raspberry Pi Pico/RP2040/RP2350 paketini kur.
  3. Araçlar > Kart menüsünden Raspberry Pi Pico W (Pico 2 W için Raspberry Pi Pico 2W) seç.
  4. İlk yüklemede BOOTSEL düğmesine basılı tutarak kartı bağla; Arduino IDE kartı UF2 diski olarak bulur. Sonraki yüklemelerde Araçlar > Port menüsünde görünen seri portu seçmen yeterlidir.
  5. Kodu yükledikten sonra Seri Monitör'ü 115200 baud hızında aç ve IP adresini oku.
C++ (Arduino IDE)
1#include <WiFi.h>
2#include <WebServer.h>
3#include <LEAmDNS.h>
4
5const char* ssid = "AgAdi";          // Wi-Fi adın / your Wi-Fi name
6const char* password = "Sifre123";   // Wi-Fi şifren / your Wi-Fi password
7
8WebServer server(80);
9bool ledOn = false;
10
11void sendPage() {
12  String html = "<!DOCTYPE html><html><head><meta charset='utf-8'>"
13                "<meta name='viewport' content='width=device-width, initial-scale=1'>"
14                "<title>Pico W</title></head>"
15                "<body style='font-family:sans-serif;text-align:center'><h1>Pico W LED</h1>";
16  html += "<p>Durum / State: <b>";
17  html += ledOn ? "AÇIK / ON" : "KAPALI / OFF";
18  html += "</b></p><p><a href='/on'><button>AÇ / ON</button></a> ";
19  html += "<a href='/off'><button>KAPAT / OFF</button></a></p>";
20  html += "<p>Sıcaklık / Temp: ";
21  html += String(analogReadTemp(), 1);   // dahili sensör / internal sensor
22  html += " °C</p></body></html>";
23  server.send(200, "text/html", html);
24}
25
26void setup() {
27  Serial.begin(115200);
28  pinMode(LED_BUILTIN, OUTPUT);          // Pico W'de kablosuz yongadaki LED / the LED on the wireless chip
29  WiFi.mode(WIFI_STA);
30  WiFi.begin(ssid, password);
31  while (WiFi.status() != WL_CONNECTED) {
32    delay(500);
33    Serial.print(".");
34  }
35  Serial.println();
36  Serial.print("IP: ");
37  Serial.println(WiFi.localIP());        // bu adresi telefonda aç / open this address on your phone
38
39  MDNS.begin("picow");                   // http://picow.local
40  server.on("/", sendPage);
41  server.on("/on", []() { ledOn = true;  digitalWrite(LED_BUILTIN, HIGH); sendPage(); });
42  server.on("/off", []() { ledOn = false; digitalWrite(LED_BUILTIN, LOW);  sendPage(); });
43  server.onNotFound([]() { server.send(404, "text/plain", "404"); });
44  server.begin();
45}
46
47void loop() {
48  server.handleClient();
49  MDNS.update();
50}

Bu kod MicroPython'daki LED sayfasının aynısını yapar, sayfaya da analogReadTemp() ile okunan dahili sıcaklığı ekler. LED_BUILTIN, Pico W'de kablosuz yongaya bağlı LED'i otomatik olarak yönetir; MDNS.begin("picow") satırı sayesinde sayfa http://picow.local adresinden de açılır. Wi-Fi sürücüsü derlenen programa yaklaşık 220 KB ekler, bu yüzden ilk derleme biraz uzun sürebilir. MicroPython ile Arduino arasında seçim yaparken şunu düşün: MicroPython'da kodu kaydedip anında denersin; Arduino'da derlemeyi beklersin ama daha hızlı çalışan kod ve geniş kütüphane desteği elde edersin.

Raspberry Pi Pico W ile proje fikirleri

  • Wi-Fi termometre: DHT11 ya da DHT22 ile ölçtüğün sıcaklık ve nemi telefondan izle.
  • Telefonla lamba: Bu yazıdaki LED sayfasına bir röle modülü ekleyerek masa lambasını aç-kapa.
  • Bitki nem takibi: Toprak nem sensörü değerini sayfada göster, toprak kuruyunca uyarı ver.
  • Hareket bildirimi: PIR sensörü birini algılayınca urequests ile telefonuna Telegram mesajı gönder.
  • İnternet saati: NTP'den aldığın saati bir OLED ekranda tarih ve gün adıyla göster.
  • Ev otomasyonu: mip ile umqtt.simple kütüphanesini kurup ölçümleri MQTT üzerinden Home Assistant'a gönder; mantığı ESP32 MQTT yazısında anlatılıyor.
  • Gerçek zamanlı kontrol paneli: Daha hızlı güncellenen sayfalar için WebSocket kullanan ESP32 async web sunucu yazısındaki fikirleri Pico W'ye uyarla.

Sık yapılan hatalar ve çözümleri

Belirti ya da hataSebepÇözüm
ImportError: no module named 'network'Pico W'ye düz Pico firmware'i yüklenmişRPI_PICO_W (Pico 2 W için RPI_PICO2_W) UF2 dosyasını yükle
wlan.status() sürekli -2Ağ görünmüyor: 5 GHz, yanlış ağ adı ya da zayıf sinyal2,4 GHz bandını aç, wlan.scan() ile ağı ara, kartı modeme yaklaştır
wlan.status() -3Şifre yanlışŞifreyi büyük-küçük harf ve boşluklara dikkat ederek yeniden yaz
OSError: [Errno 98] EADDRINUSEÖnceki sunucu soketi 80 numaralı portu tutuyorSO_REUSEADDR kullan, Ctrl+D ile yeniden başlat
Telefonda sayfa açılmıyorTelefon mobil veride, misafir ağında ya da modemde istemci yalıtımı açıkTelefonu aynı Wi-Fi'ye bağla, adresi https değil http ile yaz
OSError: -2 (urequests)Alan adı çözülemedi: Wi-Fi bağlı değil ya da DNS sorunu varÖnce wifi.connect() çağır, adresi kontrol et
OSError: [Errno 12] ENOMEMBellek dolduresponse.close() ve gc.collect() kullan, daha küçük cevap iste
Saatler sonra bağlantı kopuyorGüç tasarrufu ya da modemin yeniden başlamasıpm=network.WLAN.PM_NONE kullan, döngüde wlan.isconnected() kontrol edip yeniden bağlan
Bilgisayardan ayırınca çalışmıyorKod main.py olarak kaydedilmemiş ya da wifi.py Pico'da yokİki dosyayı da Pico'ya kaydet
Bu yazıdaki sunucular şifresiz ve HTTPS'sizdir; aynı ağa bağlı herkes sayfayı açabilir. Ev ağında denemek için bu yeterlidir, ama modeminde port yönlendirme yaparak Pico W'yi doğrudan internete açma. Dışarıdan erişim gerekiyorsa MQTT ya da Telegram gibi aracı bir servis kullanmak çok daha güvenlidir. Kodunu paylaşırken de wifi.py'deki Wi-Fi şifreni silmeyi unutma.

Raspberry Pi Pico W ile Wi-Fi'ye bağlanmak, web sayfası yayınlamak ve internetten veri çekmek gördüğün gibi birkaç dosyalık bir iş: wifi.py bağlantıyı, main.py ise projenin kendisini yönetir. Pico'nun temellerini pekiştirmek istersen BlueGrays uygulamasında Raspberry Pi Pico ile LED yakma, trafik lambası, PWM ve RGB LED projelerini; ESP32 tarafında da Wi-Fi bağlantısı, async web sunucu, NTP saat ve hava durumu API projelerini devre şemaları ve kodlarıyla adım adım bulabilirsin.

Sıkça sorulan sorular

Raspberry Pi Pico W 5 GHz Wi-Fi'ye bağlanır mı?

Hayır. Pico W ve Pico 2 W'deki CYW43439 yongası yalnızca 2,4 GHz bandında çalışır ve 5 GHz ağları göremez. Modeminin 2,4 GHz bandının açık olduğundan emin ol; iki bant aynı adla yayınlanıyorsa ve sorun yaşıyorsan 2,4 GHz bandına ayrı bir ad vermek işe yarar.

Pico W'ye MicroPython nasıl yüklenir?

micropython.org'dan RPI_PICO_W kartına ait .uf2 dosyasını indir. BOOTSEL düğmesine basılı tutarak Pico W'yi bilgisayara bağla ve açılan RPI-RP2 diskine dosyayı sürükle. Kart yeniden başlar ve Thonny ile kullanıma hazır olur; Thonny'nin "Install or update MicroPython" penceresi de aynı işi yapar.

Pico W'nin IP adresini nasıl bulurum?

Bağlandıktan sonra wlan.ifconfig()[0] komutu IP adresini verir; bu yazıdaki wifi.py dosyası adresi Shell'e yazdırır. Kart bilgisayara bağlı değilken modeminin arayüzündeki bağlı cihazlar listesine bakabilir ya da mDNS destekleyen cihazlarda http://picow.local adresini deneyebilirsin.

Pico W'de dahili LED neden Pin(25) ile yanmıyor?

Pico W'de dahili LED işlemciye değil kablosuz yongaya bağlıdır; GP25 ise bu yonganın seçim hattı olarak kullanılır. MicroPython'da Pin("LED", Pin.OUT), Arduino IDE'de LED_BUILTIN yazarsan LED doğru şekilde yanar. Bu yazım düz Pico'da da çalıştığı için her zaman tercih edebilirsin.

Pico W web sunucusuna internetten erişebilir miyim?

Modeminde port yönlendirme yaparak teknik olarak mümkündür ama önerilmez, çünkü basit MicroPython sunucusunda şifreleme ve kimlik doğrulama yoktur. Dışarıdan kontrol için MQTT, Telegram botu ya da bir bulut IoT servisi gibi aracı bir yöntem kullanmak çok daha güvenlidir.

Wi-Fi projeleri için Pico W mi ESP32 mi daha iyi?

İkisi de 2,4 GHz Wi-Fi ve Bluetooth sunar. MicroPython ile çalışmak, düzenli belgeler ve sürprizsiz pinler istiyorsan Pico W; daha yüksek hız, çok sayıda analog giriş ve geniş Arduino kütüphanesi desteği istiyorsan ESP32 daha uygundur. Basit web sunucu, sensör ve API projelerinde ikisi de rahatça iş görür.

Tüm projeleri gör
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
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
Raspberry Pi Pico Trafik Lambası (3 LED Sıralı)
#150Başlangıç

Raspberry Pi Pico Trafik Lambası (3 LED Sıralı)

Kırmızı, sarı ve yeşil LED'lerle gerçek trafik ışığı mantığını simüle ediyoruz — Pico serisinin 3 LED'e geçen ilk projesi! Yeşil 4 saniye "geç", sarı 1.5 saniye "hazırlan", kırmızı 3 saniye "dur" ve kırmızı+sarı 1 saniye "kalkış" (Avrupa trafik lambası pattern'i). Bu proje ile fonksiyon tanımlama (def all_off()), durum makinesi mantığı (sequence) ve coklu GPIO senkronizasyonu kavramlarını öğreneceksin. Devre çok basit: GP11 (Yeşil), GP12 (Sarı), GP13 (Kırmızı) pinlerine 3 LE

4.0(1)
12
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
ESP32 Async Web Server (LCD'de IP Göstergeli)
#129İleri

ESP32 Async Web Server (LCD'de IP Göstergeli)

Bu projede ESP32'yi aynı Wi-Fi ağındaki telefonunuzdan veya bilgisayarınızdan kontrol edebileceğiniz asenkron bir web sunucusuna dönüştürüyoruz. ESPAsyncWebServer kütüphanesi sayesinde sunucu birden fazla isteği aynı anda işleyebiliyor (klasik WebServer.h gibi tek istekte bloklamıyor). Tarayıcıdan ESP32'nin IP adresine bağlanıp ON/OFF butonlarına basarak (/on ve /off adresleri) GPIO 5'e bağlı LED'i açıp kapatabileceksiniz.

4.8(16)
26
ESP32 Wi-Fi STA Bağlantısı (LCD Ekranlı)
#127İleri

ESP32 Wi-Fi STA Bağlantısı (LCD Ekranlı)

Bu projede ESP32'yi Station (STA) modunda evdeki Wi-Fi ağına güvenli ve hata toleranslı şekilde bağlıyoruz. SSID/şifreyi secrets.h dosyasına ayırarak Git'e sızmasını önlüyor, otomatik yeniden bağlanma mekanizması kuruyor, RSSI sinyal seviyesini ve IP adresini I2C LCD ekranda gösteriyoruz. Dahili LED durum göstergesi olarak çalışır. Üretim seviyesi bir bağlantı yöneticisidir.

4.4(21)
34
ESP32 NTP ile İnternetten Gerçek Zaman
#128İleri
Premium

ESP32 NTP ile İnternetten Gerçek Zaman

ESP32, Wi-Fi'a bağlanıp NTP (Network Time Protocol) sunucularından milisaniye hassasiyetiyle gerçek zamanı çeker. configTzTime() fonksiyonu sayesinde Türkiye saat dilimi (TRT, UTC+3) otomatik uygulanır ve yaz/kış saati uygulayan ülkelerde DST geçişi POSIX TZ string'i ile otomatik yönetilir. Saat hem Serial Monitor'e hem de opsiyonel I2C LCD'ye yazdırılır. configTzTime() SNTP hizmetini başlatır; ağ erişimi varken periyodik yeniden senkronizasyon yapılır ve iki senkronizasyon arasında sistem s

4.5(13)
21
ESP32 HTTPClient + Hava Durumu API (LCD Ekranlı)
#133İleri
Premium

ESP32 HTTPClient + Hava Durumu API (LCD Ekranlı)

Bu projede ESP32 ile internet üzerinden hava durumu API'sine (wttr.in) HTTPClient.h kullanarak REST API çağrısı yapıyoruz. ArduinoJson v7 ile dönen JSON cevabını parse edip şehir, sıcaklık, nem, hava durumu ve rüzgar bilgilerini I2C LCD ekranda hem Türkçe hem İngilizce gösteriyoruz. wttr.in ücretsizdir, API key gerektirmez — herhangi bir şehir ismini yazarak o şehrin anlık hava durumunu çekebilirsiniz. 30 dakikada bir otomatik güncelleme, LED ile her ekran için farklı görsel feedback ve eksiks

4.7(13)
20