Görünüşe göre X’e (eski adıyla Twitter) alternatif sosyal medya platformları popülerlik kazanıyor ve BlueSky artık 15 milyon kullanıcı. Politika bir yana, X, Mastodon ve BlueSky’yi üçlü olarak kullanıyorum ve hepsinin güçlü ve zayıf yanları var.
X’in güçlü yönlerinden biri uygulamalar ve botlardı. Kullanıcılarla etkileşime giren bir uygulama oluşturmak için geliştirici API’sini kolayca kullanabildik ve Raspberry Pi’nin ortaya çıkışıyla, GPIO ile etkileşimde bulunmak için X’i kullanabildik. Sensörlü bir Raspberry Pi, X takipçilerinize veri iletebilir, takipçileriniz Raspberry Pi Pico W’nizdeki NeoPixels’in renk değiştirmesini tetikleyebilir. Bunu Mastodon ile de yapabiliriz ve bu daha fazla araştırmam gereken bir şey ama işte burada BlueSky devreye giriyor.
Geçen hafta şununla ilgili bir mesaj gördüm: protokollerdeBİR BlueSky için API Bu, X’te bulunan aynı işlevselliği sağlar ancak BlueSky platformunu kullanır. İlk başta şüpheciydim ama denedim. Gerçekten iyi çalıştı ve bende Python uygulaması bir saatten kısa sürede çalışıyor. Ancak daha kullanışlı bir şey istiyordum ve bunun için bir Raspberry Pi’ye ihtiyacım vardı, bu yüzden uygulamayı Raspberry Pi 5’e geçirmeyi araştırmaya başladım ve bunun işe yarayacağından emindim, ancak daha sonra yapımcı arkadaşım ve BlueSky kullanıcısı Mike Bell’in aklına bir fikir geldi. Bell’in fikri, atprototools modülü Raspberry Pi Pico W’de kullanılabilir. Birkaç saat sonra BlueSky’den gelen gönderileri Pico W ile okuyabildik. Birkaç saat sonra Bell, Pico W’den BlueSky’a gönderi göndermeyi başardı.
Bu nasıl yapılır oluşturmak için ihtiyacım olan tek şey buydu. BlueSky hesabımızdaki (ve yalnızca bizim hesabımızdaki) en son gönderiyi okuyan ve ardından DHT11 sıcaklık sensörünü kullanarak sıcaklığı kontrol eden, Raspberry Pi Pico W destekli bir cihaz oluşturacağız. Sıcaklık daha sonra BlueSky’a bir mesaj olarak gönderilir. Pico W daha sonra işlemi tetiklemek için başka bir mesajı bekler.
Bunu spam yapmak veya baş belası olmak için kullanmayın. Test yaparken takipçilerinizin deneyiminin bozulmasını önlemek için yedek bir hesapla kullanın.
Son olarak ve en önemlisi, bunu mümkün kılan yardımları ve çalışmaları için Mike Bell’e çok teşekkür ederiz.
Bu proje için ihtiyacınız olacak
- BlueSky hesabı
- Ahududu Pi Pico W
- 1 x Ekmek Tahtası
- 1 adet LED
- 1 x 100 Ohm direnç (Kahverengi-Siyah-Kahverengi-Altın)
- 1 adet DHT11
- 5 x Erkekten erkeğe aktarma kabloları
- Tonny bilgisayarınıza yüklendi
Demo Devresinin Oluşturulması
Demo devresinin iki bölümü vardır. LED ve DHT11 sıcaklık sensörü.
İlk önce LED’i ele alacağız.
Raspberry Pi Pico GPIO | Tel Rengi | LED Bağlantısı |
---|---|---|
GPIO15 | Yeşil | Anot (+, uzun bacak) |
GND | Siyah | 100 Ohm direnç aracılığıyla katot (-, kısa bacak) |
LED’in yalnızca iki pimi vardır. Anot (uzun bacak) ve Katot (kısa bacak). Anot, Raspberry Pi Pico W üzerindeki GPIO 15’e doğrudan bağlanır. Katot, 100 Ohm’luk bir direnç aracılığıyla Pico W üzerindeki herhangi bir GND pinine bağlanır. Direnç LED’in tükettiği akımı sınırlayarak LED’in ömrünü uzatacaktır.
Son olarak DHT11 sıcaklık ve nem sensörü. Dört pini var ama sadece üçü kullanılabiliyor.
Raspberry Pi Pico GPIO | Tel Rengi | DHT11 |
---|---|---|
3V3 (Fiziksel pin 36) | Kırmızı | Pim 1 |
GPIO17 | Sarı | Pim 2 |
GND | Siyah | Pim 4 |
DHT11’in gücü, DHT11’deki pin 1’e bağlanan Raspberry Pi Pico’nun 3V3 pininden gelir. Veri bağlantısı DHT11’in pin 2’sidir ve bu Pico W üzerindeki GPIO 17’ye bağlanır. Sıcaklık verilerini bu şekilde alıyoruz. Son olarak DHT11’deki pin 4 GND’dir ve bu Pico’daki herhangi bir GND’ye bağlanabilir.
Kablolarınızı kontrol edin ve hazır olduğunuzda kodlama bölümüne geçin.
BlueSky Sıcaklık Botunu Kodlama
Bu adımlar, yazarken Raspberry Pi Pico W’yi nasıl kurmamız gerektiğidir. Bunun birkaç hafta/ay içinde değişmesi kuvvetle muhtemeldir, ancak gelişmeleri takip edip buna göre güncelleyeceğim.
1. Takip etmek ve dahil olmak üzere adım 6 bunun nasıl yapılacağı, böylece Raspberry Pi Pico W’niz MicroPython’u çalıştırıyor ve Thonny’yi çalıştıran bilgisayarınıza bağlanıyor.
2. Yeni bir boş proje oluşturun ve kodu buradan kopyalayın. Buradave yeni boş dosyaya yapıştırın. Bu, Mike Bell’in Raspberry Pi Pico W’de çalışacak şekilde değiştirdiği koddur.
3. Dosyayı Raspberry Pi Pico W cihazınızın kök dizinine prototools.py olarak kaydedin.
4. Başka bir boş dosya oluşturun ve kodu buradan kopyalayın. Burada ve boş dosyaya yapıştırın. Dosyayı Raspberry Pi Pico W’nin kök dizinine datetime.py olarak kaydedin. Atprototools modülünün BlueSky gönderilerimizi doğru bir şekilde alıp gönderebilmesi için datetime’a ihtiyacımız var.
5. Bluesky hesabınıza bir tarayıcı açın ve Ayarlar dişli çarkına tıklayın ve Uygulama Şifreleri seçeneğine ilerleyin.
6. Uygulama Şifresi Ekle’ye tıklayın.
7. Uygulama şifresini “Python” olarak adlandırın ve Uygulama Şifresi Oluştur’a tıklayın.
8. Kodu bir metin dosyasına kopyalayın ve Bitti’ye tıklayın. Bu kodu bir daha Bluesky’de görmeyeceksiniz!
9. Thonny’ye dönersek, yeni bir dosya oluşturun ve dosyada SSID, PASSWORD, BSKY_USERNAME ve BSKY_PASSWORD olmak üzere dört nesne oluşturun. Tırnak işaretlerinin içine bilgilerinizi girin. Bluesky kullanıcı adınız profil URL’nizin son kısmı olmalıdır, yani benim için “biglesp.bsky.social”. BSKY_PASSWORD daha önce oluşturduğumuz uygulama şifresidir.
SSID = “YOUR WI-FI ACCESS POINT”
PASSWORD = “YOUR WI-FI PASSWORLD
BSKY_USERNAME= ‘YOUR BLUESKY HANDLE”
BSKY_PASSWORD = “THE APP PASSWORD”
10. Dosyayı Raspberry Pi Pico’nuza secrets.py olarak kaydedin.
11. Proje kodu için yeni bir dosya oluşturun.
12. Önceden yazılmış kodun modüllerini içe aktarın Wi-Fi erişimi (ağ), BlueSky (prototools’ta), Wi-Fi ve BlueSky kimlik bilgilerimiz (sırlar), Ağ Zaman Protokolü (ntp), kodu duraklatmak (uyku) ve GPIO’yu (makine) kontrol etmek için.
import network
from atprototools import Session
from secrets import SSID, PASSWORD, BSKY_USERNAME, BSKY_PASSWORD
import ntptime
from time import sleep
from machine import Pin
13. LED’imizin hangi GPIO pinine bağlı olduğunu bildirecek olan led nesnesini oluşturun. Daha sonra LED’i kapatmak için bunu kullanın.
led = Pin(15, Pin.OUT)
led.off()
14. Wlan adı verilen bir nesneyi kullanarak Raspberry Pi Pico W’yi Wi-Fi’nize bağlayın. Bu, Wi-Fi’yi etkin hale getirecek, ardından AP’nize bağlanmayı deneyecek, başarısız olursa (Yanlış) her saniye denemeye devam edecektir.
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(SSID, PASSWORD)
while wlan.isconnected() is False:
print('Waiting for connection...')
sleep(1)
15. NTP’yi kullanarak geçerli saati ve tarihi ayarlayın. Bunu Pico W ve BlueSky’nin ortak bir zaman referansına sahip olması için yapmamız gerekiyor, aksi takdirde kod çökecektir.
ntptime.settime()
16. Bir nesne, oturum oluşturun ve bunu BlueSky’ye bağlanmak için kullanın.
session = Session(BSKY_USERNAME, BSKY_PASSWORD)
17. Kodu denemek ve çalıştırmak için bir istisna işleyicisi oluşturunwhile True (sonsuza kadar) döngüsüyle başlar.
try:
while True:
18. Last_bloot adında bir nesne oluşturun ve onu BlueSky oturumumuzdan döndürülen verileri depolamak için kullanın. Esasen bu, Python API’sinin BlueSky’den görebildiği JSON olarak biçimlendirilmiş bir dökümüdür.
latest_bloot = session.getLatestBloot(BSKY_USERNAME).json()
19. If koşullu ifadesini kullanarak kullanıcı hesabınızdaki son mesajı kontrol edin. Eğer “Temp Check” (tam olarak) ibaresini içeriyorsa bu durumda koşul True olacak ve aşağıdaki kod etkinleşecektir.
if latest_bloot['feed'][0]['post']['record']['text'] == "Temp Check":
20. LED’i üç kez yanıp sönmek için for döngüsünü kullanın. Bu bize Pico W’nin komutu aldığını gösterir.
for i in range(3):
led.on()
sleep(0.3)
led.off()
sleep(0.3)
21. DHT11’i kullanarak sıcaklığı ölçün, döndürülen değeri iki ondalık basamağa yuvarlayın ve ardından sıcaklığı bir mesajda kullanmak üzere bir dizeye dönüştürün. Döndürülen sıcaklığın santigrat derece cinsinden olduğunu unutmayın.
sensor.measure()
temp = round(sensor.temperature(),2)
temp = str(temp)
22. Mesajın içeriğini tanımlayan ve verileri sonuna ekleyen bir BlueSky gönderisi oluşturun. Bu durumda oda sıcaklığı ve ardından santigrat derece cinsinden gerçek sıcaklık gelir.
post = session.postBloot("The room temperature is "+temp+"C")
23. Kullanıcıdan mesaj gelmemişse, Pico W’yi beklemeye zorlamak için başka bir koşul yaratın, bir uyku ekleyin Döngünün çok hızlı çalışmasını durdurmak için. BlueSky’nin hız sınırlaması olduğunu unutmayın, bu nedenle yeni mesajları sürekli kontrol ettiğimizde Pico W bağlantısının kesildiğini görebiliriz. Dakikada en fazla bir kez kontrol etmenizi öneririz.
else:
print("Waiting for message")
sleep(60)
24. Önemli Hataları yakalamak için bir istisna oluşturun. Bunlar, döndürülen JSON feed’i veri içermediğinde, genellikle bir hız sınırına ulaştığımızda oluşturulan hatalardır.
except KeyError as e:
print('I got a KeyError - reason "%s"' % str(e))
25. Kodu Raspberry Pi Pico W’nin kök dizinine bsky.py olarak kaydedin.
26. Kodu başlatmak için yeşil Çalıştır düğmesine tıklayın. Pico W’niz Wi-Fi’nize bağlanmaya çalışacak ve bağlandıktan sonra komut dosyası, “Sıcaklık Kontrolü” için feed’inizdeki en son mesajı kontrol edecektir. Bu mesaj göründüğünde kod etkinleşecek, LED üç kez yanıp sönecek ve ardından bir sıcaklık ölçümü alınacak ve bu daha sonra BlueSky’a gönderilecek.
bsky.py için Kod Listesini Tamamlayın
import network
from atprototools import Session
from secrets import SSID, PASSWORD, BSKY_USERNAME, BSKY_PASSWORD
import ntptime
from time import sleep
from machine import Pin
import dht
sensor = dht.DHT11(Pin(17))
led = Pin(15, Pin.OUT)
led.off()
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(SSID, PASSWORD)
while wlan.isconnected() is False:
print('Waiting for connection...')
sleep(1)
ntptime.settime()
session = Session(BSKY_USERNAME, BSKY_PASSWORD)
try:
while True:
latest_bloot = session.getLatestBloot(BSKY_USERNAME).json()
if latest_bloot['feed'][0]['post']['record']['text'] == "Temp Check":
for i in range(3):
led.on()
sleep(0.3)
led.off()
sleep(0.3)
sensor.measure()
temp = round(sensor.temperature(),2)
temp = str(temp)
post = session.postBloot("The room temperature is "+temp+"C")
else:
print("Waiting for message")
sleep(1)
except KeyError as e:
print('I got a KeyError - reason "%s"' % str(e))