Go Down

Topic: millis does not stop. (Read 542 times) previous topic - next topic

sp1r

we have used a millis function to call the function stop (uitzetten) after 35 seconds. But when it reaches 35 seconds it doesnt call that function. We tested it with 5, 10 and 15 seconds and it works fine. But with 35 seconds ( we even want to use 3 minutes finally) it fails and it keeps counting. Anyone knows whats wrong with our code?

thanks in advance
Code: [Select]

// INGANGEN

int afstand0 = 0;    // ANALOGE INGANG AFSTANDSMETER
int afstand1 = 1;    // ANALOGE INGANG AFSTANDSMETER
int ingang7 = 7;     //  DIGITALE INGANG LASER

// UITGANGEN
int ingang2 = 2; // INGANG DRUK KNOP
int uitgang8 = 8;  // UITGANG LED
int uitgang9 = 9;  // UITGANG LED
int uitgang10 = 10;  // UITGANG LED
int uitgang11 = 11;  // UITGANG LED
int uitgang12 = 12; // UITGANG POMP
int uitgang13 = 13; // UITGANG LASER

// BEGINWAARDES

int val0 = 0;    // BEGIN WAARDE BEWEGINGSSENSORS
int val1 = 0;    // BEGIN WAARDE BEWEGINGSSENSORS
int val2 = 0;   // BEGIN WAARDE LASER
int valoud = -1;
// VARIABELEN INSTELLEN

int afstand = 400; // Afstand tot Inschakelen
int timeraan = -1;
int interval = 35000; // tijd tot stop


// EINDE INSTELLEN

void setup() {
 Serial.begin(9600);
 pinMode(ingang2, INPUT); // DRUK KNOP
 pinMode(ingang7, INPUT);  // INGANG LASER
 pinMode(uitgang8, OUTPUT);  // UITGANG LED
 pinMode(uitgang9, OUTPUT);  // UITGANG LED
 pinMode(uitgang10, OUTPUT);  // UITGANG LED
 pinMode(uitgang11, OUTPUT);  // UITGANG LED
 pinMode(uitgang12, OUTPUT);  // UITGANG POMP
 pinMode(uitgang13, OUTPUT);  // UITGANG LASER
}

void loop() {
  val0 = analogRead(afstand0);  
  val1 = analogRead(afstand1);
  val2 = digitalRead(ingang2);

      //Serial.println(val0);
      //Serial.println(val1);
      //Serial.println(val2);
       
 
   if ( val0 > afstand || val1 > afstand){
          aanzetten();
          timeraan = millis();
           
     }  
     if ((val2 != valoud) && (valoud != -1)) {
        uitzetten();
     }
     
     if (timeraan != -1) {
       Serial.println(millis() - timeraan);
         if (millis() - timeraan > interval) {
           uitzetten();
        }  
     }
     
    valoud = val2;
}
     
void aanzetten() {
     digitalWrite(uitgang8, HIGH);
     digitalWrite(uitgang9, HIGH);
     digitalWrite(uitgang10, HIGH);
     digitalWrite(uitgang11, HIGH);
     digitalWrite(uitgang12, HIGH);
}

void uitzetten() {
   digitalWrite(uitgang8, LOW);
   digitalWrite(uitgang9, LOW);  // led groep uit
   //digitalWrite(uitgang13, HIGH); // LASER ON! zend signaal naar andere groep
   digitalWrite(uitgang10, LOW);  // led groep uit
   digitalWrite(uitgang11, LOW);  // led groep uit
   digitalWrite(uitgang12, LOW);  // pomp uit
   //digitalWrite(uitgang13, LOW);  
}  

mellis

You need to use long's not int's to deal with the values returned from millis() (and the numbers you'll be comparing it to, etc.).  An int can only hold number up to 32,767.  You might also need to put an L at the end of any numbers that are bigger than that (e.g. 35000L).  

sti robot

Yeah, you are probably getting rounding errors and just not seeing them.  Converting from one type to the other can be tricky in any language.  Be sure to use unsigned longs throughout when comparing with millis() as that is what it returns.

Go Up