PDA

Επιστροφή στο Forum : Arduino, Έλεγχος εξόδου μετά από χρόνο



NIKPAPAZOGLOU
17-04-14, 00:32
Ένα μεγάλο γεια σε όλους και καλό Πάσχα να έχουμε
Θέλω να κάνω τον αυτοματισμό αστέρα τριγώνου με Arduino.
Το πρόβλημα είναι στην μεταγωγή από αστέρα σε τρίγωνο,
δεν μπορώ να βρω τον τρόπο της καθυστέρησης,
με την εντολή delay δεν γίνετε σωστά γιατί σταματά ο κύκλος

του προγράμματος.(Αν πατήσω το στοπ δεν θα το εκτελέσει γιατί δεν θα το διαβάσει )
Υπάρχει κάποια άλλη εντολή που μπορεί να κάνει αυτό που
θέλω;

nestoras
17-04-14, 02:21
Θα πρέπει να βάλεις το STOP σαν είσοδο με χρήση interrupt.
Δές εδώ:

http://arduino.cc/en/Reference/attachInterrupt
http://playground.arduino.cc/Code/Interrupts

geoek4
17-04-14, 02:37
Γεια χαρα φίλε!
Υπάρχει η εντολή millis η οποία είναι ο εσωτερικός counter του arduino. Βαση αυτου του counter οριζεις τον χρονο που θες. Διάβασε το παράδειγμα Blink Without Delay

G.G.
17-04-14, 09:09
Το interrupt δεν το ηξερα και θα το δω.

Εγω για αυτο το προβλημα εδωσα την παρακατω λυση: καθε 0.5sec, ελεγχος της παραμετρου, και αν ισχυει break.

for (int x=0;x<240;x++)
{
delay(500);
magnState = digitalRead(magnPin);

if (magnState == HIGH) break;

}

NIKPAPAZOGLOU
17-04-14, 11:57
Έχω δοκιμάσει με την millis αλλά δεν κατάφερα κάτι.
Προσπάθησα να προσαρμόσω τον παρακάτω κώδικα στις δικές μου ανάγκες.

/* Flashing LED Version 2
* ------------------------
*
* Turns on and off a light emitting diode(LED) connected to a digital
* pin, in intervals of 2 seconds using millis() function
*
*/
int ledPin = 13; // LED connected to digital pin 13
unsigned long currentTime;
unsigned long loopTime;

void setup()
{
pinMode(ledPin, OUTPUT); // sets the digital pin as output
currentTime = millis();
loopTime = currentTime;
}

void loop()
{
currentTime = millis();
if(currentTime >= (loopTime + 1000)){
digitalWrite(ledPin, !digitalRead(ledPin)); // toggles the LED on/off
loopTime = currentTime; // Updates loopTime
}
// Other processing can be done here
}



Η millis ξεκινά να μετρά από την στιγμή που τρέχει το πρόγραμμα, δεν μπορώ να την κάνω να μετρήσει όταν πατώ το μπουτόν ή αφού έχω μια έξοδο και μετά, έτσι ώστε να προσθέσω ένα χρόνο που μετά από αυτό θα πάρω το αποτέλεσμα που θέλω.
Ίσως να γράφω με λάθος σειρά τον κώδικα..
Υπάρχει τρόπος να μετρήσει όταν θέλω εγώ;

vmanos
17-04-14, 12:33
οριζεις μια μεταβλητη και αποθηκευεις τα millis οταν πατας το κουμπι και ελεχγεις ποσος χρονος περασε με millis()-μεταβλητη

katmadas
17-04-14, 15:51
Ευκολακι ειναι μπορεις να χρησιμοποιησεις και το while
απλα καλεσε την ρουτινα wait οταν την θελεις
αυτη θα ψαχνει για 1000 ms το πατημα του κουμπιου:




unsigned long currentTime = 0;//δηλωση παραμετρων
unsigned long pastTime = 0;

int wait = 1000;
unsigned long timePassed = 0;


void wait()
{
while(wait >= timePassed)
{
pastTime = currentTime;
currentTime = millis();

timePassed = currentTime - pastTime;

if......
{
.....dosomething

}
else
{
break;
}

NIKPAPAZOGLOU
19-04-14, 02:51
Ευχαριστώ παιδιά,
τελικά το έκανα με την εντολή millis()
Με την κατάλληλη συνθήκη παίρνω μια φορά τον τρέχον χρόνο
και μετά προσθέτω σε αυτόν τον χρόνο που θέλω για να έχω την καθυστέρηση.
(Το πρόβλημα που είχα πριν ήταν ότι σε κάθε κύκλο διάβαζε τον χρόνο με αποτέλεσμα
ποτέ να μην φτάνει στο millis + "my time")