Ev bitkilerinin ilgiye ihtiyacı vardır ve siz masanızda oturup çalışırken bazen onlara bakmayı unutursunuz. Hastamız, çok az bakıma ihtiyaç duyan, Ikea’dan bir Gasteria etli “Gary” ve bu, onu sulamayı unuttuğum anlamına geliyor. Peki nasıl Ahududu Pi Pico W Gary’ye daha iyi bakmama yardım eder misin?
Toprak nemi sensörleri, toprağın iletkenliğini ölçer ve değeri Raspberry Pi Pico W’ye (veya başka bir mikrodenetleyiciye) voltaj olarak gönderir. Bu voltaj analog bir GPIO pini tarafından okunur ve 0 ile 65535 arasında bir değere çevrilir. Sayı ne kadar düşükse, toprak o kadar kuru demektir. Bu daha sonra bir mesaj göndermek için bir tetikleyici olarak kullanılabilir.
Bu nasıl yapılır belgesinde, bir dizi sensör okuması yapmayı, bunların medyan değerini hesaplamayı ve bunu Gary’nin bir içkiye ihtiyacı olup olmadığını belirlemek için kullanmayı öğreneceğiz. Gary daha sonra bize bir Telegram Botu aracılığıyla bir mesaj gönderecek.
Bu Proje İçin İhtiyacınız Olacak
Devreyi Kurmak
Devre son derece basittir. GPIO’nun üç pimine bağlı bir toprak nemi sensörümüz var. İlk iki pin, 3V3 gücü ve GND, sensöre ihtiyaç duyduğu gücü sağlar.
Üçüncü pin Signal, Raspberry Pi Pico’ya bir değer gönderen bir çıkış pinidir. Çıkış, karşılık gelen GPIO’nun 0 ile 65535 arasında bir değer olarak okuduğu bir voltajdır. Bu değer daha sonra kodda bitkinin susuz olup olmadığını belirlemek için kullanılır.
Toprak nemi sensörü aşağıdaki gibi bağlanır.
Renk | Toprak Nem Sensörü | Ahududu Pi Pico |
---|---|---|
Kırmızı | + / VCC | 3V3 (Fiziksel pin 36) |
Sarı | S / Sinyal | GP26 |
Siyah | – / GND | Herhangi bir Toprak / GND pimi |
Telegram Botu Kurma
Telegram, Raspberry Pi Pico W ile iletişim kurabileceğimiz son derece basit araçlara sahip, kullanımı kolay bir anlık mesajlaşma hizmetidir. Bir Bot kullanarak, ev bitkilerimize ve hatta ev güvenliğimize ayrılmış bir kanal oluşturabiliriz.
Bir Telegram Botu oluşturmak basit bir işlemdir ve neyse ki bize yardım etmek için The BotFather’a sahibiz.
1. Telegram hesabınıza giriş yapın. Daha kolay bir iş akışı için Windows istemcisini kullandık.
2. ile sohbet oluştur BotBaba. BotFather, bot oluşturmak ve yönetmek için kullanılan bir bottur.
3. /newbot komutunu kullanarak yeni bir bot oluşturun ve Enter tuşuna basın. BotFather, bot oluşturma sürecinde size rehberlik edecek bir sihirbaz oluşturacaktır.
/newbot
4. API anahtarını not edin, proje için gereklidir. Bu olmadan kodumuzu kullanarak botla iletişim kuramayız.
5. Telegram’da IDBot ile yeni bir sohbet oluşturun, kimliğinizi isteyin. Kimliği not edin.
/getid
Kodu Yazmak
Tüm proje kodu, Raspberry Pi Pico W için en son MicroPython sürümü kullanılarak MicroPython’da yazılmıştır. Kodu doğrudan Raspberry Pi Pico W üzerinde yazmak ve test etmek için Thonny’yi kullanıyoruz.
1. Bu adımları takip et Raspberry Pi Pico W için MicroPython’un en son sürümünü indirmek için. En önemli adımlar, UF2 üretici yazılımı görüntüsünü indirip yüklemek ve Thonny’yi kurmaktır. Gerisi isteğe bağlıdır.
2. Tonny’yi aç Ve Durdur düğmesine tıklayın bağlantıyı yenilemek için. Bu, Python Kabuğunun açık ve doğru şekilde çalışmasını sağlar.
3. Yeni bir dosya oluşturun ve bu bağlantının içeriğini yapıştırın. Dosyayı, Raspberry Pi Pico W’nin kök dizinine istatistik.py olarak kaydedin. Bu dosya, bir veri listesinden medyan değeri seçmek için gerekli tüm istatistiksel fonksiyonları içeren bir modüldür. Proje tarafından oluşturuldu Roberto Colistete Junior.
4. yeni bir dosya oluştur ve orada SSID, PASSWORD, API ve ID olmak üzere dört nesne oluşturun.
5. SSID nesnesi için ona Wi-Fi erişim noktanızın / yönlendiricinizin adını atayın.
SSID = “YOUR WI-FI AP NAME HERE”
6. Parola için Wi-Fi parolasını atayın.
PASSWORD = “YOUR SECRET PASSWORD”
7. API için Telegram Bot API anahtarını atayın. Anahtarın ” ” içinde olduğundan emin olun.
API = "YOUR TELEGRAM BOT API KEY"
8. Kimlik için Telegram kullanıcı kimliğinizi atayın. Değeri bir dize olarak ayarlayacağından, kimliğin ” ” içinde olduğundan emin olun.
ID = “YOUR USER ID HERE”
9. Dosyayı Raspberry Pi Pico W’ye secrets.py olarak kaydedin.
SSID = “YOUR WI-FI SSID”
PASSWORD “YOUR WI-FI PASSWORD”
API = “YOUR TELEGRAM BOT API KEY”
ID = “YOUR TELEGRAM USER ID”
10. Yeni bir dosya oluşturun ve bir dizi Python modülünü içe aktarın.
A. makine GPIO (Pin) ve analog girişleri (ADC) kullanmak için gerekli işlevleri ve sınıfları içerir.
B. Zaman koda bir gecikme eklemek için kullanılır.
C. Ağ Wi-Fi bağlantılarını yapar.
D. Urequest’ler (mikro istekler), bir ağ üzerinden veri göndermek ve almak için kullanılan isteklerin bir MicroPython sürümüdür.
e. İstatistikverilerin istatistiksel analizini gerçekleştirmek için işlevler içeren bir modül.
F. Sırlartüm Wi-Fi ayrıntılarımızı ve API anahtarlarımızı içeren bir modül.
from machine import Pin, ADC
import time
import network
import urequests
import statistics
import secrets
11. GPIO 26’da bir nesne, sensör oluşturun ve toprak nemi sensörüne bir bağlantı oluşturun. Bu nesne, toprağın iletkenliğini temsil etmek için 0 ile 65535 arasında bir değer kullanarak sensör girişini analog olarak ayarlayacaktır. Sayı ne kadar yüksek olursa, iletkenlik o kadar iyi olur.
sensor = ADC(Pin(26))
12. Bir wlan nesnesi oluşturun ve bunu Wi-Fi erişim noktanızla bağlantı kurmak için kullanın. Bağlantı etkinleştirilir, ardından secrets.py’de depolanan SSID ve PASSWORD kullanılarak erişim noktasına bağlanırız. Beş saniyelik bir duraklama, bağlantının kararlı hale gelmesini sağlar, ardından bağlantının mevcut durumunu yazdırırız. Bağlanırsa DOĞRU görürüz, başarısız olursa YANLIŞ görürüz.
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(secrets.SSID, secrets.PASSWORD)
time.sleep(5)
print(wlan.isconnected())
13. “Okumalar” adlı boş bir liste oluşturun. Liste aynı zamanda dizi olarak da bilinir ve onu birden çok değeri kolayca okunabilir bir biçimde depolamak için kullanırız.
readings = []
14. Bir try, outside ifadesinin ilk bölümünü oluşturun ve kodu bir while True döngüsü çalıştıracak şekilde ayarlayın. Deneyin, hariç, bir hata işleme ifadesidir. Kod, içinde bulunanları çalıştırmayı deneyecek, ancak bir istisna veya hata varsa, varsayılan olarak bununla ilgilenecek bir kod bölümü olacaktır.
try:
while True:
15. Bir for döngüsü kullanarak, toprak nemi sensöründen beş okuma toplayın ve her okumayı bir saniyelik aralıklarla okuma listesine ekleyin. Bu kod bölümü, sensöre bağlı GPIO pinini okuyacak ve ardından değeri alıp listede saklayacaktır. Okumaları yazdırmak, herhangi bir sorunda hata ayıklamak için kullanışlıdır.
for i in range(5):
reading = sensor.read_u16()
readings.append(reading)
print(readings)
time.sleep(1)
16. for döngüsünün dışında bir nesne oluşturun, median_value ve burada okumaların toplanmasından medyan (orta nokta) değeri saklayın.
median_value = statistics.median(readings)
17. Medyan_değerini sabit kodlanmış bir değere karşı kontrol etmek için koşullu bir ifade kullanın. Testlerimizde gasteria tesisimizin suya ihtiyaç duyacağı nokta olarak 400’ü seçtik. Tesisinizin ihtiyaçlarını karşılamak için bu değeri ayarlayın.
if median_value < 400:
18. Tesisin suya ihtiyacı varsa, urequest’leri kullanarak Telegram’a bir mesaj gönderin, ardından Python kabuğuna bir mesaj yazdırın. API anahtarımızı eklemek için secrets.API ve kullanıcı kimliğimizi göndermek için secrets.ID kullandığımızı unutmayın. Asıl mesaj burada sendMessage?text=Gary susadı.
urequests.get("https://api.telegram.org/bot"+secrets.API+"/sendMessage?text=Gary is thirsty&chat_id="+secrets.ID)
print("Message Sent")
19. Aksi takdirde, bitki yeterli suya sahip olduğunu ve şu anda suya ihtiyacı olmadığını belirler. Bu daha sonra kodda bir saatlik bir gecikmeyi tetikler.
else:
print("Gary has enough water")
time.sleep(3600)
20. Python kabuğuna bir mesaj yazdıran bir İşletim Sistemi Hatasını (Wi-Fi bağlantısı yok) işlemek için tasarlanmış bir istisna işleyici oluşturun. print(“@”*68) satırları, mesajın üstünde ve altında dekoratif kenarlıklar oluşturur.
except OSError:
print("@"*68)
print("@ Cannot connect to the Wi-Fi, please check your SSID and PASSWORD @")
print("@"*68)
21. Kodu, Raspberry Pi Pico W’de main.py olarak kaydedin. Bu, Pico W’yi her kapatıldığında kodu yüklemeye zorlar.
22. Pico W’yi kapatıp açın ve ev bitkilerinizin sularını talep etmesini bekleyin!
Eksiksiz Kod Listesi
from machine import Pin, ADC
import time
import network
import urequests
import statistics
import secrets
sensor = ADC(Pin(26))
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(secrets.SSID, secrets.PASSWORD)
time.sleep(5)
print(wlan.isconnected())
readings = []
try:
while True:
for i in range(5):
reading = sensor.read_u16()
readings.append(reading)
print(readings)
time.sleep(1)
median_value = statistics.median(readings)
if median_value < 400:
urequests.get("https://api.telegram.org/bot"+secrets.API+"/sendMessage?text=Gary is thirsty&chat_id="+secrets.ID)
print("Message Sent")
else:
print("Gary has enough water")
time.sleep(3600)
except OSError:
print("@"*68)
print("@ Cannot connect to the Wi-Fi, please check your SSID and PASSWORD @")
print("@"*68)