Raspberry Pi Pico W ile Kablosuz Sensör İstasyonu
Giriş ve Proje Genel Bakışı
Raspberry Pi Pico W, RP2040 mikroişlemcisi ve dahili CYW43439 kablosuz çipi sayesinde IoT projelerinde güçlü ve uygun maliyetli bir çözüm sunar. Bu yazıda, Pico W kullanarak sıcaklık, nem ve basınç verilerini kablosuz olarak toplayan, bir web arayüzü üzerinden görüntüleyen ve opsiyonel olarak bulut platformlarına aktaran tam donanımlı bir sensör istasyonu kuracağız.
Gerekli Malzemeler
- Raspberry Pi Pico W — Dahili Wi-Fi destekli mikrodenetleyici
- BME280 sensör modülü — Sıcaklık, nem ve barometrik basınç ölçümü (I2C)
- Breadboard ve jumper kablolar
- Micro-USB kablo — Güç beslemesi ve programlama için
- Opsiyonel: 0.96" OLED ekran (SSD1306, I2C), harici anten, LiPo pil + şarj modülü
Donanım Bağlantıları
BME280 sensörünü Pico W'ye I2C protokolü üzerinden bağlayacağız. Bağlantı şeması aşağıdaki gibidir:
- BME280 VIN → Pico W 3V3 (Pin 36)
- BME280 GND → Pico W GND (Pin 38)
- BME280 SDA → Pico W GP4 (Pin 6) — I2C0 SDA
- BME280 SCL → Pico W GP5 (Pin 7) — I2C0 SCL
I2C hatlarında harici pull-up dirençlerine genellikle gerek yoktur; çoğu BME280 breakout kartında bu dirençler zaten mevcuttur. Yine de iletişim sorunları yaşarsanız SDA ve SCL hatlarına 4.7kΩ pull-up direnci eklemeyi deneyin.
MicroPython Ortamının Kurulumu
Pico W üzerinde MicroPython çalıştırmak için şu adımları izleyin:
- Raspberry Pi resmi sitesinden en güncel MicroPython UF2 dosyasını indirin (Pico W sürümünü seçtiğinizden emin olun).
- Pico W üzerindeki BOOTSEL düğmesine basılı tutarak USB kablosunu bağlayın. Cihaz bir USB sürücü olarak görünecektir.
- UF2 dosyasını bu sürücüye sürükleyip bırakın. Cihaz otomatik olarak yeniden başlayacaktır.
- Geliştirme ortamı olarak Thonny IDE kullanmanızı öneriyorum. Interpreter ayarını "MicroPython (Raspberry Pi Pico)" olarak seçin.
BME280 Kütüphanesinin Yüklenmesi
BME280 sensörü için bir MicroPython sürücüsüne ihtiyacımız var. Aşağıdaki basitleştirilmiş sürücüyü bme280.py adıyla Pico W'ye kaydedin veya Thonny'nin paket yöneticisinden micropython-bme280 paketini yükleyin.
Wi-Fi Bağlantısı
Öncelikle Pico W'yi kablosuz ağa bağlayalım:
import network
import time
def wifi_baglan(ssid, sifre, zaman_asimi=15):
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
if wlan.isconnected():
print("Zaten bağlı:", wlan.ifconfig())
return wlan
print(f"'{ssid}' ağına bağlanılıyor...")
wlan.connect(ssid, sifre)
baslangic = time.time()
while not wlan.isconnected():
if time.time() - baslangic > zaman_asimi:
raise RuntimeError("Wi-Fi bağlantı zaman aşımı!")
time.sleep(0.5)
print("Bağlantı başarılı!")
print("IP Adresi:", wlan.ifconfig()[0])
return wlan
Sensör Verilerini Okuma
BME280 sensöründen veri okumak için I2C arayüzünü yapılandıralım:
from machine import Pin, I2C
import bme280
i2c = I2C(0, sda=Pin(4), scl=Pin(5), freq=400000)
# I2C adresini doğrulayın (BME280 genellikle 0x76 veya 0x77)
adresler = i2c.scan()
print("Bulunan I2C cihazları:", [hex(a) for a in adresler])
bme = bme280.BME280(i2c=i2c)
def sensor_oku():
sicaklik, basinc, nem = bme.values
return {
"sicaklik": sicaklik,
"basinc": basinc,
"nem": nem
}
# Test okuması
veri = sensor_oku()
print(f"Sıcaklık: {veri['sicaklik']}")
print(f"Basınç: {veri['basinc']}")
print(f"Nem: {veri['nem']}")
Web Sunucusu ile Canlı İzleme
Pico W üzerinde hafif bir HTTP sunucusu çalıştırarak sensör verilerini tarayıcıdan görüntüleyebiliriz. Bu yaklaşım herhangi bir harici servise ihtiyaç duymadan yerel ağda çalışır:
import socket
import json
def html_sayfa(veri):
return f"""
Hava İstasyonu
{veri['sicaklik']}
Sıcaklık
{veri['nem']}
Nem
{veri['basinc']}
Basınç
"""
def api_yaniti(veri):
return json.dumps(veri)
def sunucu_baslat():
addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1]
s = socket.socket()
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(addr)
s.listen(5)
print("Sunucu dinleniyor:", addr)
while True:
cl, addr = s.accept()
try:
istek = cl.recv(1024).decode()
veri = sensor_oku()
if "GET /api" in istek:
yanit = api_yaniti(veri)
cl.send("HTTP/1.0 200 OK\r\n")
cl.send("Content-Type: application/json\r\n\r\n")
cl.send(yanit)
else:
yanit = html_sayfa(veri)
cl.send("HTTP/1.0 200 OK\r\n")
cl.send("Content-Type: text/html; charset=utf-8\r\n\r\n")
cl.send(yanit)
except Exception as e:
print("Hata:", e)
finally:
cl.close()
Ana Program: Her Şeyi Birleştirme
Tüm bileşenleri bir araya getiren main.py dosyası:
# main.py
WIFI_SSID = "AgAdiniz"
WIFI_SIFRE = "Sifreniz"
wlan = wifi_baglan(WIFI_SSID, WIFI_SIFRE)
sunucu_baslat()
Cihaz başladığında Wi-Fi'ye bağlanacak ve konsola yazdırılan IP adresini tarayıcınıza girerek sensör verilerini görebileceksiniz. /api yoluna istek göndererek JSON formatında veri de alabilirsiniz; bu, verileri başka uygulamalarla entegre etmek için idealdir.
Veri Kaydetme ve Bulut Entegrasyonu
Sensör verilerini zaman serisi olarak kaydetmek isteyebilirsiniz. İki farklı yaklaşım önerebilirim:
Yerel Kayıt (SD Kart veya Dahili Flash)
Pico W'nin dahili dosya sistemine CSV formatında veri yazabilirsiniz:
import time
def veri_kaydet(dosya_adi="veriler.csv"):
veri = sensor_oku()
zaman_damgasi = time.time()
with open(dosya_adi, "a") as f:
f.write(f"{zaman_damgasi},{veri['sicaklik']},"
f"{veri['nem']},{veri['basinc']}\n")
MQTT ile Bulut Aktarımı
Daha gelişmiş bir kurulum için MQTT protokolü kullanarak verileri bir broker'a (örneğin Mosquitto) ve oradan Grafana, InfluxDB veya Home Assistant gibi platformlara aktarabilirsiniz. umqtt.simple kütüphanesini kullanarak bağlantı kurulabilir:
from umqtt.simple import MQTTClient
def mqtt_gonder(sunucu, konu, mesaj):
client = MQTTClient("pico_istasyon", sunucu)
client.connect()
client.publish(konu, mesaj)
client.disconnect()
# Kullanım
veri = sensor_oku()
mqtt_gonder("192.168.1.100", "ev/hava/sicaklik",
veri["sicaklik"])
Güç Yönetimi ve Pil ile Çalışma
Sensör istasyonunu pil ile çalıştırmak istiyorsanız güç tüketimini minimize etmek kritik önem taşır. Pico W'nin deepsleep modunu kullanarak ölçümler arasında cihazı uyku moduna alabilirsiniz:
import machine
# 5 dakikada bir ölçüm al
OLCUM_ARALIGI_MS = 5 * 60 * 1000
def olcum_dongusu():
wlan = wifi_baglan(WIFI_SSID, WIFI_SIFRE)
veri = sensor_oku()
veri_kaydet()
# veya mqtt_gonder(...)
wlan.active(False)
machine.deepsleep(OLCUM_ARALIGI_MS)
olcum_dongusu()
Bu yöntemle cihaz yalnızca ölçüm anında uyanır, veriyi okur ve gönderir, ardından tekrar uyku moduna geçer. Tipik bir 18650 Li-Ion pil ile haftalarca kesintisiz çalışma mümkündür.
Sorun Giderme ve İpuçları
- I2C cihaz bulunamıyor: Kablo bağlantılarını kontrol edin.
i2c.scan()boş dönüyorsa SDA/SCL pinlerini ve güç bağlantısını doğrulayın. - Wi-Fi bağlantı sorunu: Pico W yalnızca 2.4 GHz ağları destekler. 5 GHz ağlara bağlanamaz. Ayrıca SSID ve şifrede Türkçe karakter kullanmaktan kaçının.
- Bellek yetersizliği: MicroPython'da RAM sınırlıdır. HTML sayfalarını mümkün olduğunca küçük tutun ve
gc.collect()çağrılarını düzenli olarak yapın. - Sensör doğruluğu: BME280'in ilk birkaç okuması hatalı olabilir. Cihaz başladıktan sonra ilk 2-3 okumayı atlayarak daha güvenilir sonuçlar elde edebilirsiniz.
- Web sunucusu yanıt vermiyor: Eş zamanlı bağlantı sayısını sınırlayın ve her bağlantıyı
try/finallybloğu ile kapatın; aksi halde soket sızıntısı oluşur.
Sonuç ve Geliştirme Fikirleri
Bu projede Raspberry Pi Pico W ile tam işlevsel bir kablosuz sensör istasyonu kurduk: donanım bağlantılarından sensör okumaya, web arayüzünden bulut entegrasyonuna kadar her adımı ele aldık. Projeyi daha da geliştirmek için şu fikirleri değerlendirebilirsiniz:
- Birden fazla sensör düğümü kurarak mesh sensör ağı oluşturma
- Grafana + InfluxDB ile geçmiş verileri görselleştirme
- Belirli eşik değerlerde Telegram veya e-posta bildirimi gönderme
- Home Assistant entegrasyonu ile akıllı ev senaryoları oluşturma
- UV indeksi, toprak nemi veya hava kalitesi sensörleri ekleyerek kapsamı genişletme
Raspberry Pi Pico W'nin düşük maliyeti ve geniş ekosistemi, onu hobi projelerinden ciddi IoT uygulamalarına kadar pek çok alanda mükemmel bir tercih haline getiriyor. İyi denemeler!