جدول المحتويات:
- الخطوة 1: ابدأ بسيطًا: أضف زرًا
- الخطوة 2: تعديل الكود لتسجيل ضغطات الأزرار
- الخطوة 3: أضف العديد من الأزرار مثل عدد الأطفال
- الخطوة 4: أضف الجرس
- الخطوة 5: أضف شاشة LCD
فيديو: معدل سلوك الطفل: 5 خطوات (بالصور)
2024 مؤلف: John Day | [email protected]. آخر تعديل: 2024-02-01 14:39
يسجل معدّل سلوك الطفل عدد المرات التي وقع فيها طفلك في المشاكل (ويعرف أيضًا باسم الضربات) وعندما يصل إلى الثالثة ، ينطلق جرس وتعلن شاشة LCD أنه تم تأريضه.
الخطوة 1: ابدأ بسيطًا: أضف زرًا
الخطوة الأولى في هذا المشروع بسيطة. إضافة زر 1. في هذه الخطوة ، تحتاج إلى 4 أسلاك من الذكور إلى الذكور ، و 1220 Resisitor وزر ضغط.
- قم بتوصيل 5V على جانب Power بالصف الموجب على اللوح
-
قم بتوصيل GND بالجانب السلبي من اللوح
- أدخل الزر الانضغاطي على لوح التجارب
-
قم بتوصيل الطاقة الموجودة في الصف الإيجابي بالجزء السفلي الأيسر من زر الضغط
- قم بتثبيت الزر باستخدام المقاوم في الجزء السفلي الأيمن من زر الضغط على الصف السالب من لوح التجارب.
- قم بتوصيل رقم 13 على الجانب الرقمي من Arduino بالجانب الأيمن العلوي من الزر.
تحقق برمزك من أن الزر قيد التسجيل:
int child1ButtonPin = 13 ؛ // هذا هو الدبوس الذي يتصل به زر الضغط
int child1ButtonState = 0 ؛ // يقرأ حالة الزر (تشغيل / إيقاف)
int child1Strike = 0 ؛ // كم عدد الضربات التي قام بها الطفل
// يتم تشغيل وظيفة الإعداد مرة واحدة عند الضغط على إعادة تعيين أو تشغيل اللوحة
إعداد باطل () {Serial.begin (9600) ؛ pinMode (child1ButtonPin ، INPUT) ؛ } // تعمل وظيفة الحلقة مرارًا وتكرارًا إلى الأبد حلقة باطلة () {// اقرأ حالة الزر (تشغيل أو إيقاف) child1ButtonState = digitalRead (child1ButtonPin)؛ إذا (child1ButtonState == HIGH) // يتم الضغط على الزر {Serial.println ("HIGH") ؛ تأخير (5000) ؛ }
إذا (child1ButtonState == LOW)
{Serial.println ("LOW") ؛ تأخير (5000) ؛ }}
الخطوة 2: تعديل الكود لتسجيل ضغطات الأزرار
قم بتعديل الكود لتسجيل زر اضغط:
int child1ButtonPin = 13 ؛ // هذا هو الدبوس المتصل بزر الضغط الخاص بنا إلى child1ButtonState = 0 ؛ // يقرأ حالة الزر (تشغيل / إيقاف) int child1PreviousState = 0 ؛ // حالة الزر السابقة int child1Strike = 0 ؛
// يتم تشغيل وظيفة الإعداد مرة واحدة عند الضغط على إعادة تعيين أو تشغيل اللوحة
إعداد باطل () {Serial.begin (9600) ؛ pinMode (child1ButtonPin ، INPUT) ؛ } // تعمل وظيفة الحلقة مرارًا وتكرارًا إلى الأبد حلقة باطلة () {// اقرأ حالة الزر (تشغيل أو إيقاف) child1ButtonState = digitalRead (child1ButtonPin)؛ if (child1ButtonState! = child1PreviousState) {if (child1ButtonState == HIGH) // يتم الضغط على الزر {child1Strike ++؛ Serial.println (child1Strike) ؛ تأخير (1000) ؛ }}
}
بعد ذلك ، قم بتعديل المدونة حتى يحصل الطفل على 3 ضربات ، وبعد ذلك سيتلقى رسالة تفيد بأنه مؤرض:
int child1ButtonPin = 13 ؛ // هذا هو الدبوس المتصل بزر الضغط الخاص بنا إلى child1ButtonState = 0 ؛ // يقرأ حالة الزر (تشغيل / إيقاف) int child1PreviousState = 0 ؛ int child1Strike = 0 ؛
// يتم تشغيل وظيفة الإعداد مرة واحدة عند الضغط على إعادة تعيين أو تشغيل اللوحة
إعداد باطل () {Serial.begin (9600) ؛ pinMode (child1ButtonPin ، INPUT) ؛ } // تعمل وظيفة الحلقة مرارًا وتكرارًا إلى الأبد حلقة باطلة () {// اقرأ حالة الزر (تشغيل أو إيقاف) child1ButtonState = digitalRead (child1ButtonPin)؛ if (child1ButtonState! = child1PreviousState) {if (child1ButtonState == HIGH) // يتم الضغط على الزر {child1Strike ++؛ Serial.println (child1Strike) ؛
إذا (child1Strike> = 3)
{Serial.println ("الطفل 1 مؤرض!") ؛ } تأخير (3000) ؛ }}
}
يجب أن يبدو جهاز العرض التسلسلي مثل الصورة أعلاه.
ملاحظة: تأكد من أنك مرتاح للتأخير. لقليل من التأخير وسيتم تسجيل زر واحد اضغط على أكثر من زر واحد!
الخطوة 3: أضف العديد من الأزرار مثل عدد الأطفال
في هذه الخطوة ، نقوم ببساطة بنسخ الخطوتين الأخيرتين. أضف العديد من الأزرار كما تفعل مع الأطفال. في حالتي ، أضيف أربعة. تأكد من تغيير الرمز الخاص بك إلى الرقم السري الرقمي الذي تم توصيل الزر به. في حالتي ، استخدمت الدبابيس من 12 إلى 10 لإضافة الأزرار الخاصة بي. في حالة احتياجك للتذكير هنا هي الخطوة 1:
- قم بتوصيل 5V على جانب Power بالصف الموجب على اللوح
-
قم بتوصيل GND بالجانب السلبي من اللوح
- أدخل الزر الانضغاطي على لوحة التجارب قم بتوصيل الطاقة الموجودة في الصف الأساسي بالجزء السفلي الأيسر من زر الضغط
-
قم بتثبيت الزر باستخدام المقاوم في الجزء السفلي الأيمن من زر الضغط على الصف السالب من لوح التجارب.
- قم بتوصيل (رقم التعريف الشخصي الخاص بك) على الجانب الرقمي من Arduino بالجانب الأيمن العلوي من الزر.
ستحتاج أيضًا إلى تعديل الرمز للتعامل مع جميع الأزرار الخاصة بك. يرجى أن تضع في اعتبارك أنه إذا كنت بحاجة إلى توخي الحذر من السلاسل التي استخدمتها. لا يمكنك إضافة إلى الأحرف الصغيرة معًا. من الأفضل إعلان 1 ككائن سلسلة.
int child1ButtonPin = 13 ؛ // هذا هو الدبوس الذي يتصل زر الضغط لدينا بـ child2ButtonPin = 12 ؛ int child3ButtonPin = 11 ؛ int child4ButtonPin = 10 ؛ int child1ButtonState = 0 ؛ // يقرأ حالة الزر (تشغيل / إيقاف) int child2ButtonState = 0 ؛ int child3ButtonState = 0 ؛ int child4ButtonState = 0 ؛ int child1PreviousState = 0 ؛ int child2PreviousState = 0 ؛ int child3PreviousState = 0 ؛ int child4PreviousState = 0 ؛ int child1Strike = 0 ؛ int child2Strike = 0 ؛ int child3Strike = 0 ؛ int child4Strike = 0 ؛
// يتم تشغيل وظيفة الإعداد مرة واحدة عند الضغط على إعادة تعيين أو تشغيل اللوحة
إعداد باطل () {Serial.begin (9600) ؛ pinMode (child1ButtonPin ، INPUT) ؛ pinMode (child2ButtonPin ، INPUT) ؛ pinMode (child3ButtonPin ، INPUT) ؛ pinMode (child4ButtonPin ، INPUT) ؛ } // تعمل وظيفة الحلقة مرارًا وتكرارًا إلى الأبد حلقة باطلة () {// اقرأ حالة الزر (تشغيل أو إيقاف) child1ButtonState = digitalRead (child1ButtonPin)؛
child2ButtonState = digitalRead (child2ButtonPin) ،
child3ButtonState = digitalRead (child3ButtonPin) ،
child4ButtonState = digitalRead (child4ButtonPin) ،
إذا (child1ButtonState! = child1PreviousState)
{if (child1ButtonState == HIGH) // يتم الضغط على الزر {child1Strike ++ ؛ Serial.println (String ("Child 1 Has:") + child1Strike + "Strike") ؛
إذا (child1Strike> = 3)
{Serial.println ("الطفل 1 مؤرض!") ؛ } تأخير (3000) ؛ }} إذا (child2ButtonState! = child2PreviousState) {if (child2ButtonState == HIGH) // يتم الضغط على الزر {child2Strike ++؛ Serial.println (String ("Child 2 has:") + child2Strike + "strikes") ؛
إذا (child2Strike> = 3)
{Serial.println ("الطفل 2 مؤرض!") ؛ } تأخير (3000) ؛ }}
إذا (child3ButtonState! = child3PreviousState)
{if (child3ButtonState == HIGH) // يتم الضغط على الزر {child3Strike ++ ؛ Serial.println (String ("الطفل 3:") + child3Strike + "Strike") ؛
إذا (child3Strike> = 3)
{Serial.println ("الطفل 3 مؤرض!") ؛ } تأخير (3000) ؛ }}
إذا (child4ButtonState! = child4PreviousState)
{if (child4ButtonState == HIGH) // يتم الضغط على الزر {child4Strike ++؛ Serial.println (String ("Child 4 has:") + child4Strike + "strikes") ؛
إذا (child4Strike> = 3)
{Serial.println ("الطفل 4 مؤرض!") ؛ } تأخير (3000) ؛ }}}
الخطوة 4: أضف الجرس
دعنا الآن نتأكد من أن أطفالك يعرفون أنهم قد تم تأريضهم. دعونا نضيف الجرس. لتوصيل الجرس ، اتبع هذه الخطوات السهلة.
- أضف الجرس إلى اللوح الخاص بك ، وخطط للمساحة منذ ظهور شاشة LCD.
- قم بتوصيل الجانب الإيجابي (يجب أن يكون للجرس علامة + على الجانب الإيجابي) بالدبوس الذي تختاره. لقد فعلت 9.
- قم بتوصيل الجانب الآخر بالقضيب الأرضي للوح الخاص بك.
بعد ذلك ، قم بتعديل الكود الخاص بك لضبط الجرس عند إيقاف تشغيل الطفل. هناك طريقتان مختلفتان لتشفير الجرس الخاص بك ولكني أحب النغمة (buzzerName ، hertz ، المدة) لبساطتها ، لذا من الأمثلة على ذلك النغمة (الجرس ، 4000 ، 300).
int child1ButtonPin = 13 ؛ // هذا هو الدبوس الذي يتصل زر الضغط لدينا بـ child2ButtonPin = 12 ؛ int child3ButtonPin = 11 ؛ int child4ButtonPin = 10 ؛ int child1ButtonState = 0 ؛ // يقرأ حالة الزر (تشغيل / إيقاف) int child2ButtonState = 0 ؛ int child3ButtonState = 0 ؛ int child4ButtonState = 0 ؛ int child1PreviousState = 0 ؛ int child2PreviousState = 0 ؛ int child3PreviousState = 0 ؛ int child4PreviousState = 0 ؛ int child1Strike = 0 ؛ int child2Strike = 0 ؛ int child3Strike = 0 ؛ int child4Strike = 0 ؛ جرس كثافة العمليات = 2 ؛
// يتم تشغيل وظيفة الإعداد مرة واحدة عند الضغط على إعادة تعيين أو تشغيل اللوحة
إعداد باطل () {Serial.begin (9600) ؛ pinMode (child1ButtonPin ، INPUT) ؛ pinMode (child2ButtonPin ، INPUT) ؛ pinMode (child3ButtonPin ، INPUT) ؛ pinMode (child4ButtonPin ، INPUT) ؛ pinMode (الجرس ، الإخراج) ؛ } // تعمل وظيفة الحلقة مرارًا وتكرارًا إلى الأبد حلقة باطلة () {// اقرأ حالة الزر (تشغيل أو إيقاف) child1ButtonState = digitalRead (child1ButtonPin)؛
child2ButtonState = digitalRead (child2ButtonPin) ،
child3ButtonState = digitalRead (child3ButtonPin) ،
child4ButtonState = digitalRead (child4ButtonPin) ،
إذا (child1ButtonState! = child1PreviousState)
{if (child1ButtonState == HIGH) // يتم الضغط على الزر {child1Strike ++ ؛ Serial.println (String ("Child 1 Has:") + child1Strike + "Strike") ؛
إذا (child1Strike> = 3)
{Serial.println ("الطفل 1 مؤرض!") ؛ نغمة (الجرس ، 5000 ، 500) ؛ // يرسل صوت 5 هرتز لمدة 5 مللي ثانية
}
تأخير (3000) ؛ }} إذا (child2ButtonState! = child2PreviousState) {if (child2ButtonState == HIGH) // يتم الضغط على الزر {child2Strike ++؛ Serial.println (String ("Child 2 has:") + child2Strike + "strikes") ؛
إذا (child2Strike> = 3)
{Serial.println ("الطفل 2 مؤرض!") ؛ نغمة (الجرس ، 5000 ، 500) ؛ } تأخير (3000) ؛ }}
إذا (child3ButtonState! = child3PreviousState)
{if (child3ButtonState == HIGH) // يتم الضغط على الزر {child3Strike ++ ؛ Serial.println (String ("الطفل 3:") + child3Strike + "Strike") ؛
إذا (child3Strike> = 3)
{Serial.println ("الطفل 3 مؤرض!") ؛ نغمة (الجرس ، 5000 ، 500) ؛ } تأخير (3000) ؛ }}
إذا (child4ButtonState! = child4PreviousState)
{if (child4ButtonState == HIGH) // يتم الضغط على الزر {child4Strike ++؛ Serial.println (String ("Child 4 has:") + child4Strike + "strikes") ؛
إذا (child4Strike> = 3)
{Serial.println ("الطفل 4 مؤرض!") ؛ نغمة (الجرس ، 5000 ، 500) ؛ } تأخير (3000) ؛ }}}
الخطوة 5: أضف شاشة LCD
يتيح لك الآن شاشة LCD لقراءة واضحة وسهلة.
- أولاً ، أضف مقياس جهد إلى لوح التجارب للتحكم في شاشة LCD. كن حذرًا من المكان الذي وضعته فيه نظرًا لأن المساحة على الأرجح قد نفدت الآن.
- استخدم الجزء الأمامي الأيسر لتوصيل مقياس الجهد بسكة الطاقة
- استخدم اليمين الأمامي لتأريض مقياس الجهد.
- سيتم توصيل الجزء الخلفي بشاشة LCD.
- أضف شاشة LCD إلى لوحة التجارب
- قم بتأريض أول دبوس الشاشة بسكة التأريض
- قم بتوصيل الدبوس الثاني بسكة الطاقة.
- ينتقل دبوس LCD الثالث إلى Pin 8 على Arduino
- ينتقل دبوس LCD الرابع إلى Pin 7 على Arduino
- الخامس يذهب إلى Pin 6 على Arduino
- يذهب Sixth Pin إلى رقم 5 في Arduino
- الدبابيس من 7 إلى 10 على شاشة LCD فارغة
- ينتقل Pin 11 إلى Pin 5 على Arduino
- يذهب دبوس 12 إلى السكة الأرضية
- ينتقل Pin 13 إلى Pin 4 على Arduino
- يذهب دبوس 14 إلى الجزء الخلفي من مقياس الجهد
- يذهب دبوس 15 إلى سكة الطاقة
- يذهب دبوس 16 إلى السكك الحديدية الأرضية.
الآن سوف تضطر إلى تحديث الكود الخاص بك لاستخدام شاشة LCD. لذلك سوف تستخدم libary Liquid Crystal. كن حذرا من بيانات طباعة شاشات الكريستال السائل الخاصة بك. تذكر أن تمسح الشاشة عندما تحتاج إلى رسالة جديدة. تذكر أيضًا ضبط المؤشر عندما تريد استخدام سطرين.
#يشمل
LiquidCrystal LCD (3 ، 4 ، 5 ، 6 ، 7 ، 8) ؛ // يعين شاشة LCD
int child1ButtonPin = 13 ؛ // هذا هو الدبوس الذي يتصل به زر الضغط الخاص بنا بـ int child2ButtonPin = 12 ؛ int child3ButtonPin = 11 ؛ int child4ButtonPin = 10 ؛ int child1ButtonState = 0 ؛ // يقرأ حالة الزر (تشغيل / إيقاف) int child2ButtonState = 0 ؛ int child3ButtonState = 0 ؛ int child4ButtonState = 0 ؛ int child1PreviousState = 0 ؛ // الحالة السابقة للزر الذي تم الضغط عليه int child2PreviousState = 0 ؛ int child3PreviousState = 0 ؛ int child4PreviousState = 0 ؛ int child1Strike = 0 ؛ // كم عدد الضربات التي يمتلكها الطفل int child2Strike = 0 ؛ int child3Strike = 0 ؛ int child4Strike = 0 ؛ جرس كثافة العمليات = 9 ؛ // الجرس
// يتم تشغيل وظيفة الإعداد مرة واحدة عند الضغط على إعادة تعيين أو تشغيل اللوحة
إعداد باطل () {Serial.begin (9600) ؛ lcd.begin (16 ، 2) ؛ lcd.print ("الطفل") ؛ lcd.setCursor (0 ، 1) ؛ lcd.print ("تعديل السلوك") ؛ pinMode (child1ButtonPin ، INPUT) ؛ pinMode (child2ButtonPin ، INPUT) ؛ pinMode (child3ButtonPin ، INPUT) ؛ pinMode (child4ButtonPin ، INPUT) ؛ pinMode (الجرس ، الإخراج) ؛ } // تعمل وظيفة الحلقة مرارًا وتكرارًا إلى الأبد حلقة باطلة () {lcd.setCursor (0، 0)؛ // قراءة حالة الزر (تشغيل أو إيقاف) child1ButtonState = digitalRead (child1ButtonPin) ؛
child2ButtonState = digitalRead (child2ButtonPin) ،
child3ButtonState = digitalRead (child3ButtonPin) ،
child4ButtonState = digitalRead (child4ButtonPin) ،
إذا (child1ButtonState! = child1PreviousState)
{if (child1ButtonState == HIGH) // يتم الضغط على الزر {lcd.clear ()؛ child1Strike ++ ؛ Serial.println (String ("Child 1 Has:") + child1Strike + "Strike") ؛ lcd.print ("الطفل 1 لديه:") ؛ lcd.setCursor (0 ، 1) ؛ lcd.print (child1Strike) ؛ lcd.print ("الضربات!") ؛
إذا (child1Strike> = 3)
{Serial.println ("الطفل 1 مؤرض!") ؛ lcd.clear () ؛ lcd.setCursor (0 ، 0) ؛ lcd.print ("الطفل 1 هو") ؛ lcd.setCursor (0 ، 1) ؛ lcd.print ("مؤرض!") ؛
نغمة (الجرس ، 5000 ، 500) ؛ // يرسل صوت 5 هرتز لمدة 5 مللي ثانية
}
تأخير (3000) ؛ }} if (child2ButtonState! = child2PreviousState) {lcd.clear ()؛ إذا (child2ButtonState == HIGH) // يتم الضغط على الزر {child2Strike ++ ؛ Serial.println (String ("Child 2 has:") + child2Strike + "strikes") ؛ lcd.print ("الطفل 2 لديه:") ؛ lcd.setCursor (0 ، 1) ؛ lcd.print (child2Strike) ؛ lcd.print ("الضربات!") ؛ if (child2Strike> = 3) {Serial.println ("الطفل 2 مؤرض!")؛ lcd.clear () ؛ lcd.setCursor (0 ، 0) ؛ lcd.print ("الطفل 2 هو") ؛ lcd.setCursor (0 ، 1) ؛ lcd.print ("مؤرض!") ؛ نغمة (الجرس ، 5000 ، 500) ؛ } تأخير (3000) ؛ }}
إذا (child3ButtonState! = child3PreviousState)
{lcd.clear () ، إذا (child3ButtonState == HIGH) // يتم الضغط على الزر {child3Strike ++ ؛ Serial.println (String ("الطفل 3:") + child3Strike + "Strike") ؛ lcd.print ("الطفل 3 لديه:") ؛ lcd.setCursor (0 ، 1) ؛ lcd.print (child3Strike) ؛ lcd.print ("الضربات!") ؛ if (child3Strike> = 3) {Serial.println ("الطفل 3 مؤرض!")؛ lcd.clear () ؛ lcd.setCursor (0 ، 0) ؛ lcd.print ("الطفل 3") ؛ lcd.setCursor (0 ، 1) ؛ lcd.print ("مؤرض!") ؛ نغمة (الجرس ، 5000 ، 500) ؛ } تأخير (3000) ؛ }}
إذا (child4ButtonState! = child4PreviousState)
{lcd.clear () ، إذا (child4ButtonState == HIGH) // يتم الضغط على الزر {child4Strike ++ ؛ Serial.println (String ("Child 4 has:") + child4Strike + "strikes") ؛ lcd.print ("الطفل 4 لديه:") ؛ lcd.setCursor (0 ، 1) ؛ lcd.print (child4Strike) ؛ lcd.print ("الضربات!") ؛
إذا (child4Strike> = 3)
{Serial.println ("الطفل 4 مؤرض!") ؛ lcd.clear () ؛ lcd.setCursor (0 ، 0) ؛ lcd.print ("الطفل 4 هو") ؛ lcd.setCursor (0 ، 1) ؛ lcd.print ("مؤرض!") ؛ نغمة (الجرس ، 5000 ، 500) ؛ } تأخير (3000) ؛ }}} وهذا كل ما تحتاجه لبناء معدل سلوك الطفل الخاص بك
موصى به:
لا يتبول الآن ، جهاز تعديل سلوك الحيوانات الأليفة الذي يمنع القطط من التبول في منزلك: 4 خطوات
لا يتبول الآن ، جهاز ضبط سلوك الحيوانات الأليفة الذي يوقف القطط عن التبول في منزلك: لقد أزعجتني قطتي لدرجة أنها تحب التبول على سريري ، وتحققت من كل ما تحتاجه وأخذتها أيضًا إلى الطبيب البيطري. بعد أن أزعجت كل ما يمكنني التفكير فيه والاستماع إلى كلمة الطبيب ، أدركت أن لديها بعض السلوك السيئ. لذا
الطفل الماندالوري الآلي: 10 خطوات (بالصور)
ماندالوريان الطفل الآلي: لقد اشتريت هذه اللعبة الجديدة (لشخص آخر غيرك) وترغب في وضعها على & quot؛ active & quot؛ العرض دون إتلاف الوحدة. لسوء الحظ ، لا يعمل إلا عند النقر على رأسه. إذا قمت بلصق قطعة من رقائق معدنية بأعلى
قياس معدل ضربات القلب في متناول يدك: نهج التصوير الضوئي لتحديد معدل ضربات القلب: 7 خطوات
قياس معدل ضربات قلبك في متناول يدك: نهج التصوير الضوئي لتحديد معدل ضربات القلب: يعد مقياس الرسم الضوئي (PPG) تقنية بصرية بسيطة ومنخفضة التكلفة تُستخدم غالبًا للكشف عن التغيرات في حجم الدم في طبقة الأوعية الدموية الدقيقة من الأنسجة. يتم استخدامه في الغالب بشكل غير جراحي لإجراء قياسات على سطح الجلد ، عادةً
CribSense: جهاز مراقبة الطفل بدون تلامس قائم على الفيديو: 9 خطوات (بالصور)
CribSense: جهاز مراقبة الطفل بدون تلامس ، يعتمد على الفيديو: CribSense عبارة عن جهاز مراقبة أطفال بدون تلامس قائم على الفيديو يمكنك صنعه بنفسك دون كسر البنك. CribSense هو تطبيق C ++ لتكبير الفيديو تم ضبطه للتشغيل على Raspberry Pi 3 Model B. خلال عطلة نهاية الأسبوع ، يمكنك إعداد سرير خاص بك
اردوينو مراقبة الطفل مع عارض جافا: 8 خطوات (بالصور)
Arduino Baby Monitor مع Java Viewer: قم ببناء وحدة متعددة المستشعرات قائمة على Arduino لمراقبة الظروف في الغرفة. يمكن لهذه الوحدة استشعار الرطوبة ودرجة الحرارة والحركة والصوت. مرفق هو عارض قائم على جافا يتلقى البيانات التسلسلية من اردوينو