[מדריך וידאו משולב] פיענוח שלט של מזגן, ושליטה במזגן בעזרת ארדואינו. (משוחזר)

היי זהו פוסט משוחזר שמת יחד עם הפורום Makers.co.il, אבל הנה הוא חזר 🙂

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

המדריך מורכב וטקסט שהועתק מנושא אחר שבו רשמתי את המקור http://www.makers.co.il/mfs/showthread.php?t=2722
וגם סרטון וידאו באורך 38 דקות ביוטיוב, הוא דיי משעמם אז תראו רק אם זה באמת מעניין אתכם.

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

הקדמה:
תקשורת IR בין שלט לבין מכשיר כלשהו מתבצעת עם פולסים בתדר 38Khz בתזמונים שונים ובאורכים שונים
למה 38Khz ? כדי שלא כל דבר שפולט IR יפריע לתקשורת כמו אור שמש, אש, נורת להט רגילה וכו…

הבעיה:
טלויזיה,סטריאו, מגבר, YES, HOT, תבל, ערוצי זהב, עידן+, עידן- הצלחנו,מה הבעיה במזגן? למה זה לא עובד?
ובכן מזגן פועל קצת שונה.
כשאתם לוחצים בשלט להדליק טלויזיה הוא שולח רצף פולסים שאומרים לה להידלק, מחרוזת באורך 30-70 פולסים בערך
כשאתם לוחצים להדליק מזגן, בגלל שיש לו שלט "חכם" שמראה לכם על המסך את כל ההגדרות, בכל לחיצה הוא שולח כמות אסורונומית של מידע: תדליק/תכבה, מצב חום, מאוורר אוטומטי, טמפרטורה 30 מעלות, מדף זז,IFEEL מכובה,SMART דלוק,תכין קפה,קר לי.סוף.
ומיד אחרי זה להעלות מעלה אחת הוא שולח: אל תדליק/תכבה, מצב חום, מאוורר אוטומטי, טמפרטורה 31 מעלות, מדף זז,IFEEL מכובה,SMART דלוק,תכין קפה,קר לי.סוף.
וגם כשאתם מכבים הוא שולח הכל בכל מקרה!
רק יש הבדל קטן בין סוגי מזגנים ושלטים – יש שלטים שמתכבים ברגע שמכבים את המזגן ונגלקים ברגע שמדליקים, לשלטים אלא יש קוד נפרד לכיבוי והדלקה.
שלטים שדלוקים תמיד יש להם את אותו הקוד לכיבוי והדלקה, הם כל פעם שולחים TOGGLE מתי שאתם רוצים להגליק או לכבות .. ומבצע בהתאם למצב המזגן.
וזה יוצא מחרוזות באורך 150-250 פולסים.. ומפה זה מסתבך.
כי בטח ניסיתם עם ספריית IRemote לקלוט קוד ולשדר אותו בחזרה ושום דבר לא עבד, הסיבה היא שהספרייה מוגבלת למחרוזות באורך 100 בלבד אז מלא מידע נחוץ פשוט לא נשלח..
מה עושים?

מתחילים, צ'ק ליסט:

  • יש לנו מקלט IR 38Khz מחובר לארדואינו (הם פועלים על 5V וחיבור פשוט ביותר כאשר VCC ו GND מתחברים למתח וOUT של המקלט מתחבר ל פין 2 בארדואינו במקרה שלנו- תבדקו מול DATASHEET שאתם מחברים נכון … אם לא תחברו נכון הלך המקלט  )
  • יש לנו לד IR שמחובר לפין 3 – ואני ארחיב טיפה לד IR פועל על 1.5V כן שמעתם נכון .. ווזולל 50מיליאמפר בכל יריה. כך שלא מומלץ לחבר אותו ישירות לפין דיגיטלי עם נגד כי איך שאנחנו יודעים הפנים בארדואינו יודעים רק 40mA, אפשר לחבר עם נגד גדול יותר ולהגביל את הזרם בשביל לספק בטיחות לארדואינו אבל אנחנו מאבדים המון טווח ככה וזה לא מה שאנחנו רוצים. מה עושים? מחברים דרך טרנזיסטור – מפין 3 דרך נגד 1K לBASE של טרנזיסטור גנרי (2N2222 לדוגמא) Emitter לGND דרך נגד 75 אוהם וCollector לרגל מינוס של הלד, רגל פלוס של הלד ל 5V.
    לגבי הנגד זה בעצם 70 אבל 75 הכי קרוב… ממליצים לנו נגד של 1/2 וואט אבל בדלל שהוא לא ידלק קבוע וירה פולסים בלבד.. אני מניח הנחה לא נכונה שיספיק גם רבע ואט (שזה הרגילים) – אפשר לעלות ל 100/82 אוהם אם אין לכם 75 אבל חס וחלילה לא לרדת מתחת … (100 אוהם יגביל אותנו ל35 mA ו82 אוהם ל42) ראו שרטוט
  • ספריית IRemote שתאפשר לנו לשלוח את הקוד שאנחנו רוצים בתדר 38Khz שזאת השפה שבה מדברים שלטים – אפשר להוריד מכאן https://github.com/shirriff/Arduino-IRremot

מקור הבעיה והפתרון:
מצאתי בקוד של IRemote את ההגבלה ל 100 תווים .. היא נמצאת בקובץ IRemote.h שורה 122 – אבל כששיניתי את הערך ל150/200/250 – שומדבר לא השתנה.

קוד:

#define RAWBUF 100

אז עזבתי את זה והשתמשתי בקוד קצת אחר, הרכבתי אותו מחלקי קוד שונים ויצא משהוא שאפילו לא משתמש בספרייה:

קוד להקלטת פקודות IR בשביל IRemote שמוגבל ל600 תווים: http://pastebin.com/6h8TunBx

קוד זה ידאג להגיד לנו בדיוק מה המחרוזת ללא הגבלה ל100 וגם ללא הגבלת מינימום כלשהי (בעצם ל 600 תווים 

)
לחיצה קצרה על השלט ולחכות .. תזכרו השלט שולח מעל 200 פולסים וזה לוקח זמן ולארדואינו גם יקח זמן לקלוט את כולו, תוך 1-2 שניות נקבל את הדבר הבא בסריאל מוניטור (לחצן הדלקה במזגן שלי):

קוד:

unsigned int raw[344] = {8780, 4440, 540, 1680, 540, 1680, 580, 540, 580, 540, 540, 580, 540, 580, 540, 580, 560, 1660, 540, 580, 540, 1680, 540, 1680, 540, 580, 540, 580, 560, 560, 540, 580, 560, 560, 580, 540, 560, 560, 560, 1660, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 540, 580, 560, 560, 540, 580, 540, 580, 540, 580, 540, 580, 540, 580, 540, 580, 540, 560, 560, 580, 540, 580, 540, 580, 540, 560, 560, 560, 560, 560, 560, 560, 560, 560, 540, 580, 7800, 580, 1660, 560, 560, 560, 1660, 560, 540, 580, 1640, 580, 540, 580, 540, 580, 1660, 560, 1660, 560, 1660, 560, 560, 560, 560, 560, 1660, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 540, 580, 540, 580, 560, 560, 540, 580, 540, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 580, 540, 580, 540, 560, 560, 560, 560, 540, 580, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 540, 580, 540, 560, 560, 560, 560, 560, 560, 560, 1660, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 1660, 560, 7820, 560, 560, 560, 560, 560, 560, 560, 560, 540, 560, 560, 560, 560, 560, 560, 560, 580, 1640, 580, 540, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 540, 580, 580, 540, 580, 540, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 540, 580, 540, 580, 540, 580, 540, 580, 540, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 580, 540, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 1660, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 540, 580, };
irsend.sendRaw(raw,344,38);

המון מספריםת יותר נכון 344!
אבל מה קיבלנו? קיבלנו קוד, שהוא בעצם תזמונים של הדלקה וכיבוי הלד IR במיקרו שניות, הקוד ישחזר בדיוק את כל ההגדרות שהיו בשלט וברגע שתשלחו את הקוד מהארדואינו פעם אחת תדליק אותו עם אותן ההגדרות ופעם שניה תכבה וכך הלאה.
אם תקליטו את הקוד כאשר אתם לוחצים +1 במעלות ויש 25 מעלות על השלט כל פעם שתשלחו את הקוד הוא לא ידליק ויכבה את המזגן, אבל אם הוא דלוק, הוא ישים אותו במצב 25 מעלות עם כל ההגדרות שהיו בשלט, כל פעם אותו הדבר.

שליחת קוד ה-IR:
לוקחים את החלק הראשון שקיבלנו שזאת הגדרה של מערך INT בראש הקוד
וכשרוצים לשלוח משתמשים בפקודה שבסוף
לדוגמא:

שליחת קוד IR בעזרת IRemote לדוגמא:http://pastebin.com/uP2maQLG

וזה ישלח לנו את הקוד כל פעם אחת בלבד בכל RESET של הארדואינו.

פחות צורם בעיניים:
אם נתבונן בכל המספרים האלה נראה שאין שם כל כך הרבה מגוון, יש שם 8780,4440 בהתחלה וכל השאר זה 580,560,540 וגם 1680,1660,1640 ועוד 7280 טועה שם איפושהוא בשליש דרך.
נגלה לכם סוד ונגיד שכל מה שקרוב אחד לשני בטווח 100-200us זה אותו הדבר,
כלומר 540,560,580 זה הכל אותו אורך ומעכשיו נקרא לו 560 …
ו 1680,1660,1640 זה הכל 1660
שני המספרים בהתחלה מייצגים את תחילת הקוד שמה שקולט את זה יבין שהוא מקשיב מההתחלה.
והמספר 7280 הוא סוג של מציין דרך, גם שם בשביל לשמור על הסדר..

אז העיקר שיש לנו זה 560 ו 1660 וזה כמו 0 ו 1 בבינארית .. HIGH ו LOW

נשבצר את הקוד שלנו קצת כדי לפשט את העניין נבקש להדפיס כל מה מעל ל7000 בתור 3
4000-5000 בתור 2
1000-2000 בתור 1
0-1000 בתור 0

קוד להקלטת פקודות בפורמט "בינארי":http://pastebin.com/WBnLk3uL

נלחץ על אותו הכפתור ונקבל

קוד:

Ready to decode IR!
3, 2, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

שעם זה כבר אפשר לעבוד …

ניתוח ופיענוח:
הקלטתי קודים ושמתי אותם בקובץ CSV (קובץ אקסל בסיסי ביותר שכל שורה היא שורה וכל עמודה מופרדת בפסיק)
אם מדביקים מה סריאל מוניתור ישר בקובץ עם NOTEPAD ואחרי זה פותחים עם אקסל זה עושה את הקסם.

בעזרת פורמטינג מבקשים ממנו שיצבע לנו את 0,1,2,3 בצבעים שונים
מחפשים מה השתנה, מה לא השתנה ומה פעם ככה פעם ככה, מה שהשתנה סימנתי את העמודה בצבע מסויים (באותו הצבע של התיאור) ואת מה שלא עושה שם היגיון צבעתי באדום ולא אתייחס אליו (בגלל זה גם הקלטתי את הטמפרטורות פעמיים ככה רואים יותר טוב דברים לא הגיוניים.)
עמודה שכבר סומנה בצבע מסויים לא אתייחס איליה בעתיד כשאחפש מה משתנה בפונקציות אחרות של השלט
בסופו של דבר כל מה שלא משתנה כלל סימנתי באפור וזה הולך להיות קוד הבסיס שלנו שבו פשוט נציב 1 |(או 1660 לדיוק במקרה שלי)במקומות הנכונים כדי לכופף אותו לצרכינו.
בסוף הקוד זה נראה כאלילו יש 2 חלקים שחוזרים על עצמם .. כמו סוג של Checksum .. וכאן כבר נכנסת בדיקה וטעייה כדי לבדוק מה מו מי. (פרטים בוידאו)

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

קוד סופי לשליטה על מזגן Breeze לארדואינו דרך ממשק סריאלי: http://pastebin.com/qJHbTuWJ

משחזר …

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

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

אבל הנה אני מתחיל לשחזר והקונטנט חוזר. נתראה בסיבוב.