שעון 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
לחץ על Run וכוון את השעון לשעה שלך, ואז לחץ על Check.
נסו בעצמכם
#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); // לצייר מחדש עשר פעמים בשנייה
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה פרויקטים
6שעון NeoPixel
שעון NeoPixel: שניותשעון NeoPixel: דקותשעון NeoPixel: שילוב המחוגיםשעון NeoPixel: קביעת השעהתרגלו בעצמכם: Arduino אונליין