» إلكترونيات » اردوينو »إدارة الدفيئة أو الدفيئة من أي مكان في العالم (مثال على التنفيذ)

إدارة دفيئة أو دفيئة من أي مكان في العالم (مثال على التنفيذ)

1 مفهوم الجهاز



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

يستخدم المشروع اردوينو وحدة UNO و WiFi ESP8266-01. سيتم نقل البيانات إلى السحابة من خلال خدمة الويب ThingSpeak.com ، وسيتم تنشيط الأجهزة من خلال تطبيق android الذي تم تطويره باستخدام MIT AppInventor.

إدارة دفيئة أو دفيئة من أي مكان في العالم (مثال على التنفيذ)


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


سيكون التركيز الأساسي لمشروع إنترنت الأشياء هذا هو خدمة ThingSpeak.com. يتلقى جهاز UNO / ESP-01 المحلي بيانات من أجهزة الاستشعار وبيانات عن حالة المشغلات ، ويرسلها إلى "تسجيل" الإنترنت عبر قناة حالة ThingSpeak.com معينة (قناة حالة ThingSpeak.com) ، ويتلقى نفس الجهاز المحلي البيانات ، " قراءتها "من قناة بيانات أخرى -" قناة الأجهزة التنفيذية "(قنوات ThingSpeak.com المشغل).



سيتم جمع البيانات باستخدام مستشعر درجة الحرارة والرطوبة النسبية ، ودرجة حرارة التربة والرطوبة ، ومستشعر الإضاءة المحيطة. سيتم إرسال هذه البيانات إلى سحابة خدمة ThingSpeak.

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


2 قائمة المكونات المطلوبة



جميع الروابط هي لأغراض إعلامية فقط.






2 × مصابيح LED (أحمر وأخضر)
1 ×
- $3.00
مصباح 220 فولت
2 × 330 أوم المقاوم (تستخدم مع المصابيح)
2 × 10 كيلو أوم مقاومة (تستخدم مع DHT22 و LDR)
1 × 4K7 أوم المقاوم (تستخدم مع DS18B20)
اللوح
صداري
مصدر طاقة خارجي لترحيل 5V DC

3 جزء حديدي



تحتاج الآن إلى توصيل جميع أجهزة الاستشعار ، كما هو موضح في الرسم التخطيطي.



سيكون الحل المثالي هو تجميع واختبار المشروع في أجزاء.

في التسلسل التالي:
1. تثبيت واختبار جميع أجهزة الاستشعار
2.قم بتثبيت وتكوين ESP-01 كحد أدنى
3. قم بتغيير إعداد ESP-01 إلى التكوين النهائي والاختبار
4. تكوين قناة حالة ThingSpeak
5. قم بتثبيت رمز ThingSpeak على Arduino وتحقق من حالة المستشعرات على السحابة
6. تطوير الإصدار الأول من البرنامج على نظام أندرويد للتحقق من رسائل الحالة من أجهزة الاستشعار
7. تثبيت المحركات
8. تكوين قنوات مشغلات ThingSpeak
9. تثبيت واختبار كود للأجهزة التنفيذية على اردوينو
10. قم بعمل النسخة الثانية من البرنامج على نظام Android لتجميع الجهاز بالكامل.

4 اتصال المستشعر





يستخدم المشروع بعض المكتبات المدرجة في. من الضروري التحقق من توافرها. التكوين الأولي لهذه المكتبات هو كما يلي:
// DS18B20
# تتضمن 
# تتضمن 
#define ONE_WIRE_BUS 5 // DS18B20 على الطرف D5
OneWire oneWire (ONE_WIRE_BUS) ؛
دالاس Temperature DS18B20 (وواحد سلك) ؛
int earthTemp = 0 ؛

// DHT
# تضمين "DHT.h"
# تتضمن 
int pinoDHT = 11 ؛
int tipoDHT = DHT22 ؛
DHT dht (pinoDHT ، tipoDHT) ؛
int airTemp = 0 ؛
int airHum = 0 ؛

// LDR (فاتح)
# تعريف ldrPIN 1
ضوء int = 0 ؛

// رطوبة التربة
# تحديد التربة HUMPIN 0
int التربةHum = 0 ؛


الآن نقوم بتهيئة أجهزة الاستشعار الخاصة بنا وعرضها في المحطة:
إعداد باطل ()
{
  Serial.begin (9600) ؛
  DS18B20.begin () ؛
  dht.begin () ؛
}}

حلقة فارغة ()
{
  قراءة المستشعرات () ؛
  displaySensors () ؛
  تأخير (10000) ؛
}}

وأخيرًا ، سنكتب وظيفتين: إحداهما تقرأ القراءات من أجهزة الاستشعار ، والأخرى تعرضها على الشاشة:
/ ********* قراءة قيمة المستشعرات ************* /
قراءة الفراغات (باطلة)
{
  airTemp = dht.readTemperature () ،
  airHum = dht.readHumidity () ؛

  DS18B20.requestTemperatures () ؛
  earthTemp = DS18B20.getTempCByIndex (0) ، // مستشعر 0 سوف يلتقط Soil Temp في Celcius
  
  groundHum = خريطة (analogRead (earthHumPIN) ، 1023 ، 0 ، 0 ، 100) ؛
 
  ضوء = خريطة (analogRead (ldrPIN) ، 1023 ، 0 ، 0 ، 100) ؛ // LDRDark: 0 ==> ضوء 100٪

}}

/ ********* قيمة مستشعرات العرض ************* /
شاشة خالية (باطلة)
{
  Serial.print ("airTemp (oC):") ؛
  Serial.println (airTemp) ؛
  Serial.print ("airHum (٪):") ؛
  Serial.println (airHum) ؛
  Serial.print ("earthTemp (oC):") ؛
  Serial.println (earthTemp) ؛
  Serial.print ("earthHum (٪):") ؛
  Serial.println (نبتة التربة) ؛
  Serial.print ("light (٪):") ؛
  Serial.println (فاتح) ؛
  Serial.println ("") ؛
}}


تُظهر الصورة كيفية عرض البيانات على الشاشة.


يمكن تحميل كود المصدر من المؤلف.

4 ESP8266-01 التكوين الأساسي



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

أولاً ، تحتاج إلى توصيل الوحدة ، كما هو موضح في الصورة



( لاحظ أن طرف Tx الخاص بـ ESP-01 متصل بطرف Tx الخاص بـ UNO ، تمامًا مثل محطات Rx المتصلة ببعضها البعض. سيتم تغيير هذا الاتصال لاحقًا. ).

ثم قم بتوصيل UNO بالكمبيوتر ، افتح IDE وقم بتنزيل المثال الموجود. هذا رمز فارغ بحيث لا يوجد تعارض بين ESP-01 و UNO. تم تحميل هذا الرمز إلى Ardunio قبل توصيل ESP-01 به ، للتأكد من أن Ardunio لن يستخدم دبابيس Tx و Rx لأي شيء آخر.
تحتاج الآن إلى فتح IDE Serial Monitor ، وتعيين معدل الباود على 115200 في الإعدادات وإرسال أمر AT إلى مراقب IDE التسلسلي. يجب أن ترسل ESP-01 إجابة موافق

تحتاج الآن إلى تغيير معدل البيانات في وحدة ESP-01. للقيام بذلك ، في IDE ، إعطاء الأمر

AT + CIOBAUD = 9600


قد يحدث أن يعود ESP-01 إلى إعدادات المصنع ، ثم ستحتاج إلى استخدام أمر آخر:

AT + UART_DEF = ، ، ، ، 


على سبيل المثال 9600 باود / 8 بتات بيانات / 1 بتات توقف ولا تماثل والتحكم في التدفق

AT + UART_DEF = 9600،8،1،0،0


الآن قم بتغيير معدل نقل البيانات في إعدادات IDE إلى 9600 وأرسل الأمر AT ، يجب أن تأتي استجابة OK.
بعد ذلك ، تحتاج إلى تبديل الوحدة النمطية إلى وضع STA حتى تتمكن من الاتصال بنقطة الوصول لشبكتك.

AT + CWMODE = 1


لكي تتصل الوحدة بالشبكة ، أدخل الأمر AT + CWJAP = "network_name" ، "network_name_1"أين اسم_الشبكة هو اسم شبكتك و network_name_1 - كلمة المرور لشبكتك (يجب أن تكون كلمة المرور واسم الشبكة بين علامتي اقتباس)
إذا رأيت الجواب WIFI متصل WIFI GOT IP، ثم يتم تأسيس الاتصال. تحقق من عنوان IP باستخدام الأمر
AT + CIFSR
.

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


• ESP-01 RX (أصفر) -> دبوس UNO D7
• ESP-01 TX (برتقالي) -> دبوس UNO D6
• ESP-01 Ch-Pd (بني) -> Vcc (3.3 فولت)
• إعادة تعيين ESP-01 (أزرق) -> UNO Pin D8
• ESP-01 Vcc (أحمر) -> 3.3 فولت
• ESP-01 Gnd (أسود) -> UNO GND

لاحظ أن مكتبة البرامج التسلسلية تستخدم دبوس UNO Pin D7 مثل تكساس ويتصل بإخراج ESP-01 Rxبينما UNO Pin D6 مثل Rxمتصل بـ ESP-01 TX.

أدخل رمزًا صغيرًا للتحقق من التوصيل والتكوين الصحيحين لوحدة ESP-01
# تتضمن 
البرمجيات المسلسل esp8266 (6.7) ؛ // Rx ==> Pin 6 ؛ TX ==> Pin7

# تعريف السرعة 8266 9600

إعداد باطل ()
{
  esp8266.begin (speed8266) ؛
  المسلسل يبدأ (سرعة 8266) ؛
  Serial.println ("اختبار الإعداد ESP8266 - استخدام AT coomands") ؛
}}

حلقة فارغة ()
{
  بينما (esp8266.available ())
  {
    Serial.write (esp8266.read ()) ؛
  }}
  بينما (Serial.available ())
  {
    esp8266.write (Serial.read ()) ؛
  }}
}}


الآن عدد قليل من فرق AT. شاهد النتائج في Serial Monitor.



* AT =====> ESP8266 يُرجع موافق
* AT + RST =====> إعادة تشغيل ESP8266 وإرجاع موافق
* AT + GMR =====> ESP8266 يُرجع AT الإصدار ؛ إصدار SDK ؛ معرف ؛ حسنًا
* AT + CWMODE؟ => إرجاع ESP8266 نوع وضع
* AT + CWLAP ===> يقوم ESP8266 بإرجاع نقاط الوصول القريبة
* AT + CIFSR ===> إرجاع ESP8266 IP المصمم

يمكن تنزيل رمز البرنامج على

6 توصيل أجهزة الاستشعار و ESP-01




بعد توصيل جميع أجهزة الاستشعار وفحصها ، بالإضافة إلى فحص وحدة ESP-01 ، من الضروري إعداد البيانات لإرسالها إلى الإنترنت.

7 ThingSpeak





أحد أهم أجزاء المشروع هو منصة إنترنت الأشياء المفتوحة ، والتي ستسمح لك بجمع البيانات من أجهزة الاستشعار ومعالجتها وتحليلها. للقيام بذلك ، انتقل إلى وقم بإنشاء حسابك. بعد ذلك ، تحتاج إلى إنشاء قناة حيث سيكون هناك مشغلان و 5 أجهزة استشعار ومجال احتياطي واحد.
• الحقل 1: المشغل 1 (الجهاز 1)
• الحقل 2: المشغل 2 (الجهاز 2)
• المجال 3: درجة حرارة الهواء في درجة مئوية (درجة حرارة الهواء بالدرجات المئوية)
• مصنف 4: الرطوبة النسبية للهواء في٪ (الرطوبة النسبية٪)
• الحقل 5: درجة حرارة التربة في درجة مئوية (درجة حرارة التربة في غرام مئوية)
• المجال 6: رطوبة التربة في٪ (رطوبة التربة في٪)
• الحقل 7: السطوع في٪ (الإضاءة في٪)
• الحقل 8: قطع غيار

تم حجز الحقل 8 للتوسع المستقبلي أو لتصحيح الأخطاء. في هذا المشروع ، يتم استخدامه كعداد خطأ اتصال بين Arduino / ESP-01 و ThingSpeak.com.

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

8 إرسال حالة المستشعر إلى السحابة



في الوقت الحالي ، لدينا خدمة سحابية مهيأة وتقوم أجهزة الاستشعار الخاصة بنا بجمع البيانات محليًا. الآن تحتاج إلى أخذ هذه البيانات وإرسالها إلى السحابة على ThingSpeak.com.

لكتابة البيانات إلى قناة ThingSpeak ، تحتاج إلى إرسال سلسلة GET. سيتم ذلك على ثلاث مراحل.
إرسال الأمر "بدء cmd"
AT + CIPSTART = "TCP"، "184.106.153.149"، 80

مزيد من طول السلسلة

AT + CIPSEND = 116


وأخيرًا ، سلسلة GET التي ستكتب بياناتنا في حقول قناة الحالة المحجوزة.

GET / update؟ Api_key = Your_saved_key_here & field1 = pump & fieldlamp = 0 & field3 = airTemp & field4 = airHum & field5 = earthTemp & field6 = earthHum & field7 = light & field8 = الغيار


يرجى ملاحظة أنه لا ينبغي لنا كتابة البيانات للقناة أكثر من مرة واحدة في 16 ثانية.

سيفعل الرمز المقدم كل هذا.
// Thingspeak
String statusChWriteKey = "مفتاحك هنا هنا" ؛ // معرف قناة الحالة: 385184

# تتضمن 
SoftwareSerial EspSerial (6 ، 7) ؛ // Rx، Tx
# تعريف HARDWARE_RESET 8

// DS18B20
# تتضمن 
# تتضمن 
#define ONE_WIRE_BUS 5 // DS18B20 على الطرف D5
OneWire oneWire (ONE_WIRE_BUS) ؛
دالاس Temperature DS18B20 (وواحد سلك) ؛
int earthTemp = 0 ؛

// DHT
# تضمين "DHT.h"
# تتضمن 
int pinoDHT = 11 ؛
int tipoDHT = DHT22 ؛
DHT dht (pinoDHT ، tipoDHT) ؛
int airTemp = 0 ؛
int airHum = 0 ؛

// LDR (فاتح)
# تعريف ldrPIN 1
ضوء int = 0 ؛

// رطوبة التربة
# تحديد التربة HUMPIN 0
int التربةHum = 0 ؛

// المتغيرات التي سيتم استخدامها مع المؤقتات
وقت الكتابة الطويل = الثواني = 17 ؛ // ==> تحديد وقت العينة بالثواني لإرسال البيانات
startWriteTiming = 0 طويلة ؛
فترة زمنية طويلة WriteTime = 0 ؛

// المتغيرات المراد استخدامها مع المشغلات
مضخة منطقية = 0 ؛
مصباح منطقي = 0 ؛

عدد الفراغ = 0 ؛
خطأ منطقي

إعداد باطل ()
{
  Serial.begin (9600) ؛
  
  pinMode (HARDWARE_RESET ، OUTPUT) ،
  
  الكتابة الرقمية (HARDWARE_RESET ، HIGH) ؛
  
  DS18B20.begin () ؛
  dht.begin () ؛

  EspSerial.begin (9600) ؛ // Comunicacao com Modulo WiFi
  EspHardwareReset () ؛ // Reset do Modulo WiFi
  startWriteTiming = ملي () ، // بدء "ساعة البرنامج"
}}

حلقة فارغة ()
{
  بدء: // label
  الخطأ = 0 ؛
  
  elapsedWriteTime = millis () - startWriteTiming ؛
  
  إذا (elapsedWriteTime> (writeTimingSeconds * 1000))
  {
    قراءة المستشعرات () ؛
    writeThingSpeak () ؛
    startWriteTiming = ملي () ،
  }}
  
  if (الخطأ == 1) // إعادة الإرسال إذا لم يكتمل الإرسال
  {
    Serial.println ("<<<< خطأ >>>>") ؛
    تأخير (2000) ؛
    البدء // انتقل إلى التصنيف "start"
  }}
}}

/ ********* قراءة قيمة المستشعرات ************* /
قراءة الفراغات (باطلة)
{
  airTemp = dht.readTemperature () ،
  airHum = dht.readHumidity () ؛

  DS18B20.requestTemperatures () ؛
  earthTemp = DS18B20.getTempCByIndex (0) ، // مستشعر 0 سوف يلتقط Soil Temp في Celcius
             
  ضوء = خريطة (analogRead (ldrPIN) ، 1023 ، 0 ، 0 ، 100) ؛ // LDRDark: 0 ==> ضوء 100٪
  groundHum = خريطة (analogRead (earthHumPIN) ، 1023 ، 0 ، 0 ، 100) ؛

}}

/ ********* Conexao com TCP com Thingspeak ******* /
باطلة writeThingSpeak (باطلة)
{

  startThingSpeakCmd () ؛

  // Preparacao da string GET
  String getStr = "GET / update؟ Api_key ="؛
  getStr + = statusChWriteKey ،
  getStr + = "& field1 =" ؛
  getStr + = سلسلة (مضخة) ؛
  getStr + = "& field2 =" ؛
  getStr + = سلسلة (مصباح) ؛
  getStr + = "& field3 =" ؛
  getStr + = سلسلة (airTemp) ؛
  getStr + = "& field4 =" ؛
  getStr + = سلسلة (airHum) ؛
  getStr + = "& field5 =" ؛
  getStr + = سلسلة (نوع التربة) ؛
  getStr + = "& field6 =" ؛
  getStr + = سلسلة (التربة) ؛
  getStr + = "& field7 =" ؛
  getStr + = سلسلة (ضوء) ؛
  getStr + = "& field8 =" ؛
  getStr + = سلسلة (قطع غيار) ؛
  getStr + = "\ r \ n \ r \ n" ؛

  sendThingSpeakGetCmd (getStr) ؛
}}

/ ********* إعادة تعيين ESP ************* /
باطلة EspHardwareReset (باطلة)
{
  Serial.println ("إعادة تعيين .......") ؛
  الكتابة الرقمية (HARDWARE_RESET ، LOW) ؛
  تأخير (500) ؛
  الكتابة الرقمية (HARDWARE_RESET ، HIGH) ؛
  تأخير (8000) ؛ // Tempo necessário para começar a ler
  Serial.println ("RESET") ؛
}}

/ ********* ابدأ الاتصال مع ThingSpeak ************* /
startThingSpeakCmd باطل (باطل)
{
  EspSerial.flush () ؛ // limpa o buffer antes de começar a gravar
  
  السلسلة cmd = "AT + CIPSTART = \" TCP \ "، \" "؛
  cmd + = "184.106.153.149" ؛ // Endereco IP de api.thingspeak.com
  cmd + = "\" ، 80 "؛
  EspSerial.println (cmd) ؛
  Serial.print ("enviado ==> Start cmd:") ؛
  Serial.println (cmd) ؛

  إذا (EspSerial.find ("خطأ"))
  {
    Serial.println ("خطأ AT + CIPSTART") ؛
    العودة
  }}
}}

/ ********* أرسل GET cmd إلى ThingSpeak ************* /
String sendThingSpeakGetCmd (String getStr)
{
  السلسلة cmd = "AT + CIPSEND =" ؛
  cmd + = سلسلة (getStr.length ()) ؛
  EspSerial.println (cmd) ؛
  Serial.print ("enviado ==> lenght cmd:") ؛
  Serial.println (cmd) ؛

  إذا (EspSerial.find ((char *) ">"))
  {
    EspSerial.print (getStr) ؛
    Serial.print ("enviado ==> getStr:") ؛
    Serial.println (getStr) ؛
    تأخير (500) ؛ // tempo para processar o GET، sem este delay apresenta busy no próximo comando

    String messageBody = ""؛
    بينما (EspSerial.available ())
    {
      سطر السلسلة = EspSerial.readStringUntil ('\ n') ؛
      if (line.length () == 1)
      {// يبدأ المحتوى الفعلي بعد السطر الفارغ (الذي يبلغ طوله 1)
        messageBody = EspSerial.readStringUntil ('\ n') ؛
      }}
    }}
    Serial.print ("تم استلام MessageBody:") ؛
    Serial.println (messageBody) ؛
    إعادة الرسالة
  }}
  آخر
  {
    EspSerial.println ("AT + CIPCLOSE") ؛ // تنبيه المستخدم
    Serial.println ("ESP8266 CIPSEND ERROR: RESENDING") ؛ // إعادة إرسال ...
    الغيار = الغيار + 1 ؛
    الخطأ = 1 ؛
    إرجاع "خطأ" ؛
  }}
}}

يمكنك رؤية التقدم في Serial Monitor.

يمكن تنزيل رمز المصدر في

9 تطبيق أندرويد - الجزء الأول



تحتاج أولاً إلى إنشاء واجهة مستخدم. تظهر الصورة العناصر الرئيسية المرئية وغير المرئية.



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

1 متغيرات الدولة التي يجب أن تعلن عالمي

2 يتم استدعاء الإجراء كل ثانيتين (حسب الساعة 1) "readArduino"


يعيد الإجراء قيمة المتغيرات التي يجب عرضها على الشاشة. في هذه الحالة ، يتم تحويل قيمة الحالة (0 و 1) للمشغلات إلى "ON" و "OFF" لتحسين الإدراك.

سيتم عرض هذه القيم (الحالة) في "الاختصارات" المقابلة

3 سيقرأ روتين readArduino بشكل أساسي قناة الحالة في ThingSpeak. لذلك ، تحتاج إلى تحديد عنوان URL الذي سيتم إرساله إلى Thingspeak. للقيام بذلك ، يجب التصريح عن 3 متغيرات عامة ودمجها لإنشاء عنوان URL الذي سيتم إرساله إلى ThingSpeak. يجب إرسال GET إلى مكون ويب يسمى "ArduFarmBotStatusCh"

4 سيصل النص المستلم من الأمر السابق بتنسيق JSon. يجب معالجة هذا النص بحيث تتم قراءة كل حقل وتخزينه في المتغير العام المقابل.

5 آخر ما عليك فعله هو استدعاء إجراء "التنبيه" ، الذي سيحلل حالة مستشعرين للتربة. إذا كانت درجة الحرارة منخفضة للغاية (في حالتنا 10 درجة مئوية) ، فيجب عرض رسالة. نفس الشيء بالنسبة للرطوبة إذا كانت أقل من 60٪.

يرجى ملاحظة أننا حددنا مؤقتًا آخر (Clock2) ، مبرمجًا لتشغيله كل ثانية. تحتاج فقط إلى "تبديل" لون نص الرسالة (من الأبيض إلى الأحمر). ستومض الرسالة.

يمكن تنزيل رمز التطبيق على

10 توصيل المشغلات




سيتم استلام أوامر تشغيل المضخة والمصباح وإيقاف تشغيله عن بُعد. سوف ينشط إخراج Ardunio التتابع و LED ، مع أخذ هذه الأوامر. توضح الصورة كيفية توصيل المشغلات. يرجى ملاحظة أن GND تتابع الإخراج غير متصل لإخراج GNDUNO. بهذه الطريقة سيكون هناك تدخل أقل في الطاقة عند تشغيل التتابع.

11 تكوين مشغلي القناة (قنوات المحرك)




تكرر جميع الإجراءات الإجراء لتكوين قناة الحالة. من الضروري إنشاء قناتين لكل جهاز. لكل قناة ، اكتب معرف القناة ، مفاتيح القراءة والكتابة. سنكتب فقط في الحقل الأول من كل قناة. على سبيل المثال:
معرف القناة 375598 ==> LED أحمر (مضخة)
◦ الحقل 1 = 0 ==> إيقاف المضخة
◦ الحقل 1 = 1 ==> تشغيل المضخة
2. معرف القناة 375599 ==> LED أخضر (مصباح)
◦ الحقل 1 = 0 ==> المصباح مغلق
◦ الحقل 1 = 1 ==> المصباح قيد التشغيل

11 محرك اختبار واختبار كود في Ardunio.



عندما أرسلنا البيانات إلى السحابة ، "كتبنا" هذه البيانات إلى ThingSpeak. قناة الحالة ، "نقل" (تحميل) هذه البيانات. الآن علينا "قراءة" البيانات من قناة المحرك ، "قبول" (تنزيل) هذه البيانات.

للقيام بذلك ، أرسل سلسلة GET ويتكون هذا الإجراء من 3 مراحل.
"بدء كمد"
AT + CIPSTART = "TCP"، "184.106.153.149"، 80

طول الخط
AT + CIPSEND = 36

وسلسلة GET نفسها
GET / channels / 375598 / fields / 1 / last

سيتم "قراءة" القنوات كل 10 ثوانٍ

بعد إرسال GET ، يجب أن نقبل الرد من ThingSpeak. يجب أن تكون الإجابة إما 0 أو 1 لكل قناة. إذا كانت هناك أي قيم أخرى ، فإننا ببساطة نتجاهلها.

الفرق الرئيسي بين هذا الجزء والجزء السابق هو فقط في الوظيفة readThingSpeak (سلسلة القنوات)
يوجد أدناه الرمز الذي ينفذ الإجراءات الموصوفة.

// Thingspeak
String canalID1 = "999999" ؛ // المحرك 1
String canalID2 = "999999" ؛ // المحرك 2

# تتضمن 
SoftwareSerial EspSerial (6 ، 7) ؛ // Rx، Tx
# تعريف HARDWARE_RESET 8

// المتغيرات التي سيتم استخدامها مع المؤقتات
القراءة الطويلة: الوقت بالثواني = 10 ؛ // ==> تحديد وقت العينة بالثواني لاستلام البيانات
بداية طويلة RedTiming = 0 ؛
انقضى وقت طويل RedTime = 0 ؛

// مرحلات
#define ACTUATOR1 10 // RED LED ==> مضخة
#define ACTUATOR2 12 // GREEN LED ==> المصباح
مضخة منطقية = 0 ؛
مصباح منطقي = 0 ؛

عدد الفراغ = 0 ؛
خطأ منطقي

إعداد باطل ()
{
  Serial.begin (9600) ؛
  
  pinMode (ACTUATOR1 ، OUTPUT) ؛
  pinMode (ACTUATOR2 ، OUTPUT) ؛
  pinMode (HARDWARE_RESET ، OUTPUT) ،

  الكتابة الرقمية (ACTUATOR1 ، عالية) ؛ // o módulo relé é ativo em LOW
  الكتابة الرقمية (ACTUATOR2 ، عالية) ؛ // o módulo relé é ativo em LOW
  الكتابة الرقمية (HARDWARE_RESET ، HIGH) ؛

  EspSerial.begin (9600) ؛ // Comunicacao com Modulo WiFi
  EspHardwareReset () ؛ // Reset do Modulo WiFi
  startReadTiming = millis () ، // بدء "ساعة البرنامج"
}}

حلقة فارغة ()
{
  بدء: // label
  الخطأ = 0 ؛
  
  elapsedReadTime = millis () - startReadTiming ؛

  if (elapsedReadTime> (readTimingSeconds * 1000))
  {
    int command = readThingSpeak (canalID1) ؛
    إذا (الأمر! = 9) مضخة = الأمر ؛
    تأخير (5000) ؛
    الأمر = readThingSpeak (canalID2) ؛
    if (command! = 9) lamp = command ؛
    takeActions () ؛
    startReadTiming = millis () ،
  }}
  
  if (الخطأ == 1) // إعادة الإرسال إذا لم يكتمل الإرسال
  {
    Serial.println ("<<<< خطأ >>>>") ؛
    تأخير (2000) ؛
    البدء // انتقل إلى التصنيف "start"
  }}
}}

/ ********* اتخاذ الإجراءات بناءً على أوامر ThingSpeak ************* /
إجراءات باطلة (باطلة)
{
  Serial.print ("Pump:") ؛
  Serial.println (مضخة) ؛
  Serial.print ("المصباح:") ؛
  Serial.println (مصباح) ؛
  if (pump == 1) digitalWrite (ACTUATOR1، LOW) ؛
  آخر digitalWrite (ACTUATOR1 ، HIGH) ؛
  if (lamp == 1) digitalWrite (ACTUATOR2، LOW) ؛
  آخر digitalWrite (ACTUATOR2 ، HIGH) ؛
}}

/ ********* قراءة أمر المحركات من ThingSpeak ************* /
int readThingSpeak (String channelID)
{
  startThingSpeakCmd () ؛
  أمر int
  // Preparacao da string GET
  String getStr = "GET / channels /"؛
  getStr + = معرّف القناة ؛
  getStr + = "/ fields / 1 / last" ؛
  getStr + = "\ r \ n" ؛

  String messageDown = sendThingSpeakGetCmd (getStr) ،
  إذا (messageDown [5] == 49)
  {
    command = messageDown [7] -48 ؛
    Serial.print ("تلقت القيادة:") ؛
    Serial.println (الأمر) ؛
  }}
  أمر آخر = 9 ؛
  أمر العودة ؛
}}

/ ********* إعادة تعيين ESP ************* /
باطلة EspHardwareReset (باطلة)
{
  Serial.println ("إعادة تعيين .......") ؛
  الكتابة الرقمية (HARDWARE_RESET ، LOW) ؛
  تأخير (500) ؛
  الكتابة الرقمية (HARDWARE_RESET ، HIGH) ؛
  تأخير (8000) ؛ // Tempo necessário para começar a ler
  Serial.println ("RESET") ؛
}}

/ ********* ابدأ الاتصال مع ThingSpeak ************* /
startThingSpeakCmd باطل (باطل)
{
  EspSerial.flush () ؛ // limpa o buffer antes de começar a gravar
  
  السلسلة cmd = "AT + CIPSTART = \" TCP \ "، \" "؛
  cmd + = "184.106.153.149" ؛ // Endereco IP de api.thingspeak.com
  cmd + = "\" ، 80 "؛
  EspSerial.println (cmd) ؛
  Serial.print ("enviado ==> Start cmd:") ؛
  Serial.println (cmd) ؛

  إذا (EspSerial.find ("خطأ"))
  {
    Serial.println ("خطأ AT + CIPSTART") ؛
    العودة
  }}
}}

/ ********* أرسل GET cmd إلى ThingSpeak ************* /
String sendThingSpeakGetCmd (String getStr)
{
  السلسلة cmd = "AT + CIPSEND =" ؛
  cmd + = سلسلة (getStr.length ()) ؛
  EspSerial.println (cmd) ؛
  Serial.print ("enviado ==> lenght cmd:") ؛
  Serial.println (cmd) ؛

  إذا (EspSerial.find ((char *) ">"))
  {
    EspSerial.print (getStr) ؛
    Serial.print ("enviado ==> getStr:") ؛
    Serial.println (getStr) ؛
    تأخير (500) ؛ // tempo para processar o GET، sem este delay apresenta busy no próximo comando

    String messageBody = ""؛
    بينما (EspSerial.available ())
    {
      سطر السلسلة = EspSerial.readStringUntil ('\ n') ؛
      if (line.length () == 1)
      {// يبدأ المحتوى الفعلي بعد السطر الفارغ (الذي يبلغ طوله 1)
        messageBody = EspSerial.readStringUntil ('\ n') ؛
      }}
    }}
    Serial.print ("تم استلام MessageBody:") ؛
    Serial.println (messageBody) ؛
    إعادة الرسالة
  }}
  آخر
  {
    EspSerial.println ("AT + CIPCLOSE") ؛ // تنبيه المستخدم
    Serial.println ("ESP8266 CIPSEND ERROR: RESENDING") ؛ // إعادة إرسال ...
    الغيار = الغيار + 1 ؛
    الخطأ = 1 ؛
    إرجاع "خطأ" ؛
  }}
}}


يمكنك تنزيله من

12 أمر إرسال للأجهزة



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

قم بتشغيل المضخة (LED باللون الأحمر)
https://api.thingspeak.com/update؟api_key=Saved_channel_key_1&field1=1

إيقاف تشغيل المضخة (إيقاف LED باللون الأحمر)
https://api.thingspeak.com/update؟api_key=Saved Channel_key_1 & field1 = 0

قم بتشغيل المصباح (LED الأخضر قيد التشغيل)
https://api.thingspeak.com/update؟api_key=Saved_channel_key_2&field1=1

أطفئ المصباح (ضوء LED أخضر)
https://api.thingspeak.com/update؟api_key=Saved Channel_key_2 & field1 = 0


14 إنهاء برنامج الروبوت




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

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

بالضغط على الأزرار في التطبيق ، يمكنك رؤية النتيجة في Serial Monitor.

يمكن تنزيل الرمز على

15 التجميع النهائي



في هذه المرحلة ، يوجد تطبيق أندرويد مكتمل بالكامل ، وهو جزء من الأجهزة تم تجميعه بالكامل ، ولكن لا يوجد كود في وحدة التحكم يقرأ البيانات ويرسل الأوامر إلى السحابة باستمرار. تحتاج فقط إلى دمج جميع أجزاء الرمز المكتوبة سابقًا. بالطبع ، يحتوي الرمز على خيارات تحقق إضافية (على سبيل المثال ، إذا تجمد ESP-01). للقيام بذلك ، بشكل دوري ، قبل كل أمر قراءة أو كتابة ، يتم إرسال أمر AT.وإذا لم تكن الإجابة موافق من الوحدة ، فسيتم إعادة تشغيل الوحدة برمجيًا.

يمكن تحميل كود المشروع الكامل على

على العنوان يمكنك الحصول على تحديثات لملفات البرنامج.

يمكنك أيضًا قراءة التعليقات على رابط المصدر ، إذا كان هناك شيء غير واضح.
8.3
8.6
8.4

أضف تعليقًا

    • ابتسميبتسمxaxaحسنًالا أعرفياهونيا
      رئيسهالصفرأحمقنعمنعم نعمعدوانيسر
      آسفارقصرقص 2رقص 3العفومساعدةالمشروبات
      توقفالأصدقاءجيدجيدصفارة الحكمإغماءلسان
      دخانالتصفيقصرخةيعلنمشتقعدم الإشارةتنزيل
      حرارةغاضبتضحك 1mdaاجتماعالمسكسلبي
      not_iالفشارمعاقبةاقرأتخويفيخيفبحث
      ساخرشكرا لكهذاtoclclumnikحادتوافق
      سيءالنحلblack_eyeblum3استحىتباهىالملل
      للرقابةإرضاءسر 2تهددانتصاريونظارة شمس
      صدمةتنفسههههساداهلا وسهلاكروتويya_za
      ya_dobryiالمساعدne_huliganne_othodiحمىحظرقريب

ننصحك بقراءة:

تسليمها للهاتف الذكي ...