کار با سنسورها و پروژهٔ پایانی
سه سنسور رایج LDR، LM35 و HC-SR04 را میخوانید و در پروژهٔ پایانی، فاصله را اندازه میگیرید و با نور و سریال هشدار میدهید.
آنچه در این درس میآموزید
- تفاوت خروجی آنالوگ و دیجیتال سنسورها را تشخیص دهید
- LDR را با مقسم ولتاژ و LM35 را با فرمول دمایی بخوانید
- فاصله را با HC-SR04 اندازه بگیرید و پروژهٔ هشدار فاصله بسازید
فهرست مطالب
سنسور قطعهای است که کمیت فیزیکی — نور، دما، فاصله — را به سیگنال الکتریکی تبدیل میکند. تا اینجای دوره همهٔ ابزار لازم را دارید: خواندن آنالوگ، PWM و گفتوگوی سریال. در این درس سه سنسور پرتکرار را میشناسید و همهٔ آموختهها را در یک پروژهٔ پایانی کنار هم میگذارید.
خانوادهٔ سنسورها
سنسورها به دو گروه اصلی تقسیم میشوند: آنالوگ که ولتاژ پیوسته میدهند و با analogRead خوانده میشوند، و دیجیتال که پالس یا دادهٔ کدشده میدهند:
| سنسور | کمیت اندازهگیری | نوع خروجی | روش خواندن |
|---|---|---|---|
| LDR | شدت نور | مقاومت متغیر → ولتاژ | analogRead با مقسم ولتاژ |
| LM35 | دما | ولتاژ آنالوگ | analogRead و فرمول |
| HC-SR04 | فاصله | پالس دیجیتال | pulseIn و محاسبهٔ زمان |
| DHT11 | دما و رطوبت | دادهٔ دیجیتال کدشده | کتابخانهٔ اختصاصی |
سنسور نور LDR با مقسم ولتاژ
LDR (Light Dependent Resistor) مقاومتی است که با افزایش نور، مقاومتش کم میشود. ADC آردوینو ولتاژ میخواند نه مقاومت؛ پس با یک مقاومت ۱۰ کیلواهم «مقسم ولتاژ» میسازیم:
| پین آردوینو | اتصال | توضیح |
|---|---|---|
| 5V | یک پایهٔ LDR | بالای مقسم |
| A0 | پایهٔ دیگر LDR + یک پایهٔ مقاومت ۱۰ کیلواهم | نقطهٔ میانی مقسم |
| GND | پایهٔ دیگر مقاومت ۱۰ کیلواهم | پایین مقسم |
هرچه نور بیشتر، مقاومت LDR کمتر و ولتاژ نقطهٔ میانی بالاتر میشود؛ پس عدد analogRead مستقیماً معیار روشنایی محیط است.
سنسور دمای LM35
LM35 سنسور دمای آنالوگ است که به ازای هر درجهٔ سلسیوس ۱۰ میلیولت خروجی میدهد. تبدیل عدد ADC به دما:
const int lm35Pin = A0;
void setup() {
Serial.begin(9600);
}
void loop() {
int reading = analogRead(lm35Pin);
float temperature = reading * 5.0 / 1023.0 * 100.0;
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.println(" C");
delay(1000);
}خروجی این برنامه به دمای واقعی محیط شما بستگی دارد و قطعی نیست؛ خودتان در سریال مانیتور دنبال کنید و عدد را با یک دماسنج معمولی مقایسه کنید.
سنسور فاصله HC-SR04
HC-SR04 با صدا کار میکند: پین TRIG یک پالس ۱۰ میکروثانیهای میگیرد، سنسور یک بستهٔ موج فراصوتی میفرستد و پین ECHO به اندازهٔ زمان برگشت پالس HIGH میماند. سرعت صوت حدود ۰٫۰۳۴ سانتیمتر بر میکروثانیه است و صدا مسیر رفت و برگشت را میرود، پس فاصله:
| پین آردوینو | اتصال | توضیح |
|---|---|---|
| 5V | VCC | تغذیهٔ ۵ ولت سنسور |
| GND | GND | زمین مشترک |
| D7 | TRIG | فرمان شروع اندازهگیری |
| D8 | ECHO | دریافت مدتزمان برگشت |
پروژهٔ پایانی: هشدار فاصله با نور
پروژهای میسازیم که فاصله را اندازه میگیرد: هرچه جسم نزدیکتر، LED پین ۹ روشنتر و هرچه دورتر، خاموشتر؛ وضعیت هم در سریال گزارش میشود. این ترکیب، نمونهٔ کوچک همان منطقی است که حسگر پارک خودرو دارد:
const int trigPin = 7;
const int echoPin = 8;
const int ledPin = 9; // PWM pin
void setup() {
Serial.begin(9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
}
void loop() {
// Send a 10-microsecond pulse to TRIG
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH); // Return time in microseconds
float distance = duration * 0.034 / 2.0; // Centimeters
int brightness = map(constrain(distance, 0, 100), 0, 100, 255, 0);
analogWrite(ledPin, brightness);
Serial.print("Distance: ");
Serial.print(distance);
Serial.print(" cm | Brightness: ");
Serial.println(brightness);
delay(200);
}نکتههای کد:
pulseIn(echoPin, HIGH)منتظر میماند تا پالس ECHO برسد و طولش را به میکروثانیه برمیگرداند.constrain(distance, 0, 100)فاصله را به بازهٔ ۰ تا ۱۰۰ سانتیمتر محدود میکند تاmapبا عدد بزرگ خراب نشود.- بازهٔ مقصد
mapمعکوس است (۲۵۵ به ۰) تا جسم نزدیک LED را روشنتر کند.
تمرینها
تمرین
تمرین ۱ — دماسنج سریال با هشدار
برنامهای با LM35 بنویسید که هر ثانیه دما را چاپ کند و اگر دما از ۳۰ درجه گذشت، عبارت هشدار چاپ کند. برای آزمایش، فرض کنید ADC مقدار ۷۷ را خوانده است؛ دمای محاسبهشده چقدر میشود و خروجی سریال مانیتور چه خواهد بود؟
// Write your code hereنمایش راهحل
با مقدار ۷۷: دما برابر است با درجه سلسیوس، پس هشدار هم چاپ میشود.
const int lm35Pin = A0;
void setup() {
Serial.begin(9600);
}
void loop() {
int reading = analogRead(lm35Pin);
float temperature = reading * 5.0 / 1023.0 * 100.0;
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.println(" C");
if (temperature > 30.0) {
Serial.println("Warning: temperature is above 30 degrees");
}
delay(1000);
}با فرض خواندن مقدار ۷۷ از ADC، خروجی سریال مانیتور این است:
Temperature: 37.63 C Warning: temperature is above 30 degrees
::: :::
خلاصه
- سنسورهای آنالوگ ولتاژ پیوسته میدهند و با analogRead خوانده میشوند؛ سنسورهای دیجیتال پالس یا دادهٔ کدشده میدهند.
- LDR با مقسم ولتاژ (مقاومت ۱۰ کیلواهم) به ولتاژ قابلخواندن تبدیل میشود.
- LM35 به ازای هر درجهٔ سلسیوس ۱۰ میلیولت میدهد؛ دما از عدد ADC با ضریب مناسب بهدست میآید.
- HC-SR04 زمان رفتوبرگشت صدا را میسنجد و فاصله از حساب میشود.
- بارهای پرجریان را هرگز از پین ۵ ولت برد تغذیه نکنید؛ منبع جدا و زمین مشترک، قاعدهٔ طلایی است.
با این پروژه، دورهٔ «اصول آردوینو» را کامل کردهاید؛ از اینجا میتوانید سنسورهای دیگر (مثل DHT11 با کتابخانه)، نمایشگرها و موتورها را با همان الگوی همیشگی اضافه کنید: بخوان، تصمیم بگیر، عمل کن.