Arduino project απο την αρχή εώς το τέλος, Μέρος 3ο
Σε αυτό το μέρος χτίζω βήμα-βήμα τον κώδικα για τον έλεγχο του RGB led χρησιμοποιώντας ώς βάση τα προγράμματα AnalogReadSerial (http://arduino.cc/en/Tutorial/AnalogReadSerial) και Fade (http://arduino.cc/en/Tutorial/Fade).
Επίσης περιγράφω αναλυτικά τη λειτουργία κάθε γραμμής κώδικα, ορθές πρακτικές προγραμματισμού και τη χρησιμότητα των σχολίων (comments).
Ο πλήρης κώδικας, καθαρογραμμένος και σχολιασμένος:
/* Το παρακάτω πρόγραμμα ελέγχει ένα RGB led, δηλαδή εναλλάσει όλα τα χρώματα μέσω ενός ποτενσιόμετρου Κάθε θέση του ποτενσιόμετρου αντιστοιχεί και σε διαφορετικό χρώμα. Αυτό επιτυγχάνεται αυξομειόνοντας την φωτεινότητα του κάθενός απο τα τρία βασικά χρώματα του RGB led χρησιμοποιόντας τη μέθοδο PWM Το κάθε βασικό χρώμα μπορεί να ρυθμιστεί σε 10 διαφορετικά επίπεδα φωτεινότητας επομένως το led μπορεί να παράξει 10x10x10 = 1000 διαφορετικά χρώματα Ο δρομέας του ποτενσιόμετρου συνδέεται στο pin A0 του Arduino, ενώ οι έξοδοι PWM για τα τρία χρώματα δίνονται στα pin 9,10 και 11. */ void setup() {} void loop() { long sensorValue = (analogRead(A0)); /* μετατρέπει την αναλογική έξοδο του ποτενσιόμετρου (0-5 Volt) σε έναν αριθμό απο 0-1023 και τον αποθηκεύει στη μεταβλητή "sensorValue"*/ sensorValue = (sensorValue*999/1023); /* μετατρέπει το εύρος του περιεχομένου της μεταβλητής sensorValue απο 0 εώς 1023 σε 0 εώς 999 και το αποθηκεύει πάλι στη sensorValue. Η μεταβλητή ορίστηκε ώς long γιατι το αποτέλεσμα των ενδιάμεσων μαθηματικών πράξεων ξεπερνά τα όρια του datatype int*/ int RED = (sensorValue / 100); /* ορίζει τη μεταβλητή "RED" και της δίνει την τιμή sensorValue / 100. Καθώς η μεταβλητή sensorValue είναι ακέραια τιμή, το αποτέλεσμα της διαίρεσης με το 100 θα είναι επίσης ακέραιο, επομένως στη μεταβλητή RED θα αποθηκευτεί το πηλίκο της ευκλείδιας διαίρεσης. Πχ 832/100 = 8 */ RED = (RED * 255 / 9); //Αλλάζει το εύρος της RED απο 0-9 σε 0-255 int GREEN = ((sensorValue % 100) / 10); /*Παίρνει το υπόλοιπο της διαίρεσης sensorValue δια 100 και στη συνέχεια παίρνει το πηλίκο του αποτελεσματος δια το 10 Πχ 832 % 100 = 32. Μετά, 32 / 10 = 3. Ο αριθμός 3 είναι που αποθηκεύεται στη GREEN */ GREEN = (GREEN * 255 / 9); //Αλλάζει το εύρος του GREEN απο 0-9 σε 0-255 int BLUE = ((sensorValue %100) % 10); /* Παίρνει το υπόλοιπο της διαίρεσης sensorValue με το 100 και στη συνέχεια το υπόλοιπο της διαίρεσης του αποτελέσματος με το 10. Πχ 832 % 100 = 32 και στη συνέχεια 32 % 10 = 2 */ BLUE = (BLUE * 255 / 9); //Αλλάζει το εύρος της BLUE απο 0-9 σε 0-255 //Οι παρακάτω τρείς γραμμές ορίζουν τα pin 9,10 και 11 ώς εξόδους PWM και το duty cycle είναι //ανάλογο με την τιμή των μεταβλητών RED, GREEN και BLUE αντίστοιχα analogWrite(9, RED); analogWrite(10, GREEN); analogWrite(11, BLUE); }