تشغيل Arduino بسلاسة لمصابيح RGB LED من خلال زر. التحكم في سطوع LED باستخدام مقياس الجهد. وصف البرنامج للاردوينو

في هذه التجربة، نضيف جزءًا من السطوع إلى مؤشر LED بزر واحد ونخفضه باستخدام الزر الآخر.

قائمة أجزاء التجربة

- 1 لوحة اردوينو أونو؛

- 1 لوح تجارب غير قابل للحام؛

- 2 أزرار على مدار الساعة؛

- مقاوم واحد بقيمة اسمية 220 أوم؛

- 1 إل إي دي؛

- 7 أسلاك ذكر-ذكر.

مخطط الرسم البياني

رسم تخطيطي على اللوح

ملحوظة

  • إذا كنت تقوم بإعادة صياغة الدائرة من التجربة السابقة، لاحظ أننا هذه المرة نحتاج إلى توصيل مؤشر LED بمنفذ يدعم PWM.

رسم

تحميل رسم تخطيطي لاردوينو IDE
#define PLUS_BUTTON_PIN 2 #define MINUS_BUTTON_PIN 3 #define LED_PIN 9 سطوع int = 100؛ boolean plusUp = true; boolean minusUp = true; إعداد باطلة () ( pinMode (LED_PIN، OUTPUT)؛ pinMode (PLUS_BUTTON_PIN، INPUT_PULLUP)؛ pinMode (MINUS_BUTTON_PIN، INPUT_PULLUP)؛) حلقة باطلة () (analogWrite (LED_PIN، السطوع)؛ // الرد على النقرات باستخدام الوظيفة التي كتبناها plusUp = HandleClick(PLUS_BUTTON_PIN, plusUp, +35); minusUp = HandleClick(MINUS_BUTTON_PIN, minusUp, -35);) // الوظيفة الخاصة مع 3 معلمات: رقم الدبوس مع الزر // (buttonPin)، الحالة قبل التحقق (wasUp) ) والتدرج // السطوع عند الضغط على زر (دلتا). تقوم الدالة بإرجاع // (إرجاع باللغة الإنجليزية) إلى الحالة الحالية الجديدة للزر boolean HandleClick(int ButtonPin, boolean WasUp, int delta) ( boolean isUp = digitalRead(buttonPin); if (wasUp && !isUp) ( تأخير(10) ); isUp = digitalRead(buttonPin); // إذا كانت هناك نقرة، قم بتغيير السطوع من 0 إلى 255 if (!isUp) Brightness = constrain(brightness + delta, 0, 255);) return isUp; // إرجاع القيمة مرة أخرى إلى رمز المتصل)

شرح الكود

  • لا يمكننا استخدام الوظائف المضمنة فحسب، بل يمكننا أيضًا إنشاء وظائفنا الخاصة. يكون هذا مبررًا عندما نحتاج إلى تكرار نفس الإجراءات في أماكن مختلفة في الكود، أو، على سبيل المثال، نحتاج إلى تنفيذ نفس الإجراءات على بيانات مختلفة، كما في هذه الحالة: معالجة الإشارة من المنافذ الرقمية 2 و3.
  • يمكنك تحديد وظائفك الخاصة في أي مكان في الكود خارج كود الوظائف الأخرى. في مثالنا، قمنا بتعريف دالة بعد ذلك حلقة .
  • لتحديد وظيفتنا نحتاج إلى:
    • أعلن عن نوع البيانات التي سترجعها. في حالتنا هو عليه منطقية. إذا كانت الدالة تنفذ بعض الإجراءات فقط ولا تُرجع أي قيمة، فاستخدم الكلمة الأساسية فارغ
    • قم بتعيين اسم للوظيفة - معرف. تنطبق هنا نفس القواعد عند تسمية المتغيرات والثوابت. تتم تسمية الوظائف بنفس النمط likeVariables .
    • بين قوسين، قم بإدراج المعلمات التي تم تمريرها إلى الوظيفة، مع الإشارة إلى نوع كل منها. هذا إعلان للمتغيرات المرئية داخل الوظيفة التي تم إنشاؤها حديثًا، وداخلها فقط. على سبيل المثال، إذا حاولنا في هذه التجربة الوصول إلى ما الجديدأو اعلىمن حلقة()سوف نتلقى رسالة خطأ من المترجم. وبالمثل، تم الإعلان عن المتغيرات في حلقة، غير مرئية للوظائف الأخرى، ولكن يمكن تمرير قيمها كمعلمات.
    • بين زوج من الأقواس المتعرجة، اكتب الكود الذي تنفذه الدالة
    • إذا كان يجب أن ترجع الدالة بعض القيمة، فاستخدم الكلمة الأساسية يعودتحديد القيمة المراد إرجاعها. يجب أن تكون هذه القيمة من النوع الذي أعلنا عنه
  • ما يسمى بالمتغيرات العالمية، أي. عادةً ما يتم الإعلان عن المتغيرات التي يمكن الوصول إليها من أي دالة في بداية البرنامج. في حالتنا، هذا هو سطوع .
  • داخل الوظيفة التي أنشأناها HandleClickيحدث نفس الشيء كما في التجربة.
  • نظرًا لأنه مع خطوة زيادة السطوع بمقدار 35، وبعد ما لا يزيد عن ثماني نقرات متتالية على أحد الأزرار، فإن قيمة التعبير السطوع + دلتاسوف تذهب خارج الفاصل الزمني . باستخدام الوظيفة تقييدنقوم بتحديد القيم المسموح بها للمتغير سطوعحدود الفاصل الزمني المحدد.
  • في التعبير plusUp = HandleClick(PLUS_BUTTON_ دبوس ، بالإضافة إلى الأعلى، +35)نصل إلى المتغير plusUpمرتين. بسبب ال = يضع قيمة المعامل الأيمن في المعامل الأيسر، ويحسب أولاً ما سيعود HandleClick. لذلك عندما نعطيها plusUpكمعلمة، فإنه لا يزال يحتوي على القيمة القديمة المحسوبة أثناء المكالمة الأخيرة HandleClick .
  • داخل HandleClickنحسب قيمة سطوع LED الجديدة ونكتبها في متغير عام سطوع، والتي في كل تكرار حلقةمرت للتو ل AnalogWrite .

أسئلة لاختبار نفسك

  1. ماذا تعني الكلمة الرئيسية؟ فارغ ?
  2. كيف يتصرف البرنامج عندما يتم ذكر متغير واحد من جوانب مختلفة من عامل التعيين = ?

مهام الحل المستقل

  1. قم بتعديل الكود بحيث يتم ضبط خطوة تغيير السطوع في مكان واحد.
  2. أنشئ وظيفة أخرى وأعد صياغة الكود بحيث تكون إحدى الوظائف مسؤولة عن تتبع ضغطات المفاتيح، وأخرى مسؤولة عن حساب سطوع مؤشر LED وإعادته إلى المستوى المطلوب. AnalogWrite .

الآن دعونا نلقي نظرة على مصباح LED متعدد الألوان، والذي يُطلق عليه غالبًا اختصارًا: RGB LED. RGB هو اختصار يرمز إلى: أحمر - أحمر، أخضر - أخضر، أزرق - أزرق. أي أنه يتم وضع ثلاثة مصابيح LED منفصلة داخل هذا الجهاز. اعتمادًا على النوع، قد يحتوي مصباح RGB LED على كاثود مشترك أو أنود مشترك.

1. خلط الألوان

لماذا يعتبر RGB LED أفضل من ثلاثة مصابيح تقليدية؟ الأمر كله يتعلق بقدرة رؤيتنا على مزج الضوء من مصادر مختلفة موضوعة بالقرب من بعضها البعض. على سبيل المثال، إذا وضعنا مصابيح LED زرقاء وحمراء بجانب بعضها البعض، فسوف يندمج توهجها على مسافة عدة أمتار وسترى العين نقطة أرجوانية واحدة. وإذا أضفنا اللون الأخضر أيضًا، فستظهر لنا النقطة باللون الأبيض. هذه هي بالضبط الطريقة التي تعمل بها شاشات الكمبيوتر وأجهزة التلفزيون والشاشات الخارجية. تتكون مصفوفة التلفزيون من نقاط فردية بألوان مختلفة. إذا أخذت عدسة مكبرة ونظرت من خلالها إلى الشاشة قيد التشغيل، فيمكنك بسهولة رؤية هذه النقاط. لكن على شاشة خارجية، لا يتم وضع النقاط بكثافة كبيرة، بحيث يمكن تمييزها بالعين المجردة. ولكن من مسافة عدة عشرات من الأمتار لا يمكن تمييز هذه النقاط. وتبين أنه كلما اقتربت النقاط متعددة الألوان من بعضها البعض، كلما قلت المسافة التي تحتاجها العين لمزج هذه الألوان. ومن هنا الاستنتاج: على عكس ثلاثة مصابيح LED منفصلة، ​​يكون خلط الألوان في RGB LED ملحوظًا بالفعل على مسافة 30-70 سم، وبالمناسبة، فإن أداء RGB LED مع عدسة غير لامعة يعمل بشكل أفضل.

2. توصيل RGB LED إلى Arduino

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

3. برنامج للتحكم في RGB LED

دعونا نؤلف برنامج بسيط، والتي سوف تضيء كل من الألوان الثلاثة على التوالي. بايت ثابت rPin = 3 ؛ بايت ثابت gPin = 5؛ بايت ثابت bPin = 6؛ إعداد الفراغ () ( pinMode (rPin، OUTPUT)؛ pinMode (gPin، OUTPUT)؛ pinMode (bPin، OUTPUT)؛) حلقة باطلة () (/ إيقاف اللون الأزرق، تشغيل الكتابة الرقمية باللون الأحمر (bPin، LOW)؛ الكتابة الرقمية () rPin، HIGH)؛ تأخير (500)؛ // إيقاف اللون الأحمر، تشغيل الكتابة الرقمية باللون الأخضر (rPin، LOW)؛ الكتابة الرقمية (gPin، HIGH)؛ تأخير (500)؛ // إيقاف اللون الأخضر، تشغيل الكتابة الرقمية الزرقاء (gPin) ، LOW)؛ digitalWrite (bPin، HIGH)؛ تأخير (500)؛ ) قم بتحميل البرنامج على Arduino ولاحظ النتيجة. متصفحك لادعم علامة الفيديو. دعونا نحسن البرنامج قليلاً: بدلاً من المتغيرات rPin وgPin وbPin، سنستخدم مصفوفة. وهذا سوف يساعدنا في المهام القادمة. بايت ثابت rgbPins = (3,5,6); إعداد باطل () (لـ (بايت i = 0؛ i<3; i++) pinMode(rgbPins[i], OUTPUT); } void loop() { digitalWrite(rgbPins, LOW); digitalWrite(rgbPins, HIGH); delay(500); digitalWrite(rgbPins, LOW); digitalWrite(rgbPins, HIGH); delay(500); digitalWrite(rgbPins, LOW); digitalWrite(rgbPins, HIGH); delay(500); }

4. سبعة ألوان من قوس قزح

الآن دعونا نحاول إضاءة لونين في نفس الوقت. لنبرمج تسلسل الألوان التالي:
  • أحمر
  • أحمر + أخضر = أصفر
  • أخضر
  • أخضر + أزرق = أزرق فاتح
  • أزرق
  • أزرق + أحمر = أرجواني
لقد حذفنا اللون البرتقالي من أجل البساطة. لذلك، اتضح أن هناك ستة ألوان من قوس قزح 🙂 const byte rgbPins = (3,5,6); قوس قزح بايت ثابت = (((1,0,0)، // أحمر (1،1،0)، // أصفر (0،1،0)، // أخضر (0،1،1)، // أزرق ( 0,0,1)، // الأزرق (1،0،1)، // الأرجواني)؛ إعداد باطل () (لـ (بايت i = 0؛ i<3; i++) pinMode(rgbPins[i], OUTPUT); } void loop() { // перебираем все шесть цветов for(int i=0; i<6; i++){ // перебираем три компоненты каждого из шести цветов for(int k=0; k<3; k++){ digitalWrite(rgbPins[k], rainbow[i][k]); } delay(1000); } } В результате работы программы получается: Your browser does not support the video tag.

5. تغيير اللون على نحو سلس

لم يكن من قبيل الصدفة أننا قمنا بتوصيل RGB LED بالأطراف 3 و5 و6. كما تعلم، تتيح لك هذه الأطراف إنشاء إشارة PWM لدورات عمل مختلفة. وبعبارة أخرى، لا يمكننا فقط تشغيل أو إيقاف تشغيل مؤشر LED، ولكن التحكم في مستوى الجهد عليه. ويتم ذلك باستخدام الوظيفة AnalogWrite. دعونا نتأكد من أن مؤشر LED الخاص بنا سوف ينتقل بين ألوان قوس قزح ليس بشكل مفاجئ، ولكن بسلاسة. بايت ثابت rgbPins = (3,5,6); كثافة العمليات قاتمة = 1؛ إعداد باطل () (لـ (بايت i = 0؛ i<3; i++){ pinMode(rgbPins[i], OUTPUT); } // начальное состояние - горит красный цвет analogWrite(rgbPins, 255); analogWrite(rgbPins, 0); analogWrite(rgbPins, 0); } void loop() { // гасим красный, параллельно разжигаем зеленый for(int i=255; i>=0; i--)(analogWrite(rgbPins, i/dim); AnalogWrite(rgbPins, (255-i)/dim); Delay(10);) // إيقاف اللون الأخضر وتشغيل اللون الأزرق بالتوازي for(int i=255 ; i> =0; i--)(analogWrite(rgbPins, i/dim); AnalogWrite(rgbPins, (255-i)/dim); تأخير(10);) // إيقاف اللون الأزرق وتشغيل اللون الأحمر بالتوازي for(int i=255 ; i>=0; i--)( AnalogWrite(rgbPins, i/dim); AnalogWrite(rgbPins, (255-i)/dim); تأخير(10); ) ) يحدد المتغير الخافت سطوع الوهج. عند dim = 1 لدينا أقصى سطوع. قم بتحميل البرنامج على الاردوينو. متصفحك الحالي لا يدعم تشغيل الفيديو.

مهام

  1. مؤشر درجة الحرارة. دعونا نضيف الثرمستور إلى الدائرة ونقوم بتوصيله بالمدخل التناظري. يجب أن يتغير لون مؤشر LED اعتمادًا على درجة حرارة الثرمستور. كلما انخفضت درجة الحرارة، زاد اللون الأزرق، وكلما ارتفعت درجة الحرارة، زاد اللون الأحمر.
  2. مصباح RGB مع منظم. دعونا نضيف ثلاث مقاومات متغيرة إلى الدائرة ونقوم بتوصيلها بالمدخلات التناظرية. يجب أن يقرأ البرنامج باستمرار قيم المقاوم ويغير لون مكون RGB LED المقابل.

في هذا المثال، سوف تتعلم كيفية تغيير سطوع LED باستخدام مقاومات ذات مقاومات مختلفة.

لهذا المثال سوف تحتاج

1 LED قطر 5 مم

مقاومة 1270 أوم (أحمر، بنفسجي، بني)

مقاومة 1470 أوم (أصفر، بنفسجي، بني)

1 مقاومة 2.2 كيلو أوم (أحمر، أحمر، أحمر)

1 مقاومة 10 كيلو أوم (بني، أسود، برتقالي)

المصابيح - معلومات عامة

تعمل مصابيح LED بشكل جيد في الأجهزة لأنواع مختلفة من المؤشرات. أنها تستهلك القليل من الكهرباء ودائمة.

في هذا المثال، نستخدم مصابيح LED الأكثر شيوعًا بقطر 5 مم. من الشائع أيضًا استخدام مصابيح LED التي يبلغ قطرها 3 ملم، ومصابيح LED الكبيرة التي يبلغ قطرها 10 ملم.

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

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

هناك طريقتان للتمييز بين الأرجل الإيجابية والسلبية لمصباح LED.

الأول هو أن الساق الإيجابية أطول.

والثاني هو أنه عند دخول مبيت الصمام الثنائي نفسه، توجد حافة مسطحة على موصل الساق السالب.

إذا صادفت مصباح LED بحافة مسطحة على الساق الأطول، فإن الساق الأطول لا تزال إيجابية.

المقاومات - معلومات عامة

مقاومة - مقاومة (الإنجليزية)

وكما يوحي الاسم، فإن المقاومات تقاوم تدفق الكهرباء. كلما ارتفعت قيمة (أوم) المقاوم، زادت المقاومة وقل تدفق التيار عبر الدائرة التي تم تركيبه فيها. سوف نستخدم خاصية المقاومات هذه لتنظيم التيار الذي يمر عبر LED وبالتالي سطوعه.

ولكن أولا، دعونا نتحدث قليلا عن المقاومات.

الوحدات التي يتم قياس المقاومة بها هي أوم، والتي يُشار إليها في العديد من المصادر بالحرف اليوناني Ω - أوميغا نظرًا لأن أوم هي قيمة صغيرة للمقاومة (غير محسوسة تقريبًا في الدائرة)، فسنعمل غالبًا بوحدات مثل kOhm - كيلو أوم (1000 أوم) وميجا أوم (1,000,000 أوم).

في هذا المثال، سوف نستخدم مقاومات بأربع قيم مختلفة: 270 أوم، 470 أوم، 2.2 كيلو أوم، و10 كيلو أوم. أحجام هذه المقاومات هي نفسها. اللون أيضا. الشيء الوحيد الذي يميزهم هو الخطوط الملونة. من هذه الشرائط يتم تحديد قيمة المقاومات بصريًا.

بالنسبة للمقاومات التي لها ثلاثة خطوط ملونة وآخر شريط ذهبي تعمل المراسلات التالية:

بني 1

احمر 2

برتقالي 3

الأخضر 5

الأرجواني 7

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

مقاومة ذات خطوط باللون البني والأسود والبرتقالي: 10 وثلاثة أصفار، أي 10000 أوم. أي 10 كيلو أوم.

على عكس مصابيح LED، لا تحتوي المقاومات على أرجل موجبة وسالبة. لا يهم الساق التي تستخدمها لتوصيلها بالطاقة/الأرض.

مخطط الاتصال

الاتصال وفقا للرسم البياني أدناه:

يحتوي Arduino على دبوس 5V لتشغيل الأجهزة الطرفية. سوف نستخدمه لتشغيل مصباح LED ومقاوم. لن تحتاج إلى أي شيء آخر من اللوحة، فقط قم بتوصيلها عبر USB بجهاز الكمبيوتر الخاص بك.

مع مقاومة 270 أوم، يجب أن يضيء مؤشر LED بشكل ساطع. إذا قمت باستبدال المقاومة 270 أوم بمقاومة 470 أوم، فلن يتوهج مؤشر LED بنفس السطوع. مع مقاومة 2.2 كيلو أوم، يجب أن يتلاشى مؤشر LED أكثر قليلاً. بعد كل شيء، مع مقاومة 10 كيلو أوم، سيكون مؤشر LED بالكاد مرئيًا. من المحتمل أنه لكي ترى الفرق في الخطوة الأخيرة، سيتعين عليك سحب المحول الأحمر واستخدامه كمفتاح. ومن ثم يمكنك رؤية الفرق في السطوع.

بالمناسبة، يمكنك إجراء هذه التجربة مع إطفاء الأنوار.

خيارات تركيب المقاوم المختلفة

في اللحظة التي يتم فيها توصيل 5V بساق واحدة من المقاوم، يتم توصيل الساق الثانية من المقاوم بالساق الموجبة لـ LED، والساق الثانية من LED متصلة بالأرض. إذا قمنا بتحريك المقاومة بحيث تكون خلف مؤشر LED كما هو موضح أدناه، فسيظل مؤشر LED مضاءً.

وميض الصمام

يمكننا توصيل LED بمخرج Arduino. انقل السلك الأحمر من طرف الطاقة 5V إلى D13 كما هو موضح أدناه.

الآن قم بتنزيل مثال "Blink" الذي نظرنا إليه. يرجى ملاحظة أن كلا مؤشري LED - المدمج والخارجي الذي قمت بتثبيته - بدأا في الوميض.

دعونا نحاول استخدام دبوس مختلف على اردوينو. لنفترض D7. انقل الموصل من الطرف D13 إلى الطرف D7 وقم بتغيير السطر التالي من التعليمات البرمجية الخاصة بك:

قم بتحميل المخطط المعدل إلى Arduino. سيستمر مؤشر LED في الوميض، ولكن هذه المرة باستخدام الطاقة من الطرف D7.

في الدروس السابقة تعرفنا على أبسط الدوائر - التجميع و. نقوم اليوم بتجميع نموذج بمقياس الجهد (مقاوم متغير) ومصباح LED. يمكن استخدام مثل هذا النموذج للتحكم في الروبوت.

مقياس فرق الجهدهو متغير المقاوم مع مقاومة قابلة للتعديل.تُستخدم مقاييس الجهد في الروبوتات كمنظمين لمختلف المعلمات - حجم الصوت والطاقة والجهد وما إلى ذلك. في نموذجنامن تحويل مقبض الجهدسوف يعتمد سطوع LED. وهذا أيضًا أحد المخططات الأساسية.

تعليمات الفيديو لتجميع النموذج:

لتجميع النموذج نحتاج:

  • لوحة اردوينو (أو نظائرها)؛
  • اللوح.
  • 6 أسلاك و/أو وصلات من الذكور إلى الذكور؛
  • الصمام الثنائي الباعث للضوء
  • مقياس الجهد (المقاوم المتغير) ؛
  • 220 أوم المقاوم.
  • Arduino IDE، والذي يمكن تنزيله من موقع Arduino.

ما الذي تحتاجه لتوصيل مقياس الجهد و LED بالاردوينو؟

مخطط اتصال لنموذج Arduino مع مقياس الجهد و LED:

مخطط اتصال لنموذج Arduino مع مقياس الجهد و LED

البرنامج التالي مناسب لهذا النموذج للعمل (يمكنك ببساطة نسخ البرنامج إلى Arduino IDE):

// إعطاء أسماء الدبابيس مع LED
// ومقياس الجهد
#تعريف الصمام 9
#تعريف الوعاء A0
الإعداد باطل()
{
// دبوس مع LED - الإخراج
pinMode(led, OUTPUT);
// دبوس بمقياس الجهد - الإدخال
pinMode(pot, INPUT);
}
حلقة فارغة()
{
// أعلن عن المتغير x
كثافة العمليات س؛
// قراءة الجهد من مقياس الجهد:
// سيتم استلام رقم من 0 إلى 1023
// اقسمه على 4، وستحصل على رقم في النطاق
// 0-255 (سيتم تجاهل الجزء الكسري)
س = القراءة التناظرية (وعاء) / 4؛
// إخراج النتيجة إلى LED
AnalogWrite(led, x);
}

هذا ما يبدو عليه نموذج Arduino المجمع لمقياس الجهد المزود بمصباح LED:

نموذج اردوينو مع مقياس الجهد و LED مجمعة

بهذا ننتهي من الدرس الثالث "الاردوينو للمبتدئين". يتبع!

مشاركات الدرس:

  1. الدرس الأول: .
  2. الدرس الثاني: .
  3. الدرس الثالث : .
  4. الدرس الرابع : .
  5. الدرس الخامس : .
  6. الدرس السادس : .
  7. الدرس السابع : .
  8. الدرس الثامن : .
  9. الدرس التاسع:

ودعونا نحاول إكمال مهمة جديدة. أعتقد أن الجميع قد شاهدوا أكاليل عرض رأس السنة الجديدة التي تومض فيها مصابيح LED بسلاسة. لنفترض أننا نريد أن نفعل شيئًا كهذا.
لقد ألقينا نظرة بالفعل على الدالة digitalWrite() ونعلم أن القيمة التي تكتبها يمكن أن تكون من خيارين - عالية أو منخفضة. في هذه الحالة، ستساعدنا الدالة AnalogWrite(). تختلف "صيغة" الوظائف فقط في البادئات الأولية، لذلك يسهل تذكرها.

تحتوي الدالة AnalogWrite()، مثل digitalWrite()، على وسيطتين بين قوسين وتعمل على نفس المبدأ اللفظي: "أين، ماذا". والفرق الرئيسي هو القدرة على تسجيل نطاق واسع من القيم بدلاً من القيمة المنخفضة أو العالية المعتادة. سيسمح لنا ذلك بضبط سطوع مؤشر LED. الملاحظة الرئيسية التي يجب أخذها في الاعتبار هي أن هذه الميزة تعمل فقط على جهات اتصال معينة. يتم تمييز هذه الدبابيس بالرمز "~". يشير هذا الرمز إلى أن هذه جهة اتصال PWM. يبدو PWM (تعديل عرض النبضة) مثل PWM (تعديل عرض النبضة) باللغة الروسية. يعتمد مبدأ التشغيل على تغيير مدة النبض. بيانيا يمكن تصوير ذلك على النحو التالي:

دعونا نحاول معرفة كيفية عمل ذلك من خلال النظر إلى مثال بسيط. للقيام بذلك، تحتاج إلى توصيل مؤشر LED بجهة اتصال PWM من خلال مقاومة 150 أوم وربط برنامج بسيط في Arduino. يتم عرض مخطط الاتصال ورمز الرسم أدناه:


الإعداد باطل()
{
pinMode(led,OUTPUT);
}

حلقة فارغة()
{
ل(int i=0; i<=255; i++)
{
AnalogWrite(led,i);
تأخير (10)؛
}
ل(int i=255; i>=0; i--)
{
AnalogWrite(led,i);
تأخير (10)؛
}
}


أعتقد أن الكود واضح بشكل عام، ولكننا بحاجة إلى إيلاء القليل من الاهتمام للحلقة for(). هناك شيء مثل الإذن. نظرًا لأننا نعمل بدقة 8 بت (ستتم مناقشة ذلك لاحقًا)، فإن الحد الأدنى للقيمة سيكون 0، والحد الأقصى سيكون 255. وفي نهاية كل تكرار، قمنا بتعيين التأخير الزمني إلى 10 مللي ثانية.

دعنا نعود إلى الرسم البياني من الدرس السابق ونحاول إنشاء إكليل مشابه باستخدام الدالة AnalogWrite().


int ButtonPin = 2;
دبابيس int = (3,5,6,9,10,11);

boolean lastButton = LOW؛
زر التيار المنطقي = LOW؛
تمكين منطقي = خطأ؛

الإعداد باطل()
{
pinMode(buttonPin, INPUT);
ل(وضع int = 0; الوضع<= 5; mode++) pinMode(pins, OUTPUT);
}

الارتداد المنطقي (الأخير المنطقي)
{
التيار المنطقي = القراءة الرقمية (buttonPin)؛
إذا (الأخير! = الحالي)
{
تأخير (5)؛
current = digitalRead(buttonPin);
}
العودة الحالية.
}

حلقة فارغة()
{
currentButton = debounce(lastButton);
إذا (الزر الأخير == LOW &&الزر الحالي == مرتفع)
{
تمكين =! تمكين؛
}

إذا (تمكين == صحيح)
{
ل(int i=0; i<=5; i++)
{
ل(كثافة كثافة العمليات = 0؛ السطوع<= 255; brightness++)
{
تأخير (1)؛
}
تأخير (40)؛
}
ل(int i=0; i<=5; i++)
{
لـ (السطوع = 255؛ السطوع >= 0؛ السطوع--)
{
AnalogWrite(pins[i], Brightness);
تأخير (1)؛
}
تأخير (40)؛
}
}

إذا (تمكين == خطأ)
{
ل(int i = 0; i<= 5; i++) digitalWrite(pins[i], LOW);
}

LastButton = currentButton؛
}


بصريا، أصبح الرسم أكثر تعقيدا إلى حد ما. في الواقع، كل شيء بسيط هنا ودعونا نكتشف ذلك. نحن بحاجة إلى تحديد جميع مصابيح LED المتصلة، ولكن بدلاً من مؤشر int المعتاد، نستخدم مصفوفة، كل عنصر منها عبارة عن طرف PWM على Arduino. في نص الدالة void setup()، تصرفنا أيضًا بطريقة ماكرة. لقد عهدنا "بإدراج" جميع جهات الاتصال إلى حلقة for()، مع كل تكرار يتم تكوين جهة الاتصال المقابلة له على OUTPUT. دعنا ننتقل إلى وظيفة حلقة الفراغ (). تظل وظيفة debounce() وشرط if() الأولي دون تغيير. مازلنا نتحقق من مستويات متغيرين: القيمة السابقة (منخفضة في البداية) والحالة الحالية للزر. عند استيفاء هذه الشروط، يتم عكس قيمة متغير التمكين. مع أخذ هذا في الاعتبار، أضفنا شرطين if() بسيطين آخرين. إذا كان تمكين = صحيح، فسيتم تشغيل الطوق، ويتم التحكم في سلاسة "التدفق" من خلال حلقة for(). إذا كان التمكين = خطأ، فسيتم إيقاف تشغيل جميع مصابيح LED. في نهاية الشروط، يأخذ المتغير lastButton الحالة الحالية للزر.
أثناء اختبار برنامجنا، لاحظنا أن كل شيء لم يكن يعمل كما هو متوقع. تذكر أننا قمنا في الدرس الأخير بتعديل أنه إذا كان التأخير الزمني كبيرا، فسيتم تشغيل الزر بعد انتهاء صلاحيته؟ في المثال السابق، عند تشغيل الطوق، كان إجمالي التأخير في نص الدالة void Loop() هو 85 مللي ثانية. لقد منحنا هذا الفرصة "للوصول إلى هناك" خلال فترة زمنية معينة. في هذا الرسم التخطيطي، وفي ظل نفس الحالة، يختلف التأخير عدة مرات. ربما، إذا كنت ترغب في إيقاف تشغيل الطوق، فإن كلمة "مقاطعة" تشير إلى نفسها. سيكون هذا هو الحل لهذه المشكلة!

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




قمة