Menu
CoddyTech

שעון 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

לחץ על 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);  // לצייר מחדש עשר פעמים בשנייה
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה פרויקטים

תרגלו בעצמכם: Arduino אונליין