Raspberry Pi, Python, dan tanaman indoor berair

Saya tidak punya hubungan dengan tanaman indoor. Faktanya adalah saya lupa menyirami mereka. Mengetahui hal ini, saya mulai merenungkan fakta bahwa seseorang, tentu saja, telah menemukan cara untuk mengotomatisasi irigasi. Ternyata, ada banyak cara. Yaitu, kita berbicara tentang solusi berdasarkan Arduino atau Raspberry Pi. Pada artikel ini saya ingin berbicara tentang bagaimana saya membuat sistem berdasarkan Raspberry Pi dan Python, yang dirancang untuk mengotomatiskan pabrik penyiraman.



Komponen dan Sumber Daya Berguna


Saya ingin segera mencatat bahwa saya sama sekali tidak ahli dalam bidang elektronik. Jika mereka meminta saya untuk menggambar sirkuit listrik, atau untuk memberi tahu secara detail tentang bagaimana komponen elektronik bekerja, saya tidak akan bisa menggambar apa pun yang masuk akal atau memberitahu. Sebenarnya, saya mengerjakan proyek ini hanya dengan pengetahuan dasar tentang listrik dan hanya bereksperimen dengan komponen. Saya meminta Anda untuk sangat berhati-hati bekerja dengan listrik. Dan, jika Anda merasa kurang pengetahuan di bidang ini, saya sarankan setidaknya sedikit pemahaman tentang ini.

Berikut adalah daftar komponen yang saya gunakan dalam proyek saya.


Saya berpartisipasi dalam program afiliasi Amazon, jadi tautan di atas disediakan. Jika Anda pergi melalui mereka dan membeli sesuatu, saya akan mendapat sedikit.

Setelah saya mendapatkan semua komponen yang saya butuhkan, saatnya untuk melakukan riset. Berikut ini adalah daftar sumber daya yang membantu saya menghubungkan komponen elektronik dengan benar dan memahami poin utama mengenai fungsinya:


Berikut diagram port GPIO Raspberry Pi.


Diagram Raspberry Pi GPIO Port

Hubungkan relay ke Raspberry Pi


Saya mulai dengan menghubungkan relay ke Raspberry Pi. Ini tampilannya.


Menghubungkan relai ke Raspberry Pi

Kabel merah (Wanita-Wanita) beralih dari pin papan relay JD_VCC ke pin 5V (pin No. 2) dari Raspberry Pi. Kawat oranye (Wanita-Wanita) mengarah dari pin papan relay VCC ke pin 3.3V (pin No. 1) dari Raspberry Pi.


Pin JD_VCC dan VCC dari papan relai

Menggunakan kabel ini, kami menyediakan daya ke papan relai. Agar dapat mengontrol masing-masing relay, Anda harus menghubungkan papan relay dan Raspberry Pi dengan dua kabel lagi yang terhubung ke pin GND dan IN1 pada papan relay.


Pin GND dan IN1 papan relay

Kawat Female (Female) Female adalah kabel ground yang menghubungkan pin GND pada papan relay dan terminal ground pada Raspberry Pi (saya menghubungkannya ke pin No. 34). Kabel putih (Wanita-Wanita) mengarah dari pin IN1 papan relay ke pin No. 12 dari Raspberry Pi. Kabel putih inilah yang memungkinkan kita mengontrol relay secara terprogram, menyalakan dan mematikan relay individual yang terdapat di papan tulis.


Kabel hitam dan putih terhubung ke Raspberry Pi

Jika Anda memutuskan untuk mereproduksi proyek saya, Anda dapat mengatur relay dan Raspberry Pi untuk berkomunikasi menggunakan pin yang sesuai. Tetapi perlu diingat bahwa jika diagram koneksi komponen proyek Anda berbeda dari diagram koneksi komponen proyek saya, Anda harus membuat perubahan yang sesuai dengan kode saya.

Menghubungkan catu daya ke relai


Setelah saya menghubungkan papan relay ke Raspberry Pi, saya menghubungkan catu daya ke salah satu relay.

Jangan colokkan catu daya ke stopkontak sampai Anda menyelesaikan semua operasi pengumpulan komponen sistem. Waspadai risiko sengatan listrik.


Menghubungkan catu daya ke salah satu relay

Catu daya 12V yang saya gunakan dilengkapi dengan adaptor yang memudahkan untuk menghubungkan kabel penghubung. Saya menghubungkan kabel merah (Male-Male) ke konektor adaptor "+", dan kabel cokelat (Male-Male) ke konektor adaptor "-". Lalu saya menghubungkan kabel dengan konektor "Crocodile" (Female-Male) ke kabel cokelat.


Adaptor yang datang dengan catu daya

Papan relay memiliki empat relay terpisah. Masing-masing dari mereka memiliki tiga pin yang dapat dihubungkan kabel. Di tengah setiap relai adalah konektor yang mana output positif dari sumber daya eksternal terhubung. Di sebelah kiri adalah konektor di mana input positif perangkat yang terhubung dengan daya tersambung.


Menghubungkan relai terpisah

Saya menghubungkan kabel merah dari catu daya (terminal positif) ke kontak sentral relai. Lalu saya menghubungkan kabel oranye (Male-Male) ke konektor kiri relay dan menghubungkan kabel dengan "buaya" (Female-Male) ke kabel ini.


Kabel merah dan oranye


Catu daya dan adaptor


Relay dan Raspberry Pi

Menghubungkan pompa air ke relay


Sekarang tinggal menghubungkan konektor “buaya” ke pompa air. Urutan koneksi mereka menentukan arah aliran air.

Jadi, saya membutuhkan air untuk memasuki saluran kiri pompa dan keluar dari saluran kanan. Oleh karena itu, saya menghubungkan konektor "buaya" dari kawat hitam ke terminal pompa, di dekat yang ada titik merah, dan yang lain "buaya" ke terminal pompa lainnya. Jika saya menghubungkan "buaya" dalam urutan yang berbeda - air akan pergi ke arah yang berlawanan - dari saluran kanan ke kiri.


Menghubungkan pompa air ke relay


Sistem irigasi lengkap: air memasuki pompa melalui saluran kiri, meninggalkan kanan dan pergi ke pabrik

Kode


Jadi kami mendapatkan apa yang benar-benar saya kuasai Kami sampai pada kode. Untuk membuat perangkat lunak bekerja dengan port GPIO Raspberry Pi, saya menggunakan perpustakaan gpiozero . Mudah digunakan, ia menyembunyikan banyak mekanisme tingkat rendah dari programmer, yang biasanya Anda perlu memahami siapa yang ingin bekerja dengan pin GPIO. Perpustakaan didokumentasikan dengan baik.

Sebelum menulis kode, Anda harus menghubungkan monitor, mouse, dan keyboard ke Raspberry Pi Anda. Atau Anda perlu terhubung ke Raspberry Pi melalui SSH .

Setelah Anda memasukkan Raspberry Pi, buka folder Desktopdan buat folder di sana run. Buat folder di folder ini classes. Dan di dalam folder, classesbuat file Hardware.py. Seharusnya memiliki kode berikut:

from gpiozero import OutputDevice

class Relay(OutputDevice):
    def __init__(self, pin, active_high):
        super(Relay, self).__init__(pin, active_high)

Dalam file ini, saya baru saja mendeklarasikan kelas baru Relay, yang merupakan turunan dari kelas OutputDevice .

Selanjutnya, di folder, classessaya membuat file baru TimeKeeper.py:

import datetime

class TimeKeeper:
    def __init__(self, current_time):
        self.current_time = current_time
        self.time_last_watered = None
    
    def set_current_time(self, updated_time):
        self.current_time = updated_time

    def set_time_last_watered(self, updated_time):
        self.time_last_watered = updated_time

    @staticmethod
    def get_current_time():
        now = datetime.datetime.now()
        return now.strftime("%I:%M:%S %p")

Tujuan dari kelas ini adalah untuk melacak waktu saat ini dan saat ketika penyiraman terakhir kali dilakukan.

Jadi, file-file tersebut Hardware.pydan TimeKeeper.pyada di folder classes. Sekarang, di luar folder ini, saya membuat file water_plant.py:

from classes import Hardware
from classes import TimeKeeper as TK
import schedule
import smtplib
import time
import ssl

# WATERING_TIME must be in "00:00:00 PM" format
WATERING_TIME = '11:59:50 AM'
SECONDS_TO_WATER = 10
RELAY = Hardware.Relay(12, False)
EMAIL_MESSAGES = {
    'last_watered': {
        'subject': 'Raspberry Pi: Plant Watering Time',
        'message': 'Your plant was last watered at'
    },
    'check_water_level': {
        'subject': 'Raspberry Pi: Check Water Level',
        'message': 'Check your water level!',
    }
}

def send_email(time_last_watered, subject, message):
    port = 465
    smtp_server = "smtp.gmail.com"
    FROM = TO = "YOUR_EMAIL@gmail.com"
    password = "YOUR_PASSWORD"

    complete_message = ''
    if time_last_watered == False:
        complete_message = "Subject: {}\n\n{}".format(subject, message)
    else:
        complete_message = "Subject: {}\n\n{} {}".format(subject, message, time_last_watered)
    
    context = ssl.create_default_context()
    with smtplib.SMTP_SSL(smtp_server, port, context=context) as server:
        server.login(FROM, password)
        server.sendmail(FROM, TO, complete_message)

def send_last_watered_email(time_last_watered):
    message = EMAIL_MESSAGES['last_watered']['message']
    subject = EMAIL_MESSAGES['last_watered']['subject']
    send_email(time_last_watered, subject, message)

def send_check_water_level_email():
    message = EMAIL_MESSAGES['check_water_level']['message']
    subject = EMAIL_MESSAGES['check_water_level']['subject']
    send_email(False, subject, message)

def water_plant(relay, seconds):
    relay.on()
    print("Plant is being watered!")
    time.sleep(seconds)
    print("Watering is finished!")
    relay.off()

def main():
    time_keeper = TK.TimeKeeper(TK.TimeKeeper.get_current_time())
    if(time_keeper.current_time == WATERING_TIME):
        water_plant(RELAY, SECONDS_TO_WATER)
        time_keeper.set_time_last_watered(TK.TimeKeeper.get_current_time())
        print("\nPlant was last watered at {}".format(time_keeper.time_last_watered))
        # send_last_watered_email(time_keeper.time_last_watered)

# schedule.every().friday.at("12:00").do(send_check_water_level_email)

while True:
    # schedule.run_pending()
    time.sleep(1)
    main()

Di sini Anda dapat mengubah nilai-nilai variabel WATERING_TIMEdan SECONDS_TO_WATERyang tampaknya cocok untuk Anda. Variabel pertama menentukan jam berapa untuk menyirami tanaman. Yang kedua menentukan durasi penyiraman.

Selain itu, di sini saya membuat mekanisme untuk mengirim pemberitahuan dan pengingat melalui email. Berkat mekanisme ini, pemilik sistem irigasi menerima email setiap kali sistem dinyalakan dan menyirami tanaman. Selain itu, setiap hari Jumat ia menerima surat yang mengingatkan bahwa ia perlu memeriksa persediaan air irigasi. Dalam kode tersebut, panggilan metode yang sesuai dikomentari, sebagai hasilnya, program dapat bekerja secara normal tanpa pengaturan yang berkaitan dengan email. Jika Anda ingin mengaktifkan pengingat ini, lakukan hal berikut:

  1. Anda harus memasukkan dalam baris FROM = TO = «YOUR_EMAIL@gmail.com»dan password = «YOUR_PASSWORD»alamat email dan kata sandi Gmail Anda.
  2. Batalkan komentar pada baris berikut:

    •  # send_last_watered_email (time_keeper.time_last_watered)
    • # schedule.every (). friday.at ("12:00"). do (send_check_water_level_email)
    • # schedule.run_pending ()
  3. Anda harus pergi ke sini , masuk ke akun Gmail Anda dan nyalakan sakelar di halaman ini. Kalau tidak, ketika Anda mencoba mengirim email menggunakan Gmail, Anda akan menerima pesan kesalahan. 

Selain itu, penting untuk dicatat bahwa sistem pengingat saya hanya berfungsi dengan akun Gmail.

Sekarang semuanya siap untuk bekerja, Anda harus mendapatkan struktur file dan folder berikut:

run
├── classes
│ ├── Hardware.py
│ └── TimeKeeper.py
└── water_plant.py

Folder runsebenarnya dapat ditempatkan di mana saja. Saya memutuskan untuk meninggalkannya di folder Desktop.

Saya tidak tertarik dengan prospek terhubung ke Raspberry Pi setiap kali saya harus memulainya water_plant.py. Saya ingin agar skrip ini berjalan secara otomatis ketika Raspberry Pi dihidupkan. Ini, misalnya, akan memudahkan untuk mematikan sistem, memindahkannya ke tempat lain, menyalakannya, dan tidak perlu khawatir tentang apa pun. Untuk menerapkan skenario yang menarik ini, kita membutuhkan tim crontab.

Buka jendela terminal pada Raspberry Pi dan masukkan perintah berikut:

sudo crontab -e

Menanggapi hal itu, sistem harus menampilkan sesuatu yang menyerupai yang ditunjukkan pada gambar berikut.


Mengkonfigurasi tugas cron

Tambahkan baris berikut ke file ini:

@reboot python3 /home/pi/Desktop/run/water_plant.py

Maka file ini harus disimpan menggunakan kombinasi tombol Ctrl+Xdengan memasukkan Ydan menekan Enter.

Pada baris di atas, kami memberikan Raspberry Pi instruksi berikut: "Setiap kali Anda reboot, jalankan file yang water_plant.pyterletak di folder runyang ada di folder Desktop." Jika folder Anda runterletak dengan cara yang berbeda, edit perintah ini sesuai.

Ringkasan


Lihat kode proyek di sini . Jika mau, Anda dapat segera mengkloning repositori Anda dengan perintah ini:

git clone https://github.com/AlanConstantino/rpi-plant-project.git

Itu saja! Sekarang Anda tahu cara membuat sistem irigasi otomatis untuk tanaman dalam ruangan berdasarkan Raspberry Pi. Dia tahu cara menyirami tanaman setiap 24 jam dan dapat mengirim pemberitahuan dan pengingat email kepada pemiliknya.

Pembaca yang budiman! Bagaimana Anda mengembangkan sistem penyiraman tanaman otomatis di rumah?


All Articles