حسّاسات درجة الحرارة والرطوبة
درجة الحرارة هي المقدار الذي نقيسه أكثر من أي مقدار آخر في أنظمة التحكّم: في منظّم الحرارة في البيت، في الدفيئة الزراعية، في خزّان الماء الساخن وفي الفرن الصناعي. في هذا الفصل نتعرّف على حسّاسات الحرارة الشائعة وعلى حسّاس الرطوبة: ماذا يقيس كل حسّاس، هل مخرجه تماثلي أم رقمي، ما مدى قياسه، كيف نوصله بالمتحكّم، والبرنامج الذي يقرؤه. في النهاية نقارن بينها ونتعلّم كيف نختار الحسّاس الملائم.
- نوصل المقاومة الحرارية NTC بمُجزِّء الجهد، ونفهم لماذا تتغيّر القيمة الخام مع الحرارة.
- نحوّل جهد LM35 إلى درجات، ونقارن دقّة التمييز في Uno (10 خانات) وفي ESP32 (12 خانة).
- نوصل عدّة حسّاسات DS18B20 على طرف واحد مع مقاومة رفع، ونقرؤها بمكتبة جاهزة.
- نقرأ الحرارة والرطوبة النسبية من DHT22 مرّة كل ثانيتين على الأقل، ونفحص القراءة الفاشلة.
- نعرف مبدأ الحسّاس الصناعي PT100، ولماذا نقرؤه في المصنع عبر مرسِل وحلقة تيار.
- نقارن بين الحسّاسات ونختار الحسّاس الملائم لتطبيق معيّن.
تعرّفوا على الحسّاسات – הכירו את החיישנים:
قبل أن ندرس الحسّاسات واحدا واحدا، هذه كلّ الحسّاسات في الكتاب: الاسم، ماذا يقيس كلّ واحد، ونوع مخرجه. نرى الحسّاس نفسه مرّة أخرى بجانب تعريفه في الفصل الذي يتناوله.
נגד תלוי-טמפרטורה (NTC) – المقاومة الحرارية 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 (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 מול 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 (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 (DHT22 / AM2302)
DHT22 (ويُسمّى أيضا AM2302) حسّاس رقمي فيه عنصر سعوي للرطوبة، مقاومة حرارية للحرارة، ومعالج صغير يرسل القياسين على خط بيانات واحد ببروتوكول خاص به (ليس ناقل السلك الواحد). يعمل بـ 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 – حسّاس حرارة صناعي: 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 | رقمي، ناقل السلك الواحد | −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) | נגד משיכה למעלה | Pull-up resistor |
| زمن التحويل | זמן המרה | Conversion time |
| الرطوبة النسبية | לחות יחסית | Relative humidity |
| زمن الاستجابة | זמן תגובה | Response time |
| حسّاس المقاومة البلاتينية | גשש התנגדות (PT100) | RTD, PT100 |
| المرسِل | משדר | Transmitter |
| حلقة التيار 4–20 mA | לולאת זרם 4–20 mA | 4–20 mA current loop |
| المزدوج الحراري | צמד תרמי | Thermocouple |
| المكتبة | ספרייה | Library |
أسئلة للتمرين:
(أ) لمقاومة الحسّاس؟
(ب) للجهد في A0؟
(ج) للقيمة الخام؟
(أ) نحسب الجهد في A0.
(ب) هل الحرارة أعلى من 25 °C أم أقل؟ (عند 25 °C تكون N = 512.)
(أ) انقطع سلك NTC: ما هو الجهد في A0؟
(ب) حدث قصر بين طرفي NTC: ما هي القيمة الخام؟
(أ) جهد المخرج،
(ب) القيمة الخام،
(ج) القراءة بالدرجات.
(أ) كم مستوى في المحوّل؟
(ب) نحسب دقّة التمييز النظرية بالدرجات.
(أ) الجهد،
(ب) درجة الحرارة.
(أ) أيّهما يُقرأ بالدالة analogRead() وأيّهما بمكتبة؟
(ب) أيّهما يسمح بعدّة حسّاسات على طرف واحد، ولماذا؟
(أ) ما المشكلة؟
(ب) كم قراءة صحيحة في الدقيقة على الأكثر يسمح بها الحسّاس؟
(أ) حرارة زيت في أنبوب نحو 180 °C على بعد 50 m من لوحة التحكّم.
(ب) فرن صهر زجاج حرارته نحو 1100 °C.