آردوینومقدماتی۷ دقیقه مطالعهArduino IDE 2.x / Uno R3

کار با سنسورها و پروژهٔ پایانی

سه سنسور رایج 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 به دما:

T=reading×5.01023×100T = \frac{reading \times 5.0}{1023} \times 100

lm35.ino
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 می‌ماند. سرعت صوت حدود ۰٫۰۳۴ سانتی‌متر بر میکروثانیه است و صدا مسیر رفت و برگشت را می‌رود، پس فاصله:

d=t×0.0342d = \frac{t \times 0.034}{2}

پین آردوینو اتصال توضیح
5V VCC تغذیهٔ ۵ ولت سنسور
GND GND زمین مشترک
D7 TRIG فرمان شروع اندازه‌گیری
D8 ECHO دریافت مدت‌زمان برگشت

پروژهٔ پایانی: هشدار فاصله با نور

پروژه‌ای می‌سازیم که فاصله را اندازه می‌گیرد: هرچه جسم نزدیک‌تر، LED پین ۹ روشن‌تر و هرچه دورتر، خاموش‌تر؛ وضعیت هم در سریال گزارش می‌شود. این ترکیب، نمونهٔ کوچک همان منطقی است که حسگر پارک خودرو دارد:

distance-alarm.ino
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);
}

نکته‌های کد:

  1. pulseIn(echoPin, HIGH) منتظر می‌ماند تا پالس ECHO برسد و طولش را به میکروثانیه برمی‌گرداند.
  2. constrain(distance, 0, 100) فاصله را به بازهٔ ۰ تا ۱۰۰ سانتی‌متر محدود می‌کند تا map با عدد بزرگ خراب نشود.
  3. بازهٔ مقصد map معکوس است (۲۵۵ به ۰) تا جسم نزدیک LED را روشن‌تر کند.

تمرین‌ها

تمرین

تمرین ۱ — دماسنج سریال با هشدار

برنامه‌ای با LM35 بنویسید که هر ثانیه دما را چاپ کند و اگر دما از ۳۰ درجه گذشت، عبارت هشدار چاپ کند. برای آزمایش، فرض کنید ADC مقدار ۷۷ را خوانده است؛ دمای محاسبه‌شده چقدر می‌شود و خروجی سریال مانیتور چه خواهد بود؟

cpp
// Write your code here
نمایش راه‌حل

با مقدار ۷۷: دما برابر است با 77×51023×100≈37.63\frac{77 \times 5}{1023} \times 100 \approx 37.63 درجه سلسیوس، پس هشدار هم چاپ می‌شود.

cpp
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 زمان رفت‌وبرگشت صدا را می‌سنجد و فاصله از d=t×0.0342d = \frac{t \times 0.034}{2} حساب می‌شود.
  • بارهای پرجریان را هرگز از پین ۵ ولت برد تغذیه نکنید؛ منبع جدا و زمین مشترک، قاعدهٔ طلایی است.

با این پروژه، دورهٔ «اصول آردوینو» را کامل کرده‌اید؛ از این‌جا می‌توانید سنسورهای دیگر (مثل DHT11 با کتابخانه)، نمایشگرها و موتورها را با همان الگوی همیشگی اضافه کنید: بخوان، تصمیم بگیر، عمل کن.

منابع و ارجاع‌ها

درس‌های مرتبط