ساعة 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.
التحدي
متوسطاجعل ضبط الوقت ممكنًا:
- الدبوسان 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); // أعِد الرسم عشر مرات في الثانية
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المشاريع
3مستشعر ركن السيارة
مستشعر ركن السيارة: المسافةمستشعر ركن السيارة: الأضواءمستشعر ركن السيارة: التنبيهات الصوتيةمستشعر ركن السيارة: الشاشة6ساعة NeoPixel
ساعة NeoPixel: الثوانيساعة NeoPixel: الدقائقساعة NeoPixel: مزج العقاربساعة NeoPixel: ضبط الوقتتدرّب بنفسك: Playground لـ Arduino