Θέλουμε να υλοποιήσουμε ένα φανάρι (αυτοκινήτων κ πεζών) το οποίο θα δουλεύει με συγκεκριμένο χρονισμό. Σε επόμενο μάθημα θα προσθέσουμε ένα κουμπί για τους πεζούς.
H λογική με την οποία δουλεύει το φανάρι μας:
To φανάρι των οχημάτων μένει πράσινο για 5 δευτερόλεπτα.
Έπειτα γίνεται πορτοκαλί για 2 δευτερόλεπτα και στη συνέχεια κόκκινο.
Όσο το φανάρι των οχημάτων είναι πράσινο ή πορτοκαλί, τότε το φανάρι των πεζών είναι κόκκινο.
Τρία δευτερόλεπτα αφότου γίνει κόκκινο το φανάρι των οχημάτων, ανάβει πράσινο για τους πεζούς και διαρκεί 5 δευτερόλεπτα.
Τρία δευτερόλεπτα αφότου γίνει κόκκινο το φανάρι των πεζών, ανάβει πράσινο για τα οχήματα.
BHMA 1
Αρχικά δηλώνουμε μεταβλητές (ονόματα) για τα pins στα οποία συνδέουμε τα leds.
Αν θέλουμε να χρησιμοποιήσουμε διαφορετικά pins, αλλάζουμε τις πιο κάτω δηλώσεις.
int gLed = 10; // green - πράσινο led
int yLed = ...; // yellow - κίτρινο led
int rLed = ...; // red - κόκκινο led
int grigoris = ...; // πράσινο πεζών
int stamatis = ...; // κόκκινο πεζών
ΕΡΩΤΗΣΗ 1: Πως διαλέγουμε ονόματα για τα pins?
ΕΡΩΤΗΣΗ 2: Γιατί είναι καλό να χρησιμοποιούμε μεταβλητές (ονόματα) για τα pins?
ΕΡΩΤΗΣΗ 3 (for geeks): Τι σημαίνει η λέξη int?
BHMA 2
Μέσα στη setup() πρέπει να ορίσουμε αν τα παραπάνω pins θα δουλεύουν σαν είσοδος ή σαν έξοδος.
void setup()
{
pinMode(gLed, OUTPUT);
..............
..............
}
BHMA 3
Ένα δεύτερο πράγμα που κάνουμε στη setup() είναι να ορίζουμε την αρχική κατάσταση.
Ποια led θα είναι αναμμένα και ποια θα είναι σβηστα.
Εμείς αρχικά θέλουμε οι πεζοί να έχουν κόκκινο και τα αυτοκίνητα πράσινο.
void setup()
{
pinMode(gLed, OUTPUT);
..............
..............
digitalWrite(grigoris, LOW);
digitalWrite(stamatis, HIGH);
..............
..............
}
BHMA 4
Μέσα στην loop() γράφουμε τον κώδικα για τον χρονισμό του φαναριού.
void loop()
{
// πράσινο για οχήματα (κόκκινο για πεζούς) για 5 sec
digitalWrite(gLed, HIGH);
digitalWrite(yLed, LOW);
digitalWrite(rLed, LOW);
digitalWrite(stamatis, HIGH);
digitalWrite(grigoris, LOW);
delay(5000);
// πορτοκαλί για οχήματα (κόκκινο για πεζούς) για 2 sec
.........
.........
delay(2000);
// κόκκινο για οχήματα (κόκκινο για πεζούς) για 3 sec
..........
..........
// πράσινο για πεζούς (κόκκινο για οχήματα), για 5 sec
..............
..............
// κόκκινο για πεζούς (και για οχήματα) για 3 sec
..............
..............
}
BHMA 5
Μπορούμε να φτιάξουμε ομάδες εντολών και να τους δώσουμε ένα όνομα.
Κάθε τέτοια ομάδα εντολών κάνει μια συγκεκριμένη, ολοκληρωμένη δουλειά.
Για παράδειγμα, η ομάδα εντολών prasino() περιέχει τις εντολές που χρειάζονται ώστε να είναι πράσινο το φανάρι των οχημάτων, κόκκινο των πεζών, για 5 sec.
void prasino()
{
digitalWrite(gLed, HIGH);
digitalWrite(yLed, LOW);
digitalWrite(rLed, LOW);
digitalWrite(stamatis, HIGH);
digitalWrite(grigoris, LOW);
delay(5000);
}
Η ομάδα εντολών portokali() περιέχει τις εντολές που χρειάζονται ώστε να ανάψει πορτοκαλί για τα οχήματα, κόκκινο για τους πεζούς, για 2 sec.
void portokali()
{
digitalWrite(gLed, LOW);
digitalWrite(yLed, HIGH);
digitalWrite(rLed, LOW);
digitalWrite(stamatis, HIGH);
digitalWrite(grigoris, LOW);
delay(2000);
}
Η ομάδα εντολών kokkino() περιέχει τις εντολές που χρειάζονται ώστε να ανάψει κόκκινο για τα οχήματα και μετά από 3 sec πράσινο για τους πεζούς για 5 sec.
void kokkino()
{
.........
.........
}
H ομάδα εντολών kokkinoAll() περιέχει τις εντολές ώστε και τα οχήματα και οι πεζοί να έχουν κόκκινο για 3 δευτερόλεπτα.
void kokkinoAll()
{
........
........
}
BHMA 6
Για να χρησιμοποιήσουμε αυτές τις ομάδες εντολών μέσα στο πρόγραμμά μας, απλά αναφέρουμε το όνομά τους μέσα στην loop() στο σημείο όπου θέλουμε να εκτελεστεί ο κώδικάς τους.
void loop()
{
prasino();
portokali();
...............
...............
}