חיישני טמפרטורה ולחות
הטמפרטורה היא הגודל שמודדים יותר מכל גודל אחר במערכות בקרה: בתרמוסטט בבית, בחממה, בדוד המים החמים ובתנור התעשייתי. בפרק זה נכיר את חיישני הטמפרטורה הנפוצים ואת חיישן הלחות: מה כל חיישן מודד, האם המוצא שלו תקבילי או ספרתי, מהו תחום המדידה שלו, כיצד מחברים אותו לבקר, ואת הסקיצה שקוראת אותו. בסוף נשווה ביניהם ונלמד כיצד בוחרים את החיישן המתאים.
- נחבר נגד תלוי-טמפרטורה (NTC) במחלק מתח, ונבין מדוע הערך הגולמי משתנה עם הטמפרטורה.
- נמיר את המתח של LM35 למעלות, ונשווה את הרזולוציה ב-Uno (10 סיביות) וב-ESP32 (12 סיביות).
- נחבר כמה חיישני DS18B20 להדק אחד עם נגד משיכה למעלה, ונקרא אותם בעזרת ספרייה מוכנה.
- נקרא טמפרטורה ולחות יחסית מ-DHT22 לכל היותר פעם בשתי שניות, ונבדוק קריאה כושלת.
- נכיר את העיקרון של החיישן התעשייתי PT100, ונבין מדוע במפעל קוראים אותו דרך משדר ולולאת זרם.
- נשווה בין החיישנים ונבחר את החיישן המתאים ליישום נתון.
הכירו את החיישנים:
לפני שנלמד על החיישנים אחד אחד, הנה כל החיישנים שבספר: השם, מה כל אחד מודד ומה סוג המוצא שלו. את אותו חיישן נראה שוב ליד ההגדרה שלו בפרק שעוסק בו.
נגד תלוי-טמפרטורה (NTC) (NTC Thermistor)
למודול הנפוץ במעבדה התנגדות של 10 kΩ ב-25 °C (ערך טיפוסי לפי דף הנתונים). הקשר בין ההתנגדות לטמפרטורה אינו לינארי (העקומה מימין). הבקר מודד מתח ולא התנגדות, ולכן נחבר את ה-NTC בטור עם נגד קבוע R = 10 kΩ ונקבל מחלק מתח (הסרטוט משמאל): ה-NTC למעלה, לכיוון 5 V, ולכן המתח ב-A0 עולה כשהטמפרטורה עולה.
הטבלה מראה את השרשרת כולה: הטמפרטורה עולה ← התנגדות החיישן קטנה ← המתח ב-A0 עולה ← הערך הגולמי גדל.
| T | 0 °C | 25 °C | 50 °C | 75 °C | 100 °C |
|---|---|---|---|---|---|
| RNTC | 33621 Ω | 10000 Ω | 3588 Ω | 1492 Ω | 698 Ω |
| VA0 | 1.15 V | 2.5 V | 3.68 V | 4.35 V | 4.67 V |
| N | 235 | 512 | 753 | 890 | 956 |
הסקיצה קוראת את הערך הגולמי, ממירה אותו למתח, ומדפיסה הודעת שגיאה אם הקריאה היא 0 או 1023 (תיל קטוע או קצר):
const int NTC_PIN = A0; // NTC to 5V, 10k to GND
void setup() {
Serial.begin(9600);
}
void loop() {
int n = analogRead(NTC_PIN);
float v = n * 5.0 / 1023.0; // raw value -> volts
if (n > 0 && n < 1023) { // 0 or 1023: open or short
Serial.print("N = "); Serial.print(n);
Serial.print(" V = "); Serial.print(v, 2);
Serial.println(" V");
} else {
Serial.println("NTC error");
}
delay(1000);
}N = 475 V = 2.32 V N = 510 V = 2.49 V N = 537 V = 2.62 V N = 580 V = 2.83 V
החזקנו את החיישן ביד, והערך הגולמי והמתח עלו. את ההמרה המדויקת למעלות לוקחים מהטבלה שבדף הנתונים (ההתנגדות בכל טמפרטורה) או מספרייה מוכנה; ולעיתים קרובות מספיק להשוות את הערך הגולמי לסף שנקבע בניסוי.
(א) מהו המתח ב-A0?
(ב) האם קר יותר מ-25 °C או חם יותר? היעזרו בטבלה.
חיישן הטמפרטורה LM35 (LM35)
לפי דף הנתונים (ערכים טיפוסיים): מתח ההזנה מ-4 V עד 30 V, ולכן נזין אותו ב-5 V גם כשעובדים עם ESP32; בחיבור הבסיסי הוא מודד מכ-2 °C עד 150 °C; והדיוק כ-±0.5 °C ב-25 °C בדגם המדויק ביותר. מתח המוצא ב-150 °C הוא 1.5 V בלבד, ולכן אפשר לחבר אותו ישירות להדק של ESP32.
| סימן | משמעות | יחידת מידה |
|---|---|---|
| Vout | מתח המוצא של החיישן | [mV] |
| T | הטמפרטורה | [°C] |
הסקיצה מבצעת את השרשרת כולה: הערך הגולמי ← המתח ← הטמפרטורה. את המתח בוולט כופלים ב-100, כי 10 mV לכל מעלה פירושם 100 מעלות לכל וולט.
const int LM35_PIN = A1;
const float VREF = 5.0; // Uno: 5 V reference, 10 bits
void setup() {
Serial.begin(9600);
}
void loop() {
int n = analogRead(LM35_PIN);
float v = n * VREF / 1023.0; // volts
float t = v * 100.0; // 10 mV per degree C
Serial.print("N = "); Serial.print(n);
Serial.print(" V = "); Serial.print(v * 1000.0, 1);
Serial.print(" mV T = "); Serial.print(t, 2);
Serial.println(" C");
delay(1000);
}N = 49 V = 239.5 mV T = 23.95 C N = 50 V = 244.4 mV T = 24.44 C N = 50 V = 244.4 mV T = 24.44 C N = 50 V = 244.4 mV T = 24.44 C N = 51 V = 249.3 mV T = 24.93 C N = 51 V = 249.3 mV T = 24.93 C
הטמפרטורה האמיתית עלתה לאט מ-24 °C ל-25 °C בצעדים של 0.2 °C, אבל הקריאה קופצת בקפיצות של כחצי מעלה: היא אינה משתנה עד שהמתח משתנה בצעד שלם של הממיר. את גודל הצעד הזה נחשב עכשיו.
רזולוציה: Uno מול ESP32:
לממיר של Uno יש 10 סיביות, כלומר 210 = 1024 רמות, ומתח הייחוס 5 V. לממיר של ESP32 יש 12 סיביות, כלומר 212 = 4096 רמות, ומתח הייחוס 3.3 V. השינוי הקטן ביותר במתח שהממיר מבחין בו הוא מתח הייחוס חלקי מספר הרמות; נחלק אותו ב-10 mV/°C ונקבל את השינוי הקטן ביותר בטמפרטורה:
| סימן | משמעות | יחידת מידה |
|---|---|---|
| ΔT | השינוי הקטן ביותר בטמפרטורה שהקריאה מבחינה בו | [°C] |
| Vref , n | מתח הייחוס של הממיר, ומספר הסיביות שלו | [V] |
ב-Uno הקריאה קופצת בצעדים של כחצי מעלה; ב-ESP32 הצעד קטן בערך פי 6, כי יש יותר רמות ומתח הייחוס קטן יותר. זהו חישוב תאורטי: הממיר האמיתי של ESP32 מדויק פחות בקצות התחום שלו.
(א) ב-Uno.
(ב) ב-ESP32.
(א) ב-Uno (5 V, Nmax = 1023):
(ב) ב-ESP32 (3.3 V, Nmax = 4095):
(א) מהו המתח של החיישן?
(ב) מהי הטמפרטורה?
(ג) מהו הערך הגולמי באותה טמפרטורה ב-ESP32?
חיישן הטמפרטורה הספרתי DS18B20 (DS18B20, 1-Wire)
לפי דף הנתונים (ערכים טיפוסיים): תחום המדידה מ-−55 °C עד +125 °C, הדיוק ±0.5 °C בין −10 °C ל-+85 °C, ומתח ההזנה מ-3.0 V עד 5.5 V; הוא נמכר גם במארז מתכת עמיד במים. הרזולוציה מגיעה עד 0.0625 °C, ואז החיישן זקוק לעד 750 ms כדי להשלים את המדידה (זמן ההמרה).
קו הנתונים DQ משותף לכל החיישנים, וכל חיישן יכול רק למשוך אותו ל-0 V, ולכן נוסיף נגד משיכה למעלה של 4.7 kΩ בין DQ לבין 5 V (הערך המומלץ בדף הנתונים). סדר ההדקים במארז TO-92: GND, DQ, VDD.
נשתמש בשתי ספריות: OneWire (הפרוטוקול) ו-DallasTemperature (פקודות החיישן). הפקודה requestTemperatures() מתחילה את המדידה בכל החיישנים יחד; אחריה הסקיצה מוצאת את הכתובת של כל חיישן בעזרת הפונקציה getAddress(), מדפיסה אותה בבסיס הקסדצימלי, וקוראת את הטמפרטורה שלו לפי הכתובת:
#include <OneWire.h>
#include <DallasTemperature.h>
const int BUS_PIN = 2; // 1-Wire bus, 4.7k pull-up to 5V
OneWire bus(BUS_PIN);
DallasTemperature sensors(&bus);
DeviceAddress addr;
void setup() {
Serial.begin(9600);
sensors.begin();
sensors.setResolution(12); // 0.0625 C, up to 750 ms
}
void loop() {
sensors.requestTemperatures(); // all sensors convert together
for (int i = 0; i < sensors.getDeviceCount(); i++) {
sensors.getAddress(addr, i);
for (int j = 0; j < 8; j++) {
if (addr[j] < 16) Serial.print("0");
Serial.print(addr[j], HEX);
}
Serial.print(" T = "); Serial.print(sensors.getTempC(addr), 2);
Serial.println(" C");
}
delay(2000);
}283A7F460C00006C T = 21.37 C 28912B580B000015 T = 48.94 C 283A7F460C00006C T = 21.44 C 28912B580B000015 T = 46.50 C
החיישן הראשון נמצא באוויר החדר, והשני במים חמים שמתקררים. כל שורה מתחילה בכתובת החיישן (הכתובות כאן הן דוגמה), וכך יודעים איזו קריאה שייכת לאיזה חיישן.
(א) כמה הדקים של הבקר דרושים?
(ב) כמה נגדי משיכה למעלה, ומה ערכם?
(ג) האם זמן המדידה גדל פי ארבעה משום שעל האפיק יש ארבעה חיישנים?
חיישן טמפרטורה ולחות DHT22 (DHT22 / AM2302)
DHT22 (נקרא גם AM2302) הוא חיישן ספרתי שיש בו רכיב קיבולי ללחות, נגד תלוי-טמפרטורה לטמפרטורה, ומעבד קטן ששולח את שתי המדידות על קו נתונים אחד, בפרוטוקול משלו (לא אפיק 1-Wire). הוא פועל ב-3.3 V וב-5 V. ארבעת ההדקים שלו: VDD, DATA, NC (לא מחובר), GND. על הקו DATA נשים נגד משיכה למעלה; במודולים המוכנים בעלי שלושה הדקים הוא כבר מורכב על הלוח.
| התכונה | טמפרטורה | לחות יחסית |
|---|---|---|
| תחום מדידה | −40 עד 80 °C | 0 עד 100 % |
| דיוק | ±0.5 °C | ±2 % |
| רזולוציה | 0.1 °C | 0.1 % |
| זמן מזערי בין שתי קריאות | 2 s | 2 s |
הספרייה DHT sensor library מטפלת בפרוטוקול, ושתי הפונקציות שלה, readTemperature() ו-readHumidity(), מחזירות את שני המספרים. עם כל קריאה החיישן שולח בית בדיקה, והספרייה בודקת אותו; כשהקריאה נכשלת הפונקציה מחזירה NaN ("לא מספר"), ונבדוק זאת בעזרת הפונקציה isnan(). הסקיצה קוראת כל 2.5 s בעזרת millis() בלי delay(), וכך הלולאה נשארת פנויה למשימות אחרות:
#include <DHT.h>
const int DHT_PIN = 4;
const unsigned long PERIOD = 2500; // datasheet: at least 2 s
DHT dht(DHT_PIN, DHT22);
unsigned long last = 0;
void setup() {
Serial.begin(9600);
dht.begin();
}
void loop() {
if (millis() - last < PERIOD) return;
last = millis();
float h = dht.readHumidity();
float t = dht.readTemperature(); // degrees C
Serial.print("t = "); Serial.print(last / 1000.0, 1);
if (isnan(h) || isnan(t)) {
Serial.println(" s DHT22 read error");
return;
}
Serial.print(" s T = "); Serial.print(t, 1);
Serial.print(" C RH = "); Serial.print(h, 1);
Serial.println(" %");
}t = 2.5 s T = 23.4 C RH = 48.7 % t = 5.0 s T = 23.6 C RH = 61.2 % t = 7.5 s T = 23.9 C RH = 74.8 % t = 10.0 s T = 23.8 C RH = 66.0 % t = 12.5 s T = 23.6 C RH = 57.3 %
נשפנו על החיישן אחרי הקריאה הראשונה: הלחות קפצה ואחר כך חזרה לאט, כי זמן התגובה של רכיב הלחות ארוך בהרבה מזה של רכיב הטמפרטורה.
חיישן טמפרטורה תעשייתי: PT100 (Industrial Sensor: PT100)
במפעל מודדים טמפרטורה של תנורים, של צינורות קיטור ושל שמנים חמים, ולעיתים קרובות במרחק עשרות מטרים מלוח הבקרה. שם משתמשים בדרך כלל בגשש התנגדות.
העיקרון פשוט: ככל שהטמפרטורה עולה, ההתנגדות גדלה, הפוך מ-NTC. אבל השינוי קטן: ב-100 °C ההתנגדות היא כ-138.5 Ω (ערך טיפוסי לפי התקן), כלומר פחות מחצי אוהם לכל מעלה. לכן לא נחבר PT100 ישירות להדק של הבקר, ונחבר אותו בשלושה או בארבעה מוליכים, כדי שהתנגדות המוליכים הארוכים לא תתווסף לקריאה.
איך קוראים אותו? ליד החיישן מרכיבים משדר שממיר את הטמפרטורה לזרם בלולאת זרם 4–20 mA: למשל 4 mA ב-0 °C ו-20 mA ב-200 °C (התחום נקבע במשדר). הזרם אינו מושפע מאורך המוליכים, והבקר קורא אותו דרך נגד מדידה. את לולאת הזרם ואת חיבורה לבקר נלמד בפרק 8.
(א) מהי התנגדותו ב-0 °C?
(ב) התנגדותו נמדדה והיא גדולה מ-100 Ω: האם הטמפרטורה מעל האפס או מתחתיו?
(ג) מדוע במפעל קוראים אותו דרך משדר ולולאת זרם?
השוואה ובחירת חיישן (Comparison)
| החיישן | המוצא | תחום מדידה | דיוק | שימוש אופייני |
|---|---|---|---|---|
| NTC | התנגדות (מחלק מתח) | לפי הדגם | לפי הדגם | מכשירי בית, תרמוסטט פשוט |
| LM35 | מתח תקבילי 10 mV/°C | 2 עד 150 °C | מ-±0.5 עד ±1 °C, לפי הדגם | טמפרטורת החדר בקריאה תקבילית |
| DS18B20 | ספרתי, אפיק 1-Wire | −55 עד 125 °C | ±0.5 °C | כמה נקודות מדידה, טמפרטורת מים |
| DHT22 | ספרתי, קו ייעודי | −40 עד 80 °C; 0 עד 100 % | ±0.5 °C; ±2 % | חממה, חדר, תחנת מזג אוויר |
| PT100 | התנגדות, נקראת דרך משדר זרם | −200 עד 850 °C | לפי דרגת הדיוק | צינורות ומכלים במפעל |
| צמד תרמי K | מתח קטן מאוד (דרך מודול המרה) | יותר מ-1000 °C | כשתי מעלות | תנורים ודודי קיטור |
המספרים טיפוסיים לפי דפי הנתונים, והם משתנים בין דגמים ובין יצרנים. הצמד התרמי שבשורה האחרונה הוא שני תילים משתי מתכות שונות, המולחמים זה לזה בקצה אחד; הוא נותן מתח קטן מאוד שתלוי בטמפרטורה, ולכן קוראים אותו תמיד דרך מודול המרה או משדר. בבחירה נשאל: מהו תחום המדידה? האם צריך גם לחות? כמה נקודות מדידה יש? והאם הסביבה תעשייתית?
בקצרה: לטמפרטורה עם לחות בחדר או בחממה — DHT22; לכמה נקודות מדידה על כבל אחד או במים — DS18B20; לקריאה תקבילית פשוטה בלי ספרייה — LM35; לזול ולקטן ביותר — NTC; ולתהליכים תעשייתיים ולטמפרטורות גבוהות — PT100 עד כמה מאות מעלות, וצמד תרמי לתנורים.
(א) מדידת טמפרטורת המים בחמישה אקווריומים בעזרת בקר אחד.
(ב) הפעלת מאוורר כשהלחות בחדר הרחצה עולה.
(ג) מדידת הטמפרטורה של תנור קרמיקה שמגיעה ל-900 °C.
סיכום נוסחאות הפרק:
| החוק | הנוסחה |
|---|---|
| המתח מהערך הגולמי | V = N·VrefNmax |
| חיישן LM35 | T = Vout10 mV/°C |
| רזולוציה במעלות (LM35) | ΔT = Vref2n · 10 mV/°C |
מילון מונחים:
| עברית | English | العربية |
|---|---|---|
| נגד תלוי-טמפרטורה (תרמיסטור) | NTC thermistor | المقاومة الحرارية (الثرمستور) |
| מקדם טמפרטורה שלילי | Negative temperature coefficient | المعامل الحراري السالب |
| חיישן פעיל · חיישן סביל | Active · passive sensor | حسّاس فعّال · حسّاس سلبي |
| מתח ייחוס | Reference voltage | جهد المرجع |
| רזולוציה (הפרדה) | Resolution | دقّة التمييز |
| אפיק 1-Wire | 1-Wire bus | ناقل السلك الواحد |
| כתובת | Address (ROM code) | العنوان |
| נגד משיכה למעלה | Pull-up resistor | مقاومة الرفع (pull-up) |
| זמן המרה | Conversion time | زمن التحويل |
| לחות יחסית | Relative humidity | الرطوبة النسبية |
| זמן תגובה | Response time | زمن الاستجابة |
| גשש התנגדות (PT100) | RTD, PT100 | حسّاس المقاومة البلاتينية |
| משדר | Transmitter | المرسِل |
| לולאת זרם 4–20 mA | 4–20 mA current loop | حلقة التيار 4–20 mA |
| צמד תרמי | Thermocouple | المزدوج الحراري |
| ספרייה | Library | المكتبة |
שאלות לתרגול:
(א) להתנגדות החיישן?
(ב) למתח ב-A0?
(ג) לערך הגולמי?
(א) חשבו את המתח ב-A0.
(ב) האם הטמפרטורה גבוהה מ-25 °C או נמוכה ממנה? (ב-25 °C הערך הוא N = 512.)
(א) התיל של ה-NTC נקטע: מהו המתח ב-A0?
(ב) נוצר קצר בין שני ההדקים של ה-NTC: מהו הערך הגולמי?
(א) את מתח המוצא,
(ב) את הערך הגולמי,
(ג) את הקריאה במעלות.
(א) כמה רמות יש בממיר?
(ב) חשבו את הרזולוציה התאורטית במעלות.
(א) את המתח,
(ב) את הטמפרטורה.
(א) איזה מהם נקרא בפונקציה analogRead() ואיזה בעזרת ספרייה?
(ב) איזה מהם מאפשר כמה חיישנים על הדק אחד, ומדוע?
(א) מה הבעיה?
(ב) כמה קריאות תקינות בדקה, לכל היותר, החיישן מאפשר?
(א) טמפרטורה של שמן בצינור, כ-180 °C, במרחק 50 m מלוח הבקרה.
(ב) תנור להתכת זכוכית שהטמפרטורה בו כ-1100 °C.