آموزش سنسور دما و پروتکل 1-Wire
در این راهنمای پروژهمحور، از شناخت پایهها و سیمکشی تا تایمینگ باس 1-Wire، تنظیم دقت، خواندن چند سنسور، حالت تغذیه انگلی و کدنویسی عملی را قدمبهقدم یاد میگیرید.
DS18B20 یک دماسنج دیجیتال کالیبرهشده است که اندازهگیری را داخل تراشه انجام میدهد و نتیجه را بهصورت دیجیتال روی باس 1-Wire میفرستد. برخلاف سنسورهای آنالوگ، طول سیم و نویز ADC مستقیماً عدد دما را تغییر نمیدهد. هر سنسور یک کد ROM یکتای 64 بیتی دارد؛ بنابراین چند DS18B20 میتوانند تنها با یک پایه میکروکنترلر کار کنند.
در پکیج TO-92، وقتی سطح تخت بدنه رو به شماست و پایهها رو به پاییناند، ترتیب پایهها از چپ به راست چنین است:
| پایه | نام | کاربرد |
|---|---|---|
| 1 | GND | زمین مدار |
| 2 | DQ | داده 1-Wire؛ با مقاومت 4.7kΩ به ولتاژ منطقی Pull-up شود |
| 3 | VDD | تغذیه 3.0 تا 5.5 ولت؛ در حالت انگلی به GND متصل میشود |
VDD به 5V، GND به GND و DQ به D2. مقاومت 4.7kΩ بین DQ و 5V قرار گیرد.
VDD به 3.3V، GND به GND و DQ مثلاً به GPIO4. مقاومت 4.7kΩ بین DQ و 3.3V قرار گیرد.
برای کابلهای بلند یا محیط صنعتی، توپولوژی خطی، کابل زوجتابیده، خازن بایپس نزدیک سنسور و Pull-up متناسب با ظرفیت باس نتیجه بهتری از اتصال ستارهای میدهد.
VDD جداگانه وصل است و DQ فقط برای داده استفاده میشود. این روش برای ESP32، چند سنسور، کابل بلند و طراحی قابل اعتماد پیشنهاد میشود.
VDD به زمین وصل میشود و سنسور انرژی را هنگام HIGH بودن DQ در خازن داخلی ذخیره میکند. هنگام تبدیل دما یا نوشتن EEPROM به Strong Pull-up نیاز است؛ یک مقاومت معمولی همیشه جریان لازم را تأمین نمیکند. برای شروع، این حالت را کنار بگذارید و از تغذیه سهسیمه استفاده کنید.
بیتهای R1 و R0 در رجیستر Configuration رزولوشن را مشخص میکنند. دقت عددی بیشتر، زمان تبدیل طولانیتری میخواهد:
| رزولوشن | گام اندازهگیری | حداکثر زمان تبدیل |
|---|---|---|
| 9 بیت | 0.5°C | 93.75 ms |
| 10 بیت | 0.25°C | 187.5 ms |
| 11 بیت | 0.125°C | 375 ms |
| 12 بیت | 0.0625°C | 750 ms |
رزولوشن بالاتر به معنی دقت مطلق بهتر نیست؛ دقت تضمینشده در بازه اصلی ±0.5°C است. برای کنترل دمای سریع، 10 یا 11 بیت اغلب انتخاب متعادلتری است.
هر تبادل با Reset شروع میشود. مستر باس را حداقل 480 میکروثانیه LOW میکند؛ سپس سنسور پس از رها شدن خط، با پالس Presence حضور خود را اعلام میکند. هر اسلات خواندن یا نوشتن حداقل 60 میکروثانیه است و بین اسلاتها حداقل 1 میکروثانیه زمان بازیابی لازم است.
در برنامههای معمول نیازی نیست این تأخیرها را دستی بسازید؛ کتابخانه OneWire آنها را مدیریت میکند. دانستن تایمینگ برای عیبیابی با لاجیک آنالایزر، کابلهای بلند و نوشتن درایور اختصاصی ضروری است.
| فرمان | کد | کاربرد |
|---|---|---|
| Search ROM | F0h | پیدا کردن آدرس همه سنسورها روی باس |
| Match ROM | 55h | انتخاب یک سنسور با آدرس 64 بیتی |
| Skip ROM | CCh | خطاب به تنها سنسور یا همه سنسورها |
| Convert T | 44h | شروع تبدیل دما |
| Read Scratchpad | BEh | خواندن دما، آلارم، تنظیمات و CRC |
| Write Scratchpad | 4Eh | نوشتن TH، TL و رزولوشن |
| Read Power Supply | B4h | تشخیص تغذیه عادی یا انگلی |
| Alarm Search | ECh | پیدا کردن سنسورهایی که از محدوده آلارم خارج شدهاند |
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
void setup() {
Serial.begin(115200);
sensors.begin();
sensors.setResolution(12);
Serial.printf("Sensors: %d\n", sensors.getDeviceCount());
}
void loop() {
sensors.requestTemperatures();
float c = sensors.getTempCByIndex(0);
if (c == DEVICE_DISCONNECTED_C) {
Serial.println("Sensor disconnected");
} else {
Serial.printf("Temperature: %.2f C\n", c);
}
delay(1000);
}
همان دو کتابخانه روی Arduino Core for ESP32 کار میکنند. DQ را به GPIO4 و Pull-up را به 3.3V وصل کنید. برای جلوگیری از توقف 750 میلیثانیهای برنامه، تبدیل را غیرمسدودکننده انجام دهید:
#include <OneWire.h>
#include <DallasTemperature.h>
constexpr uint8_t ONE_WIRE_BUS = 4;
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
uint32_t conversionStarted = 0;
bool converting = false;
void setup() {
Serial.begin(115200);
sensors.begin();
sensors.setResolution(12);
sensors.setWaitForConversion(false);
}
void loop() {
if (!converting) {
sensors.requestTemperatures();
conversionStarted = millis();
converting = true;
}
if (converting && millis() - conversionStarted >= 750) {
float c = sensors.getTempCByIndex(0);
Serial.printf("Temperature: %.2f C\n", c);
converting = false;
}
// WiFi, UI and other tasks can run here.
}
بهجای تکیه بر Index، آدرس 8 بایتی هر سنسور را پیدا و ذخیره کنید؛ ترتیب Index ممکن است با تغییر سیمکشی عوض شود. کتابخانه DallasTemperature متد getAddress() و خواندن با getTempC(address) را فراهم میکند. در یک باس، فرمان Convert T را برای همه صادر کنید و بعد Scratchpad هر آدرس را جدا بخوانید.
برای یک پروژه مطمئن با ESP32، تغذیه سهسیمه 3.3 ولت، مقاومت 4.7kΩ، خواندن غیرمسدودکننده و بررسی CRC نقطه شروع مناسبی است. برای یادگیری سنسورهای بیشتر به مرکز آموزش سنسورها و آموزش سنسورهای دما و رطوبت سر بزنید.
مرجع فنی: دیتاشیت رسمی DS18B20 Rev. 6 از Analog Devices / Maxim Integrated.