NODEMCU Lua ESP8266 مع ساعة الوقت الحقيقي (RTC) و EEPROM: 7 خطوات
NODEMCU Lua ESP8266 مع ساعة الوقت الحقيقي (RTC) و EEPROM: 7 خطوات
Anonim
NODEMCU Lua ESP8266 مع ساعة الوقت الحقيقي (RTC) و EEPROM
NODEMCU Lua ESP8266 مع ساعة الوقت الحقيقي (RTC) و EEPROM

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

قد تسأل لماذا لا تستخدم ESP8266 لتوفير الوقت لك؟ حسنًا ، يمكنك ذلك ، لديها RTC الداخلية الخاصة بها (Real Time Clock) ، لكن ESP8266 لديها 3 ترددات تشغيل مختلفة على مدار الساعة - 52 ميجاهرتز عند التشغيل ، 80 ميجاهرتز أثناء التشغيل المنتظم ، و 160 ميجاهرتز إذا تم تعزيزها. إذا كنت بحاجة إلى مزيد من الدقة في الحفاظ على الوقت ، خاصة على مدى فترات أطول ، فقد يوفر لك RTC خارجي حلاً. تحتوي هذه الوحدات أيضًا على بطارية احتياطية في حالة فقد الطاقة. RTC ليس دقيقًا بشكل رهيب لأنه يحسب الوقت المنقضي منذ أن تم ضبطه وعلى الرغم من أنه قد يكون مفيدًا لمعظم التطبيقات ، فقد لا يكون جيدًا بما يكفي لحفظ الوقت الحرج. من الممكن الحصول على وقت دقيق من خادم وقت SNTP الذي يمكن من خلاله تحديث RTC على فترات منتظمة إذا لزم الأمر.

وحدة DS1307 Tiny RTC I2C (أعلاه) هي مثال على هذه العناصر ويمكن شراؤها من Ebay والموردين الآخرين بأقل من 2 جنيه إسترليني. هناك أيضًا أجهزة أخرى مثل DS1302 و DS3231 والتي تعمل بنفس الطريقة وتكلفتها من 99p وما فوق.

تستخدم الوحدة النمطية DS1307 واجهة I2C ويجب توصيل ESP-01 على النحو التالي:

Vcc - 3.3 فولت ، Gnd - Gnd ، SDA - D3 ، SCL - D4

يمكن توصيل SDA و SCL بأي من منافذ الإدخال / الإخراج على ESP8266 الأكبر (قم بتغيير الرمز وفقًا لذلك). يجب توصيل دبابيس الجانب الأيسر فقط بهذه الوحدة.

الخطوة 1: توقيت جوجل

توقيت جوجل
توقيت جوجل

هناك العديد من الأمثلة للحصول على الوقت من Google وتبدو شيئًا كهذا. عند تشغيل برنامج GoogleTime.lua ، تحصل على نتيجة مثل هذه:

dofile ("GoogleTime.lua")> الوقت: الجمعة ، 15 كانون الأول (ديسمبر) 2017 ، الساعة 11:19:45 بتوقيت غرينتش

تكمن المشكلة في هذه الطريقة في أنك تحصل على الوقت بتنسيق سلسلة ويتعين عليك تقسيم السلسلة إلى بتات فردية لساعات ودقائق وثواني وما إلى ذلك. يقبل RTC الوقت بتنسيق خاص ، مثل الطابع الزمني لـ UNIX. من منظور الشخص العادي ، هذا هو عدد الثواني التي انقضت منذ الخميس 1 يناير 1970 حتى يومنا هذا والوقت. يتم استخدام UNIX Epoch (1970/01/01 00:00:00) بواسطة معظم أنظمة تشغيل الكمبيوتر ويتم تخزين الوقت المنقضي كرقم 32 بت موقع. هذا يعني أن هذا النظام سيعمل حتى 19 يناير 2038 عندما يصبح الرقم كبيرًا جدًا بحيث لا يمكن تخزينه بهذه الطريقة. يتمثل أحد الحلول في تخزين الرقم على هيئة 64 بت ، ولكن في الوقت الحالي تكفي طريقة 32 بت.

لتعيين الوقت على 9 يوليو 2015 ، 18:29:49 على RTC الداخلي ، ستستخدم هذا السطر من التعليمات البرمجية:

rtctime.set (1436430589، 0)

المعلمتان هما الثواني والثواني الدقيقة.

يمكنك العثور على مزيد من المعلومات بقراءة وثائق NodeMCU.

الخطوة 2: خوادم SNTP الزمنية

خوادم SNTP الزمنية
خوادم SNTP الزمنية

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

يضبط البرنامج SNTPTime2.lua الوقت على RTC الداخلي. يجب أن يكون لديك وحدتا rtctime و sntp في جهازك عندما تومض ESP8266. يحصل البرنامج على الوقت من الخادم بالثواني والثواني الدقيقة ويضبط RTC الداخلي باستخدام rtctime.set (sec، usec).

ثم يعرض البرنامج التاريخ والوقت بتنسيقات مختلفة.

هناك العديد من خوادم SNTP حول العالم وبعضها كالتالي:

  • sntp.sync ({"216.239.35.0"} ،
  • sntp.sync ({"0.uk.pool.ntp.org"، "0.uk.pool.ntp.org"}،
  • sntp.sync ({"3.uk.pool.ntp.org"، "143.210.16.201"} ،
  • sntp.sync ({"0.uk.pool.ntp.org" ، "1.uk.pool.ntp.org" ، "3.uk.pool.ntp.org"} ،

يمكن استبدال جميع أسطر التعليمات البرمجية أعلاه في برنامج SNTPTime2.lua.

يوجد المزيد من خوادم SNTP في العناوين أدناه والتي يمكن استخدامها مرة أخرى في البرنامج.

93.170.62.252 ، 130.88.202.49 ، 79.135.97.79 ، ntp.exnet.com

توفر Google أيضًا خوادم الوقت على هذه العناوين:

216.239.35.0, 216.239.35.4, 216.239.35.8, 216.239.35.12

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

الخطوة 3: الحصول على الوقت من وحدة RTC

الحصول على الوقت من وحدة RTC
الحصول على الوقت من وحدة RTC

يقرأ برنامج GetRTCTime.lua الوقت من RTC الداخلي.

يقرأ الجزء الأول الوقت ويعرضه بالثواني والميكروثانية.

الجزء الثاني يحولها إلى تنسيق أكثر قابلية للقراءة البشرية.

عند استدعاء tm = rtctime.epoch2cal (rtctime.get ()) يتم إرجاع:

  • سنة - 1970 ~ 2038
  • mon - month 1 ~ 12 في السنة الحالية
  • اليوم - اليوم 1 ~ 31 في الشهر الحالي
  • ساعة
  • دقيقة
  • ثانية
  • يوم - يوم 1 ~ 366 في العام الحالي
  • الأربعاء - اليوم 1 ~ 7 في الأسبوع الحالي (الأحد 1)

يمكن الوصول إلى كل عنصر كـ tm ["day"] ، tm ["year"] …

يمكنك العثور على مزيد من المعلومات بقراءة وثائق NodeMCU.

DisplaySNTPtime.lua هي طريقة أكثر تفصيلاً لعرض التاريخ والوقت على شاشة LCD 128 x 64 OLED ، حيث يسهل توصيلها ويمكن استخدامها مع هذه البرامج.

الخطوة 4: ذاكرة مستخدم RTC

هناك القليل من الانحراف عن حفظ الوقت هو أن RTC الداخلي على ESP8266 يحتوي على عناوين ذاكرة 128 × 32 بت يمكن للمبرمج الوصول إليها. إنها مفيدة بشكل خاص لأنها يمكن أن تنجو من دورة النوم العميق لـ ESP8266. الأمر متروك للمبرمج للتحكم في استخدامها والتأكد من عدم الكتابة فوقها عن طريق الخطأ.

لقد قمت بتضمين RTCmem.lua ، وهو برنامج بسيط يوضح استخدامه. يجب أن يكون لديك وحدة rtcmem في جهازك.

الخطوة 5: وحدات RTC الخارجية

وحدات RTC الخارجية
وحدات RTC الخارجية

تتصل وحدات RTC الخارجية بـ ESP8266 من خلال واجهة I2C ، والتي تستخدم فقط دبابيس إدخال / إخراج وبالتالي تعمل مع ESP-01 بالإضافة إلى معظم أجهزة ESP8266 الأخرى.

عنوان وحدة RTC هو 0x68 ويتم الوصول إليه باستخدام أوامر I2C العادية. ومع ذلك ، هناك شيء يجب أخذه في الاعتبار ، يتم تخزين البيانات الموجودة في سجلات RTC بتنسيق BCD (الأساس 16) ، لذلك يتعين على برامجك التعامل مع هذا الأمر. يتم تخزين الوقت والتاريخ في 7 سجلات داخل RTC. على RTC الداخلي ، يتم الاهتمام بتحويلات BCD بواسطة وحدة rtctime.

يقوم SetExtRTC.lua بتحويل البيانات إلى BCD وتعيين الوقت.

يقرأ ReadExtRTC.lua بيانات الوقت ويطبعها. ملاحظة: تتم طباعة البيانات بالنظام الست عشري.

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

الخطوة 6: تسجيل البيانات

تسجيل البيانات
تسجيل البيانات

إذا نظرت عن كثب إلى وحدات RTC النمطية ، ستلاحظ أنها تحتوي على AT24C32 EEPROM IC أو ما شابه ذلك ، أو يمكنك استخدام لوحة 24C256 كما هو مذكور أعلاه. معظم هذه الدوائر المتكاملة EEPROM لها دبابيس مماثلة كما هو مذكور أعلاه. إنها تأتي بكميات مختلفة من التخزين ، ولكن يتم الوصول إليها جميعًا بالطريقة نفسها. نظرًا لأن AT24C32 ملحوم بالفعل على اللوحة ، يمكن استخدامه مباشرة من I2C الخاص بـ RTC الخارجي.

إذا كان لديك فقط 24C256 IC أو ما شابه ، يمكنك إعداده في لوحة الخبز ، وتوصيل A1 و A2 و A3 بـ Gnd ، و Vcc بـ 3.3 فولت و SDA و SCL إلى I2C ، يمكن ترك WP عائمًا. تعمل بعض وحدات EEPROM IC عند 5 فولت فقط ، لذا تحقق من ورقة البيانات ذات الصلة أولاً.

يكتب ByteWR.lua بايتًا واحدًا من البيانات إلى موقع الذاكرة 0x00 الخاص بـ EEPROM ويقرأها مرة أخرى.

يكتب Desiderata.lua سطرين من النص الشهير إلى EEPROM.

يقرأ eeRead.lua البيانات من EEPROM ويطبعها.

ملاحظة: يجب أن تعمل هذه البرامج مع لوحات EEPROM الأخرى أيضًا.

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

لقد حاولت إظهار كيفية عمل RTC و EEPROM لتسجيل البيانات. هذه مجرد بداية لتتطور أكثر. يمكنك توصيل أجهزة مختلفة بحافلة I2C مثل مستشعرات الضوء ومستشعرات الضغط الجوي ومستشعرات درجة الحرارة والرطوبة وتسجيل البيانات على EEPROM.

موصى به: