جدول المحتويات:
- الخطوة 1: فهم بروتوكول Firmata
- الخطوة 2: لنبدأ
- الخطوة 3: تعديل FirmataExpress لدعم DHT
- الخطوة 4: تعديل Pymata4 لدعم DHT
- الخطوة الخامسة: الختم
فيديو: تجاوز المعايير القياسية - إعادة النظر: 5 خطوات
2024 مؤلف: John Day | [email protected]. آخر تعديل: 2024-01-30 07:37
منذ فترة وجيزة ، اتصل بي الدكتور Martyn Wheeler ، مستخدم pymata4 ، للحصول على إرشادات حول إضافة دعم لمستشعر الرطوبة / درجة الحرارة DHT22 إلى مكتبة pymata4. تتيح مكتبة pymata4 ، جنبًا إلى جنب مع نظيرتها من Arduino ، FirmataExpress ، للمستخدمين التحكم في أجهزة Arduino ومراقبتها عن بُعد. في غضون بضع جولات من تبادل البريد الإلكتروني ، نجح الدكتور ويلر في تعديل كل من pymata4 و FirmataExpress. نتيجة لذلك ، أصبح دعم مستشعرات DHT22 و DHT11 جزءًا قياسيًا من pymata4 و FirmataExpress.
في مايو 2014 ، كتبت مقالًا عن إضافة دعم إلى Firmata للأجهزة الإضافية. بالتفكير في مقالتي ، أدركت مدى التغيير الذي طرأ منذ أن أخذت قلمًا إلى ورقة لتلك المقالة. بالإضافة إلى هذا المقال ، قام الدكتور ويلر بتوثيق جهوده ، وقد ترغب في التحقق من ذلك أيضًا.
يعتمد FirmataExpress على StandardFirmata ، وقد تطورت بنية دليل StandardFirmata. بالإضافة إلى ذلك ، فإن واجهة برمجة تطبيقات pymata4 مختلفة تمامًا أيضًا عن واجهة PyMata الأصلية لعام 2014. اعتقدت أن هذا سيكون الوقت المثالي لإعادة النظر في هذه المقالة وتحديثها. باستخدام عمل دكتور ويلر كأساس ، دعنا نستكشف كيفية توسيع وظائف pymata4 / FirmataExpress.
قبل أن نبدأ - بعض المعلومات الأساسية حول Arduino / Firmata
إذن ما هو فيرماتا؟ نقلاً عن صفحة ويب Firmata ، "Firmata هو بروتوكول عام للتواصل مع ميكروكنترولر من برنامج على كمبيوتر مضيف."
يستخدم Arduino Firmata واجهة تسلسلية لنقل معلومات الأوامر والتقرير بين متحكم Arduino وجهاز كمبيوتر ، عادةً باستخدام رابط تسلسلي / USB مضبوط على 57600 بت في الثانية. البيانات المنقولة عبر هذا الارتباط ثنائية ، ويتم تنفيذ البروتوكول في نموذج العميل / الخادم.
يتم تحميل جانب الخادم إلى متحكم Arduino على شكل رسم تخطيطي من Arduino. يتحكم مخطط StandardFirmata ، المضمن في Arduino IDE ، في دبابيس الإدخال / الإخراج من Arduino ، وفقًا لأمر العميل. كما يقوم أيضًا بالإبلاغ عن تغييرات دبوس الإدخال ومعلومات التقرير الأخرى إلى العميل. FirmataExpress هي نسخة موسعة من StandardFirmata. يعمل بسرعة ارتباط تسلسلي 115200 بت في الثانية.
عميل Arduino المستخدم في هذه المقالة هو pymata4. إنه تطبيق Python يتم تنفيذه على جهاز كمبيوتر. كلاهما يرسل الأوامر إلى خادم Arduino ويتلقى التقارير منه. نظرًا لأن pymata4 يتم تنفيذه في Python ، فإنه يعمل على أجهزة كمبيوتر Windows و Linux (بما في ذلك Raspberry Pi) وأجهزة كمبيوتر macOS.
لماذا نستخدم Firmata؟
المتحكمات الدقيقة من Arduino هي أجهزة صغيرة رائعة ، لكن موارد المعالج والذاكرة محدودة إلى حد ما. بالنسبة للتطبيقات التي تتطلب معالجًا أو ذاكرة مكثفة ، غالبًا ما يكون هناك القليل من الخيارات سوى إلغاء تحميل الطلب على الموارد على جهاز كمبيوتر حتى يكون التطبيق ناجحًا.
لكن هذا ليس السبب الوحيد لاستخدام StandardFirmata. عند تطوير تطبيقات Arduino خفيفة الوزن ، يمكن لجهاز الكمبيوتر توفير أدوات وإمكانيات تصحيح أخطاء غير متوفرة مباشرة على متحكم Arduino. يساعد استخدام العميل والخادم "الثابت" في حصر تعقيد التطبيق على جهاز كمبيوتر ، والذي تتم إدارته بسهولة أكبر. بمجرد اكتمال التطبيق ، يمكن ترجمته إلى رسم Arduino مخصص ومستقل.
لماذا تستخدم pymata4؟
كوني مؤلفها ، بالطبع ، أنا متحيز. ومع ذلك ، فهو عميل Firmata الوحيد المستند إلى Python والذي تم صيانته باستمرار على مدار السنوات العديدة الماضية. يوفر واجهة برمجة تطبيقات بديهية وسهلة الاستخدام. بالإضافة إلى الرسومات القائمة على StandardFirmata ، فهي تدعم Firmata عبر WiFi لأجهزة مثل ESP-8266 عند استخدام مخطط StandardFirmataWifI.
أيضًا ، تم تصميم pymata4 ليتم توسيعه بسهولة بواسطة المستخدم لدعم المستشعرات والمحركات الإضافية غير المدعومة حاليًا بواسطة StandardFirmata.
الخطوة 1: فهم بروتوكول Firmata
بروتوكول اتصالات Arduino Firmata مشتق من بروتوكول MIDI ، والذي يستخدم بايت واحد أو أكثر من 7 بت لتمثيل البيانات.
تم تصميم Firmata لتكون قابلة للتوسيع بواسطة المستخدم. الآلية التي توفر هذه القابلية للتوسعة هي بروتوكول المراسلة الحصري للنظام (SysEx).
يظهر تنسيق رسالة SysEx ، كما هو محدد بواسطة بروتوكول Firmata ، في الرسم التوضيحي أعلاه. يبدأ بـ START_SYSEX بايت بقيمة ثابتة سداسية عشرية 0xF0 ، ويتبعه بايت أمر SysEx فريد. يجب أن تكون قيمة بايت الأمر في النطاق السداسي العشري 0x00-0x7F. ثم يتبع الأمر بايت بعدد غير محدد من بايتات بيانات 7 بت. أخيرًا ، يتم إنهاء الرسالة بـ END_SYSEX بايت ، بقيمة ثابتة من السداسي العشري 0xF7.
تشفير / فك تشفير بيانات Firmata
نظرًا لأن جزء بيانات المستخدم في رسالة SysEx يتكون من سلسلة من 7 بت بايت ، فقد تتساءل كيف يمثل المرء قيمة أكبر من 128 (0x7f)؟ تقوم Firmata بترميز هذه القيم عن طريق تفكيكها إلى أجزاء بايت متعددة مكونة من 7 بتات قبل تنظيم البيانات عبر ارتباط البيانات. يتم إرسال البايت الأقل أهمية (LSB) لعنصر البيانات أولاً ، متبوعًا بمكونات متزايدة الأهمية لعنصر البيانات حسب الاتفاقية. البايت الأكثر أهمية (MSB) لعنصر البيانات هو آخر عنصر بيانات تم إرساله.
كيف يعمل هذا؟
لنفترض أننا نرغب في دمج قيمة 525 في جزء البيانات لرسالة SysEx. نظرًا لأن القيمة 525 أكبر من القيمة 128 بشكل واضح ، فنحن بحاجة إلى تقسيمها أو تفكيكها إلى "قطع" 7 بت بايت.
هنا كيف يتم ذلك.
قيمة 525 في النظام العشري تعادل القيمة السداسية العشرية 0x20D ، وهي قيمة ثنائية البايت. للحصول على LSB ، نقوم بإخفاء القيمة بإدخالها مع 0x7F. يتم عرض كل من تطبيقات "C" و Python أدناه:
تنفيذ // "C" لعزل LSB
int max_distance_LSB = max_distance & 0x7f ؛ // إخفاء البايت السفلي # تنفيذ Python لعزل LSB max_distance_LSB = max_distance & 0x7F # إخفاء البايت السفلي
بعد التقنيع ، سيحتوي max_distance_LSB على 0x0d. 0x20D & 0x7F = 0x0D.
بعد ذلك ، نحتاج إلى عزل MSB لقيمة 2 بايت. للقيام بذلك ، سنقوم بتحويل قيمة 0x20D إلى اليمين ، 7 أماكن.
// تطبيق "C" لعزل MSB بقيمة 2 بايت
int max_distance_MSB = max_distance >> 7 ؛ // تحويل البايت عالي الترتيب # تنفيذ Python لعزل MSB بقيمة 2 بايت max_distance_MSB = max_distance >> 7 # shift للحصول على البايت العلوي بعد التحويل ، سيحتوي max_distance_MSB على قيمة 0x04.
عند تلقي البيانات المنظمة "المقسمة" ، يجب إعادة تجميعها في قيمة واحدة. إليك كيفية إعادة تجميع البيانات في كل من "C" و Python
// "C" لإعادة تجميع البايت 2 ،
// قيم 7 بت في قيمة واحدة int max_distance = argv [0] + (argv [1] << 7) ؛ # تنفيذ Python لإعادة تجميع قيم 2 بايت ، # 7 بت في قيمة واحدة max_distance = data [0] + (data [1] << 7)
بعد إعادة التجميع ، تساوي القيمة مرة أخرى 525 عشري أو 0x20D سداسي عشري.
يمكن إجراء عملية التفكيك / إعادة التجميع بواسطة العميل أو الخادم.
الخطوة 2: لنبدأ
يتطلب دعم جهاز جديد إجراء تغييرات على كل من خادم Arduino المقيم وعميل Python المقيم في الكمبيوتر. سيتم استخدام عمل الدكتور ويلر لتوضيح التعديلات اللازمة.
ربما تكون الخطوة الأكثر أهمية هي تحديد ما إذا كنت ترغب في دمج مكتبة أجهزة داعمة موجودة في جانب Arduino من المعادلة أو كتابة ما يخصك. من المستحسن أنه إذا كان بإمكانك العثور على مكتبة موجودة ، فسيكون استخدامها أسهل بكثير من كتابة مكتبة خاصة بك من البداية.
لدعم جهاز DHT ، بنى دكتور ويلر كود الامتداد الخاص به على مكتبة DHTNew. بذكاء شديد ، قام دكتور ويلر بتقسيم وظائف مكتبة DHTN الجديدة عبر جانبي Arduino و pymata4 من المعادلة لتوفير الحد الأدنى من الحجب على جانب Arduino.
إذا نظرنا إلى DHTNew ، فإنه يقوم بكل ما يلي:
- يضبط وضع الإخراج الرقمي المحدد.
- يعمل على إخراج إشارة مشفرة لاسترداد أحدث قيم الرطوبة ودرجة الحرارة.
- يتحقق من أي أخطاء ويبلغ عنها.
- لحساب قيم درجة الحرارة والرطوبة التي يمكن قراءتها من قبل الإنسان من البيانات الأولية المسترجعة.
للحفاظ على كفاءة الأشياء قدر الإمكان على جانب FirmataExpress ، قام الدكتور ويلر بتفريغ إجراءات تحويل البيانات من Arduino إلى pymata4.
الخطوة 3: تعديل FirmataExpress لدعم DHT
شجرة دليل FirmataExpress
فيما يلي جميع الملفات التي يتألف منها مستودع FirmataExpress. هذه الشجرة مطابقة لشجرة StandardFiramata ، إلا أن بعض أسماء الملفات تعكس اسم المستودع.
الملفات التي تحتاج إلى تعديل هي تلك التي يوجد بجانبها علامة النجمة (*).
فيرماتا إكسبريس
├── * مجالس
├── أمثلة
│ └── فيرماتا إكسبريس
│ ├── بوردكس
│ ├── * FirmataExpress.ino
│ ├── LICENSE.txt
│ └── Makefile
├── * FirmataConstants.h
├── * FirmataDefines.h
├── FirmataExpress.cpp
├── FirmataExpress.h
├── FirmataMarshaller.cpp
├── FirmataMarshaller.h
├── FirmataParser.cpp
└── FirmataParser.h
دعونا نلقي نظرة على كل من الملفات والتغييرات التي تم إجراؤها.
المجالس
يحتوي هذا الملف على تعريفات ماكرو من نوع الدبوس لكل نوع من أنواع اللوحات المدعومة. يحدد الحد الأقصى لعدد الأجهزة المدعومة عند الحاجة إلى دعم أكثر من جهاز واحد.
بالنسبة لجهاز DHT ، يمكن توصيل ما يصل إلى 6 أجهزة في وقت واحد ويتم تحديد هذه القيمة على النحو التالي:
#ifndef MAX_DHTS
#define MAX_DHTS 6 #endif
أيضًا ، يمكن تحديد وحدات الماكرو من نوع الدبوس اختياريًا للجهاز الجديد ، إما لجميع أنواع اللوحات أو فقط تلك التي تهمك. تُستخدم وحدات الماكرو هذه في الغالب لأغراض إعداد التقارير ولا تُستخدم للتحكم في الأجهزة. تحدد وحدات الماكرو هذه كلا المسامير التي تدعم الجهاز:
#define IS_PIN_DHT (p) (IS_PIN_DIGITAL (p) && (p) - 2 <MAX_DHTS)
بالإضافة إلى ماكرو لتحديد تحويل رقم التعريف الشخصي.
#define PIN_TO_DHT (p) PIN_TO_DIGITAL (p)
FirmataConstants.h
يحتوي هذا الملف على رقم إصدار البرنامج الثابت ، والذي قد ترغب في تعديله لتتبع الإصدار الذي قمت بتحميله على Arduino. يحتوي أيضًا على قيم رسائل Firmata ، بما في ذلك رسائل Firmata SysEx.
ستحتاج إلى تعيين رسالة جديدة أو مجموعة رسائل لجهازك في هذا الملف. بالنسبة لـ DHT ، تمت إضافة رسالتين. أحدهما يقوم بتكوين دبوس على أنه دبوس "DHT" ، والآخر ، كرسالة مراسل ، عند إرسال أحدث بيانات DHT إلى العميل.
ثابت ثابت int DHT_CONFIG = 0x64 ؛
ثابت ثابت int DHT_DATA = 0x65 ؛
يتم تحديد أوضاع الدبوس أيضًا في هذا الملف. بالنسبة لـ DHT ، تم إنشاء وضع دبوس جديد:
ثابت ثابت int PIN_MODE_DHT = 0x0F ؛ // تم تكوين دبوس لـ DHT
عند إضافة وضع الدبوس الجديد ، يجب تعديل TOTAL_PIN_MODES:
ثابت ثابت int TOTAL_PIN_MODES = 17 ،
FirmataDefines.h
يجب تحديث هذا الملف ليعكس الرسائل الجديدة المضافة إلى FirmataConstants.h:
#ifdef DHT_CONFIG # undef DHT_CONFIG #endif #define DHT_CONFIG firmata:: DHT_CONFIG // DHT request #ifdef DHT_DATA #undef DHT_DATA #endif #define DHT_DATA firmata:: DHT_DATA // DHT reply #ifdef PIN_MODE_DifHT #:: PIN_MODE_DHT
FirmataExpress.ino
في هذه المناقشة ، سنغطي "النقاط البارزة" للتغييرات التي تم إجراؤها على مخطط Arduino.
من أجل دعم FirmataExpress لما يصل إلى ستة أجهزة DHT في وقت واحد ، تم إنشاء 3 صفائف لتتبع كل رقم التعريف الشخصي المرتبط بالجهاز ، وقيمة WakeUpDelay ، ونوع الجهاز ، أي DHT22 أو DHT11:
// مجسات DHT
int numActiveDHTs = 0 ؛ // عدد DHTs المرفقة uint8_t DHT_PinNumbers [MAX_DHTS] ؛ uint8_t DHT_WakeUpDelay [MAX_DHTS] ، uint8_t DHT_TYPE [MAX_DHTS] ،
نظرًا لأن كلا نوعي الأجهزة يتطلبان ما يقرب من ثانيتين بين القراءات ، نحتاج إلى التأكد من أننا نقرأ كل DHT مرة واحدة فقط في الإطار الزمني الذي يبلغ ثانيتين. لا يتم الوصول إلى بعض الأجهزة ، مثل أجهزة DHT ومستشعرات المسافة HC-SR04 ، إلا بشكل دوري. هذا يتيح لهم الوقت للتفاعل مع بيئاتهم.
uint8_t nextDHT = 0 ؛ // فهرس إلى dht لتتم قراءة الجهاز التالي
uint8_t currentDHT = 0 ؛ // يتتبع المستشعر النشط. int dhtNumLoops = 0 ؛ // عدد المرات المستهدفة خلال الحلقة b4 التي تصل إلى DHT int dhtLoopCounter = 0 ؛ // حلقة العداد
تكوين وقراءة جهاز DHT
عندما يتلقى FirmataExpress أمر SysEx لتكوين دبوس لعملية DHT ، فإنه يتحقق من عدم تجاوز الحد الأقصى لعدد أجهزة DHT. إذا كان من الممكن دعم DHT الجديد ، يتم تحديث صفائف DHT. إذا كان نوع DHT غير معروف ، يتم إنشاء رسالة سلسلة SysEx وإرسالها مرة أخرى إلى pymata4
الحالة DHT_CONFIG: int DHT_Pin = argv [0] ؛ int DHT_type = argv [1] ؛ إذا (numActiveDHTs <MAX_DHTS) {if (DHT_type == 22) {DHT_WakeUpDelay [numActiveDHTs] = 1 ؛ } else if (DHT_type == 11) {DHT_WakeUpDelay [numActiveDHTs] = 18 ؛ } else {Firmata.sendString ("ERROR: UNKNOWN SENSOR TYPE، VALID SENSORS ARE 11، 22")؛ استراحة؛ } // test the sensor DHT_PinNumbers [numActiveDHTs] = DHT_Pin؛ DHT_TYPE [numActiveDHTs] = DHT_type ، setPinModeCallback (DHT_Pin ، PIN_MODE_DHT) ؛
ثم يحاول FirmataExpress الاتصال بجهاز DHT. إذا كانت هناك أي أخطاء ، فإنها تشكل رسالة SysEx مع بيانات الخطأ وترسل رسالة SysEx مرة أخرى إلى pymat4. يحتفظ المتغير _bits بالبيانات التي يتم إرجاعها بواسطة جهاز DHT للمعالجة الإضافية بواسطة pymata4 إذا رغبت في ذلك.
Firmata.write (START_SYSEX) ؛
Firmata.write (DHT_DATA) ؛ Firmata.write (DHT_Pin) ؛ Firmata.write (DHT_type) ؛ لـ (uint8_t i = 0 ؛ i> 7 & 0x7f) ؛ } Firmata.write (abs (rv)) ؛ Firmata.write (1) ؛ Firmata.write (END_SYSEX) ،
إذا تم إرجاع بيانات صالحة ، يتم زيادة عدد DHTs النشطة. يتم أيضًا ضبط المتغير الذي يتتبع عدد التكرارات الحلقية لإكمالها قبل التحقق من DHT التالي للبيانات. يضمن هذا المتغير أنه بغض النظر عن عدد DHTs التي تمت إضافتها إلى النظام ، فستتم قراءتها جميعًا في غضون ثانيتين.
int rv = readDhtSensor (numActiveDHTs) ؛
إذا (rv == DHTLIB_OK) {numActiveDHTs ++ ؛ dhtNumLoops = dhtNumLoops / numActiveDHTs ؛ // كل شيء جيد }
إذا تم تكوين جهاز DHT أو أكثر في وظيفة الحلقة للرسم ، فسيتم قراءة جهاز DHT التالي. إما أن يتم إرجاع البيانات الصالحة أو حالة الخطأ الخاصة بها إلى pymata4 في شكل رسالة SysEx:
if (dhtLoopCounter ++> dhtNumLoops) {if (numActiveDHTs) {int rv = readDhtSensor (nextDHT) ؛ uint8_t current_pin = DHT_PinNumbers [nextDHT] ؛ uint8_t current_type = DHT_TYPE [nextDHT] ، dhtLoopCounter = 0 ؛ CurrentDHT = nextDHT ؛ إذا (nextDHT ++> = numActiveDHTs - 1) {nextDHT = 0 ؛ } if (rv == DHTLIB_OK) {// TEST CHECKSUM uint8_t sum = _bits [0] + _bits [1] + _bits [2] + _bits [3] ؛ إذا (_bits [4]! = sum) {rv = -1 ؛ }} // أرسل الرسالة مرة أخرى مع حالة الخطأ Firmata.write (START_SYSEX) ؛ Firmata.write (DHT_DATA) ؛ Firmata.write (current_pin) ؛ Firmata.write (current_type) ؛ لـ (uint8_t i = 0 ؛ i <sizeof (_bits) - 1 ؛ ++ i) {Firmata.write (_bits ) ؛ // Firmata.write (_bits ؛} Firmata.write (abs (rv)) ؛ Firmata.write (0) ؛ Firmata.write (END_SYSEX) ؛}}
الكود المستخدم للتواصل مع جهاز DHT مشتق مباشرة من مكتبة DHT الجديدة:
int readDhtSensor (فهرس int) {
// INIT BUFFERVAR TO RECEIVE DATA uint8_t mask = 128 ؛ uint8_t idx = 0 ؛ // EMPTY BUFFER // memset (_bits، 0، sizeof (_bits)) ؛ لـ (uint8_t i = 0 ؛ i 5 BYTES لـ (uint8_t i = 40 ؛ i! = 0 ؛ i--) {loopCnt = DHTLIB_TIMEOUT ؛ while (digitalRead (pin) == LOW) {if (--loopCnt == 0) إرجاع DHTLIB_ERROR_TIMEOUT؛} uint32_t t = micros ()؛ loopCnt = DHTLIB_TIMEOUT؛ while (digitalRead (pin) == HIGH) {if (--loopCnt == 0) إرجاع DHTLIB_ERROR_TIMEOUT؛} إذا ((micros () - t)> 40) {_bits [idx] | = القناع ؛} القناع >> = 1 ؛ إذا (القناع == 0) // البايت التالي؟ {mask = 128 ؛ idx ++ ؛}} إرجاع DHTLIB_OK ؛}
الخطوة 4: تعديل Pymata4 لدعم DHT
private_constants.h
لدعم DHT ، نحتاج إلى إضافة كل من رسائل نوع الدبوس و SysEx الجديدة إلى هذا الملف:
# أوضاع الدبوس INPUT = 0x00 # pin تم تعيينه كإدخال OUTPUT = 0x01 # دبوس تم تعيينه كإخراج ANALOG = 0x02 # دبوس تناظري في وضع الإدخال التناظري PWM = 0x03 # دبوس رقمي في وضع إخراج PWM SERVO = 0x04 # دبوس رقمي في وضع إخراج المؤازرة I2C = 0x06 # pin مضمن في إعداد I2C STEPPER = 0x08 # أي دبوس في وضع السائر SERIAL = 0x0a PULLUP = 0x0b # أي دبوس في وضع السحب SONAR = 0x0c # أي دبوس في وضع SONAR TONE = 0x0d # أي دبوس في وضع النغمة PIXY = 0x0e # محجوز لوضع الكاميرا pixy DHT = 0x0f # مستشعر DHT IGNORE = 0x7f # رسائل أوامر DHT SysEx DHT_CONFIG = 0x64 # dht config command DHT_DATA = 0x65 # dht sensor reply
يجب أن يتطابق نوع الدبوس وأوامر SysEx المضافة مع القيم الموجودة في FirmataConstants.h المضافة إلى FirmataExpress.
pymata4.py
يستخدم Pymata4 قاموس Python لربط رسالة Firmata واردة بسرعة بمعالج الرسالة. اسم هذا القاموس هو report_dispatch.
تنسيق إدخال القاموس هو:
{MessageID: [message_handler ، عدد وحدات بايت البيانات المراد معالجتها]}
تمت إضافة إدخال إلى القاموس للتعامل مع رسائل DHT الواردة:
{PrivateConstants. DHT_DATA: [self._dht_read_response، 7]}
7 بايت من البيانات في الرسالة هي رقم التعريف الشخصي الرقمي الخاص بـ Arduino ونوع جهاز DHT (22 أو 11) و 5 بايت من البيانات الأولية.
يتحقق أسلوب _dht_read_response من أي أخطاء تم الإبلاغ عنها. إذا لم يتم الإبلاغ عن أي أخطاء ، فسيتم حساب الرطوبة ودرجة الحرارة باستخدام الخوارزمية المنقولة من مكتبة Arduino DHTNew.
يتم الإبلاغ عن القيم المحسوبة عبر طريقة رد الاتصال التي يوفرها المستخدم. يتم تخزينها أيضًا في بنية بيانات pin_data الداخلية. قد يتم استدعاء القيمة الأخيرة التي تم الإبلاغ عنها عن طريق استقصاء pin_data باستخدام طريقة dht_read.
تكوين جهاز DHT جديد
عند إضافة جهاز DHT جديد ، يتم استدعاء طريقة set_pin_mode_dht. تقوم هذه الطريقة بتحديث pin_data للدبابيس الرقمية. يقوم أيضًا بإنشاء وإرسال رسالة DHT_CONFIG SysEx إلى FirmataExpress.
الخطوة الخامسة: الختم
كما رأينا ، فإن إضافة دعم Firmata لجهاز جديد يتطلب منك تعديل كود خادم Arduino FirmataExpress ورمز عميل pymata4 المستند إلى Python. يمكن أن يكون تصحيح أخطاء رمز FirmataExpress أمرًا صعبًا. تمت إضافة طريقة تسمى printData إلى FirmataExpress للمساعدة في تصحيح الأخطاء. تسمح لك هذه الطريقة بإرسال قيم البيانات من FirmataExpress وستقوم بطباعتها على وحدة التحكم pymata4.
تتطلب هذه الوظيفة كلاً من مؤشر لسلسلة الأحرف والقيمة التي ترغب في عرضها. إذا كانت قيمة البيانات مضمنة في متغير يسمى argc ، فيمكنك استدعاء printData بالمعلمات التالية.
printData ((char *) "argc ="، argc) ؛
إذا كانت لديك أي أسئلة ، فاترك تعليقًا ، وسأكون سعيدًا بالإجابة.
ترميز سعيد!
موصى به:
إضافة الملح القياسية في Arduino PH: 7 خطوات
إضافة الملح القياسية في Arduino PH: مقدمة: الغرض من هذه التجربة هو استخدام مستشعر الأس الهيدروجيني مع Arduino uno لقياس جهد مياه الصنبور والخل ومشروبات Mountain Dew كإضافة قياسية لملح الهيمالايا الوردي. الهدف ليس فقط معرفة كيفية إضافة
المعايير والمعايير وأهداف التعلم: 5 خطوات
المعايير والمعايير وأهداف التعلم: ستوجه هذه التعليمات الطالب خلال بناء جهاز استشعار وقوف السيارات باستخدام اردوينو. على وجه التحديد ، سيكون لديّ جهاز استشعار بالموجات فوق الصوتية يقوم بالتقصي باستمرار عن المسافة ، جنبًا إلى جنب مع رمز صغير يأخذ هذه المسافة ويضعها من خلال
كيفية تعديل العجلات الساخنة القياسية إلى عجلات R / C الساخنة: D: 6 خطوات (بالصور)
كيفية تعديل العجلات الساخنة القياسية إلى عجلات R / C الساخنة: D: منذ أن كنت طفلاً صغيراً ، أحب سيارات Hot Wheels. لقد أعطتني الإلهام لتصميم المركبات الخيالية. هذه المرة تفوقوا على أنفسهم مع Star War Hot Wheels C-3PO. ومع ذلك ، فأنا أريد أكثر من مجرد الدفع أو السفر على مضمار ، فقد قررت ، "L
ضع أجزاء SMD الخاصة بك على لوحة الأداء القياسية: 6 خطوات (بالصور)
ضع أجزاء SMD الخاصة بك على لوحة الأداء القياسية: تواجه Instructables مسابقة النصائح والحيل الإلكترونية الآن ، لذلك اعتقدت أنني سأشارك بعضًا منها فيما يتعلق باستخدام أجزاء وتقنيات SMD في المشكلة القياسية ، أحادية الجانب ، لوحة أداء جيدة. غالبًا ما يجد الكثير منا أكثر من خمسين نوعًا
حالة وزارة الدفاع للوحة الأم غير القياسية: 7 خطوات
Case Mod للوحة الأم غير القياسية: هل لديك لوحة أم قديمة وحالة ، لكن العلبة يمكن أن تستخدم المزيد من الحوامل لتركيب اللوحة بشكل صحيح؟ قد يكون هذا Instructable لك. في هذا المثال ، يتم تثبيت اللوحة الأم المزدوجة PII Xeon والمعالجات في علبة Gateway G6 - 333 (L