חיישן למדידת טמפרטורה בעומק קיר – חלק א’

רוצה להיות הראשון?
טכנולוגיה מתקדמת

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

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

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

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

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

תכנון המערכת

כל יחידה תהיה מורכבת מיחידת בקרה (אני בחרתי לעבוד עם NodeMCU – רכיב חומרה תואם Arduino עם רכיב WiFi מובנה – תכונה שגרמה לי לבחור דווקא בו), אליה יחוברו מספר חיישני טמרפטורה DS18B20, מהסוג האטום למים.

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

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

אז מה צריך כדי להקים יחידה?

  • nodeMCU
  • מספר חיישני DS18B20 (אמרנו מינימום 3).
  • נגד של 4.7k~ (אני משתמש בנגד שקול של 5K, משני נגדים של 10K במקביל וזה עובד יופי, לפחות כרגע).

תרשים סכמטי של הפינים הזמינים בNodeMCU: https://github.com/lvidarte/esp8266/wiki/NodeMCU

השוואת גודל בין בקרים דומים

השוואת גודל בין בקרים דומים. במקור מ: https://github.com/lvidarte/esp8266/wiki/NodeMCU

חיישן טמפרטורה ds18b20 עמיד במים

חיישן טמפרטורה ds18b20 עמיד במים

התקנות והרכבת המעגל

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

לתוכן זה נכתבה תגובה אחת

עליך להתחבר כדי לבצע פעולה זו...

הצטרפות

דילוג לתוכן