כחלק ממערכת שלמה שאני מתכנן ובונה שמטרתה למדוד התנהגות טרמית של מבנה, אני אפרסם כאן את ההתקדמות בפיתוח, גם בשבילכם אבל גם הרבה בשבילי – תיעוד הוא חלק בלתי נפרד מהתהליך.
על רגל אחת, הרעיון הוא לחווט את כל עומק הקירות, הרצפה והתקרה בחיישני טמפרטורה שמאפשרים למדוד את השתנות מפל הטמפרטורות לעומקו של הקיר /תקרה / רצפה,ובעצם לספר אמפירית ובמידה רבה של דיוק על ההתנהגות הטרמית של המבנה. מכיוון שמדובר במבנה גדול ובמספר רב של עמדות, בין החיישנים תתקיים תקשורת אלחוטית עם אתר אינטרנט שאוסף את המידע ומסדר אותו.
אז מלמעלה למטה, יש לנו אתר אינטרנט שאוסף את המידע (את זה כולנו מכירים ויודעים איך הוא נראה). המידע נשלח לאתר דרך רשת הWifi הביתית. זה די מובן (גם אם לא בהכרח קל לביצוע).
את יחידות החישה שמפוזרות ברחבי המבנה חילקתי לשתיים. יחידות של רצפה ותקרה שהחיישן בהם צריך להיות אטום למים, ויחידות של עומק הקיר, שימדדו גם לחות יחסית ויוכלו לתת אינפורמציה על איך הקיר מתמודד עם לחות מבפנים ומבחוץ.
במדריך זה אתייחס ליחידה של הרצפה / תקרה, בעיקר מבחינת האלקטרוניקה. על התכנון הפיזי של היחידה אדבר במדריך הבא.
תכנון המערכת
כל יחידה תהיה מורכבת מיחידת בקרה (אני בחרתי לעבוד עם NodeMCU – רכיב חומרה תואם Arduino עם רכיב WiFi מובנה – תכונה שגרמה לי לבחור דווקא בו), אליה יחוברו מספר חיישני טמרפטורה DS18B20, מהסוג האטום למים.
מכיוון שהחיישן הוא חיישן דיגיטלי, ולכל אחד מהם יש מספר ייחודי שנצרב במפעל, ניתן להבדיל ביניהם ולכן לחבר ולקרוא כמה חיישנים על אותו הקו. חיבור חיישנים בצורה כזו מאפשר לנו להניח חיישנים במרחק קבוע זה מזה וכך לבטא בפועל את מפל הטמפרטורות לאורך החתך (במקרה שלנו, לאורך הקיר).
כמות החיישנים על הקו תקבע על ידי כמות המדידות שתרצו שיהיו על החתך. באופן עקרוני, שתי נקודות היו יכולות להספיק, כי מדובר במפל הטמפטורה בחומר (בלוקם של המפ) שההתנהגות שלו היא די צפויה, והוא לא משנה את תכונותיו ביחס לטמפרטורה. עם זאת, כדי למנוע חוסר אחידות בחומר, קרבה לחלון או אנומליה אחרת, נמדוד לפחות עם שלושה חיישנים. מעבר לזה, ככל שיש יותר חיישנים על הקו, נקבל קריאה יותר מדויקת (וכמובן שנצטרך להעביר יותר מידע)
אז מה צריך כדי להקים יחידה?
- nodeMCU
- מספר חיישני DS18B20 (אמרנו מינימום 3).
- נגד של 4.7k~ (אני משתמש בנגד שקול של 5K, משני נגדים של 10K במקביל וזה עובד יופי, לפחות כרגע).
התקנות והרכבת המעגל
הערת ביניים: מה שבאמת יפה בקהילת הקוד הפתוח בכלל, וגם בסביבת Arduino, שכמות אדירה של אנשים כל הזמן עוזרים זה לזה, מנסים דברים חדשים ומתעדים את ההתקדמות שלהם ומתייעצים זה בזה וירטואלית, וכך יוצא שכמעט כל מה שתרצו לעשות, יש מישהו שניסה משהו מספיק דומה שאפשר להתחיל ממנו, וכך גם במצב שלי.
- נתחיל בהתקנת סביבת הפיתוח של אדרואינו, וארגון סביבת העבודה של nodeMCU, שדורשת התקנה של כמה ספריות בתוכנה של ארדואינו (לא אני צילמתי, אלא השתמשתי בזה ובאחרים, בדיוק כמוכם).
- בהנחה שההתקנה עברה בצורה סבירה, כל השאר מתואר בפשטות במדריך הזה כאן, כך שהרגשתי מצחיק להעתיק אותו לכאן. פשוט עובדים לפי המדריך. שימו לב שלפעמים מוצג החיישן הלא אטום למים, אבל בעיקרון זה אותו הדבר בדיוק.
גירסא ראשונית של הקוד
/********* Rui Santos Complete project details at https://RandomNerdTutorials.com *********/ #include <OneWire.h> #include <DallasTemperature.h> // Data wire is plugged TO GPIO 2 #define ONE_WIRE_BUS 2 // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs) OneWire oneWire(ONE_WIRE_BUS); // Pass our oneWire reference to Dallas Temperature. DallasTemperature sensors(&oneWire); // Number of temperature devices found int numberOfDevices; // We'll use this variable to store a found device address DeviceAddress tempDeviceAddress; void setup(){ // start serial port Serial.begin(115200); // Start up the library sensors.begin(); // Grab a count of devices on the wire numberOfDevices = sensors.getDeviceCount(); // locate devices on the bus Serial.print("Locating devices..."); Serial.print("Found "); Serial.print(numberOfDevices, DEC); Serial.println(" devices."); // Loop through each device, print out address for(int i=0;i<numberOfDevices; i++){ // Search the wire for address if(sensors.getAddress(tempDeviceAddress, i)){ Serial.print("Found device "); Serial.print(i, DEC); Serial.print(" with address: "); printAddress(tempDeviceAddress); Serial.println(); } else { Serial.print("Found ghost device at "); Serial.print(i, DEC); Serial.print(" but could not detect address. Check power and cabling"); } } } void loop(){ sensors.requestTemperatures(); // Send the command to get temperatures // Loop through each device, print out temperature data for(int i=0;i<numberOfDevices; i++){ // Search the wire for address if(sensors.getAddress(tempDeviceAddress, i)){ // Output the device ID Serial.print("Temperature for device: "); Serial.print(i,DEC); // Print the data float tempC = sensors.getTempC(tempDeviceAddress); Serial.print(": "); Serial.println(tempC); } } Serial.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "); delay(5000); } // function to print a device address void printAddress(DeviceAddress deviceAddress) { for (uint8_t i = 0; i < 8; i++){ if (deviceAddress[i] < 16) Serial.print("0"); Serial.print(deviceAddress[i], HEX); } }
הקוד הזה לא שלי, חוץ ממספר שינויים קטנים.
אחד מהקסמים בקוד הוא שעזרת הספריות השונות שכבר התקנתם (OneWire) המערכת יודעת לסנכרן לבד בין החיישנים השונים ולא הייתה זקוקה שאגדיר לה כמה חיישנים יש. היא פשוט הקשיבה וזיהתה את שלושת החיישנים במערכת הראשונית שהקמתי.
ניסיון ראשון
אחרי חיווט של שלושה חיישנים, כמו המעגל שלמעלה, רק עם חוטים ארוכים (שניים של 60 ס”מ ואחד של 3.5 מטרים), ועם הקוד מלמעלה, המעגל עובד.
כל 5 שניות המערכת מתקשרת עם כל אחד מהחיישנים ומקבלת קריאה בתור שלה.
מה בהמשך?
אתגרים להמשך:
- לדאוג שכל חיישן יש לו מקום קבוע וידוע על החתך, כדי שתמיד בכל הפעלה מחדש, למשל, החיישנים יקראו בסדר הנכון.
- לייצר קופסא מתאימה שמאפשרת גם החלפת חיישנים (יש לי רעיון איך, תוכניות לעתיד הלא רחוק)
- להכין מערכת דומה עם חיישני הgy-21 שמודדים גם לחות יחד עם הטמפרטורה.
- ללמוד לתקשר עם הnodeMCU למסד נתונים חיצוני ולשלוח לו את המידע.
לתוכן זה נכתבה תגובה אחת