Raspberry Pi و Python وري النباتات الداخلية

ليس لدي علاقة بالنباتات الداخلية. الحقيقة هي أنني نسيت أن أسقيهم. بمعرفة ذلك ، بدأت أفكر في حقيقة أن شخصًا ما ، بالتأكيد ، وجد بالفعل طريقة لأتمتة الري. كما اتضح ، هناك الكثير من الطرق. وبالتحديد ، نتحدث عن حلول تعتمد على Arduino أو Raspberry Pi. في هذه المقالة ، أود أن أتحدث عن كيفية إنشاء نظام يعتمد على Raspberry Pi و Python ، مصمم لأتمتة محطات الري.



المكونات والموارد المفيدة


أود أن أشير على الفور إلى أنني لست خبيرًا على الإطلاق في مجال الإلكترونيات. إذا طلبوا مني أن أرسم مخططًا كهربائيًا ، أو أخبرهم بالتفصيل عن كيفية عمل أي مكون إلكتروني ، فلا يمكنني رسم أي شيء معقول أو إخباري. في الواقع ، لقد قمت بهذا المشروع فقط بالمعرفة الأساسية للكهرباء وتجربة المكونات فقط. أطلب منك أن تكون حذرا للغاية بشأن العمل مع الكهرباء. وإذا كنت تشعر بنقص في المعرفة في هذا المجال ، أقترح على الأقل القليل من الفهم لهذا.

فيما يلي قائمة بالمكونات التي استخدمتها في مشروعي.


أشارك في برنامج الأمازون التابع ، لذلك يتم توفير الروابط أعلاه. إذا اشتريت شيئًا بالنقر عليه ، فسوف أكسب القليل.

بعد أن حصلت على جميع المكونات التي أحتاجها ، حان الوقت لإجراء بعض الأبحاث. فيما يلي قائمة بالموارد التي ساعدتني على توصيل المكونات الإلكترونية بشكل صحيح وفهم النقاط الرئيسية المتعلقة بعملها:


هنا رسم تخطيطي لمنافذ GPIO Raspberry Pi.


الرسم التخطيطي للميناء Raspberry Pi GPIO

قم بتوصيل التتابع بـ Raspberry Pi


لقد بدأت بتوصيل التتابع بـ Raspberry Pi. هنا هو كيف يبدو.


توصيل المرحل بـ Raspberry Pi

ينتقل السلك الأحمر (أنثى - أنثى) من دبوس لوحة ترحيل JD_VCC إلى دبوس 5V (دبوس رقم 2) من Raspberry Pi. سلك برتقالي (أنثى - أنثى) يؤدي من دبوس لوحة التتابع VCC إلى دبوس 3.3V (دبوس رقم 1) من Raspberry Pi.


دبابيس JD_VCC و VCC من لوحة الترحيل

باستخدام هذه الأسلاك ، نقوم بتزويد الطاقة إلى لوحة التتابع. لتتمكن من التحكم في المرحلات الفردية ، تحتاج إلى توصيل لوحة الترحيل و Raspberry Pi بسلكين آخرين يتصلان بدبابيس GND و IN1 من لوحة الترحيل.


دبابيس GND و IN1 للوحة الترحيل

السلك الأسود (أنثى-أنثى) هو الكبل الأرضي الذي يربط دبوس GND بلوحة الترحيل والدبوس الأرضي على Raspberry Pi (قمت بتوصيله إلى الرقم 34). سلك أبيض (أنثى - أنثى) يؤدي من دبوس IN1 من لوحة التتابع إلى دبوس رقم 12 من Raspberry Pi. هذا السلك الأبيض هو الذي يسمح لنا بالتحكم المبرمج في التتابع ، وتشغيل وإيقاف المرحلات الفردية الموجودة على اللوحة.


أسلاك أبيض وأسود متصلة بـ Raspberry Pi

إذا قررت إعادة إنتاج مشروعي ، يمكنك ترتيب التتابع و Raspberry Pi للتواصل باستخدام أي دبابيس مناسبة. ولكن ضع في اعتبارك أنه إذا كان مخطط الاتصال لمكونات مشروعك مختلفًا عن مخطط الاتصال لمكونات مشروعي ، فسيتعين عليك إجراء التغييرات المناسبة على التعليمات البرمجية الخاصة بي.

توصيل مصدر الطاقة بالمرحل


بعد توصيل لوحة الترحيل بـ Raspberry Pi ، قمت بتوصيل مصدر الطاقة بأحد المرحلات.

لا تقم بتوصيل مصدر الطاقة بمأخذ الطاقة حتى تكمل جميع عمليات تجميع مكونات النظام. انتبه لخطر الصدمة الكهربائية.


توصيل مصدر الطاقة بأحد المرحلات يأتي

مزود الطاقة 12V الذي أستخدمه بمحول مناسب لتوصيل أسلاك التوصيل. لقد قمت بتوصيل السلك الأحمر (ذكر-ذكر) بموصل المحول "+" ، والكابل البني (ذكر-ذكر) بموصل المحول "-". ثم قمت بتوصيل الكبل بموصل "تمساح" (أنثى-ذكر) بالسلك البني.


محول يأتي مع مزود الطاقة

تحتوي لوحة الترحيل على أربع مرحلات منفصلة. لكل منها ثلاثة دبابيس يمكن توصيل الكابلات بها. يوجد في وسط كل مرحل موصل يتم توصيل الإخراج الإيجابي لمصدر طاقة خارجي. يوجد على اليسار الموصل الذي يتصل به الإدخال الإيجابي للجهاز الذي سيتم توصيل الطاقة به.


توصيل مرحل منفصل

قمت بتوصيل كبل أحمر من مصدر الطاقة (طرف موجب) إلى جهة الاتصال المركزية للمرحل. ثم قمت بتوصيل الكبل البرتقالي (ذكر-ذكر) بالموصل الأيسر للمرحل وقمت بتوصيل الكبل بـ "تمساح" (أنثى-ذكر) بهذا الكبل.


كابلات حمراء وبرتقالية


امدادات الطاقة ومحول


التتابع وتوت العليق Pi

توصيل مضخة مياه بمرحل


الآن يبقى فقط لربط الموصلات "التماسيح" بمضخة المياه. يحدد ترتيب اتصالهم اتجاه تدفق المياه.

لذا ، احتجت إلى الماء لدخول القناة اليسرى للمضخة والخروج من القناة اليمنى. لذلك ، قمت بتوصيل موصل "التمساح" للسلك الأسود بطرف المضخة ، الذي يوجد بالقرب منه نقطة حمراء ، و "التمساح" الآخر بطرف المضخة الآخر. إذا قمت بتوصيل "التماسيح" بترتيب مختلف - الماء سيذهب في الاتجاه المعاكس - من القناة اليمنى إلى اليسار.


توصيل مضخة مياه بمرحل


نظام الري الكامل: يدخل الماء المضخة من خلال القناة اليسرى ، ويترك اليمين ويذهب إلى المصنع

الرمز


لذا وصلنا إلى ما أجيده حقًا. وصلنا إلى الرمز. من أجل الحصول على برنامج يعمل مع منافذ GPIO لـ Raspberry Pi ، استخدمت مكتبة gpiozero . إنه سهل الاستخدام ، فهو يخفي الكثير من الآليات منخفضة المستوى عن المبرمج ، والتي عادة ما تحتاج إلى فهمها لمن يريد العمل مع دبابيس GPIO. المكتبة موثقة جيداً.

قبل كتابة الرمز ، تحتاج إلى توصيل جهاز عرض ، وماوس ، ولوحة مفاتيح بجهاز Raspberry Pi. أو تحتاج إلى الاتصال بجهاز Raspberry Pi عبر SSH .

بعد إدخال Raspberry Pi ، انتقل إلى المجلد Desktopوأنشئ مجلدًا هناك run. قم بإنشاء مجلد في هذا المجلد classes. وفي المجلد ، قم classesبإنشاء ملف Hardware.py. يجب أن يحتوي على الرمز التالي:

from gpiozero import OutputDevice

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

في هذا الملف ، أعلنت للتو عن فئة جديدة Relay، وهي سلالة فئة OutputDevice .

بعد ذلك ، في المجلد ، classesقمت بإنشاء ملف جديد 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")

الغرض من هذه الفئة هو تتبع الوقت الحالي ولحظة آخر مرة تم فيها الري.

لذا، فإن الملفات Hardware.pyو TimeKeeper.pyالموجودة في المجلد classes. الآن ، خارج هذا المجلد ، أقوم بإنشاء ملف 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()

هنا يمكنك تغيير قيم المتغيرات WATERING_TIMEو SECONDS_TO_WATERتلك التي تبدو مناسبة لك. يحدد المتغير الأول الوقت المناسب لري النباتات. والثاني يحدد مدة الري.

بالإضافة إلى ذلك ، أنشأت هنا آلية لإرسال الإشعارات والتذكيرات عبر البريد الإلكتروني. بفضل هذه الآلية ، يتلقى صاحب نظام الري بريدًا إلكترونيًا في كل مرة يتم فيها تشغيل النظام ويسقي النباتات. بالإضافة إلى ذلك ، يتلقى كل يوم جمعة رسالة تذكره بأنه بحاجة إلى التحقق من إمدادات مياه الري. في الكود ، يتم التعليق على استدعاء الطرق المقابلة ، ونتيجة لذلك ، يمكن أن يعمل البرنامج بشكل طبيعي بدون إعدادات تتعلق بالبريد الإلكتروني. إذا كنت تريد تمكين هذه التذكيرات ، فقم بما يلي:

  1. يجب إدخال في خط FROM = TO = «YOUR_EMAIL@gmail.com»و password = «YOUR_PASSWORD»عنوان البريد الإلكتروني وكلمة مرور Gmail.
  2. أزل التعليق عن السطور التالية:

    •  # send_last_watered_email (time_keeper.time_last_watered)
    • # Schedule.every (). friday.at ("12:00"). do (send_check_water_level_email)
    • # جدول. run_pending ()
  3. تحتاج إلى الذهاب هنا ، وتسجيل الدخول إلى حساب Gmail الخاص بك وتشغيل المفتاح في هذه الصفحة. خلاف ذلك ، عند محاولة إرسال بريد إلكتروني باستخدام Gmail ، ستتلقى رسالة خطأ. 

بالإضافة إلى ذلك ، من المهم ملاحظة أن نظام التذكير الخاص بي يعمل فقط مع حسابات Gmail.

الآن بعد أن أصبح كل شيء جاهزًا للعمل ، يجب أن تحصل على الهيكل التالي للملفات والمجلدات:

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

runيمكن بالفعل وضع مجلد في أي مكان. قررت تركه في المجلد Desktop.

لم أكن منجذبًا لاحتمال الاتصال بجهاز Raspberry Pi في كل مرة كنت أبدأ فيها water_plant.py. أود تشغيل هذا البرنامج النصي تلقائيًا عند تشغيل Raspberry Pi. هذا ، على سبيل المثال ، سيجعل من السهل إيقاف تشغيل النظام ، ونقله إلى مكان آخر ، وتشغيله ، ولا داعي للقلق بشأن أي شيء. من أجل تنفيذ هذا السيناريو الجذاب ، نحتاج إلى فريق crontab.

افتح النافذة الطرفية على Raspberry Pi وأدخل الأمر التالي:

sudo crontab -e

ردا على ذلك ، يجب على النظام إخراج شيء مشابه لما هو موضح في الشكل التالي.


تكوين مهام cron

أضف السطر التالي إلى هذا الملف:

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

ثم يجب حفظ هذا الملف باستخدام تركيبة المفاتيح Ctrl+Xعن طريق الدخول Yوالضغط Enter.

في السطر أعلاه ، نقدم Raspberry Pi الإرشادات التالية: "في كل مرة تعيد فيها التشغيل ، قم بتشغيل الملف water_plant.pyالموجود في المجلد runالموجود في المجلد Desktop." إذا كان المجلد الخاص بك runموجودًا بطريقة مختلفة ، فقم بتحرير هذا الأمر وفقًا لذلك.

ملخص


عرض كود المشروع هنا . إذا أردت ، يمكنك نسخ مخزونك على الفور باستخدام هذا الأمر:

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

هذا كل شئ! الآن أنت تعرف كيفية إنشاء نظام الري الآلي للنباتات الداخلية على أساس Raspberry Pi. إنها تعرف كيفية ري النباتات كل 24 ساعة ويمكنها إرسال إشعارات وتذكيرات لمالكها بالبريد الإلكتروني.

القراء الأعزاء! كيف يمكنك تطوير نظام سقي نباتي آلي منزلي؟


All Articles