Menu
CoddyTech
flag Ar iconالعربيةdown icon

ساعة NeoPixel: ضبط الوقت

جزء من قسم المشاريع في رحلة Arduino على Coddy. الدرس 24 من 24.

تبدأ الساعة دائمًا عند 10:24:50، وهذا صحيح مرة واحدة في اليوم. يضبطها زران: الزر الأحمر على المنفذ 2 يقدّم الساعة ساعةً واحدة، والزر الأخضر على المنفذ 3 يقدّمها 5 دقائق، أي بمقدار بكسل واحد لعقرب الدقائق.

الوقت رقم واحد، لذا فإن ضبطه يعني إضافة ثوانٍ. احتفظ بما أضافه الزران في متغير وأدرجه في المجموع:

unsigned long adjust = 0;   // الثواني التي تضيفها الأزرار

unsigned long now = startTime + adjust + millis() / 1000;

الساعة تساوي 3600 ثانية، و5 دقائق تساوي 300 ثانية. احتسب كل ضغطة مرة واحدة، عند ضغط الزر: LOW الآن وHIGH في المرة السابقة. إن أضفت الوقت في كل دورة ما دام الزر مضغوطًا، فستدور الساعة بسرعة. هذه الأزرار لا ترتد.

int hourState = digitalRead(hourButton);
if (hourState == LOW && lastHour == HIGH) {
  adjust = adjust + 3600;
}
lastHour = hourState;

يُشتق كل عقرب من now، لذا تتحرك كلها معًا، وتعيد البواقي الساعات إلى البداية بعد 11 والدقائق بعد 55.

challenge icon

التحدي

متوسط

اجعل ضبط الوقت ممكنًا:

  • الدبوسان 2 و3 مضبوطَان على INPUT_PULLUP
  • تضيف الضغطة على الدبوس 2 مقدار 3600 ثانية، وتضيف الضغطة على الدبوس 3 مقدار 300 ثانية، مع احتساب كل ضغطة مرة واحدة عند الضغط على الزر
  • أضف هذه الثواني إلى now

اضغط على تشغيل واضبط الساعة على وقتك، ثم اضغط على تحقّق.

جرّب بنفسك

#include <Adafruit_NeoPixel.h>

const int ringPin = 6;
const int pixelCount = 12;
Adafruit_NeoPixel ring(pixelCount, ringPin, NEO_GRB + NEO_KHZ800);

// الوقت الذي تبدأ عنده الساعة، بالثواني منذ منتصف الليل: 10:24:50
const unsigned long startTime = 10 * 3600UL + 24 * 60 + 50;

void setup() {
  ring.begin();
}

void loop() {
  unsigned long now = startTime + millis() / 1000;  // الوقت من اليوم، بالثواني
  int seconds = now % 60;
  int minutes = (now / 60) % 60;
  int hours = (now / 3600) % 12;

  int secondPixel = seconds / 5;
  int minutePixel = minutes / 5;
  int hourPixel = hours;

  // يحصل كل بكسل على اللون الأحمر من عقرب الساعات، والأخضر من عقرب الدقائق
  // والأزرق من عقرب الثواني، لذا تمتزج ألوان العقارب عندما تقع على بكسل واحد.
  for (int i = 0; i < pixelCount; i++) {
    int r = 0;
    int g = 0;
    int b = 0;
    if (i == hourPixel) {
      r = 255;
    }
    if (i == minutePixel) {
      g = 255;
    }
    if (i == secondPixel) {
      b = 255;
    }
    ring.setPixelColor(i, ring.Color(r, g, b));
  }
  ring.show();
  delay(100);  // أعِد الرسم عشر مرات في الثانية
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس المشاريع

تدرّب بنفسك: Playground لـ Arduino