تجربتي في ربط LPS331AP بأوميغا Onion2

يوم جيد يا هابروفسك!

مقدمة قصيرة


في اليوم الآخر أصبحت المالك السعيد لأحد أصغر لاعبي اللوح الواحد الذين يعملون على LEDE ، وكان أول شيء أردت القيام به (بعد وميض مؤشر LED) هو محطة الطقس المحلية ، والتي يمكن الوصول إليها من أي مكان. كانت الخطوة الأولى هي أخذ بيانات عن درجة الحرارة والرطوبة والضغط. لهذا ، تم اختيار مجسات DHT11 و LPS3311AP التي تم شراؤها في وقت سابق (الصورة تحت القص).

صور للمهتمين
صورة

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

ما الخيار يبقى؟

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

إذا كنت مهتمًا بالكيفية التي جاءت بها وما جاء منها ، فمرحباً بك في Cat.

السؤال الأول الذي صادفته هو اختيار اللغة. من بين ما يعمل على هذه اللوحة الفردية دون الرقص مع الدف - C ++ و Python. بما أنني في المستقبل أريد أن أضع هذا المشروع في قلب المنزل الذكي بنفسي ، فقد وقع الاختيار على هذا الأخير.

نظرًا لتأثير البطة ، لم أقم بإثارة السؤال التالي (أي إصدار) وعلى الفور وضعت في python3 خفيفة الوزن والمكتبة للعمل مع ناقل I2C.

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

أول صعوبة واجهتها هي قراءة البيانات. نظرًا لأن بيانات مقياس الحرارة تنتقل في وحدتي بايت ، والضغط في ثلاث وحدات ، فمن الضروري الحصول على عدة بايت ودمجها في رقم كبير واحد. لكن الثعبان سيحول عرافة إلى int افتراضيا ، وسلسلة بسيطة لا تعمل. يؤدي تحويل int إلى hex إلى إرجاع سلسلة متسلسلة تمامًا ولكن لا يتم تحويلها مرة أخرى إلى رقم. مخرج سيكون من الممكن توصيل دعم الأنواع c ، لكنني لم أرغب في العبث ، وكذلك انسداد الذاكرة بمكتبة إضافية ، لذلك تقرر كتابة دالة على 7 أسطر (في الواقع 8 ، إذا عدنا القاموس) لترجمة سلسلة البايت الزائفة إلى رقم.

عرافة تحتوي على سلسلة إلى كثافة العمليات
s_t_h = { '0' : 0, '1' : 1, '2' : 2, '3' : 3, '4' : 4, '5' : 5, '6' : 6, '7' : 7, '8' : 8, '9' : 9, 'a' : 10, 'b' : 11, 'c' : 12, 'd' : 13, 'e' : 14, 'f' : 15 } def __string_to_int(self, hex_string): l = len(hex_string) - 1 res = 0 for h in hex_string: res += s_t_h[h] * (16 ** l) l -= 1 return res 

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

الصعوبة الثانية التي حيرتني هي تفسير البيانات. كلتا الوثيقتين المذكورتين أعلاه تقدم صيغًا بسيطة جدًا للتحويل:

Pout(mbar)=(PRESS_OUT_H & PRESS_OUT_L & PRESS_OUT_XL)[dec] / 4096 للضغط ؛
T(degC) = 42.5 + (Temp_OUTH & TEMP_OUT_L)[dec] / 480 لدرجة الحرارة.

ما يحلو لهم ، فإنها تقدم على الفور نظام متري.

ومع ذلك ، أعطتني الطريقة الأولى بعناد النتيجة 0x2F8000 ، وهو ما يعني 760 مليمار أو حوالي 585 مم زئبق. الفن. بارتفاع 130 مترًا فوق مستوى سطح البحر ، من الواضح أن هذا لا يكفي. إن إعادة التحقق من الكود وإعادة قراءة المعلومات حول قياس الضغط وإعادة تشغيل المستشعر واللعب بدقة لم تقدم شيئًا. ولكن ساعدت الدراسة المتكررة للمبدأ التوجيهي - يتم تفسير 760 mbar الثابت على أنه إشارة إلى أن المستشعر خاطئ. يمكن للقراء الذين نظروا بعناية في الصورة المرفقة في بداية المقال التأكد من أن المستشعر غائب من حيث المبدأ على الرقاقة :) لحسن الحظ ، اشتريت بسرعة اثنين منهم مرة واحدة.

صورة لشريحة العمل والتشغيل السليم


المربع الأسود الصغير في الوسط هو لوحة القياس HCLGA-16L ، "قلب" المستشعر.

صورة

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

working_check
 BROKEN_MARKER = 0x2f8000/4096 def __working_check(self, address): c1 = self.__read_pressure(address) c2 = self.__read_pressure(address) c3 = self.__read_pressure(address) if c1 == c2 == c3 == BROKEN_MARKER: return True else: return False 

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

تتبادر إلى ذهني فكرة على الفور أنه لن يكون سيئًا أثناء التهيئة للتحقق مما إذا كان العنوان الموجود على الحافلة صحيحًا ، وأن وظيفة __deviceAdressCheck تمت إضافتها ، والتي تتحقق من سجل WHO_AM_I وتتوقع استلام الرقم العزيزة 0xBB.

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

Source: https://habr.com/ru/post/ar471232/


All Articles