Ένα ιστολόγιο για όσους αγαπούν τις ηλεκτρονικές κατασκευές...

Πέμπτη 25 Απριλίου 2024

ARDUINO: Συγχώνευση δύο ή περισσότερων σκετς σε ένα

 Όταν κάνουμε τα πρώτα μας βήματα στον προγραμματισμό του arduino είναι πολύ φυσιολογικό και χρήσιμο να βρίσκουμε έτοιμα σκετς που έχουν φτιάξει κάποιοι άλλοι και να τα μελετάμε για να μάθουμε πως μπορούμε να κάνουμε κάποια πράγματα.
Είναι πολύ εύκολο να βρούμε έτοιμα σκετς, μέσα στην πληθώρα εφαρμογών στο ίντερνετ, που να κάνουν την μία ή την άλλη δουλειά αλλά σχεδόν απίθανο να βρούμε κάποιο που να κάνει μαζί όλες τις λειτουργίες που θέλουμε.

Πολλές φορές με έχετε ρωτήσει πως να ενώσουμε διάφορα  σκετς ώστε να λειτουργήσουν ταυτόχρονα από την ίδια υλοποίηση hardware. Στο σημερινό άρθρο θα δούμε πως γίνεται αυτό. Σε γενικές γραμμές ισχύει περίπου ότι τα πετάμε όλα μέσα σε ένα μοναδικό σκετς αλλά θα πρέπει να προσέξουμε ορισμένα πράγματα και να κάνουμε κάποιες τροποποιήσεις όπου χρειαστεί. 


Είμαι σίγουρος ότι πολλοί από εσάς που διαβάζετε τώρα το άρθρο έχετε βάλει τον κώδικα από δύο ή περισσότερα σκετς μαζί σε ένα σκετς και τελικά δεν δούλεψε τίποτε.
Αυτό συμβαίνει γιατί το σκετς του arduino πρέπει να ακολουθεί κάποιους κανόνες.

Επάνω ψηλά δηλώνουμε τις βιβλιοθήκες που θα περιλαμβάνει το σκετς (εφόσον περιλαμβάνει κάποια ή κάποιες) Στη συνέχεια ορίζουμε τις μεταβλητές και εφόσον το επιθυμούμε δηλώνουμε αρχική τιμή για αυτές. Ακολουθεί το setup() όπου βάζουμε κάποιες εντολές που θα εκτελεστούν μόνο μια φορά κατά την εκκίνηση εκτέλεσης του προγράμματος και τέλος το loop() όπου βάζουμε τις εντολές που θα εκτελούνται συνεχώς σε επανάληψη. Δεν μπορούμε να έχουμε π.χ. δύο περιοχές με κώδικα  με ονομασία loop(), επομένως δεν μπορούμε να βάλουμε τα δύο σκετς με αντιγραφή το ένα κάτω από το άλλο γιατί απλά δεν θα δουλέψει. Θα πρέπει να πάρουμε κομμάτι - κομμάτι τον κώδικα και να τον περάσουμε στο αντίστοιχο τμήμα του σκετς.

Αρχικά αντιγράφουμε τις βιβλιοθήκες του δεύτερου σκετς ακριβώς κάτω από τις βιβλιοθήκες του πρώτου. Οι κοινές βιβλιοθήκες δεν χρειάζεται να δηλωθούν δύο φορές. Άρα διαγράφουμε τις επιπλέον ίδιες βιβλιοθήκες. Θα λειτουργήσει η ίδια βιβλιοθήκη και για τα δύο επιμέρους σκετς που πρόκειται να ενωθούν. Εδώ χρειάζεται μια προσοχή οι βιβλιοθήκες να είναι πράγματι κοινές και όχι παρόμοιες. 
Ακολούθως κάνουμε αντιγραφή ότι υπάρχει ανάμεσα από τις βιβλιοθήκες και το setup() στην αντίστοιχη περιοχή το ίδιο για το περιεχόμενο του setup() και το ίδιο επίσης για το περιεχόμενο του loop(). Αν υπάρχουν και κάποιες functions (ρουτίνες) κάτω από το loop() τις μεταφέρουμε και αυτές αντίστοιχα.

Εδώ μπορούμε να κάνουμε μια δοκιμή να τρέξουμε τον κώδικα αν και έχουμε ελάχιστες πιθανότητες να λειτουργήσει σωστά. Τι μπορεί να πάει στραβά; πολλά. Το πιο πιθανό είναι τα δύο σκετς να έχουν αναθέσει κάποιες λειτουργίες σε ίδιες εξόδους. Είναι αυτονόητο ότι δεν θα λειτουργήσει και θα πρέπει να αλλαχτούν τα ποδαράκια (έξοδοι Ι/Ο ) ώστε να είναι επιφορτισμένα με μία μόνο εργασία (π.χ. να ανοίγουν κάποιο ρελέ ή να οδηγούν κάποιο φετ κλπ). Θέλει προσοχή όταν αλλάζουμε κάποια έξοδο με κάποια άλλη γιατί δεν είναι όλες ίδιες. Για παράδειγμα το arduino δεν μπορεί να βγάλει σήμα PWM σε όλες τις εξόδους. Αν μεταφέρουμε μια έξοδο που χρησιμοποιούμε PWM σε μια άλλη που δεν είναι PWM τότε φυσικά δεν θα λειτουργήσει. Επίσης οι είσοδοι είναι αναλογικές και ψηφιακές Δεν μπορούμε να αναθέσουμε την παρακολούθηση ενός αναλογικού σήματος σε μια ψηφιακή είσοδο. Αντιθέτως μια αναλογική είσοδος μπορεί να λειτουργήσει και ως ψηφιακή.

Το επόμενο που πρέπει να προσέξουμε είναι οι μεταβλητές. Δεν πρέπει να έχουμε κοινές μεταβλητές από τα δύο σκετς. Αν και είναι πιθανό να λειτουργήσει (να μην χτυπάει η μεταγλώττιση του προγράμματος), όταν τρέχει το πρόγραμμα μπορεί να μπερδεύεται και να χρησιμοποιεί την τιμή της μεταβλητής που πήρε για το άλλο κομμάτι σκετς που ενσωματώσαμε. 

Γενικώς οι αλλαγές που θα πρέπει να γίνουν σε ποδαράκια ή μεταβλητές θα πρέπει να γίνουν σε πολλά σημεία του προγράμματος οπότε χρειάζεται προσοχή για να μην ξεμείνει καμία αλλαγή. Σε αυτό βοηθάει και η αναζήτηση μέσα στο σκετς από τον editor.

Αφού φτάσουμε έως εδώ πιθανώς όλα να πάνε καλά και να λειτουργήσει το ενοποιημένο σκετς. Όμως υπάρχουν ακόμη πράγματα που μπορεί να πάνε στραβά. Μπορεί για παράδειγμα να έχουμε απεικόνιση σε LCD display. Στη χειρότερη περίπτωση μπορεί στο ένα σκετς να χρησιμοποιεί οθόνη με σύνδεση SPI και στο δεύτερο με σύνδεση I2C. Θα πρέπει να καταργήσουμε την μία οθόνη και να προσαρμόσουμε όλες τις κατάλληλες εντολές που αναφέρονται στην οθόνη από το δεύτερο σκετς. Αλλά ακόμη και αν τα δυο σκετς χρησιμοποιούν την ίδια βιβλιοθήκη και την ίδια σύνδεση της οθόνης πάλι μπορούν τα μηνύματα του ενός σκετς να επικαλύπτουν τα μηνύματα από το άλλο σκετς. Εδώ θα χρειαστεί να επέμβουμε στις εντολές Lcd.print() και να αλλάξουμε τις θέσεις που εμφανίζονται τα μηνύματα. Ενδεχομένως να χρειαστεί να αλλάξουμε και την οθόνη από 2 γραμμών σε 4 γραμμών.

Πιθανόν να προκύψουν και άλλα προβλήματα που δεν μπορώ να σκεφτώ αυτή τη στιγμή. Δοκιμάστε και διορθώστε ανάλογα.
Γράψτε μου στα σχόλια αν σας βοήθησε το συγκεκριμένο άρθρο, ή τι άλλο πήγε στραβά ώστε να το ενσωματώσουμε σε αυτό το άρθρο.

Δεν υπάρχουν σχόλια:

Δημοσίευση σχολίου

Count down timer - χρονικό αντίστροφης μέτρησης

Μια απλή κατασκευή χρονομέτρου με αντίστροφη μέτρηση. Μπορεί να μετρήσει μέχρι 100 λεπτά με βήμα του ενός δευτερολέπτου. Είναι ιδανικό για ...