تحية لجميع سكان هبر!
أريد أن أتحدث عن طريقة جديدة وغير متوقعة لتوصيل العديد من مستشعرات HTU21 عبر ناقل I2C دون استخدام رقائق إضافية.
لا يزال هذا المستشعر شائعًا بين العديد من أساتذة DIY ، وهو مستحق: فهو أكثر دقة من سابقه وصغير الحجم (وهو مناسب للتضمين في الأجهزة).
في الآونة الأخيرة ، كنت محيرًا ، مثل العديد من المستخدمين ، بسبب عدم القدرة على تغيير عنوان هذا المستشعر. أصدرت Google ، بالطبع ، مجموعة من المقالات حول جميع أنواع أجهزة الإرسال المتعددة لحافلة I2C من "اشترِ في متجر صيني معروف على الإنترنت" إلى "افعل ذلك بنفسك". لم تكن هناك خيارات في أي مكان بدون مكواة لحام وتكاليف إضافية. هذا لا يمكن إلا أن يزعج لأنه كان من الضروري حل المشكلة هنا والآن (العملاء هم هؤلاء العملاء). أريد أن أتحدث عن طريقة أسهل وأكثر راحة وبسيطة للخروج من هذا الموقف. مفتون؟ ثم أقول لك.
البيانات الأولية: Arduino mega و 4 مجسات HTU21.
المهمة: من الضروري توصيل جميع أجهزة استشعار htu عبر ناقل I2C وقراءة القيم. علاوة على ذلك ، هذه المستشعرات ليست الأجهزة التابعة الوحيدة في هذا الناقل (تتضمن الخطط أيضًا شاشة LCD وأجهزة استشعار أخرى).
ماذا نعرف؟ يحتوي مستشعر HTU21 على عنوان ثابت في الناقل - 0x40 1 . كيف ، مع وجود متحكم و 4 مستشعرات بنفس العناوين في الحافلة ، كيف يمكنك الوصول إلى جهاز معين بدون رقائق إضافية؟
اتضح أن كل شيء بسيط للغاية:
- قم بتوصيل الأرض ، scl و sda كالمعتاد (لا تنسى مقاومات السحب لخط البيانات والمزامنة) ؛
- نقوم بتوصيل كابل الطاقة لكل مستشعر بإدخال رقمي على Arduino (ربما تفهم بالفعل إلى أين أتقدم)
- بالتناوب ، قم بتطبيق HIGH على كل إدخال رقمي يغذي مستشعر منفصل ، وبعد التأخير ، اقرأ القيمة من المستشعر الذي يعمل بالطاقة.
- إعطاء إشارة منخفضة لهذا المستشعر وتكرار الدورة لأجهزة الاستشعار الأخرى.
بالطبع ، لهذه الطريقة أيضًا عيوب ، على سبيل المثال ، قد لا يتوفر ببساطة العدد المطلوب من المخرجات الرقمية أو التناظرية المجانية. ولكن للاستخدام في المشاريع ، يعمل هذا المبدأ ويعمل على مسافات كافية من وحدة التحكم الدقيقة. آمل أن تساعدك هذه المقالة على توفير أعصابك ومالك ووقتك.
لا عجب أن يقال أن كل شيء عبقري بسيط!
القائمة المرفقة:
/* , HTU21 BME280 */ void greenhouseHT() { delay(30); rooms[3].TempA = bme.readTemperature(); delay(30); rooms[3].HumA = bme.readHumidity(); delay(30); for (int i=0; i<3; i++) { digitalWrite(HTU21_pins[i], HIGH); delay(30); rooms[i].HumA = myGreenhouseHumidity.readHumidity(); rooms[i].TempA = myGreenhouseHumidity.readTemperature(); delay(30); digitalWrite(HTU21_pins[i], LOW); delay(30); } digitalWrite(pin_HTU21_1, HIGH); }