Οι μικροελεγκτές όπως το Arduino UNO διαθέτουν εξόδου PWM (Pulse Width Modulation – Διαμόρφωση Εύρους Παλμού). Είναι μια τεχνική ελέγχου της ισχύος, που «ανοιγοκλείνει» την παροχή ρεύματος με μεγάλη ταχύτητα. Ρυθμίζοντας το πόση ώρα το σήμα παραμένει «ανοιχτό» (On) σε σχέση με το «κλειστό» (Off), μπορούμε να προσομοιώσουμε διαφορετικά επίπεδα τάσης για να ελέγξουμε την ένταση ενός LED ή την ταχύτητα ενός μοτέρ.
Όσο μεγαλύτερος είναι ο «κύκλος λειτουργίας» (duty cycle), τόσο περισσότερη ενέργεια λαμβάνει η συσκευή, κάνοντας το LED να φέγγει δυνατότερα ή το μοτέρ να γυρνά ταχύτερα. Το Arduino IDE έχει ενσωματωμένη συνάρτηση “analogWrite()” η οποία μπορεί να χρησιμοποιηθεί για τη δημιουργία ενός σήματος PWM. Η συχνότητα αυτού του παραγόμενου σήματος για τις περισσότερες ακίδες θα είναι περίπου 490Hz και μπορούμε να δώσουμε την τιμή από 0-255 χρησιμοποιώντας αυτήν τη συνάρτηση. analogWrite(0) σημαίνει σήμα κύκλου λειτουργίας 0%. analogWrite(127) σημαίνει σήμα κύκλου λειτουργίας 50%. analogWrite(255) σημαίνει σήμα κύκλου λειτουργίας 100%.
Στο Arduino Uno, οι ακίδες PWM είναι 3, 5, 6, 9, 10 και 11. Η συχνότητα του σήματος PWM στις ακίδες 5 και 6 θα είναι περίπου 980Hz και στις άλλες ακίδες θα είναι 490Hz. Οι ακίδες PWM επισημαίνονται με το σύμβολο ~.
Στο σημερινό μάθημα θα φτιάξουμε ένα κύκλωμα και θα γράψουμε τον κώδικα για μία εφαρμογή που γυρνώντας το ποτενσιόμετρο θα χαμηλώνει η θα αυξάνει την ένταση της φωτεινότητας του LED.
Υλικά που θα χρειαστούμε
Το Arduino UNO, LED, breadboard, καλώδια, ποτενσιόμετρο 10Κ, αντίσταση 220Ωμ
Το κύκλωμα μας

Γράφουμε τον κώδικα
// Ορισμός των Pins
int led_pin = 6; // Το Pin 6 υποστηρίζει PWM (σημαντικό για το analogWrite)
int pot_pin = A0; // Η αναλογική είσοδος όπου συνδέεται το ποτενσιόμετρο
int output; // Μεταβλητή για την αποθήκευση της ακατέργαστης τιμής εισόδου
int led_value; // Μεταβλητή για την τελική τιμή που θα στείλουμε στο LED
void setup() {
// Ρύθμιση του led_pin ως εξόδου
pinMode(led_pin, OUTPUT);
}
void loop() {
// Ανάγνωση από το ποτενσιόμετρο:
// Η τιμή 'output' θα είναι από 0 έως 1023 (λόγω του ADC 10-bit του Arduino)
output = analogRead(pot_pin);
// Αντιστοίχιση (Mapping) των τιμών:
// Μετατρέπουμε το εύρος 0-1023 (είσοδος) στο εύρος 0-255 (έξοδος),
// καθώς η συνάρτηση analogWrite δέχεται τιμές μόνο έως 8-bit (0-255).
led_value = map(output, 0, 1023, 0, 255);
// Αποστολή της τιμής στο LED για τη ρύθμιση της φωτεινότητας
analogWrite(led_pin, led_value);
// Μικρή καθυστέρηση 1ms για τη σταθερότητα του ADC
delay(1);
}
Μερικές χρήσιμες παρατηρήσεις:
- Γιατί map; Το Arduino διαβάζει την τάση από το ποτενσιόμετρο με ανάλυση 10-bit (210=1024 βήματα), αλλά “γράφει” PWM σήμα με ανάλυση 8-bit (28=256 βήματα). Η map εξασφαλίζει ότι όταν το ποτενσιόμετρο είναι στη μέση (512), το LED θα είναι επίσης στη μέση της φωτεινότητάς του (~127).
- PWM Pins: Βεβαιώσου ότι το LED σου είναι όντως στο pin 6 (ή σε κάποιο άλλο με το σύμβολο ~), αλλιώς το analogWrite θα δουλεύει απλά ως ON/OFF αντί για αυξομείωση φωτεινότητας.
