Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπερα σε ολους σας!!!

 

Ας τα παρουμε απο την αρχη:

θα ηθελα να φτιαξω εναν drl controller  με το arduino το οποιο εχω παρει για να μαθω σιγα σιγα να το μαθαινω!!

τελικα αγανακτησα γιατι δεν το καταλαβαινω και πηγα και αγορασα το βιβλιο  Ανάπτυξη εφαρμογών με το Arduino .... φυσικα δεν το εχω διαβασει ολο ακομα αλλα θελω να φτιαξω το πρωτο μερος του κωδικα!!!!

 

για αρχη να πουμε οτι θα "φωτα" που θα χρησιμοποιησω ειναι RGB  οποτε θα πρεπει να παω στις PWM εξοδους που εχει ο ''μπαμπουινος'' και μολις γυρισω την μιζα θελω μετα απο 10'' να αναψουν τα halo rings λευκα,ενω μολις σβησω την μηχανη(γυρισω τον διακοπτη τις μιζας στο OFF ) να μεινουν ανοιχτα για 30'' (σαν λειτουργεια Follow Me Home)

 

 πρως το παρων το μονο που εχω καταφερει ειναι αυτο:

 

const int miza=2;
const int r1=3;
const int g1=5;
const int b1=6;
const int r2=9;
const int g2=10;
const int b2=11;



                     
                   

void setup() {
  pinMode(miza,INPUT);
  pinMode(r1,OUTPUT);
  pinMode(g1,OUTPUT);
  pinMode(b1,OUTPUT);
  pinMode(r2,OUTPUT);
  pinMode(g2,OUTPUT);
  pinMode(b2,OUTPUT);

}


 
void loop() {
 
  int buttonState = digitalRead(miza);
  if (buttonState==HIGH)
 {  analogWrite(r1,255);
    analogWrite(g1,255);
    analogWrite(b1,255);
    analogWrite(r2,255);
    analogWrite(g2,255);
    analogWrite(b2,255);
}
else
 { analogWrite(r1,0);
    analogWrite(g1,0);
    analogWrite(b1,0);
    analogWrite(r2,0);
    analogWrite(g2,0);
    analogWrite(b2,0);
  }
}

 

 

με το οποιο αναβω τα led με το που πατησω το μπουτον που ειναι συνδεμενο το pin2  και να σβηνει μολις αφησω το μπουτον....

Μολις βαλω delay παει στο αναμα π.χ 10'' και στο σβησιμο 30'' μου διαβαζει μονο του αναματος και το βαζει και στο σβησιμο...και κανει συνεχεια λουπες των 10'' ... (λογικο αφου το εχω βαλει στην συναρτηση loop) ...

επισης αλλη μια ερωτηση που θελω να κανω ειναι:

εστω οτι εγω θελω να ονομασω ολα τα analogwrite,255 σαν full_power και να τα θεσω σαν σταθερα και να τα ''καλω'' οποτε θελω εγω σαν full_power πως μπορει να γινει???

 

Σας ευχαριστω πολυ εκ των προτερων...και ζητω μια τεραστια συγνωμη για τυχον ορθογραφικα και εκφραστικα λαθοι αλλα η δυσλεξια δεν με αφηνει :( :(

 

 

Δημοσ.

Δεν κατάλαβα τι σου κάνει με το delay. Για δείξε μας τον κώδικά σου με με τα delay μέσα να δούμε.

 

Οσον αφορά το full_power αυτό που θέλεις να κάνεις είναι μια function.

 

Κάπως έτσι:

const int miza=2;
const int r1=3;
const int g1=5;
const int b1=6;
const int r2=9;
const int g2=10;
const int b2=11;



                     
                   

void setup() {
  pinMode(miza,INPUT);
  pinMode(r1,OUTPUT);
  pinMode(g1,OUTPUT);
  pinMode(b1,OUTPUT);
  pinMode(r2,OUTPUT);
  pinMode(g2,OUTPUT);
  pinMode(b2,OUTPUT);

}


 
void loop() {
 
  int buttonState = digitalRead(miza);
  if (buttonState==HIGH)
 {  analogWrite(r1,255);
    analogWrite(g1,255);
    analogWrite(b1,255);
    analogWrite(r2,255);
    analogWrite(g2,255);
    analogWrite(b2,255);
}
else
 {
   fullPower();
  }
}



void fullPower ()
{
    analogWrite(r1,0);
    analogWrite(g1,0);
    analogWrite(b1,0);
    analogWrite(r2,0);
    analogWrite(g2,0);
    analogWrite(b2,0);
}

Επίσης ένα σοβαρό θέμα που πρέπει να κοιτάξεις, είναι το debouncing της εισόδου σου. Δες αν στο βιβλίο που πήρες έχει κάτι σχετικό. Μια πολύ πρόχειρη λύση είναι, μόλις δεις ότι το miza είναι HIGH να περιμένεις 100-200ms και να ξαναελέγξεις. Ψάξε στο net για περισσότερες πληροφορίες.

 

Και μια συμβουλή, να αποφύγεις το delay. Αν θες απλά να καθυστερήσεις φτιάξε μια μεταβλητή για να αποθηκεύσεις την τιμή της εντολής millis() και μετά με ένα if βλέπεις αν πέρασε ο χρόνος.

Δημοσ.

ναι το βιβλιο λεει για debouncing και το βαζει σε μπουτον με 50milisecond για να το αποφυγει!! οσο για το millis()  το γραφει πιο κατω και φυσικα δεν εχω φτασει μεχρι εκει!!!

 

αυτο με το full_power που μου γραφεις μπορω να βαλω οσα function θελω?και με αλλες τιμες? π.χ με το 75% και με 50% τις φωτηνωτητας των led??

 

οσο για το delay βαζω....

const int anama=10000;

const int svisimo=30000;

 

και κατω απο το πρωτο if

delay=anama;

και κατω απο το else

delay=svisimo;

 

και παταω το μπουτον και αναβει μετα απο 10'' (μεχρι εδω ολα καλα) και μολις το αφησω π.χ στα 15'' (δλδ το κρατησω 5'' δευτερολεπτα πατημενο και το αφησω) θα σβησει μετα απο 5'' δλδ μολις κλεισει τα 20''....λουπες καθε 10''

δεν θα δει οτι το αφησα το μπουτον αρα να παει και να μετρηση απο την ωρα που αφηνω το μπουτον 30΄΄ και να σβησει...

 

 

1000 ευχαριστω για την απαντηση...εχω ποσταρει και σε αλλα φορουμ και δεν μου απαντησε κανενας...δεν ξερω για ποιο λογο αλλα ειχα αρχισει να απελπιζομαι γιατι δεν ξερω και αγγλικα ωστε να πορεσω να απευθηνω και σε ξενα φορουμ!!!

Δημοσ.

Μάλιστα, τώρα κάπου φτάνουμε.

Βέβαια με τον τρόπο που το έχεις κάνει θα περίμενα μια περισσότερο τυχαία συμπεριφορά στο άναμα/σβήσιμο, δηλαδή τυχαίους χρόνους κάθε φορά μέχρι να κάνει κάτι...

 

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

 

Στον κώδικά σου τώρα, ας υποθέσουμε ότι είναι η πρώτη εκτέλεση του loop και δεν έχεις πατήσει το κουμπί. Αρα θα εκτελεστεί το else και θα αρχίσει να μετράει τα 30 δευτερόλεπτα. Μέσα σε αυτά τα 30 δευτερόλεπτα, ακόμα και αν πατήσεις το κουμπί, το πρόγραμμά σου δεν θα το καταλάβει. Μόλις τελειώσει το μέτρημα, θα κάνει άλλο ένα loop. Αν δεν βρεί κουμπί πατημένο θα ξαναμετράει 30 δευτερόλεπτα κοκ. Αν βρει κουμπί πατημένο θα μετρήσει 10 δευτερόλεπτα και θα ανάψει τα led, αλλά και εδώ έχεις πάλι διάφορες περιπτώσεις για το πόσο θα μείνουν τα led αναμένα.

 

Οπότε μερικές προτάσεις.

 

α) ξεφορτώσου τα delays. Δες πως θα το κάνεις με το να μετράς πόσος χρόνος έχει περάσει απο μια στιγμή που σε ενδιαφέρει. (δες παρακάτω παράδειγμα)

 

β) να χρησιμοποιήσεις την λογική καταστάσεων. ΠΧ πότε θές να μετράς τα 10 δευτερόλεπτα πριν ανάψεις τα led? μα φυσικά όταν αυτά πριν ήταν σβυστά. Πότε θες να καθυστερίσεις 30 δευτερόλεπτα το σβύσιμό τους? Οταν αυτά πριν ήταν ανοιχτά.... Και εδώ μετρβλητές του τύπου previousState=1 ή previousState=0 μέσα σε if-then-else θα βοηθήσουν.

 

γ) Βάλε debounce. Υπάρχει η βιβλιοθήκη button στο arduino αν και μια απλή καθυστέριση και ξαναδιάβασμα της εισόδου αρκουν, πχ

buttonState = digitalRead(miza);
if (buttonState==HIGH) {
    unsigned long timeNow=millis();
    while (mills() - timeNow < 20) {
    }
    buttonState = digitalRead(miza);
}

δ) αν μπορείς βάλε ένα σχηματικό. ΠΧ, μπορεί να έχεις κάνει το Pin 2 σαν INPUT, αλλά δεν βλέπω αν έχεις χρησιμποποιήσει  Pull-down αντιστάσεις. Αλλος ένας παράγωντας ασταθούς συμπεριφοράς του κυκλώματος (πολύ σημαντικός).

 

Functions ναι, μπορείς να βάλεις όσα θες, άλλωστε σε C γράφεις.

 

 

Τι ευχαριστείς, δεν έκανα και τίποτα... Αν έχεις πρόβλημα, πες...

Δημοσ.

ωπ....με προχωρησες πολυ εσυ...η συνθηκη while και τι κανουν τα millis ειναι στο επομενο κεφαλαιο....οποτε ξανα με τα μουτρα στο διαβασμα και μολις παρω χαμπαρι τι κανουν αυτα και που μπορω να τα χρησιμοποιησω,θα τα ενσωματοσω στον κωδικα και θα επιστρεψω :) :)

 

υγ. pull down ειναι συνδεμενο το κουμπι...

 

Και παλι 1000 ευχαριστω και για τον χρονο σου,και για τις γνωσεις σου αλλα και την βοηθεια :)

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...