marabatzis Δημοσ. 26 Οκτωβρίου 2015 Μέλος Δημοσ. 26 Οκτωβρίου 2015 original poster. Τεσπα κάνε ένα σχεδιάγραμμα του κυκλώματος και το διάγραμμα ροής του προγράμματος. Μόλις το ετοιμάσω σε μορφή που να μπορεί να δημοσιευθεί θα ανέβει αμέσως (ακόμη παραμένει σε χειρόγραφα..). Good! Λοιπόν! functions = διεργασίες/λειτουργικότητες (ας πούμε). Δες το σαν ένα ωραίο τρόπο να "ομαδοποιείς" κώδικα. Αντί να έχεις ένα τεράστιο "κείμενο" ανάμεσα στα { } της loop, μαζεύεις τον κώδικα σε "ομάδες" και καλείς αυτές τις ομάδες όποτε χρειάζεται. Π.χ., εάν θέλεις να μετράς τον χρόνο που πέρασε: unsigned long theTime; void setup() { theTime = millis(); } void loop() { boolean hasTheTimePassed; hasTheTimePassed = havePassedThatMuchTime(theTime, 20); if (hasTheTimePassed) { // Do what ever has to be done } } bool havePassedThatMuchTime(unsigned long previousTime /* In milliseconds */, unsigned int secondsToCheck /* In seconds */) { currentTime = millis(); if (currentTime < previousTime) { //Overflow, treat overflow } unsinged long timePassed = currentTime - previousTime; if ( (timePassed/1000) >= secondsToCheck ) return true; else return false; } Το καλό (για εσένα και στην προκειμένη φάση) είναι ότι μπορείς να έχεις μαζεμένη και διαχωρισμένη την λειτουργικότητα (δηλαδή, το τι γίνεται) από την λογική (δηλαδή, το πότε γίνεται). Το sketch είναι το αρχείο σου για το arduino. Εάν πας να κάνεις new file θα δεις ότι λέει "new sketch". Το sketch σου τώρα, είναι χωρισμένο σε 4 μεγάλα κομμάτια (κανονικά είναι 3, αλλά ως 4 θα το καταλάβεις πιο εύκολα). global variables declaration, αυτό είναι πάνω-πάνω, εκεί όπου δηλώνεις τις μεταβλητές σου setup function, η function setup loop function, η κύρια function του arduino. Αφού κληθεί η setup και γίνει το setup των μεταβλητών, καλείται η loop και τρέχει συνέχεια. Εάν έγραφες C, θα καταλάβαινες την "παρομοίωση" με την main. functions declaration, αυτό είναι μετά την loop όπου και εκεί γράφεις τις δικές σου functions (μπορείς να τις γράψεις και σε άλλο αρχείο, αλλά προς το παρόν δεν νομίζω να σε απασχολεί κάτι τέτοιο) Οπότε, η main του sketch σου είναι η loop... απλά δεν θυμόμουν το όνομά της... και τώρα για να το γράψω έκανα scroll up. Ευχαριστώ ειλικρινά για όλα... Δέστε δύο φωτογραφίες του πρωτότυπου, από την πλευρά των εξαρτημάτων και από την άλλη. Και να σκεφθείτε πως πρέπει να το ξαναφτιάξω σε μεγαλύτερη πλακέτα για να χωρέσει και το nano, και να βάλω δύο βατικές αντιστάσεις για τον έλεγχο του ρεύματος ξεχωριστά σε κάθε πόρτα,αν δεν βαρεθώ...
marabatzis Δημοσ. 26 Οκτωβρίου 2015 Μέλος Δημοσ. 26 Οκτωβρίου 2015 Συγνώμη για το breaboard με το nano, εκεί κάνω τις δοκιμές. Εδώ είναι η σωστή φωτογραφία... Σε ποιο ΤΕΙ είσαι? Έχω τελειώσει την ΑΣΕΤΕΜ ΣΕΛΕΤΕ πριν αρκετά χρόνια (τότε μόνο BASIC(σκέτο) και πολύ ήταν), τώρα διδάσκω σε ΕΠΑΛ, αλλά μου αρέσει και ασχολούμαι και με πρακτικά προβλήματα στον ελεύθερό μου χρόνο...
nkarama Δημοσ. 26 Οκτωβρίου 2015 Δημοσ. 26 Οκτωβρίου 2015 (επεξεργασμένο) Το ρεύμα στα μοτέρ πως το μετράς? με shunt αντίσταση? Edit: Απο ότι βέπω τώρα στο κύκλωμα της φωτο, μάλλον με shunt... που την βρήκες? Τι τάση και τι ισχύ έχουν οι κινητήρες? Επεξ/σία 26 Οκτωβρίου 2015 από nkarama
marabatzis Δημοσ. 27 Οκτωβρίου 2015 Μέλος Δημοσ. 27 Οκτωβρίου 2015 Το ρεύμα στα μοτέρ πως το μετράς? με shunt αντίσταση? Edit: Απο ότι βέπω τώρα στο κύκλωμα της φωτο, μάλλον με shunt... που την βρήκες? Τι τάση και τι ισχύ έχουν οι κινητήρες? Για το ρεύμα, βάζω σε σειρά με το μοτέρ μια αντίσταση 0,15Ω / 5W (τι που την βρήκα; δεν υπάρχουν τέοιες στα καταστήματα, εγώ την έχω ξεκολήσει απο κάτι ανακυκλωμένες πλακέτες) συνδεδεμένη πάντοτε στον αρνητικό πόλο και μετράω την πτώση τάσης πάνω της. Οι μηχανισμοί με τα μοτέρ που λειτουργούν τα μπράτσα για το άνοιγμα/κλείσιμο είναι 24V / 75W ο καθένας. Δηλαδή μέγιστο ρεύμα κατανάλωσης -δεν πρέπει ποτέ να φτάσουμε εκεί- 3Α, σε κανονικό άνοιγμα/κλείσιμο τραβάνε ο καθένας μεχρι 1,75Α. Άρα μεγιστο ρεύμα 6Α, αν βάλουμε σαν όριο ασφαλείας τα 5Α, τότε σύμφωνα με το νόμο του ΟΗΜ η πτώση τάσης πάνω στην αντίσταση V=I^2 * R 5^2 * 0,15 = 3,75 volt Υπάρχουν μηχανισμοί με 24V DC και με 220V AC. Οι DC μηχανισμοί λειτουργούν με αντιστροφή της πολικότητας της τάσης. Οι AC άν κάποιος θέλει να χρησιμοποιήσει τέτοιους έχουν τρία άκρα, ένα κοινό (οι ηλεκτρολόγοι το λένε ΕΠΙΣΤΡΟΦΗ) που το συνδέουμε στον ΟΥΔΕΤΕΡΟ, ένα για τη μιά κατέυθυνση π.χ.δεξιόστροφα και ένα για την άλλη. Οικονομικά συμφέρει να αγοράσει κανείς όλο το πακέτο, Μηχανισμούς και πλακέτα, εκτός αν βρεθεί καμμιά ευκαιρία, τότε ενημερώστε και εμένα. Η λύση που προτείνω είναι εφόσον κάποιος το έχει στημένο και του καεί η πλακέτα. Πολλοί λίγοι επισκευάζουν, οι εταιρείες δεν μπαίνουν στον κόπο, προτείνουν ΑΝΤΙΚΑΤΑΣΤΑΣΗ, αλλά και κάποιες όπως στην περίπτωσή μου δεν επισκευάζονται.
nkarama Δημοσ. 28 Οκτωβρίου 2015 Δημοσ. 28 Οκτωβρίου 2015 Δεν έχω βρεί τέτοιες στα γνωστά μαγαζιά... Θα ξαναρωτήσω... Εχω μετατρέψει σε τηλεκατευθυνόμενο ένα Powerwheels ηλεκτρικό αυτοκινητάκι της κόρης μου και θα ήθελα να γνωρίζω τι ρεύμα τραβάει ο κάθε κινητήρας ανα πάσα στιγμή αλλά την 10Α ασφάλεια την καίνε με το πρώτο απότομο άνοιγμα του γκαζιού ή μικρό εμπόδιο. Η 15Α αντέχει. Οπότε όπως καταλαβαίνεις, ψάχνω για κάτι μεγάλο (ή πολλές μαζί παράλληλα) Ερώτηση... 5W θα σου φτάσει? γιατί εγώ βλέπω 3.75χ5 ~17W... Με τον κώδικα έκανες τίποτα? Δεν είναι τίποτα φοβερό, αρκεί να θυμάσαι ότι ο κώδικας στο Arduino τρέχει μέσα σε ένα loop το οποίο θα εκτελεστεί αρκετές 100άδες χιλιάδες φορές το δευτερόλεπτο. Αν δεν θες να "μπλοκάρει" σε ένα συγκεκριμένο σημείο περιμένωντας κάτι να τελειώσει, τότε πρέπει απλά να μετράς την ώρα που το σύστημά σου εκτελεί αυτή την διαδικασία σε κάθε επανάληψη του κώδικα. Για το λόγο αυτό χρησιμοποιούμε την λογική των καταστάσεων.
marabatzis Δημοσ. 28 Οκτωβρίου 2015 Μέλος Δημοσ. 28 Οκτωβρίου 2015 Μάλλον για την αντίσταση έχεις δίκιο, πρέπει να βάλω παράλληλα δύο ή τρείς, νομίζω σε 5 και 10 watt θα υπάρχουν στο εμπόριο. Αλλιώς να τυλίξουμε κανένα πηνίο, με 1mm πηνιόσυρμα που αντέχει 15Α άνετα, αλλά χρειάζεται πολύμετρα και δοκιμές. Λοιπόν ο κώδικας είναι έτοιμος, στο breadboard λειτουργεί, μένει η δοκιμή με το κύκλωμα και σε παραγμτικές συνθήκες long blinkTimer = 0; const int blinkInterval = 15000; // μέγιστη διάρκεια ανοίγματος/κλεισίματος πορτών const int switchPin = 2; // switch is connected to pin 2 const int threshold =1020; // όριο ελέγχου ρεύματος //(1020 αντιστοιχεί στα 5V περίπου //με αντίσταση 0,15Ω ισοδυναμεί με 5,5Α) const int led1Pin = 8; // relay1 που καθορίζει την πολικότητα του ρεύματος const int led2Pin = 9; //relay2 τροφοδοτεί την 1η πόρτα const int led3Pin = 10; //relay3 τροφοδοτεί την 2η πόρτα const int led4Pin = 13; //current monitor const int analogPin = A0; // ανάγνωση της τάσης int val; // variable for reading the pin status int val2; // variable for reading the delayed status int buttonState; // variable to hold the button state int Mode = 0; //κατάσταση συστήματος void setup() { pinMode(analogPin, INPUT); // set analog pin as input pinMode(switchPin, INPUT); // Set the switch pin as input pinMode(led1Pin, OUTPUT); // set led1 pin as output pinMode(led2Pin, OUTPUT); // set led1 pin as output pinMode(led3Pin, OUTPUT); // set led2 pin as output pinMode(led4Pin, OUTPUT); // set led3 pin as output buttonState = digitalRead(switchPin); // read the initial state } void loop() { val = digitalRead(switchPin); // read input value and store it in val delay(50); // 10 milliseconds is a good amount of time val2 = digitalRead(switchPin); // read the input again to check for bounces if (val == val2) { // make sure we got 2 consistant readings! if (val != buttonState) { // the button state has changed! if (val == LOW) { // check if the button is pressed if (Mode == 0) { Mode = 1; } else { if (Mode == 1) { Mode = 2; blinkTimer = millis(); } else { if (Mode == 2) { Mode = 3; } else { if (Mode == 3) { Mode = 0; blinkTimer = millis(); } } } } } } buttonState = val; // save the new state in our variable } // Now do whatever the lightMode indicates if (Mode == 3) { // σταμάτημα κλεισίματος των ποτρών με το μπουτόν ή λόγω αύξησης ρεύματος digitalWrite(led1Pin, LOW); digitalWrite(led2Pin, LOW); digitalWrite(led3Pin, LOW); } if (Mode == 0) { //έναρξη ανοίγματος των πορτών digitalWrite(led1Pin, HIGH); digitalWrite(led2Pin, HIGH); if (millis() - blinkTimer >= blinkInterval/10) //delay 1 sec // καθυστέρηση ανοίγματος της δεύτερης πόρτας σε σχέση με την πρώτη πόρτα { digitalWrite(led3Pin, HIGH); } if (millis() - blinkTimer >= blinkInterval) //delay 10 sec // χρόνος που το σύστημα απενεργοποιείται αφου ολοκληρωθεί το άνοιγμα { digitalWrite(led1Pin, LOW); digitalWrite(led2Pin, LOW); digitalWrite(led3Pin, LOW); Mode = 1; } } if (Mode == 1) { //σταμάτημα ανοίγματος των πορτών με το μπουτόν ή λόγω αύξησης ρεύματος digitalWrite(led1Pin, LOW); digitalWrite(led2Pin, LOW); digitalWrite(led3Pin, LOW); } if (Mode == 2) { //έναρξη κλεισίματος των πορτών digitalWrite(led1Pin, LOW); digitalWrite(led3Pin, HIGH); if (millis() - blinkTimer >= blinkInterval/10) //delay 1sec // χρόνος που καθυστερεί να κλείσει η πρώτη πόρτα σε σχέση με τη δεύτερη { digitalWrite(led2Pin, HIGH); } if (millis() - blinkTimer >= blinkInterval) //delay 10sec //χρόνος μετά απο τον οποίο το σύστημα θα απενεργοποιηθεί αφου θα έχει ολοκληρωθεί το κλείσιμο { digitalWrite(led1Pin, LOW); digitalWrite(led3Pin, LOW); digitalWrite(led2Pin, LOW); Mode = 3; //stop door } } { int analogValue = analogRead(analogPin); //read analog pin if (analogValue > threshold) //σύγκριση της τάσης { digitalWrite(led4Pin, HIGH); if (Mode == 2) Mode = 3; if (Mode == 0) Mode = 1; } } } Σίγουρα μπορεί να γίνει καλύτερος, αλλά αφού λειτουργεί είμαι ικανοποιημένος...
nkarama Δημοσ. 28 Οκτωβρίου 2015 Δημοσ. 28 Οκτωβρίου 2015 Συγχαρητήρια! Φαντάζομαι ότι θα χρησιμοποιηθεί κάποιου είδους τηλεκοντρόλ, οπότε δεν θα χρειάζεσε το debouncing του διακόπτη που έχεις τώρα στον κώδικα. Ποιον συνδιασμό δέκτη/πομπού στα 433MHz σκέφτεσαι να χρησιμοποιήσεις? Edit: Κάνε την μεταβλητή blinkTimer τύπου unsigned long και όχι long. Διαφορετικά όταν το millis() θα είναι αρκετά μεγάλο, το πρόγραμμά σου δεν θα δουλεύει σωστά.
marabatzis Δημοσ. 29 Οκτωβρίου 2015 Μέλος Δημοσ. 29 Οκτωβρίου 2015 Ευχαριστώ, για το millis, δεν γίνεται με κάποιο τρόπο να μηδενίζει η τιμή του; Το χαλασμένο σύστημα είχε εξωτερικό τηλεχειρισμό 24V με τηλεκοντρόλ, δες την νέα φωτογραφία με την τελική δοκιμή στον πάγκο.Τον έλεγχο ρεύματος δεν έχω συνδέσει ακόμη...αλλά αυτό θα γίνει σε πραγματικές συνθήκες.
nkarama Δημοσ. 30 Οκτωβρίου 2015 Δημοσ. 30 Οκτωβρίου 2015 Ευχαριστώ, για το millis, δεν γίνεται με κάποιο τρόπο να μηδενίζει η τιμή του; Κάτι θα υπάρχει αλλά δεν το ξέρω. Δεν το έχω χρειαστεί. Αλλά γιατί να το κάνεις? Ολα τα διαστήματα που μετράς, είναι πολύ κοντά το ένα στο άλλο π 2 δευτερόλεπτα ή 20 δευτερόλεπτα. Δεν θα έχεις πρόβλημα με το rollover του millis() αρκεί η μεταβητές σου να είναι unsigned long. Εκεί που θα είχες πρόβλημα θα ήταν αν είχες να μετρήσεις διαστήματα μεγαλύτερα των 49 ημερών. Χρειάζεσαι να είναι unsigned long λόγω του τρόπου που αποθηκεύονται οι long αριθμοί στην μνήμη. Αν είναι signed το πρώτο bit απο τα 32 δείχνει το πρόσημο. Αν είναι unsigned, όλα τα bit χρησιμοποιούνται για να αποθηκεύσουν την τιμή της μεταβλητής. Αρα όταν το millis() θα επιστρέψει έναν μεγάλο αριθμό που το πρώτο του bit θα είναι 1, αν εσύ το αποθηκεύσεις σε μια signed μεταβλητή, τότε η τιμή της μεταβλητής θα εμφανίσει έναν άσχετο αρνητικό αριθμό.
groot Δημοσ. 30 Οκτωβρίου 2015 Δημοσ. 30 Οκτωβρίου 2015 Κάτι θα υπάρχει αλλά δεν το ξέρω. Δεν το έχω χρειαστεί. Αλλά γιατί να το κάνεις? Ολα τα διαστήματα που μετράς, είναι πολύ κοντά το ένα στο άλλο π 2 δευτερόλεπτα ή 20 δευτερόλεπτα. Δεν θα έχεις πρόβλημα με το rollover του millis() αρκεί η μεταβητές σου να είναι unsigned long. Εκεί που θα είχες πρόβλημα θα ήταν αν είχες να μετρήσεις διαστήματα μεγαλύτερα των 49 ημερών. Χμμμ... όχι. Έχεις καταλάβει λάθος τι διάβασες για την mills. Προς OP. 1) Η millis σου επιστρέφει πόσα milliseconds είναι ανοιχτό το arduino σου. Δηλαδή, κάθε φορά που εσύ θα καλέσεις την millis() εκείνη θα σου επιστρέψει πόση ώρα έχει περάσει από την στιγμή που άνοιξες το arduino και έτρεξε ο κώδικας. ΔΕΝ μπορείς να αλλάξεις το τι επιστρέφει εκτός και εάν δηλώσεις δικιά σου millis(), που όμως δεν ξέρω εάν γίνεται. 2) Το πρόβλημα με το OVERFLOW (και όχι rollover) της millis() θα το έχεις ΌΧΙ όταν θα πρέπει να μετρήσεις κάτι εσύ αλλά όταν το arduino σου είναι ανοιχτό για καιρό. Δηλαδή, εάν το arduino είναι on and running για διάστημα πάνω από 50 ημέρες τότε η millis() θα επιστρέψει μικρότερο αριθμό αντί για μεγαλύτερο, γιατί δεν μπορεί να επιστρέψει μεγαλύτερο. Δηλαδή, εάν Χ είναι το χρονικό σημείο που παρατηρείς την συμπεριφορά αυτή της millis(), A το αποτέλεσμα της millis() πριν το Χ και Β μετά, τότε έχεις A > B. Αυτό είναι κάτι που πρέπει να το φροντίσεις γιατί μπορεί να γίνει κανένα ατύχημα μιας και μιλάμε για αυλόπορτα.
andreapaog328 Δημοσ. 30 Οκτωβρίου 2015 Δημοσ. 30 Οκτωβρίου 2015 για τηλεχειρισμο μπορει να βαλει δυο nrf24l01, δέκτη υπερήθρων με τηλεκοντρολ, numpad με κωδικο κτλ. ναναι καλα ο κινεζος στο ebay που να δινει τσαμπα. για current monitor βαλε ενα ACS712. hall effect μη σε βαρεσει και κανα ρευμα δε παίρνεις καλύτερα ενα RTC να σου δινει δευτερόλεπτα/λεπτά/ώρα να μη καθεσαι να μπλέκεις με millis και delay? απλα ναχεις υποψιν αν θες να μεγαλωσεις το προτζεκτ ίσως δε σε φτασουν τα 16k flash του nano
marabatzis Δημοσ. 30 Οκτωβρίου 2015 Μέλος Δημοσ. 30 Οκτωβρίου 2015 Σας Ευχαριστώ και πάλι... Μήπως υπάρχει καμιά εντολή για να κάνει reset το arduino όταν το millis() θα ξεπερνάει κάποια τιμή;
nkarama Δημοσ. 30 Οκτωβρίου 2015 Δημοσ. 30 Οκτωβρίου 2015 Χμμμ... όχι. Έχεις καταλάβει λάθος τι διάβασες για την mills. Ε, δεν μου λες όμως τι ακριβώς? για τηλεχειρισμο μπορει να βαλει δυο nrf24l01, δέκτη υπερήθρων με τηλεκοντρολ, numpad με κωδικο κτλ. ναναι καλα ο κινεζος στο ebay που να δινει τσαμπα. απλα ναχεις υποψιν αν θες να μεγαλωσεις το προτζεκτ ίσως δε σε φτασουν τα 16k flash του nano Αφου το έχει έτοιμο και δουλεύει, γιατί να πάει να βάλει τόσα πράγματα????
andreapaog328 Δημοσ. 30 Οκτωβρίου 2015 Δημοσ. 30 Οκτωβρίου 2015 Σας Ευχαριστώ και πάλι... Μήπως υπάρχει καμιά εντολή για να κάνει reset το arduino όταν το millis() θα ξεπερνάει κάποια τιμή; για δες αν παιζει το post #2. αλλιως ψαξε να δεις αν εχει watchdog timer Αφου το έχει έτοιμο και δουλεύει, γιατί να πάει να βάλει τόσα πράγματα???? ιδέες δίνω
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα