ההבדל בין הגברים לילדים הוא מחיר הצעצועים שלהם. :)

× נושאים רבים בתחום הטיסנאות חופפים לרובוטיקה, פורום הרובוטיקה שלנו הוא המקום לדון בהם. סרוואים יעודיים לרובוטים, ארדואינו, תכנות, אלקטרוניקה ועשה זאת בעצמך.

שעון בארדואינו

19 יונ 2017 20:06 #1 מאת elhai
שעון בארדואינו נוצר על ידי elhai
אני מנסה לעשות שעון כמו שעון שבת בארדואינו (לא מתנתק ממקור מתח)
אבל אין לי רכיב חיצוני ואני גם לא רוצה אני מעדיף כמה שיותר קטן
הבנתי שאפשר אבל אני לא מצליח בשום דרך

Please התחברות או צור חשבון to join the conversation.

יותר
19 יונ 2017 20:16 #2 מאת IziG
תגובה מIziG בדיון שעון בארדואינו
ארדואינו חייב לקבל את השעה ממקור חיצוני. ישנן כמה אפשרויות:
  • RTC - Real Time Clock שהוא רכיב חיצוני שכולל סוללה ומשמש כשעון
  • NTP - Network Time Protocol הוא פרוטוקול רשת שמתחבר לשעונים אטומיים באינטרנט ומקבל מהם את השעה
  • הגדרה ידנית של השעה, לא מושלם אבל מספיק כדי לשמש כשעון שבת

ארדואינו שיהיה מחובר באופן קבוע למקור חשמל, יכול לעבוד כשעון שבת. צריך לזכור שזה לא יהיה מדוייק לחלוטין ואם הזמן יהיה צורך לכוון אותו מחדש. כלומר צריך לאפשר בקוד הגדרה של השעה תוך כדי עבודה.

אם הארדואינו נתקע צריך גם כן להגדיר מחדש את השעה. זה קורה לא מעט עם ארדואינו סיניים זולים ועלול לקרות גם עם ארדואינו שרץ עליו קוד בעייתי.

Please התחברות או צור חשבון to join the conversation.

יותר
19 יונ 2017 20:23 #3 מאת elhai
תגובה מelhai בדיון שעון בארדואינו
א

IziG wrote: ארדואינו חייב לקבל את השעה ממקור חיצוני. ישנן כמה אפשרויות:

  • RTC - Real Time Clock שהוא רכיב חיצוני שכולל סוללה ומשמש כשעון
  • NTP - Network Time Protocol הוא פרוטוקול רשת שמתחבר לשעונים אטומיים באינטרנט ומקבל מהם את השעה
  • הגדרה ידנית של השעה, לא מושלם אבל מספיק כדי לשמש כשעון שבת

ארדואינו שיהיה מחובר באופן קבוע למקור חשמל, יכול לעבוד כשעון שבת. צריך לזכור שזה לא יהיה מדוייק לחלוטין ואם הזמן יהיה צורך לכוון אותו מחדש. כלומר צריך לאפשר בקוד הגדרה של השעה תוך כדי עבודה.

אם הארדואינו נתקע צריך גם כן להגדיר מחדש את השעה. זה קורה לא מעט עם ארדואינו סיניים זולים ועלול לקרות גם עם ארדואינו שרץ עליו קוד בעייתי.


אוקי ואיך אני עושה את זה?
אני לא צריך גם משהו מדוייק אני מדבר על שעות לא דקות או שניות שיהיה בלילה ולא ביום

Please התחברות או צור חשבון to join the conversation.

יותר
19 יונ 2017 20:36 #4 מאת IziG
תגובה מIziG בדיון שעון בארדואינו
התחלת לכתוב את הקוד? אתה יכול להעלות אותו?
האם כל מה שהארדואינו צריך לעשות הוא להפעיל מכשיר בשעה מסויימת ולכבות אותו לאחר פרק זמן מסויים שאתה מגדיר?

מה אתה אמור להפעיל? כלומר האם הוא צרכן זרם רציני כמו מנורה או מכשיר אחר?

כתיבת קוד לטיימר זו מסימה פשוטה, תוסיף לא אפשרות להוסיף שעה או להוריד שעה על ידי כניסות נוספות בארדואינו ובזה נגמר הסיפור.

Please התחברות או צור חשבון to join the conversation.

יותר
19 יונ 2017 20:55 - 19 יונ 2017 21:13 #5 מאת elhai
תגובה מelhai בדיון שעון בארדואינו

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);
}
עריכה אחרונה:19 יונ 2017 21:13 ע"י elhai.

Please התחברות או צור חשבון to join the conversation.

יותר
19 יונ 2017 21:14 #6 מאת IziG
תגובה מIziG בדיון שעון בארדואינו
מה הכוונה למצא את הקוד? אתה כותב את הקוד לפי הדרישות, החיבורים והרכיבים שאתה מתכנן.

בכל מקרה אתה לא יכול לשלוף קוד מארדואינו אחרי שהעלית אותו.
אתה צריך את המקור שנכתב בשפה שאפשר לקרא. על הארדואינו יש קובץ בינארי שאתה לא יכול להבין ממנו מה משמעות התוכנית.

אחרי שאתה מחליט מה הארדואינו יפעיל, באילו חיבורים על הארדואינו תשתמש להפעלה ואיזה כניסות ישמשו לדוגמה לכיוון של השעות, רק אז אתה מתחיל לכתוב את הקוד ולבדוק אותו על הארדואינו שלך.

Please התחברות או צור חשבון to join the conversation.

יותר
19 יונ 2017 23:56 #7 מאת elhai
תגובה מelhai בדיון שעון בארדואינו

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.

יותר
20 יונ 2017 00:22 #8 מאת IziG
תגובה מIziG בדיון שעון בארדואינו
רק לוודא שאני מבין נכון, הקוד מזהה את כמות האור, וכשמחשיך הוא מדליק לד ומדפיס את הערך של רמת התאורה?

עכשיו אתה רוצה שהקוד הזה ירוץ רק בלילה? כלומר גם אם מסיבה כל שהיא רמת התאורה בבוקר נמוכה, נניח יום מעונן, הלד לא ידלק?

אתה יכול להשתמש בפונקציית millis שסופרת אלפיות שניה מהרגע שהארדואינו נדלק.

רעיון שעוד צריך לחשוב עליו: שמור את הערך במשתנה עם אפשרות להגדיל את המשתנה או להקטין אותו על ידי זוג לחצנים שיהיו מחוברים נניח לכניסות אנלוגיות על הארדואינו. אתה מקטין או מגדיל ב-1000x60x60 שזה שווה הערך לשעה.

אני אחפש בבוקר סיפרייה מתאימה או קטע קוד מוכן שידמה שעון שלא תלוי בגורם חיצוני.

Please התחברות או צור חשבון to join the conversation.

יותר
20 יונ 2017 17:09 #9 מאת IziG
תגובה מIziG בדיון שעון בארדואינו
הרעיון שאני חושב עליו הוא להריץ לולאה עם תנאי שבודק כמה שעות הלד צריך לדלוק. כשמסתיים הזמן נכנס ל-Delay של 24 שעות פחות הזמן שצריך לרוץ. (ברור שזה לא הדבר היעיל ביותר אבל אפשר לבנות Delay מבוסס millis שבו הארדואינו יכול לבצע גם דברים אחרים.)

עד כאן זה ברור ופשוט, החלק הטריקי הוא כיצד להגדיר לארדואינו מה השעה שבה הוא נדלק? מה שחשבתי הוא שבמקום שעה, תעביר לארדואינו את הזמן שבו הוא צריך להפעיל את הלד פעם ראשונה.

הדוגמה הזו יכולה לעזור: נניח שאתה רוצה לד שדולק (לפי כמות האור כמובן) משעה 20:00 עד שעה 06:00 בבוקר, כלומר 10 שעות.
הדלקת את הארדואינו בשעה 16:00, כלומר צריך להעביר פרמטר של 4 שעות.
מה דעתך להשתמש בכניסות הדיגיטליות 5 עד 9 ולהעביר את המספר באופן בינארי? פשוט על ידי ג'ימפור נכון של הכניסות?

מכאן התוכנית תרוץ בלופ פשוט של הדלקה וכיבוי כל 10 שעות / 14 שעות כבוי.

Please התחברות או צור חשבון to join the conversation.

יותר
20 יונ 2017 17:12 #10 מאת IziG
תגובה מIziG בדיון שעון בארדואינו
התחלתי להשתעשע טיפה עם קוד שיתחיל לתת לך את הבסיס (סלח לי אם הוא ברמה של כיתה ג', אבל זה צריך להספיק להתחלה.)
אם הרעיון מוצא חן בעינייך, אפשר להמשיך לתוכנית שעובדת. חיפשתי דרך לבצע את מה שביקשת בלי אף רכיב חיצוני מלבד חמישה ג'מפרים:
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.

יותר
21 יונ 2017 13:46 #11 מאת elhai
תגובה מelhai בדיון שעון בארדואינו

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.

יותר
21 יונ 2017 20:15 #12 מאת IziG
תגובה מIziG בדיון שעון בארדואינו
אני אחלק את ההסבר לחלקים שאותם צריך לממש. מה שכתבתי הוא טיוטה התחלתית.

חלק ראשון:
אנחנו צריכים לספור כמה זמן עבר בין השלבים. 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.

יותר
21 יונ 2017 20:24 #13 מאת IziG
תגובה מIziG בדיון שעון בארדואינו
אתה יכול לקרא על הפונקציות שאני מציע להשתמש כאן בקישורים הבאים:
- פונקציית millis שמחזירה את הזמן במילי שניות מרגע הדלקת לוח ארדואינו
- פונקציית bitshift ש"מזיזה" ביטים במשתנה ימינה או שמאלה בהתאם לחצים

Please התחברות או צור חשבון to join the conversation.

יותר
25 יונ 2017 13:53 #14 מאת elhai
תגובה מelhai בדיון שעון בארדואינו

IziG wrote: אתה יכול לקרא על הפונקציות שאני מציע להשתמש כאן בקישורים הבאים:
- פונקציית millis שמחזירה את הזמן במילי שניות מרגע הדלקת לוח ארדואינו
- פונקציית bitshift ש"מזיזה" ביטים במשתנה ימינה או שמאלה בהתאם לחצים


בלי קשר לעניין השעון אתה יודע למה שאני מנתק את הארדואינו מהמחשב הוא לא נשמר עם הקוד (הקוד הקודם)

Please התחברות או צור חשבון to join the conversation.

יותר
25 יונ 2017 13:56 #15 מאת IziG
תגובה מIziG בדיון שעון בארדואינו
דבר ראשון, הכנתי לך התחלה של שעון פשוט שמכוון על ידי הכניסות הדיגיטליות (אל תתייחס לסמיילי שהפורום החליט להוסיף).
לא הייתי בטוח שזה עדיין מעניין אותך אז לא עדכנתי את הפוסט.

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(8);
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.

יותר
מפקחים: IziGShmulik
זמן ליצירת דף: 0.074 שניות
Powered by פורום קוננה
joomla wellnessLorem Ipsum has been the industry's standard dummy text ever since the 1500s...