في هذه الوحدة سنتعلم كيفية قراءة الإشارات القادمة إلى Arduino، والتحكم في المخرجات، ومراقبة القيم أثناء تشغيل البرنامج.
بنهاية الوحدة، يُتوقع القدرة على:
digitalRead() و digitalWrite().INPUT و INPUT_PULLUP.analogRead().analogWrite().نتعامل مع منافذ Arduino بأربع عمليات أساسية:
Digital Input قراءة HIGH أو LOW.
Digital Output إخراج HIGH أو LOW.
Analog Input قراءة قيمة من 0 إلى 1023.
PWM Output إخراج قيمة من 0 إلى 255.
خلال الوحدة سنستخدم Serial Monitor لمشاهدة القراءات أثناء تشغيل البرنامج.
Serial Monitor أداة داخل Arduino IDE تعرض البيانات التي يرسلها Arduino إلى الكمبيوتر عبر USB.
نستخدمها من أجل:

نبدأ الاتصال داخل setup():
Serial.begin(9600);
ونرسل البيانات باستخدام:
Serial.print();
Serial.println();
مثال:
void setup()
{
Serial.begin(9600);
}
void loop()
{
Serial.println("Arduino is running");
delay(1000);
}
يجب أن تكون سرعة Serial Monitor:
9600 baudشغّل المثال السابق وافتح Serial Monitor.
المطلوب:
Hello Arduino
عندما نريد من Arduino إرسال إشارة من المنفذ نهيئ المنفذ كـ:
pinMode(8, OUTPUT);
ثم نستخدم:
digitalWrite();
عند كتابة:
digitalWrite(8, HIGH);
يعطي المنفذ مستوى مرتفعًا يقارب:
5V
أما:
digitalWrite(8, LOW);
فيعطي مستوى منخفضًا يقارب:
0V
بشكل مبسط:
OUTPUT + HIGH → Arduino يرسل HIGH
OUTPUT + LOW → Arduino يرسل LOWالتوصيل:
D8 → مقاومة 220Ω → LED → GND
الكود:
const int ledPin = 8;
void setup()
{
pinMode(ledPin, OUTPUT);
}
void loop()
{
digitalWrite(ledPin, HIGH);
delay(1000);
digitalWrite(ledPin, LOW);
delay(1000);
}
النتيجة:
HIGH → LED تعمل
LOW → LED تنطفئ
عندما نريد من Arduino قراءة إشارة قادمة إلى المنفذ نستخدم:
pinMode(2, INPUT);
في وضع INPUT لا يخرج Arduino جهدًا من المنفذ، بل يقرأ المستوى الكهربائي الموجود عليه.
نستخدم:
digitalRead(2);
والنتيجة تكون:
HIGH → 1
LOW → 0
الفرق الأساسي:
OUTPUT → Arduino يرسل إشارة
INPUT → Arduino يستقبل ويقرأ إشارةنقرأ المنفذ D2 ونعرض النتيجة في Serial Monitor:
const int inputPin = 2;
void setup()
{
Serial.begin(9600);
pinMode(inputPin, INPUT);
}
void loop()
{
int value = digitalRead(inputPin);
Serial.println(value);
delay(100);
}
جرّب:
D2 → 5V
النتيجة:
HIGH → 1
ثم:
D2 → GND
النتيجة:
LOW → 0

نريد أن تكون قراءة الزر:
غير مضغوط → HIGH
مضغوط → LOW
نستخدم مقاومة:
10kΩ
التوصيل:
5V → مقاومة 10kΩ → D2
|
زر
|
GND
تسمى هذه المقاومة:
Pull-up Resistor

يصل D2 إلى 5V عبر المقاومة:
5V → 10kΩ → D2
فتكون القراءة:
HIGH
يتصل D2 مع GND:
D2 → Button → GND
فتصبح القراءة:
LOW
إذن:
Released → HIGH
Pressed → LOW
المقاومة أيضًا تمنع وجود اتصال مباشر بين 5V و GND عند الضغط.
const int buttonPin = 2;
void setup()
{
Serial.begin(9600);
pinMode(buttonPin, INPUT);
}
void loop()
{
int buttonState = digitalRead(buttonPin);
if (buttonState == LOW)
{
Serial.println("Pressed");
}
else
{
Serial.println("Released");
}
delay(100);
}
النتيجة:
Released → HIGH
Pressed → LOWفي المثال السابق استخدمنا مقاومة Pull-up خارجية بقيمة 10kΩ.
Arduino يحتوي على مقاومة Pull-up داخلية يمكن تشغيلها برمجيًا:
pinMode(2, INPUT_PULLUP);
عند استخدامها نحذف المقاومة الخارجية.
التوصيل يصبح:
D2 → Pushbutton → GND
وتبقى القراءة:
Released → HIGH
Pressed → LOW
pinMode(2, INPUT);
التوصيل:
5V → 10kΩ → D2
|
زر
|
GND
pinMode(2, INPUT_PULLUP);
التوصيل:
D2 → زر → GND
في الحالتين:
Released → HIGH
Pressed → LOW
الفرق:
INPUT
→ مقاومة Pull-up خارج Arduino
INPUT_PULLUP
→ مقاومة Pull-up داخل Arduinoالتوصيل:
Pushbutton:
D2 → Button → GND
LED:
D8 → 220Ω → LED → GND
الكود:
const int buttonPin = 2;
const int ledPin = 8;
void setup()
{
pinMode(buttonPin, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
}
void loop()
{
if (digitalRead(buttonPin) == LOW)
{
digitalWrite(ledPin, HIGH);
}
else
{
digitalWrite(ledPin, LOW);
}
}
النتيجة:
ضغط الزر → LED تعمل
ترك الزر → LED تنطفئ
أحيانًا نريد أن تنفذ كل ضغطة أمرًا واحدًا فقط:
الضغطة الأولى → ON
الضغطة الثانية → OFF
الضغطة الثالثة → ON
نستخدم متغيرًا لحفظ الحالة:
bool ledState = false;
وعند الضغط:
ledState = !ledState;
الكود:
const int buttonPin = 2;
const int ledPin = 8;
bool ledState = false;
void setup()
{
pinMode(buttonPin, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
}
void loop()
{
if (digitalRead(buttonPin) == LOW)
{
delay(30);
if (digitalRead(buttonPin) == LOW)
{
ledState = !ledState;
digitalWrite(ledPin, ledState);
while (digitalRead(buttonPin) == LOW)
{
}
delay(30);
}
}
}
في هذا المثال:
delay(30)
→ يعطي الزر وقتًا للاستقرار
while()
→ ينتظر حتى يترك المستخدم الزراستخدم زرًا وLEDين.
المطلوب:
في البداية:
LED 1 → ON
LED 2 → OFF
عند كل ضغطة على الزر تتبدل الحالتان:
الضغطة الأولى:
LED 1 → OFF
LED 2 → ON
الضغطة الثانية:
LED 1 → ON
LED 2 → OFF
استخدم:
INPUT_PULLUP
وانتظر تحرير الزر قبل قبول ضغطة جديدة.
المدخل الرقمي يقرأ حالتين:
HIGH أو LOW
أما المدخل التناظري فيقرأ مستوى جهد متغير.
في Arduino UNO توجد المنافذ:
A0 → A5
ونستخدم:
analogRead(pin);
وتكون القراءة:
0 → 1023
تقريبًا:
0V → 0
5V → 1023
Potentiometer مقاومة متغيرة لها ثلاثة أطراف.
يمكن استخدامها لإنتاج جهد متغير يقرأه Arduino.
التوصيل:
الطرف الأول → 5V
الطرف الأوسط → A0
الطرف الثالث → GND
عند تدوير Potentiometer يتغير الجهد على A0.

const int potPin = A0;
void setup()
{
Serial.begin(9600);
pinMode(potPin, INPUT);
}
void loop()
{
int value = analogRead(potPin);
Serial.println(value);
delay(100);
}
أدر Potentiometer ولاحظ تغير القراءة:
0 → 1023
في Serial Monitor.
استخدم:
A0.المطلوب:
0 إلى 340
→ LED الحمراء تعمل
341 إلى 680
→ LED الخضراء تعمل
681 إلى 1023
→ LED الزرقاء تعمل
يجب أن تعمل LED واحدة فقط في كل مرة.
اعرض قيمة Potentiometer أيضًا في Serial Monitor.
Arduino UNO يستطيع قراءة جهد تناظري باستخدام:
analogRead();
لأنه يحتوي على:
ADC — Analog to Digital Converter
لكن Arduino UNO لا يحتوي على DAC لإنتاج جهد تناظري حقيقي من المنافذ العادية.
لذلك يستخدم تقنية:
PWM — Pulse Width Modulation
في PWM يتغير المنفذ بسرعة بين:
0V و 5V
كلما بقي المنفذ في حالة HIGH مدة أطول، زاد التأثير المتوسط.
مثال:
PWM منخفض → LED خافتة
PWM مرتفع → LED أكثر سطوعًا
نستخدم:
analogWrite(pin, value);
والقيمة تكون:
0 → 255
منافذ PWM في Arduino UNO:
3, 5, 6, 9, 10, 11التوصيل:
D9 → مقاومة 220Ω → LED → GND
الكود:
const int ledPin = 9;
void setup()
{
pinMode(ledPin, OUTPUT);
}
void loop()
{
analogWrite(ledPin, 64);
delay(1000);
analogWrite(ledPin, 128);
delay(1000);
analogWrite(ledPin, 192);
delay(1000);
analogWrite(ledPin, 255);
delay(1000);
analogWrite(ledPin, 0);
delay(1000);
}
لاحظ تغير سطوع LED مع تغير قيمة PWM.

analogRead() تعطينا:
0 → 1023
بينما analogWrite() تستخدم:
0 → 255
نحوّل القيمة باستخدام:
pwmValue = potValue / 4;
الكود:
const int potPin = A0;
const int ledPin = 9;
void setup()
{
Serial.begin(9600);
pinMode(potPin, INPUT);
pinMode(ledPin, OUTPUT);
}
void loop()
{
int potValue = analogRead(potPin);
int pwmValue = potValue / 4;
analogWrite(ledPin, pwmValue);
Serial.print("Analog = ");
Serial.print(potValue);
Serial.print(" PWM = ");
Serial.println(pwmValue);
delay(50);
}
النتيجة:
تدوير Potentiometer
↓
تتغير analogRead()
↓
تتغير قيمة PWM
↓
يتغير سطوع LED
استخدم:
D12.المطلوب:
عندما يكون النظام في حالة:
ON
يتحكم Potentiometer في سطوع LED.
كل ضغطة على الزر تغير حالة النظام:
الضغطة الأولى → OFF
الضغطة الثانية → ON
الضغطة الثالثة → OFF
...
عندما تكون الحالة:
OFF
تبقى LED مطفأة مهما كانت قيمة Potentiometer.
استخدم الزر على المنفذ D12 مع:
INPUT_PULLUP
وانتظر تحرير الزر باستخدام:
while()
اعرض في Serial Monitor مثلًا:
Analog = 700
PWM = 175
LED = ON
أو:
Analog = 700
PWM = 0
LED = OFFتعلمنا في هذه الوحدة:
OUTPUT و digitalWrite().INPUT و digitalRead().INPUT_PULLUP.analogRead().analogWrite().في الوحدة القادمة سنتعلم كيف نستخدم هذه الأساسيات للتعامل مع مكونات وحساسات مختلفة، وكيف نستفيد من المكتبات البرمجية والأمثلة الجاهزة.