🔧 کد آردوینو کار نمیکند؟ ۱۵ علت رایج، از سیمکشی تا تغذیه، با راهحل هر کدام
برنامه را نوشتی، آپلود شد و هیچ خطایی هم نگرفتی؛ ولی LED روشن نمیشود، دکمه جواب نمیدهد یا سریال مانیتور پر از حروف درهم است. کد آردوینو کار نمیکند و نمیدانی از کجا شروع کنی. این صفحه برای همین لحظه است: ۱۵ علت رایج را به شکل «نشانه ← علت ← راهحل» آوردهایم تا مشکل را از روی چیزی که میبینی پیدا کنی. اگر کد اصلاً کامپایل نمیشود و پیغام نارنجی میگیری، سراغ ارورهای رایج آردوینو و معنیشان برو. اگر هم مشکل این است که خود سایت wokwi.com باز نمیشود، جوابش در صفحهی ووکوی باز نمیشود است. اینجا دربارهی کدی حرف میزنیم که اجرا میشود ولی کاری را که میخواهی انجام نمیدهد.
قبل از همه، سه سؤال ساده
- کامپایل و آپلود موفق بود؟ اگر نه، مشکل در کد یا اتصال USB است، نه در مدار.
- سریال مانیتور چیزی نشان میدهد؟ یک
Serial.println("start");اولsetupبگذار. اگر چاپ شد، برنامه دارد اجرا میشود و باید دنبال اشکال منطقی یا سیمکشی بگردی. - سادهترین برنامه کار میکند؟ مثال Blink را آپلود کن. اگر حتی LED داخلی برد هم چشمک نمیزند، مشکل از برد، کابل یا تغذیه است، نه از کد تو.
۱۵ علت رایج و راهحل هر کدام
۱. پین کد با پین سیمکشی یکی نیست
- نشانه: کد درست به نظر میرسد ولی قطعه هیچ واکنشی ندارد.
- علت: در کد نوشتهای
pinMode(13, OUTPUT)ولی LED روی پین ۸ است؛ یا روی بردبورد سیم یک ردیف آنطرفتر خورده. - راهحل: شمارهی پین را بالای برنامه یک بار با اسم تعریف کن (
const int LED = 8;) و همهجا همان اسم را بنویس. بعد سیم را از پین تا قطعه با انگشت دنبال کن.
۲. LED برعکس است یا مقاومتش اشتباه
- نشانه: LED اصلاً روشن نمیشود یا نورش خیلی کم است.
- علت: پایهی بلند (آند) سمت GND افتاده، یا بهجای ۲۲۰ اهم یک مقاومت ۱۰ کیلواهم برداشتهای.
- راهحل: پایهی بلند LED سمت پین و پایهی کوتاه سمت GND. رنگهای مقاومت را با ابزار کد رنگی مقاومت چک کن.
۳. GND مشترک نیست
- نشانه: ماژول یا موتوری که منبع تغذیهی جدا دارد کار نمیکند یا رفتار عجیب دارد.
- علت: ولتاژ همیشه نسبت به یک نقطه سنجیده میشود. اگر GND منبع دوم به GND آردوینو وصل نباشد، سیگنال پین برای ماژول معنایی ندارد.
- راهحل: منفی همهی منبعها را به GND آردوینو وصل کن. مثبتها جدا میمانند.
۴. pinMode فراموش شده
- نشانه: LED روشن میشود ولی خیلی کمنور است.
- علت: بدون
pinMode(pin, OUTPUT)پین در حالت ورودی میماند. آنوقتdigitalWrite(pin, HIGH)فقط مقاومت pull-up داخلی (حدود ۳۵ کیلواهم) را روشن میکند و جریانش برای LED کافی نیست. - راهحل: در
setupبرای هر پین خروجی یکpinModeبنویس.
۵. = بهجای ==
- نشانه: شرط
ifهمیشه درست است و مقدار متغیر هم بیدلیل عوض میشود. - علت:
if (state = HIGH)مقایسه نمیکند، مقدار میگذارد. چون HIGH یعنی ۱، شرط همیشه درست است. - راهحل: برای مقایسه از
==استفاده کن. ترفند: ثابت را سمت چپ بنویس (if (HIGH == state))؛ اگر یک مساوی جا بیفتد، کامپایلر خطا میدهد.
۶. سمیکالن بعد از if یا for
- نشانه: کد داخل آکولاد همیشه اجرا میشود، یا حلقه انگار فقط یک بار میچرخد.
- علت: در
if (x > 5);آن سمیکالن یعنی «شرط تمام شد، کاری نکن» و بلوک بعدی همیشه اجرا میشود.for (...);هم بیصدا یک حلقهی خالی میچرخد. - راهحل: بعد از پرانتز
if،forوwhileهیچوقت;نگذار.
۷. delay همهچیز را قفل میکند
- نشانه: دکمه را باید چند بار یا طولانی فشار بدهی تا جواب بدهد.
- علت: در طول
delay(1000)آردوینو هیچ کار دیگری نمیکند، حتی دکمه را نمیخواند. - راهحل: زمان را با
millis()بسنج تا برنامه هیچوقت منتظر نماند؛ کد پایین همین کار را میکند. درس چند کار همزمان این روش را قدمبهقدم توضیح میدهد.
۸. سرعت سریال مانیتور با کد یکی نیست
- نشانه: در سریال مانیتور علامت سؤال و حروف درهم میبینی.
- علت: در کد
Serial.begin(9600)نوشتهای ولی مانیتور روی ۱۱۵۲۰۰ است، یا برعکس. - راهحل: عدد پایین سریال مانیتور را با عدد
Serial.beginیکی کن. برای آردوینو معمولاً ۹۶۰۰ و برای ESP32 معمولاً ۱۱۵۲۰۰.
۹. سریال خالی است یا پین ۰ و ۱ اشغال شده
- نشانه: سریال مانیتور هیچ چیزی نشان نمیدهد، یا آپلود فقط وقتی قطعهای وصل است خطا میدهد.
- علت:
Serial.beginرا جا انداختهای، یا قطعهای روی پین ۰ و ۱ (RX و TX) گذاشتهای که همان خطوط ارتباط با USB هستند. - راهحل:
Serial.beginرا اولsetupبنویس و در اونو و نانو پین ۰ و ۱ را خالی بگذار.
۱۰. ورودی شناور (floating)
- نشانه: دکمه را نزدهای ولی مقدار ورودی بین HIGH و LOW میپرد؛ حتی نزدیک کردن دست عوضش میکند.
- علت: پینی که در حالت ورودی به هیچجا وصل نیست «شناور» است و نویز اطراف را میخواند.
- راهحل:
pinMode(pin, INPUT_PULLUP)و دکمه بین پین و GND. یادت باشد منطق برعکس میشود: فشرده یعنی LOW. دربارهی مقاومت pull-up بیشتر بخوان.
۱۱. پرش کنتاکت دکمه (bounce)
- نشانه: با یک بار فشار دادن دکمه، شمارنده سه یا چهار عدد جلو میرود.
- علت: کنتاکت فلزی دکمه چند میلیثانیه میلرزد و آردوینو هر لرزش را یک فشار جدا میبیند.
- راهحل: تغییرهایی را که کمتر از حدود ۵۰ میلیثانیه با هم فاصله دارند نادیده بگیر (debounce)، مثل کد پایین.
۱۲. نوع متغیر کوچک است یا تقسیم صحیح شده
- نشانه: زمانسنج بعد از حدود ۳۳ ثانیه منفی یا قاطی میشود؛ یا حاصل
7 / 2بهجای ۳٫۵ میشود ۳. - علت:
intدر اونو حداکثر ۳۲۷۶۷ را نگه میدارد و توmillis()را در آن ریختهای. تقسیم دو عدد صحیح هم بخش اعشاری را دور میریزد. - راهحل: برای زمان همیشه
unsigned long، و برای اعشار7.0 / 2یا متغیرfloat.
۱۳. متغیر داخل loop هر بار صفر میشود
- نشانه: شمارنده همیشه ۱ چاپ میکند و جلو نمیرود.
- علت:
int count = 0;را داخلloopنوشتهای؛ این خط هر دور از نو اجرا میشود. - راهحل: متغیر را بالای برنامه (بیرون از توابع) تعریف کن یا جلویش
staticبگذار.
۱۴. analogWrite روی پینی که PWM ندارد
- نشانه: نور LED کم و زیاد نمیشود و فقط روشن یا خاموش است.
- علت: در اونو و نانو فقط پینهای ۳، ۵، ۶، ۹، ۱۰ و ۱۱ (با علامت ~) PWM دارند.
analogReadهم فقط روی پینهای A0 به بعد کار میکند. - راهحل: LED را به یکی از پینهای ~ ببر. اگر مفهوم PWM برایت تازه است، PWM چیست را ببین.
۱۵. تغذیهی ناکافی
- نشانه: وقتی سروو یا موتور حرکت میکند برد ریست میشود، LCD کمنور میشود یا اتصال USB قطع و وصل میشود.
- علت: موتور جریان زیادی میکشد و ولتاژ ۵ ولت افت میکند. هر پین آردوینو هم فقط حدود ۲۰ میلیآمپر را راحت میدهد.
- راهحل: موتور و سروو را با منبع جدا (با GND مشترک) تغذیه کن، موتور DC را با ترانزیستور یا درایور راه بینداز و هیچوقت مستقیم به پین وصل نکن. جزئیات در راهنمای تغذیهی آردوینو.
کد نمونه: چند درمان در یک برنامه
این برنامه با یک دکمه LED را روشن و خاموش میکند و همزمان LED داخلی را چشمک میزند. چند علت بالا (۴، ۵، ۷، ۸، ۱۰، ۱۱ و ۱۲) در آن درست شده است. دکمه بین پین ۲ و GND است و LED با مقاومت ۲۲۰ اهم روی پین ۸.
// Button toggles an LED while the built-in LED blinks without delay().
// Fixes from this article: pinMode, INPUT_PULLUP, ==, millis, debounce.
const int BUTTON = 2; // button between pin 2 and GND
const int LED = 8; // LED + 220 ohm resistor to GND
const int BLINK_LED = 13; // built-in LED
bool ledOn = false;
int lastReading = HIGH;
unsigned long lastChange = 0; // unsigned long for millis(), never int
unsigned long lastBlink = 0;
void setup() {
Serial.begin(9600); // set the Serial Monitor to 9600 too
pinMode(BUTTON, INPUT_PULLUP); // no floating input: idle HIGH, pressed LOW
pinMode(LED, OUTPUT);
pinMode(BLINK_LED, OUTPUT);
Serial.println("Ready");
}
void loop() {
int reading = digitalRead(BUTTON);
if (reading != lastReading && millis() - lastChange > 50) { // 50 ms debounce
lastChange = millis();
lastReading = reading;
if (reading == LOW) { // == compares, a single = would assign
ledOn = !ledOn;
digitalWrite(LED, ledOn ? HIGH : LOW);
Serial.print("LED is ");
Serial.println(ledOn ? "ON" : "OFF");
}
}
if (millis() - lastBlink >= 500) { // blink without blocking the button
lastBlink = millis();
digitalWrite(BLINK_LED, !digitalRead(BLINK_LED));
}
}
توضیح بخشهای مهم
pinMode(BUTTON, INPUT_PULLUP);پین را با مقاومت داخلی به ۵ ولت میکشد تا شناور نماند. برای همین در شرط، فشرده بودن را باLOWمیسنجیم.unsigned long lastChangeزمانها را نگه میدارد. اگرintبود، بعد از حدود ۳۳ ثانیه سرریز میشد و دکمه دیگر جواب نمیداد.- شرط
millis() - lastChange > 50لرزشهای دکمه را که در چند میلیثانیهی اول پیش میآیند نادیده میگیرد. reading == LOWمقایسه است. اگر یک مساوی بنویسی، LED با هر دورloopعوض میشود.- بخش آخر با
millis()چشمک میزند، نه باdelay؛ برای همین دکمه هیچوقت «کر» نمیشود.
پیدا کردن باگ در شبیهساز
یکی از خوبیهای تمرین در شبیهساز این است که سیم شل و قطعهی خراب ندارد و ابزار عیبیابی دارد. در شبیهساز تینکرکد فارسی دکمهی «چرا کار نمیکند؟» (دکتر مدار) کد و سیمکشی را با هم بررسی میکند و به فارسی میگوید پایهای وصل نیست، LED مقاومت ندارد، اتصال کوتاه داری یا کد با پینی کار میکند که قطعه به آن وصل نیست؛ یعنی همان علتهای ۱ تا ۳ این فهرست. اگر نشانگر را روی یک ردیف ببری، قطعهی مربوط در مدار پررنگ میشود. توضیح کاملش در معرفی عیبیاب مدار آمده است.
برای اشکالهای منطقی (علتهای ۵، ۶، ۱۲ و ۱۳) ابزار بهتر دیباگر قدمبهقدم است: کنار یک خط نقطهی توقف بگذار، اجرا را بزن و وقتی برنامه همانجا ایستاد، مقدار متغیرها را ببین. اگر برنامه هیچوقت به آن خط نرسید، شرطت غلط است. برای ورودی شناور هم نمودار سریال عالی است: مقدار پین شناور را به شکل یک خط پرنویز و لرزان میبینی. همهی این ابزارها با آردوینو اونو و نانو رایگاناند. مدار دکمه و LED بهصورت آماده هست: پروژهی «دکمه + LED»، و درس خواندن دکمه با آردوینو pull-up را با تمرین یاد میدهد.
INPUT_PULLUP را به INPUT تغییر بده و دکمه را جدا کن. حالا در نمودار سریال ببین ورودی شناور چه شکلی است، بعد درستش کن.روش کلی: کوچک کن، چاپ کن، نصف کن
وقتی هیچکدام از علتهای بالا نبود، برنامه را تکهتکه امتحان کن. اول فقط بخش LED را نگه دار و بقیه را کامنت کن؛ اگر کار کرد، بخش بعدی را برگردان. جاهای حساس Serial.println بگذار تا ببینی برنامه از کدام مسیر رد میشود و متغیرها چه مقداری دارند. اگر برنامه بلند است، نصفش را غیرفعال کن و ببین مشکل در کدام نیمه است؛ چند بار نصف کردن، باگ را به چند خط محدود میکند. روش کامل کار با سریال در سریال مانیتور و نمودار سریال و کار با نقطهی توقف در دیباگ کد آردوینو در شبیهساز آمده است.
چکلیست سریع
- شمارهی پینها در کد و سیمکشی یکی است؟
- همهی GNDها به هم وصلاند؟
- برای هر خروجی
pinModeنوشتهای؟ ورودیها pull-up دارند؟ - در شرطها
==است و بعد ازifسمیکالن نیست؟ delayطولانی جلوی خواندن ورودیها را نگرفته؟- سرعت سریال مانیتور با
Serial.beginیکی است؟ - زمانها
unsigned longهستند؟ - موتورها منبع جدا دارند؟
اگر کدت هنوز کامپایل نمیشود، معنی ارورهای آردوینو را ببین. پروژههای آمادهی بیشتر برای تمرین در صفحهی آردوینو جمع شدهاند.
مدار دکمه و LED را در تینکرکد فارسی باز کن 🔧سؤالهای رایج
کد آردوینو بدون خطا آپلود میشود ولی هیچ اتفاقی نمیافتد؛ اول چه چیزی را چک کنم؟
اول مثال Blink را آپلود کن تا مطمئن شوی برد سالم است. بعد یک Serial.println در اول setup بگذار تا ببینی برنامه اجرا میشود یا نه. اگر هر دو درست بود، شمارهی پین در کد را با سیمکشی مقایسه کن؛ بیشتر مشکلها همینجا پیدا میشوند.
چرا دکمهی آردوینو بدون فشار دادن هم روشن و خاموش میشود؟
پین ورودی شناور است و نویز را میخواند. pinMode را INPUT_PULLUP کن و دکمه را بین پین و GND بگذار؛ در این حالت دکمهی فشرده LOW خوانده میشود.
چرا وقتی سروو یا موتور حرکت میکند آردوینو ریست میشود؟
موتور جریان زیادی میکشد و ولتاژ ۵ ولت برد افت میکند. موتور را با منبع جدا تغذیه کن و فقط GND منبع را به GND آردوینو وصل کن.
مقالههای مرتبط
ارورهای رایج آردوینو و معنیشان: از was not declared in this scope تا avrdude
سریال مانیتور و نمودار سریال آردوینو در شبیهساز آنلاین
دیباگ قدمبهقدم کد آردوینو در شبیهساز آنلاین: بریکپوینت و دیدن متغیرها
ESP32 یا ESP8266؟ مقایسهی کامل دو برد وایفای و راهنمای انتخاب
همهی آموزشهای برنامهنویسی و عیبیابی آردوینو ← · همهی مقالهها