جدول المحتويات:

توصيل صندوق الرسائل المتصل بالطاقة الشمسية: 12 خطوة (بالصور)
توصيل صندوق الرسائل المتصل بالطاقة الشمسية: 12 خطوة (بالصور)

فيديو: توصيل صندوق الرسائل المتصل بالطاقة الشمسية: 12 خطوة (بالصور)

فيديو: توصيل صندوق الرسائل المتصل بالطاقة الشمسية: 12 خطوة (بالصور)
فيديو: كيف توصل نظام طاقة شمسية خطوه بخطوه وفقاً لمعايير وإشتراطات السلامة. 2024, يوليو
Anonim
متصل Letterbox يعمل بالطاقة الشمسية
متصل Letterbox يعمل بالطاقة الشمسية
متصل Letterbox بالطاقة الشمسية
متصل Letterbox بالطاقة الشمسية

بالنسبة إلى Ible الثاني ، سأصف لك أعمالي حول صندوق البريد المتصل.

بعد قراءة هذا Instructable (+ العديد من الرسائل الأخرى) ، وبما أن صندوق الرسائل الخاص بي ليس بالقرب من منزلي ، فقد أردت أن ألهمني بأعمال Open Green Energy لربط صندوق الرسائل الخاص بي بخادم Domoticz الخاص بي.

الأهداف

  • كن على علم من Telegram عندما تأتي الرسائل ؛
  • كن على علم من Telegram عندما يأتي الطرد ؛
  • تحقق مما إذا تم استلام الرسائل / الطرود.

القيد الرئيسي

صندوق البريد بعيد نسبيًا عن المنزل ، وكان من المستحيل سحب كابل كهربائي إليه لتشغيل أي شيء.

كان علي أن أجد حلًا آخر: كانت الطاقة الشمسية حلاً جيدًا!

BOM

  • Raspberry Pi (لاستضافة أجزاء MQTT و Domoticz - غير موصوفة هنا)
  • حساب Telegram Bot
  • Lolin D1 mini (أو Wemos…)
  • التوصيل في برغي موصل كتلة المحطة
  • لوحة شحن بطارية الليثيوم TP4056
  • 6V 2W الألواح الشمسية الكهروضوئية
  • بطارية ليثيوم أيون 18650
  • حامل بطارية ليثيوم أيون
  • PCB DIY لحام النحاس النموذج الأولي لوحة الدوائر المطبوعة
  • أجهزة التناظرية SG90
  • 3 مفاتيح ريد (واحد للرسائل ، واحد للطرد وواحد للخروج)
  • مغناطيس
  • بعض الأسلاك
  • الصندوق الخشبي: نظرًا لعدم وجود أي طابعة ثلاثية الأبعاد ، أدركت أن منزلي الصغير المزود بالخشب لاستلام أجزاء الإلكترونيات …
  • كابل إيثرنت احتياطي
  • لوحة اندلاع موصل إيثرنت RJ45

  • جي بي ويلد
  • بعض الكرات
  • البراغي والصواميل والغسالات

الخطوة 1: المخطط العالمي

النظام العالمي
النظام العالمي
النظام العالمي
النظام العالمي

الرسومات الجميلة دائمًا أفضل من الخطب الطويلة ؛-)

لكن بعض التفسيرات حول MQTT و Domoticz و Telegram مرحب بها دائمًا!

MQTT (نقل القياس عن بُعد لخدمة وضع الرسائل في قائمة انتظار) ، هو بروتوكول مراسلة يُستخدم لإرسال البيانات بين الأجهزة والأنظمة الأخرى في عالم إنترنت الأشياء (إنترنت الأشياء).

بدون الخوض في الكثير من التفاصيل ، تعتمد عملياتها على مبدأ اتصال العملاء بالخادم. في MQTT ، يُطلق على العملاء اسم المشترك أو الناشر ، ويطلق على الخادم اسم Broker.

في هذا Instructable ، أستخدم ناشرًا واحدًا فقط ، Lolin سلكيًا بصندوق الرسائل الخاص بي: عندما يتم اكتشاف رسائل أو طرد عبر جهات اتصال reed المثبتة في letterbox (الخطوة 1 في shematic) ، أرسل رسالة MQTT عبر WIFI إلى الوسيط (الخطوة 2).

يتم تنفيذ جزء الوسيط بواسطة Mosquitto ، والذي تم تثبيته على Raspberry Pi (الخطوة 3).

حول Domoticz:

كما هو موضح في صفحة المصدر ، Domoticz هو "نظام أتمتة المنزل" ، مما يسمح لك بالتحكم في الأجهزة المختلفة وتلقي المدخلات من البروتوكولات المختلفة: MQTT هو أحد البروتوكولات المدعومة …

بمجرد وصول المعلومات إليه (الخطوة 4) ، يمكنك تحديد الأحداث: في حالة صندوق الرسائل ، اخترت إرسال إشعار Telegram (الخطوة 5).

أخيرًا ، تم تكوين عميل Telegram على هاتفي (وزوجتي أيضًا! - الخطوة 6): تم الوصول إلى الهدف النهائي …

الخطوة 2: التخطيطي / الأسلاك

Shematic / الأسلاك
Shematic / الأسلاك
Shematic / الأسلاك
Shematic / الأسلاك
Shematic / الأسلاك
Shematic / الأسلاك
Shematic / الأسلاك
Shematic / الأسلاك

قراءة كلمة واحدة عن التناظرية:

بادئ ذي بدء ، لاحظت بعد بعض الأبحاث أن Lolin mini D1 (مثل Wemos القديم) ، يحتوي على مقسم جهد للدبوس A0 (مع الأخذ في الاعتبار 220KΩ لـ R1 و 100KΩ لـ R2 - انظر على يمين ورقة البيانات المرتبطة) ، مما يسمح بـ 3.2 فولت كحد أقصى جهد الإدخال التناظري.

بالنظر إلى الحد الأقصى لجهد الإخراج من البطارية هو 4 ، 2 فولت (محدود بواسطة لوحة الشحن) ، ومن الناحية النظرية ، تحتاج فقط إلى إضافة مقاوم خارجي (متسلسل مع R1) لزيادة نطاق جهد الدخل الأقصى. بعد ذلك ، إذا أضفت 100K في سلسلة مع R1 ، فستحصل على هذه النتيجة:

فين * R1 / (R1 + R2) = صوت

4 ، 2 * 320 ك / (320 ك + 100 ك) = 3 ، 2

في دائري ، اخترت أن أكون قادرًا على ضبط قيمته ، ولهذا السبب فضلت استخدام مقاوم قابل للتعديل في دائري: ربما سيكون عديم الفائدة بالنسبة لك ، لكن في وضعي ، قمت بتعيين قيمته على حوالي 10KΩ للحصول على قيمة متماسكة في Domoticz …

لاحظ أن دبوس A0 لديه دقة 10 بت: هذا يعني أنه في الرسم الخاص بك ، ستعيد القراءة التناظرية قيمة بين 0 إلى 1024.

نظرًا لأنني أريد إرسال قيمة النسبة المئوية إلى Domoticz ، يجب أن أقسم نتيجة القراءة التناظرية على 10 ، 24.

الخطوة الثالثة: إدارة الطاقة

إدارة السلطة
إدارة السلطة
إدارة السلطة
إدارة السلطة

بالطبع ، أريد أن يكون صندوق الرسائل مستقلاً. للوصول إلى هدفي ، أستخدم هذه العناصر:

  • بطارية Li-Ion 18650 بقوة 4000 مللي أمبير في الساعة ؛
  • لوحة شمسية يمكن أن توفر 6V / 2W ؛
  • لوحة شحن بطارية ليثيوم TP4056.

لاختيار أنسب لوحة شمسية ، ألقيت نظرة على بعض الأمثلة ، بما في ذلك هذا المثال: في هذا المثال ، يتم استخدام لوحة شمسية 5.5V / 0.66W ، وربما تكون كافية لهذا الغرض. في حالتي ، وبما أن ESP8266 يجب أن يظل قيد التشغيل خلال النهار ويجب أن يكون قادرًا على تشغيل محرك مؤازر لإبقاء المنزل في مواجهة أشعة الشمس ، فقد اخترت نموذجًا أكثر قوة للألواح الشمسية (6V / 2W) - كما أنه يسمح لي لتوقع فترات الشتاء المظلمة والأيام الملبدة بالغيوم ؛-)

أيضًا ، ومن أجل تقليل إنفاق الطاقة إلى الحد الأقصى ، فقد اخترت السيناريوهات التالية:

  • مع العلم أن ساعي البريد تجاوز فقط بين الساعة 7 صباحًا و 8 مساءً ، يتم وضع ESP في DeepSleep بقية الليل ؛
  • لا يمر العامل بين ظهر السبت وصباح الاثنين: يتم وضع ESP أيضًا في وضع DeepSleep خلال هذه الفترة.
  • للفترة ما بين 7 صباحًا و 8 مساءً ، ولتقليل استهلاك الطاقة ، أقوم ببساطة بتعطيل واجهة الشبكة الخاصة بـ ESP: يتم إعادة تشغيل الشبكة فقط عند وصول طرد أو رسالة ، فقط وقت كافٍ لإرسال المعلومات إلى Domoticz أنا لست بحاجة إلى أن يتم تحذيري على الفور ، فالثواني القليلة الإضافية اللازمة لإعادة تشغيل واجهة الشبكة ليست ضارة!

بعض القيم حول الاستهلاك في الأوضاع المختلفة التي أستخدمها في Lolin - انظر إلى ورقة البيانات ، الصفحة 18:

  • في الوضع العادي (مع عمل الترددات اللاسلكية) ، يمكن أن يزيد استهلاك الطاقة إلى 170 مللي أمبير! نظرًا لأن صندوق البريد الخاص بي يقع على بعد حوالي 50 مترًا من منزلي (وفي حدود إشارة WIFI …) أفترض أن الطاقة المستخدمة للحفاظ على الاتصال عند الحد الأقصى …
  • في وضع السكون المودم ، ينخفض استهلاك الطاقة إلى 15 مللي أمبير. ولكن كما ترى في ورقة البيانات ، فإنه لم يوقف المودم تمامًا ، لأن ESP "يحافظ على اتصال Wi-Fi بدون نقل البيانات".
  • في النوم العميق ، تنخفض الطاقة إلى 20uA.

للتأكد من أن wifi لا يظل نشطًا دون داع ، فضلت تعطيله بالأوامر التالية. لاحظ العديد من مكالمات التأخير … بدونها ، تعطل ESP:

WiFi.disconnect () ؛

تأخير (1000) ؛ WiFi.mode (WIFI_OFF) ؛ تأخير (1000) ؛ WiFi.forceSleepBegin () ، تأخير (1) ؛

بشكل عام ، بعد عدة أيام من التشغيل ، يبدو أنه يعمل وخاصة التحميل بشكل صحيح:

  • هذا يسمح لي بتشغيل المحرك المؤازر كل ساعة لوضع المنزل نحو الشمس ؛
  • يمكنني أيضًا السماح لنفسي بإعادة تنشيط واجهة الشبكة كل ساعة لإرسال مستوى شحن البطارية إلى Domoticz.

الخطوة 4: تثبيت جهات اتصال المغناطيس والقصب

تثبيت جهات اتصال المغناطيس والقصب
تثبيت جهات اتصال المغناطيس والقصب
تثبيت جهات اتصال المغناطيس والقصب
تثبيت جهات اتصال المغناطيس والقصب
تثبيت جهات اتصال المغناطيس والقصب
تثبيت جهات اتصال المغناطيس والقصب

كالعادة ، استخدمت Proxxon الخاص بي لتشكيل مكان القصب في قطعة من الخشب.

لإصلاح ملامس القصب في الفتحة الخاصة به ، استخدمت القليل من لحام J-B.

بالنسبة للطرد والإخراج ، قطعة صغيرة من الشريط ، وقليل من المنشار ، ويتم الوصول إلى الهدف!

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

الخطوة 5: اتصل بيتي الصغير

ربط بيتي الصغير
ربط بيتي الصغير
ربط بيتي الصغير
ربط بيتي الصغير

لكي أتمكن من توصيل وفصل الكبل الذي ينتقل إلى جهات اتصال القصب من صندوق الرسائل إلى المنزل بسهولة ، اخترت استخدام موصل Ethernet.

يمكنك استخدام هذا النموذج أو ، مثلي ، استخدام درع Arduino Ethernet قديم معلق في أدراجي: لم يكن يعاني ، لقد كان شجاعًا أمام المنشار ، وفاته كانت سريعة ^^

مجرد كلمة واحدة عن درع Arduino Ethernet هذا: لا تتوقع أن يكون لديك 8 برامج تشغيل منفصلة … يتم إقران الكابلات بـ 2 داخل الدرع … لقد دفعني إلى الجنون لفترة طويلة !!!

الخطوة السادسة: في المنزل …

في المنزل …
في المنزل …
في المنزل …
في المنزل …

فقط مكان كافٍ لإصلاح حامل البطارية ، وإعداد المؤازرة ، وموصل RJ45 femal.

الخطوة 7: دعها القرص الدوار …

دعه القرص الدوار …
دعه القرص الدوار …
دعه القرص الدوار …
دعه القرص الدوار …
دعه القرص الدوار …
دعه القرص الدوار …
دعه القرص الدوار …
دعه القرص الدوار …

الهدف هو إبقائها في مواجهة الشمس …

للسماح بإمكانية الدوران ، استخدمت مسمارًا طويلًا كمحور ، مع بعض الصواميل ومحامل كروية …

حتى الآن ، استخدمت أجهزة SG90 (عزم الدوران: 1.8 كجم / سم عند 4.8 فولت).

لقلب المنزل (وغراماته القليلة) يكفي. من ناحية أخرى ، لست متأكدًا من أن تروسها البلاستيكية تقاوم لفترة طويلة هبوب الرياح المتكررة الموجودة في منطقتي.

طلبت واحدة أخرى (عزم MG995: 9.4 كجم / سم عند 4.8 فولت) ، وهي ليست باهظة الثمن أيضًا ، ولكن مع التروس المعدنية.

سيكون الشيء التالي الذي يجب أن أفعله عندما أستلمه: أعتمد على صندوق البريد المتصل لإخطاري بوصوله!

الخطوة 8: بعض الاختبارات

Image
Image

بعض الملاحظات:

هذا الرسم التخطيطي مخصص فقط لمحاكاة تغييرات الساعات خلال اليوم للسماح لي بالتحكم في موضع المؤازرة.

  • مع SG90: لا توجد احتياجات إضافية ، يمكنه العمل بجهد OUT القادم من وحدة تحكم البطارية.
  • لكن مع MG 995:

    • الزاوية الكلية للدوران ليست هي نفسها (أوسع): كان علي استخدام وظيفة إضافية لتقليلها (Servo_Delta ()).
    • تحتاج إلى DC / DC Step up لتوفير جهد كافي للمؤازرة … للاستمرار …

/*

- اختبار مع SG90: لا توجد احتياجات إضافية ، يمكن أن تعمل مع جهد التيار الخارج من وحدة التحكم في البطارية - بالنسبة إلى MG 995: - استخدم وظيفة Servo_Delta () … - تحتاج إلى DC / DC Step up لتوفير جهد كافي إلى المؤازرة … تابع: * / #include bool Logs = true ؛ مؤازرة myservo. #define PIN_SERVO D2 // وضع المؤازرة لـ: 7h، 8h، 9h، 10h، 11h، 12h، 13h، 14h، 15h، 16h، 17h، 18h، 19h، 20h، 21h // int Arr_Servo_Pos = {177، 173 ، 163 ، 148 ، 133 ، 118 ، 100 ، 80 ، 61 ، 41 ، 28 ، 15 ، 2 ، 2 ، 2} ؛ int Arr_Servo_Pos = {180، 175، 165، 150، 135، 120، 102، 82، 63، 43، 30، 15، 0، 0، 0} ؛ العمر int نقاط البيع int إنت أنا إعداد باطل () {Serial.begin (115200) ؛ } حلقة فارغة () {لـ (i = 7؛ i <= 22؛ i ++) {old = i؛ إذا (i == 7) {if (Logs) Serial.println ("Positionne le servo pour 7 Heure") ؛ myservo.attach (PIN_SERVO) ، لـ (int index = Arr_Servo_Pos [(sizeof (Arr_Servo_Pos) / sizeof (Arr_Servo_Pos [0])) -1] ؛ الفهرس 7 && i = Arr_Servo_Pos [i-7] ؛ الفهرس -) {if (Logs) Serial.println (فهرس)؛ if (السجلات) Serial.print ("القيمة المعدلة:") ؛ إذا (سجلات) Serial.println (Servo_Delta (فهرس)) ؛ تأخير (200) ؛ //myservo.write(Servo_Delta(index)) ؛ myservo.write (فهرس) ؛ } تأخير (15)؛ myservo.write (Arr_Servo_Pos [i-7]) ؛ // اكتب مرة أخرى القيمة الأخيرة لتجنب الحركات المتشنجة عند datach myservo.detach () ؛ }}} delay (2000)؛ }} int Servo_Delta (قيمة int) {int Temp_val؛ Temp_val = (القيمة * 0.80) +9 ؛ إرجاع Temp_val ؛ }

الخطوة 9: البيت الصغير

البيت الصغير
البيت الصغير
البيت الصغير
البيت الصغير
البيت الصغير
البيت الصغير

كما قلت من قبل ، لم أحصل على أي طابعة ثلاثية الأبعاد. لذلك قررت استخدام صندوق خضروات قديم …

ربما لن يستمر الطقس طويلاً ، ولكن بحلول ذلك الوقت ، سيكون لدي وقت للتفكير في حل آخر (أو صديق يمتلك طابعة ثلاثية الأبعاد): لحماية الخشب ، أضفت الكثير من الورنيش في كل مكان …

يمكنك أن ترى "الستائر الجميلة" … هذا ما يحدث عندما تطلب من زوجتك القيام بالمهمة ^^

الخطوة 10: الرسم

قيد التقدم … ولكن يبدو أنه مستقر

ما زلت أعمل على الكود: نظرًا لأن هذه ليست نسخة نهائية ، نرحب بتعليقاتك / نصائحك ؛-)

بعض الملاحظات:

  • هناك العديد من التأخيرات () في الكود: هذا لتجنب الكثير من تعطل Lolin ، خاصة أثناء إيقاف تشغيل شبكة …
  • لم أجد طريقة سهلة وموثوقة للحصول على سمت الشمس: لهذا السبب قمت بتثبيت قيمة المؤازرة في وظيفة ما لاحظته … لدي طريقة جيدة (وبسيطة) للحصول عليها ، أنا مهتم! ربما! مسار للدراسة هنا ، حتى لو كنت أفضل واجهة برمجة تطبيقات عبر الإنترنت تعطيني السمت مباشرة وفقًا للتاريخ والساعة والموقع الجغرافي …
  • حول تقنية النوم: نظرًا لأن Lolin هو معالج Tensilica 32 بت ، فإن قيمته القصوى لعدد صحيح بدون إشارة يبلغ 32 بت هو 4294967295… ومن ثم ، فإنه يعطي حوالي 71 دقيقة كحد أقصى لفاصل النوم العميق. لهذا السبب أجعل النوم l'ESP عدة مرات لمدة 60 دقيقة تقريبًا …

تحرير - 2018-10-08:

اكتشفت أن الماكينة لديها الكثير من الحركات المتشنجة ، خاصة قبل المرفق () ، وفصل () وفي كل مرة يستيقظ Lolin من deepSleep ().

أثناء دراسة المزيد من أوراق البيانات ، أدركت شيئين:

  • في ورقة بيانات Lolin ، تم توصيل إخراج D4 بالفعل بـ BUILTIN_LED…
  • في ورقة البيانات ESP8266ex ، نتعلم أن إخراج D4 يُستخدم كـ UART 1 / U 1 TXD (جهاز إرسال استقبال غير متزامن عالمي). كما تم تحديد أن UART1 هذا يُستخدم لطباعة السجل.

من خلال قراءة هذه المعلومات ، أدركت أن إخراج D4 لم يكن فكرة جيدة ، خاصة لإدارة محرك مؤازر!

لذا ، الآن الإخراج المستخدم للتحكم في محرك مؤازر هو D2 ، تم تحديث الكود أدناه وفقًا لذلك.

//****************************************

تاريخ النشر: 08 / Date mise en prod: 08 / الإصدار: 0.9.4 إصدار IDE Arduino: 1.8.6 سرعة التحميل: 921600 النوع حسب الطلب dans l'IDE: "LOLIN (WEMOS) D1 R2 & mini" Carte physique Employée: LOLIN (WEMOS) D1 R2 & mini (https://www.amazon.fr/gp/product/B01ELFAF1S/ref=oh_aui_detailpage_o00_s00؟ie=UTF8&psc=1) Pin Function ESP-8266 Pin Utilization locale ------- -------------------------------------------------- ------------------------------------ TX TXD TXD RX RXD RXD A0 دخل تناظري ، دخل 3.3 فولت بحد أقصى A0 Tension d'alimentaion D0 IO GPIO16 Connecté à RST (pour le deep.sleep) D1 IO، SCL GPIO5 D2 IO، SDA GPIO4 محرك مؤازر D3 IO، 10k Pull-up GPIO0 D4 IO، 10k pull-up، BUILTIN_LED GPIO2 D5 IO ، SCK GPIO14 Reed relève D6 IO، MISO GPIO12 Reed lettre D7 IO، MOSI GPIO13 Reed colis D8 IO، 10k pull-down، SS GPIO15 G Ground GND 5V 5V - 3V3 3.3V 3.3V RST إعادة تعيين RST Connecté à D0 (صب عميق.sleep) ****************************************** / # تضمين السجلات المنطقية = صحيح ؛ // wifi const char * ssid = "LOL" ؛ const char * password = "LOL" ؛ IPAddress ip (192 ، 168 ، 000 ، 000) ؛ IPAddress dns (192 ، 168 ، 000 ، 000) ؛ بوابة IPAddress (192 ، 168 ، 000 ، 000) ؛ الشبكة الفرعية IPAddress (255 ، 255 ، 000 ، 000) ؛ عميل WiFiClient ؛ // Servo #include #define PIN_SERVO D2 Servo myservo؛ // وضع المؤازرة لـ: 7h ، 8h ، 9h ، 10h ، 11h ، 12h ، 13h ، 14h ، 15h ، 16h ، 17h ، 18h ، 19h ، 20h ، 21h int Arr_Servo_Pos = {179 ، 175 ، 165 ، 150 ، 135 ، 120 ، 102 ، 82 ، 63 ، 43 ، 30 ، 15 ، 1 ، 1 ، 1} ؛ // Reeds #define PIN_SWITCH_OUT D5 بايت Old_Switch_State_OUT ؛ بايت Switch_State_OUT ؛ #define PIN_SWITCH_IN_PARCEL D6 بايت Old_Switch_State_IN_PARCEL؛ بايت Switch_State_IN_PARCEL ؛ #define PIN_SWITCH_IN_LETTER D7 بايت Old_Switch_State_IN_LETTER ؛ بايت Switch_State_IN_LETTER ؛ التبديل الطويل بدون توقيع DEBOUCE_TIME = 200 ؛ // Analog #define PIN_ANALOG A0 // MQTT #include const char * MQTT_Server_IP = "عنوان MQTT الخاص بك" ؛ const int MQTT_Server_Port = ؛ int IDX_Letter_Box = ؛ int IDX_Parcel_Box = ؛ int IDX_Letter_Box_Battery = ؛ PubSubClient ClientMQTT (عميل) ؛ char MQTT_Message_Buff [70] ؛ سلسلة MQTT_Pub_String ؛ // تعويم التوتر vcc ؛ // NTP # تتضمن time_t tnow ؛ int Old_Time = 0 ؛ Int_Heures = 0 ؛ Int_Minutes = 0 ؛ int Int_Sleep_Duration = 63 ؛ إعداد باطل () {Serial.begin (115200) ؛ شبكة (صحيح) ؛ pinMode (PIN_SWITCH_OUT ، INPUT_PULLUP) ؛ Old_Switch_State_OUT = قراءة رقمية (PIN_SWITCH_OUT) ، pinMode (PIN_SWITCH_IN_LETTER ، INPUT_PULLUP) ؛ Old_Switch_State_IN_LETTER = قراءة رقمية (PIN_SWITCH_IN_LETTER) ، pinMode (PIN_SWITCH_IN_PARCEL، INPUT_PULLUP) ؛ Old_Switch_State_IN_PARCEL = digitalRead (PIN_SWITCH_IN_PARCEL) ، SendBatteryLevel () ، شبكة (خاطئة) ؛ // NTP set tnow = time (nullptr) ؛ Int_Heures = سلسلة (ctime (& tnow)). سلسلة فرعية (11، 13).toInt () ؛ Int_Minutes = سلسلة (ctime (& tnow)). سلسلة فرعية (14، 16).toInt () ؛ // Deepsleep for the night if (! ((Int_Heures> = 7) && (Int_Heures <= 20))) {Serial.print ("Sleep pour la nuit (")؛ Serial.print (Int_Sleep_Duration - Int_Minutes)؛ Serial. println ("minutes)") ؛ النوم (Int_Sleep_Duration - Int_Minutes) ؛ }} void loop () {// NTP set tnow = time (nullptr)؛ Int_Heures = سلسلة (ctime (& tnow)). سلسلة فرعية (11، 13).toInt () ؛ Int_Minutes = سلسلة (ctime (& tnow)). سلسلة فرعية (14، 16).toInt () ؛ //Serial.println(String(ctime(&tnow))) ؛ //Serial.println ("Heure:" + سلسلة (ctime (& tnow)). سلسلة فرعية (11 ، 13)) ؛ //Serial.println (سلسلة (ctime (& tnow)). سلسلة فرعية (11، 13).toInt ()) ؛ // إدارة المؤازرة إذا (Old_Time! = Int_Heures) {Old_Time = Int_Heures؛ إذا (Int_Heures == 7) {if (Logs) Serial.println ("Positionne le servo pour 7 Heure") ؛ myservo.attach (PIN_SERVO) ، لـ (int index = Arr_Servo_Pos [(sizeof (Arr_Servo_Pos) / sizeof (Arr_Servo_Pos [0])) -1] ؛ الفهرس 7 && Int_Heures = Arr_Servo_Pos [Int_Heures-7] ؛ الفهرس -) {if (السجلات) Serial.println (فهرس)؛ تأخير (200) ؛ myservo.write (فهرس) ؛ } تأخير (15)؛ myservo.write (Arr_Servo_Pos [Int_Heures-7]) ؛ // اكتب القيمة الأخيرة مرة أخرى لتجنب الحركات المتشنجة عند فصل myservo.detach () ؛ } شبكة (صواب) ؛ SendBatteryLevel () ، شبكة (خاطئة) ؛ }}} // Deepsleep if Saturday بعد 13 ساعة إذا ((String (ctime (& tnow)). substring (0، 3) == "Sat") && (Int_Heures> = 13)) {if (Logs) Serial.print ("Sleep pour le samedi aprés midi (")؛ if (Logs) Serial.print (Int_Sleep_Duration - Int_Minutes)؛ if (Logs) Serial.println ("minutes)")؛ النوم (Int_Sleep_Duration - Int_Minutes) ؛ } // Deepsleep if sunday if (String (ctime (& tnow)). substring (0، 3) == "Sun") {if (Logs) Serial.print ("Sleep pour le dimanche (")؛ if (Logs) Serial.print (Int_Sleep_Duration - Int_Minutes) ؛ if (Logs) Serial.println ("minutes)") ؛ النوم (Int_Sleep_Duration - Int_Minutes) ؛ } // إدارة القصب Switch_State_OUT = digitalRead (PIN_SWITCH_OUT) ؛ إذا (Switch_State_OUT! = Old_Switch_State_OUT) {if (millis () - switchPressTime> = DEBOUCE_TIME) {switchPressTime = millis () ؛ if (Switch_State_OUT == HIGH) {Serial.println ("courrier relevé!")؛ شبكة (صحيح) ؛ تأخير (5000) ؛ MQTT_Pubilsh (IDX_Letter_Box، 0، "0") ؛ تأخير (5000) ؛ MQTT_Pubilsh (IDX_Parcel_Box، 0، "0") ؛ تأخير (5000) ؛ شبكة (خاطئة) ؛ }} Old_Switch_State_OUT = Switch_State_OUT ، } Switch_State_IN_LETTER = قراءة رقمية (PIN_SWITCH_IN_LETTER) ، إذا (Switch_State_IN_LETTER! = Old_Switch_State_IN_LETTER) {if (millis () - switchPressTime> = DEBOUCE_TIME) {switchPressTime = millis () ؛ إذا (Switch_State_IN_LETTER == HIGH) {Serial.println ("courrier arrivé!") ؛ شبكة (صحيح) ؛ تأخير (5000) ؛ MQTT_Pubilsh (IDX_Letter_Box، 1، "Courrier") ؛ تأخير (5000) ؛ شبكة (خاطئة) ؛ }} Old_Switch_State_IN_LETTER = Switch_State_IN_LETTER ، } Switch_State_IN_PARCEL = digitalRead (PIN_SWITCH_IN_PARCEL) ، إذا (Switch_State_IN_PARCEL! = Old_Switch_State_IN_PARCEL) {if (millis () - switchPressTime> = DEBOUCE_TIME) {switchPressTime = millis () ؛ if (Switch_State_IN_PARCEL == HIGH) {Serial.println ("colis arrivé!") ؛ شبكة (صحيح) ؛ تأخير (5000) ؛ MQTT_Pubilsh (IDX_Parcel_Box، 1، "Colis") ؛ تأخير (5000) ؛ شبكة (خاطئة) ؛ }} Old_Switch_State_IN_PARCEL = Switch_State_IN_PARCEL ، }} باطل SendBatteryLevel () {delay (5000) ؛ vcc = analogRead (PIN_ANALOG) /10.24 ؛ إذا (السجلات) Serial.println ("\ tTension relevée:" + String (vcc، 0))؛ MQTT_Pubilsh (IDX_Letter_Box_Battery، 0، سلسلة (vcc، 0)) ؛ تأخير (5000) ؛ } سكون باطل (int Min_Duration) {ESP.deepSleep (Min_Duration * 60e6) ؛ } void network (bool UpDown) {if (UpDown) {Serial.print ("Network start")؛ WiFi.forceSleepWake () ، تأخير (1) ؛ // init WIFI WiFi.config (ip، dns، gateway، subnet) ؛ WiFi.begin (SSID ، كلمة المرور) ؛ while (WiFi.status ()! = WL_CONNECTED) {delay (500) ؛ Serial.print (".") ؛ } تأخير (5000)؛ Serial.println (".") ؛ Serial.print ("\ t متصل - عنوان IP:") ؛ Serial.println (WiFi.localIP ()) ؛ // init MQTT ClientMQTT.setServer (MQTT_Server_IP، MQTT_Server_Port) ؛ // تهيئة NTP Serial.print ("\ t تزامن الوقت.") ؛ configTime (0 ، 0 ،" fr.pool.ntp.org ") ؛ setenv (" TZ "،" CET-1CEST ، M3.5.0 ، M10.5.0 / 3 "، 0) ؛ while (time (nullptr) <= 100000) {Serial.print (".")؛ delay (100)؛} Serial.println (".")؛} else {Serial.println ("Network stop.")؛ WiFi.disconnect ()؛ تأخير (1000) ؛ WiFi.mode (WIFI_OFF) ؛ تأخير (1000) ؛ WiFi.forceSleepBegin () ؛ / t محاولة اتصال MQTT … ") ؛ // محاولة الاتصال إذا (ClientMQTT.connect (" ESP8266ClientBAL ")) {Serial.println (" متصل ") ؛} وإلا {Serial.print (" فشل ، rc = ") ؛ مسلسل.print (ClientMQTT.state ()) ؛ Serial.println ("حاول مرة أخرى في 5 ثوانٍ") ؛ // انتظر 5 ثوانٍ قبل إعادة المحاولة تأخير (5000) ؛}}} باطل MQTT_Pubilsh (int_IDX ، int N_Value ، String S_Value) {if (! ClientMQTT.connected ()) أعد الاتصال ()؛ vcc = analogRead (PIN_ANALOG) /10.24؛ Serial.println ("\ t إرسال المعلومات إلى MQTT…")؛ MQTT_Pub_String = "{" idx / ":" + String (Int_IDX) + "، \" البطارية / ":" + سلسلة (vcc، 0) + "، \" nvalue / ":" + N_Value + "، \" svalue / ": \" "+ S_Value +" / "}" ؛ MQTT_Pub_String.toCharArray (MQTT_Message_Buff ، MQTT_Pub_String.length () + 1) ، ClientMQTT.publish ("domoticz / in"، MQTT_Message_Buff) ؛ ClientMQTT.disconnect () ، }

الخطوة 11: Domoticz

دوموتيكز
دوموتيكز
دوموتيكز
دوموتيكز
دوموتيكز
دوموتيكز

في دوموتيكز:

للاستخدام العام:

  • قم بإنشاء اثنين من "الدمية (لا تفعل شيئًا ، تستخدم للمفاتيح الافتراضية)":

    1. الأول للحروف …
    2. الثاني للطرد …
  • لكل منهم ، تخصيص الإخطارات ؛
  • بالطبع ، تحتاج إلى إعداد رمز Tegegram الخاص بك.

اختياريا:

يمكنك إضافة "أداة استشعار" للإشراف على مستوى شحن البطارية.

نصائح: هنا يمكنك العثور على الكثير من الرموز المخصصة المجانية …

الخطوة 12: الخاتمة

استنتاج
استنتاج
استنتاج
استنتاج

آمل أن يساعدك هذا Instructable:

  • ما إذا كنت تريد إنشاء letterlbox الخاص بك ؛
  • أو فقط لإعطائك بعض الأفكار لمشاريعك!

إذا كانت لديك أفكار للتحسين ، فأنا أستمع!

ملاحظة: آسف على لغتي الإنجليزية ، تساعدني ترجمة Google كثيرًا ولكن ربما لا تكون مثالية ؛-)

موصى به: