Pages: [1]   Go Down
Author Topic: millis does not stop.  (Read 464 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 4
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
// 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);  
}  
Logged

Forum Administrator
Cambridge, MA
Offline Offline
Faraday Member
*****
Karma: 9
Posts: 3538
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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).  
Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 119
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Pages: [1]   Go Up
Jump to: