- הודעות 32
- תודות התקבלו: 0
שעון בארדואינו
- RTC - Real Time Clock שהוא רכיב חיצוני שכולל סוללה ומשמש כשעון
- NTP - Network Time Protocol הוא פרוטוקול רשת שמתחבר לשעונים אטומיים באינטרנט ומקבל מהם את השעה
- הגדרה ידנית של השעה, לא מושלם אבל מספיק כדי לשמש כשעון שבת
ארדואינו שיהיה מחובר באופן קבוע למקור חשמל, יכול לעבוד כשעון שבת. צריך לזכור שזה לא יהיה מדוייק לחלוטין ואם הזמן יהיה צורך לכוון אותו מחדש. כלומר צריך לאפשר בקוד הגדרה של השעה תוך כדי עבודה.
אם הארדואינו נתקע צריך גם כן להגדיר מחדש את השעה. זה קורה לא מעט עם ארדואינו סיניים זולים ועלול לקרות גם עם ארדואינו שרץ עליו קוד בעייתי.
Please התחברות או צור חשבון to join the conversation.
IziG wrote: ארדואינו חייב לקבל את השעה ממקור חיצוני. ישנן כמה אפשרויות:
- RTC - Real Time Clock שהוא רכיב חיצוני שכולל סוללה ומשמש כשעון
- NTP - Network Time Protocol הוא פרוטוקול רשת שמתחבר לשעונים אטומיים באינטרנט ומקבל מהם את השעה
- הגדרה ידנית של השעה, לא מושלם אבל מספיק כדי לשמש כשעון שבת
ארדואינו שיהיה מחובר באופן קבוע למקור חשמל, יכול לעבוד כשעון שבת. צריך לזכור שזה לא יהיה מדוייק לחלוטין ואם הזמן יהיה צורך לכוון אותו מחדש. כלומר צריך לאפשר בקוד הגדרה של השעה תוך כדי עבודה.
אם הארדואינו נתקע צריך גם כן להגדיר מחדש את השעה. זה קורה לא מעט עם ארדואינו סיניים זולים ועלול לקרות גם עם ארדואינו שרץ עליו קוד בעייתי.
אוקי ואיך אני עושה את זה?
אני לא צריך גם משהו מדוייק אני מדבר על שעות לא דקות או שניות שיהיה בלילה ולא ביום
Please התחברות או צור חשבון to join the conversation.
האם כל מה שהארדואינו צריך לעשות הוא להפעיל מכשיר בשעה מסויימת ולכבות אותו לאחר פרק זמן מסויים שאתה מגדיר?
מה אתה אמור להפעיל? כלומר האם הוא צרכן זרם רציני כמו מנורה או מכשיר אחר?
כתיבת קוד לטיימר זו מסימה פשוטה, תוסיף לא אפשרות להוסיף שעה או להוריד שעה על ידי כניסות נוספות בארדואינו ובזה נגמר הסיפור.
Please התחברות או צור חשבון to join the conversation.
זה הקודIziG wrote: התחלת לכתוב את הקוד? אתה יכול להעלות אותו?
האם כל מה שהארדואינו צריך לעשות הוא להפעיל מכשיר בשעה מסויימת ולכבות אותו לאחר פרק זמן מסויים שאתה מגדיר?
מה אתה אמור להפעיל? כלומר האם הוא צרכן זרם רציני כמו מנורה או מכשיר אחר?
כתיבת קוד לטיימר זו מסימה פשוטה, תוסיף לא אפשרות להוסיף שעה או להוריד שעה על ידי כניסות נוספות בארדואינו ובזה נגמר הסיפור.
אני רוצה שהוא יעבור בשעות מסויימות הוא מדליק כמה לדים
int ldrPin = A0;
int ledPin = 12;
void setup(){
pinMode(ldrPin, INPUT);
Serial.begin(9600);
Serial.println("Welcome");
}
void loop() {
int ldrValue=0;
ldrValue = analogRead(ldrPin);
if(ldrValue < 500){
digitalWrite(ledPin,HIGH);
}
else{
digitalWrite(ledPin,LOW);
}
Serial.print("ldrValue = ");
Serial.println(ldrValue);
delay(500);
}
Please התחברות או צור חשבון to join the conversation.
בכל מקרה אתה לא יכול לשלוף קוד מארדואינו אחרי שהעלית אותו.
אתה צריך את המקור שנכתב בשפה שאפשר לקרא. על הארדואינו יש קובץ בינארי שאתה לא יכול להבין ממנו מה משמעות התוכנית.
אחרי שאתה מחליט מה הארדואינו יפעיל, באילו חיבורים על הארדואינו תשתמש להפעלה ואיזה כניסות ישמשו לדוגמה לכיוון של השעות, רק אז אתה מתחיל לכתוב את הקוד ולבדוק אותו על הארדואינו שלך.
Please התחברות או צור חשבון to join the conversation.
IziG wrote: מה הכוונה למצא את הקוד? אתה כותב את הקוד לפי הדרישות, החיבורים והרכיבים שאתה מתכנן.
בכל מקרה אתה לא יכול לשלוף קוד מארדואינו אחרי שהעלית אותו.
אתה צריך את המקור שנכתב בשפה שאפשר לקרא. על הארדואינו יש קובץ בינארי שאתה לא יכול להבין ממנו מה משמעות התוכנית.
אחרי שאתה מחליט מה הארדואינו יפעיל, באילו חיבורים על הארדואינו תשתמש להפעלה ואיזה כניסות ישמשו לדוגמה לכיוון של השעות, רק אז אתה מתחיל לכתוב את הקוד ולבדוק אותו על הארדואינו שלך.
אני לא יודע אם ראית אבל ערכתי את ההודעה מזמן
int ldrPin = A0;
int ledPin = 12;
void setup(){
pinMode(ldrPin, INPUT);
Serial.begin(9600);
Serial.println("Welcome");
}
void loop() {
int ldrValue=0;
ldrValue = analogRead(ldrPin);
if(ldrValue < 500){
digitalWrite(ledPin,HIGH);
}
else{
digitalWrite(ledPin,LOW);
}
Serial.print("ldrValue = ");
Serial.println(ldrValue);
delay(500);
}
Please התחברות או צור חשבון to join the conversation.
עכשיו אתה רוצה שהקוד הזה ירוץ רק בלילה? כלומר גם אם מסיבה כל שהיא רמת התאורה בבוקר נמוכה, נניח יום מעונן, הלד לא ידלק?
אתה יכול להשתמש בפונקציית millis שסופרת אלפיות שניה מהרגע שהארדואינו נדלק.
רעיון שעוד צריך לחשוב עליו: שמור את הערך במשתנה עם אפשרות להגדיל את המשתנה או להקטין אותו על ידי זוג לחצנים שיהיו מחוברים נניח לכניסות אנלוגיות על הארדואינו. אתה מקטין או מגדיל ב-1000x60x60 שזה שווה הערך לשעה.
אני אחפש בבוקר סיפרייה מתאימה או קטע קוד מוכן שידמה שעון שלא תלוי בגורם חיצוני.
Please התחברות או צור חשבון to join the conversation.
עד כאן זה ברור ופשוט, החלק הטריקי הוא כיצד להגדיר לארדואינו מה השעה שבה הוא נדלק? מה שחשבתי הוא שבמקום שעה, תעביר לארדואינו את הזמן שבו הוא צריך להפעיל את הלד פעם ראשונה.
הדוגמה הזו יכולה לעזור: נניח שאתה רוצה לד שדולק (לפי כמות האור כמובן) משעה 20:00 עד שעה 06:00 בבוקר, כלומר 10 שעות.
הדלקת את הארדואינו בשעה 16:00, כלומר צריך להעביר פרמטר של 4 שעות.
מה דעתך להשתמש בכניסות הדיגיטליות 5 עד 9 ולהעביר את המספר באופן בינארי? פשוט על ידי ג'ימפור נכון של הכניסות?
מכאן התוכנית תרוץ בלופ פשוט של הדלקה וכיבוי כל 10 שעות / 14 שעות כבוי.
Please התחברות או צור חשבון to join the conversation.
אם הרעיון מוצא חן בעינייך, אפשר להמשיך לתוכנית שעובדת. חיפשתי דרך לבצע את מה שביקשת בלי אף רכיב חיצוני מלבד חמישה ג'מפרים:
unsigned long time;
int when_to_start;
int bin_inputs;
byte pins[] = {5, 6, 7, 8, 9};
int run_for_X_hours = 10; //the amount of hour our function will run. Example of 10 hours
int ldrPin = A0;
int ledPin = 12;
void setup(){
pinMode(ldrPin, INPUT);
Serial.begin(9600);
Serial.println("Welcome");
/* Setup pins as INPUT */
for(int i = 5; i < 10 ; i++) {
pinMode(pins[i], INPUT);
}
pinMode(button, INPUT);
int bin_inputs = D5 & (D6 << 1) & (D7 << 2) & (D8 << 3) & (D9 << 4)
when_to_start =
}
void loop() {
// Waiting for the tirst itteration
delay(when_to_start);
int ldrValue=0;
ldrValue = analogRead(ldrPin);
if(ldrValue < 500){
digitalWrite(ledPin,HIGH);
}
else{
digitalWrite(ledPin,LOW);
}
Serial.print("ldrValue = ");
Serial.println(ldrValue);
delay(500);
}
Please התחברות או צור חשבון to join the conversation.
IziG wrote: התחלתי להשתעשע טיפה עם קוד שיתחיל לתת לך את הבסיס (סלח לי אם הוא ברמה של כיתה ג', אבל זה צריך להספיק להתחלה.)
אם הרעיון מוצא חן בעינייך, אפשר להמשיך לתוכנית שעובדת. חיפשתי דרך לבצע את מה שביקשת בלי אף רכיב חיצוני מלבד חמישה ג'מפרים:
unsigned long time; int when_to_start; int bin_inputs; byte pins[] = {5, 6, 7, 8, 9}; int run_for_X_hours = 10; //the amount of hour our function will run. Example of 10 hours int ldrPin = A0; int ledPin = 12; void setup(){ pinMode(ldrPin, INPUT); Serial.begin(9600); Serial.println("Welcome"); /* Setup pins as INPUT */ for(int i = 5; i < 10 ; i++) { pinMode(pins[i], INPUT); } pinMode(button, INPUT); int bin_inputs = D5 & (D6 << 1) & (D7 << 2) & (D8 << 3) & (D9 << 4) when_to_start = } void loop() { // Waiting for the tirst itteration delay(when_to_start); int ldrValue=0; ldrValue = analogRead(ldrPin); if(ldrValue < 500){ digitalWrite(ledPin,HIGH); } else{ digitalWrite(ledPin,LOW); } Serial.print("ldrValue = "); Serial.println(ldrValue); delay(500); }
לא יודע אם זה של כיתה ג' כי אני בעצמי לא מבין ממש
ומה הקוד הזה בדיוק עושה?
Please התחברות או צור חשבון to join the conversation.
חלק ראשון:
אנחנו צריכים לספור כמה זמן עבר בין השלבים. Delay לא מתאים היות שתוך כדי המתנה צריך להריץ פקודות אחרות.
אחת הדרכים לממש את זה היא באמצעות פונקציית millis:
unsigned long time;
time = millis();
השורה הראשונה מגדירה משתנה בשם startup_time והשורה השניה שומרת בו את זמן כדי שנוכל בכל שלב שנרצה לוודא אם עבר מספיק זמן כדי שנעבור לשלב הבא בתוכנית.
אתה מכיר את השימוש ב-millis? אם עדיין לא, נסביר בפירוט רב יותר.
חלק שני:
קבלת השעה הנוכחית או נכון יותר, בעוד כמה זמן אנחנו רוצים להפעיל את הלד בפעם הראשונה. וכיצד לבצע את זה בלי רכיב חיצוני כלשהו מלבד 5 ג'מפרים.
הרעיון הוא לחבר או לנתק את רגליים 5, 6, 7, 8 ו-9 באמצעות ג'מפרים ל-vcc. עם 5 "ביטים" אנחנו יכולים לספור עד 32, מספיק לנו 24 כדי להעביר לארדואינו יממה שלמה.
קטע הקוד הבא יגדיר את הכניסות כדיגיטליות, יקרא אותן ויכניס אותן לתוך משתנה בשם bin_input:
for(int i = 5; i < 10 ; i++) {
pinMode(pins, INPUT);
}
pinMode(button, INPUT);
int bin_inputs = D5 & (D6 << 1) & (D7 << 2) & (D8 << 3) & (D9 << 4)
אני צריך עוד לשחק עם הקוד ולוודא שהוא פועל כמו שצריך. אחר כך נמיר את המשתנה bin_input למספר השעות עד להפעלה הראשונה של הלד.
החלק השלישי:
כאן נכניס את התוכנית המקורית שלך לתוך לולאה שבודקת עם עברו מספר השעות שבו היא צריכה לאפשר ללד להדלק ואז לכבות אותו ל-24 פחות מספר השעות שהוא אמור לדלוק.
אני מקווה שזה טיפה יותר ברור.
Please התחברות או צור חשבון to join the conversation.
IziG wrote: אתה יכול לקרא על הפונקציות שאני מציע להשתמש כאן בקישורים הבאים:
- פונקציית millis שמחזירה את הזמן במילי שניות מרגע הדלקת לוח ארדואינו
- פונקציית bitshift ש"מזיזה" ביטים במשתנה ימינה או שמאלה בהתאם לחצים
בלי קשר לעניין השעון אתה יודע למה שאני מנתק את הארדואינו מהמחשב הוא לא נשמר עם הקוד (הקוד הקודם)
Please התחברות או צור חשבון to join the conversation.
לא הייתי בטוח שזה עדיין מעניין אותך אז לא עדכנתי את הפוסט.
int hours;
int minutes;
void setup() {
//start serial connection
Serial.begin(9600);
//configure pins 2-6 as an input and enable the internal pull-up resistor
for(int i=2; i<=12; i++){
pinMode(i, INPUT_PULLUP);
}
//read hours
bool sensorVal2 = !digitalRead(2);
bool sensorVal3 = !digitalRead(3);
bool sensorVal4 = !digitalRead(4);
bool sensorVal5 = !digitalRead(5);
bool sensorVal6 = !digitalRead(6);
//read minutes
bool sensorVal7 = !digitalRead(7);
bool sensorVal8 = !digitalRead(;
bool sensorVal9 = !digitalRead(9);
bool sensorVal10 = !digitalRead(10);
bool sensorVal11 = !digitalRead(11);
bool sensorVal12 = !digitalRead(12);
hours = sensorVal2 + sensorVal3 *2 + sensorVal4 *4 + sensorVal5 *8 + sensorVal6 *16;
minutes = sensorVal7 + sensorVal8 *2 + sensorVal9 *4 + sensorVal10 *8 + sensorVal11 *16 + sensorVal12 *32;
if (minutes > 59) minutes = 59;
if (hours > 23) hours = 23;
}
void loop() {
Serial.print(" ");
Serial.print(hours);
Serial.print(":");
Serial.print(minutes);
Serial.println();
}
Please התחברות או צור חשבון to join the conversation.