Arduino 8 bit Binary LED Counter

تحويل رقم عشري إلى ثنائي باستخدام أردوينو

رابط المصدر

 

نظام العد هو طريقة عرض الأعداد برسوم محددة والتعامل معها للتعبير عن قيمتها وكيفية تطبيق العمليات الحسابية عليها

نحن كبشر نستخدمها  في أغلب تعاملتنا اليومية النظام العشري. وهو نظام تعبر خاناته عن مضاعفات قوى العدد عشرة. ويستعمل رموز الأرقام من ٠ إلى ٩ في خاناته.

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

كم أتعرق كثيرا عند ذكر هذا الكم الهائل المتوقع من الأرقام الذي يمكن ان نتعامل معها 

ولكن من المهم أن نفهم ما هو النظام العشري Decimal system و النظام الثنائي Binary system   ولكن فى هذه المرة سنتعلمهم بطريقه لطيفه نستخدم بها الأردوينو و الليدات ونرك الأنوار تخبرنا بأسرار الأرقام .

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

الان لنجرب تحول الأرقام من النظام العشري إلى النظام الثنائي

التحويل من النظام العشري الى الثنائي

لنأخذ مثلا الرقم 400, لتحويله نقسمه على 2, فإذا كانت الناتج يحتوي على كسور فيكون الرقم الأول من الرقم الثنائي هو 1 و إذا لم يحتوي على كسور فيكون الرقم صفر

400 / 2 = 200 , إذن الرقم الأول هو صفر

200 / 2 = 100 ,  صفر

100 / 2 = 50 , صفر أيضا

50 / 2 = 25 ,  صفر

25 / 2 = 12 , واحد

12 / 2 = 6 , صفر

6 / 2 = 3 ,  صفر

3 / 2 = 1 , واحد

1 / 2 = 0 , واحد

يصبح الناتج هو = 11001000

تبدأ من الأسفل و تصعد للأعلى .

هذه باختصار  عملية تحويل الرقم العشري إلى الثنائي و الثنائي إلى العشري

ملحوظة :- الرقم العشري يتكون من 0 إلى 255

مشاهدة الفيديو الموضح لنظرية عمل المثال

Watch this short video to see the 8 bit binary led counter in action:

نظرية عمل المثال

عند تشغيل المثال فانه يعني انه لا يوجد قيم مسجله نتيجة أننا لم نضغط على الزر فتكون القيمة 0 وهو بالنظام الثنائي 00000000 لذلك سيكون وضع جميع الليدات مطفاء

عند البدء بالضغط ضغطة واحده فإنها تعني رقم عشري 1 وهو يعني 00000001 فيكون الليد المضاء هو الليد رقم 1

عند الضغط عدد 2 ضغطة فهي تعني رقم عشري 2 وهو يعني 00000010 فيكون الليد المضاء هو الليد رقم 2

كيف كان هذا فبالضغط أو ضغطه الليد الاول أضاء عند الضغط تاني ضغطه الليد رقم 1 أصبح غير مضاء ولليد رقم 2 أضاء و لو ضغط للمره 3 فسيكون الليدين رقم 1 و 2 مضائين معا ويمكنك تحويل الرقم 3 إلى النظام الثنائي و ستكون النتيجة 00000011

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

الان سنتعرف على كيفية توصيل الليدات مع تحكمة الاردوينو و المقاومات و الزر وهو أمر سهل جدا

طريقة التوصيل

  1. توصيل عدد 8 ليدات على كل بن على التوالي مع  البنات رقم من 5 إلى 12 مع مراعة نفس الترتيب
  2. توحيد الأرضي بين الليدات
  3. توصيل مقاومة على طرف 5 فولت من الأردوينو و على التوالي مع البن رقم 2 ثم توصيلهم مع نقطة توصيل فى الزر  وطرف الزر الاخر مع الأرضي

Arduino Binary LEDs Sketch Code

  1. /* source: http://www.electroschematics.com/9809/arduino-8-bit-binary-led/ */
  2. int button =2;// pin to connect the button
  3. int presses =0;// variable to store number of presses
  4. long time =0;// used for debounce
  5. long debounce =100;// how many ms to "debounce"
  6. constbyte numPins =8;// how many leds
  7. int state;// used for HIGH or LOW
  8. // pins to connect leds
  9. byte pins[]={5,6,7,8,9,10,11,12};
  10.  
  11. void setup()
  12. {
  13. /* we setup all led pins as OUTPUT */
  14. for(int i =0; i < numPins; i++){
  15. pinMode(pins[i], OUTPUT);
  16. }
  17. pinMode(button, INPUT);
  18. /* use pin 2 which has interrupt 0 on Arduino UNO */
  19. attachInterrupt(0, count, LOW);
  20. }
  21.  
  22. void loop()
  23. {
  24. /* convert presses to binary and store it as a string */
  25. String binNumber =String(presses, BIN);
  26. /* get the length of the string */
  27. int binLength = binNumber.length();
  28. if(presses <=255){// if we have less or equal to 255 presses
  29. // here is the scary code
  30. for(int i =0, x =1; i < binLength; i++, x+=2){
  31. if(binNumber[i]=='0') state = LOW;
  32. if(binNumber[i]=='1') state = HIGH;
  33. digitalWrite(pins[i]+ binLength - x, state);
  34. }
  35. }else{
  36. // do something when we reach 255
  37. }
  38. }
  39.  
  40. /* function to count the presses */
  41. void count(){
  42. // we debounce the button and increase the presses
  43. if(millis()- time > debounce) presses++;
  44. time = millis();
  45. }

الشفره البرمجية فى سطور بالعربية :)

 int button = 2

هئا المتغير لتوصيل الزر به وقد حددناه على bin رقم 2

int presses = 0

متغير لتخزين عدد مرات الضغط على الزر

long time = 0

هو متغير مرتبط بالوقت ويحدده المتغير التالي

long debounce = 100

هذا المتغير يحدد عدد الملي ثانية التي تفصل بين كل ضغطة على الزر

const byte numPins = 8

تخزين عدد الليدات وهي

int state تستخدم في تحديد حالة كل ليد أو مجموعه من الليدات حسب الرقم العشري الذي تم تحويله هل

HIGH أو LOW

byte pins[]={5,6,7,8,9,10,11,12};

تحديد البنات التي ستوصل مع الليدات وتم وضع أرقام البنات فى مصفوفة حتي يسهل التعامل مع كما سنري

على أنها pins  لتحديد حلة كل البنات التي تم تعريفا فى المتغير for() الأسطر (14و15و16) تم إستخدام الدله

 OUTPUT

pinMode(button, INPUT)

تحديد حالة البن رقم 2 أنها INPUT لإستقبال القيم من خلال الضغط على الزر

attachInterrupt(0, count, LOW)

هذا الأمر يجعل البن رقم 2 فى حالة 0 أي تصفير أي قيم مرسله بحيث أن تكون

 LOWالقيمة العشرية 0 و بالتالي عند تحويلها للنظام الثانئي 000000 مما يجعل كل الليدات فى حالة 

void count()

هذه الداله مهمتها هي أن تزيد العدد كلما ضغطنا على الزر ففى بداية تشغيل الأردوينو تعمل الوظيفة

السابق شرحها وهي جعل القيمة 0 أما كلما ضغطنا قامة هئه الدالة بزيادة 1 بالصيغه العشرية وعند تحويلها للنظام الثنائي تكون 00000001 مما يعني انه إضائة الليد الاول من على اليمي

(String binNumber = String(presses, BIN داخل ال void loop()تم تعرف هذا المتغير لتحويل قيمة الضغط على الزر وتحويله لقيمة ثنائي وتخزينها int binLength = binNumber.length هذا الكتغير للحصول على عدد string أرقام ال 

كرقم صحيح بالنظام العشري

وذلك لمعرفة هل عدد الضغطات على الزر أقل من أو يساوي 255 مره ولو كان أثر من 255 مره حينها نقرر مذا يمكن أن نفعل

sayed mostafa