[SOLVED] Reset Arduino after Stattment is the same for X amount of time

How would be the code if:

I want to restart a variable when if (different variable with same value for X time)??

Record the time when the variable changes value, using millis or micros.
If the time now minus the recorded time is greater than some fixed value, reset your variable.

if((millis() - oldTime) > 100)    { 
  
    detachInterrupt(sensorInterrupt);
    flowRate = ((1000.0 / (millis() - oldTime)) * pulseCount)
    oldTime = millis();

Something like this?

Does it do what you want?

I don't know, I don't have my board here.

Neither do I.

I would like to try it out, but i dont know how to put it together with my code, so that it makes sense?

 if(sensorValue>triggerpoint){digitalWrite(relayPin,LOW);
  }

I would like for this piece to only count if the sensorvalue>triggerpoint for that amount of time.

If i try out the code, how would i integrate it? :slight_smile:

creepexthe:

if((millis() - oldTime) > 100)    { 

detachInterrupt(sensorInterrupt);
    flowRate = ((1000.0 / (millis() - oldTime)) * pulseCount)
    oldTime = millis();

if (timerRunning)
{
    unsigned long timeNow = millis();
    if(timeNow - startTime < 100) {
       // Do something, e.g.
       detachInterrupt(sensorInterrupt);
       flowRate = ((1000.0 / (timeNow - startTime)) * pulseCount);
    }
    else
    {
        timerRunning = false;
    }  
}

Somewhere else, where ever you decide you want the above code to start running…

startTime = millis();
timerRunning= true;

Although I’m not sure why you’d want to continuously detachInterrupt for 100ms?

Hi, I can't find out how to reset all these values with:
if ( flowRate has been the same for X time)

Here the code:

    if((millis() - oldTime) > 100)    { 
  
    detachInterrupt(sensorInterrupt);
    flowRate = ((1000.0 / (millis() - oldTime)) * pulseCount) / calibrationFactor;
    oldTime = millis();    
    flowMilliLitres = (flowRate / 60)*2000;   
    totalMilliLitres += flowMilliLitres;      
    unsigned int frac;
    Serial.print("Flow rate: ");
    Serial.print(int(flowRate));  
    Serial.print("L/min");
    Serial.print("\t");       
    Serial.print(totalMilliLitres/1000);
    Serial.print("L"); 
    Serial.print("\t"); 
    Serial.print("Output Liquid Quantity: ");        
    Serial.print(totalMilliLitres);
    Serial.println("mL"); 
    attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
    pulseCount = 0;   
}


void pulseCounter(){
  
  pulseCount++; 
}

all those values have to be restarted after flowRate is 0 for 30 seconds. How it would be?

Did you meanif((millis() - oldTime) > 30000) ?

Why have you opened a new thread on the same topic?

So this is a counter for a water flow sensor (that gives me the Liters wasted) that allready uses millis. I need the Arduino to restart the values after 30 secounds without activity

So where did the 1/10th of a second constant come from?

The 100ms is the delay of time I am guetting values. Every 100ms I am getting new values from the sensor

Why are you attaching and detaching the interrupt?
Where is the rest of the code?

/*
Liquid flow rate sensor -DIYhacking.com Arvind Sanjeev

Measure the liquid/water flow rate using this code. 
Connect Vcc and Gnd of sensor to arduino, and the 
signal line to arduino digital pin 2.
 
 */

byte statusLed    = 13;

byte sensorInterrupt = 0;  // 0 = digital pin 2
byte sensorPin       = 2;

// The hall-effect flow sensor outputs approximately 4.5 pulses per second per
// litre/minute of flow.
float calibrationFactor = 4.5;

volatile byte pulseCount;  

float flowRate;
unsigned int flowMilliLitres;
unsigned long totalMilliLitres;

unsigned long oldTime;

void setup()
{
  
  // Initialize a serial connection for reporting values to the host
  Serial.begin(9600);
   
  // Set up the status LED line as an output
  pinMode(statusLed, OUTPUT);
  digitalWrite(statusLed, HIGH);  // We have an active-low LED attached
  
  pinMode(sensorPin, INPUT);
  digitalWrite(sensorPin, HIGH);

  pulseCount        = 0;
  flowRate          = 0.0;
  flowMilliLitres   = 0;
  totalMilliLitres  = 0;
  oldTime           = 0;

  // The Hall-effect sensor is connected to pin 2 which uses interrupt 0.
  // Configured to trigger on a FALLING state change (transition from HIGH
  // state to LOW state)
  attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
}

/**
 * Main program loop
 */
void loop()
{
   
   if((millis() - oldTime) > 1000)    // Only process counters once per second
  { 
    // Disable the interrupt while calculating flow rate and sending the value to
    // the host
    detachInterrupt(sensorInterrupt);
        
    // Because this loop may not complete in exactly 1 second intervals we calculate
    // the number of milliseconds that have passed since the last execution and use
    // that to scale the output. We also apply the calibrationFactor to scale the output
    // based on the number of pulses per second per units of measure (litres/minute in
    // this case) coming from the sensor.
    flowRate = ((1000.0 / (millis() - oldTime)) * pulseCount) / calibrationFactor;
    
    // Note the time this processing pass was executed. Note that because we've
    // disabled interrupts the millis() function won't actually be incrementing right
    // at this point, but it will still return the value it was set to just before
    // interrupts went away.
    oldTime = millis();
    
    // Divide the flow rate in litres/minute by 60 to determine how many litres have
    // passed through the sensor in this 1 second interval, then multiply by 1000 to
    // convert to millilitres.
    flowMilliLitres = (flowRate / 60) * 1000;
    
    // Add the millilitres passed in this second to the cumulative total
    totalMilliLitres += flowMilliLitres;
      
    unsigned int frac;
    
    // Print the flow rate for this second in litres / minute
    Serial.print("Flow rate: ");
    Serial.print(int(flowRate));  // Print the integer part of the variable
    Serial.print("L/min");
    Serial.print("\t"); 		  // Print tab space

    // Print the cumulative total of litres flowed since starting
    Serial.print("Output Liquid Quantity: ");        
    Serial.print(totalMilliLitres);
    Serial.println("mL"); 
    Serial.print("\t"); 		  // Print tab space
	Serial.print(totalMilliLitres/1000);
	Serial.print("L");
    

    // Reset the pulse counter so we can start incrementing again
    pulseCount = 0;
    
    // Enable the interrupt again now that we've finished sending output
    attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
  }
}

/*
Insterrupt Service Routine
 */
void pulseCounter()
{
  // Increment the pulse counter
  pulseCount++;
}

CHECK THIS TO

While the interrupts are off, check pulsecount. If it’s non zero, store millis in an unsigned long. This tells you the last time you saw some flow. When interrupts are back on, check that time against millis and if it’s greater than thirty seconds, zero out your flow variables.

creepexthe:
all those values have to be restarted after flowRate is 0 for 30 seconds. How it would be?

I believe you need code (in loop() ) something like this pseudo code

if (flowRate > 0 ) {
   lastTimeFlowRateAboveZero = millis();
}

if (millis() - lastTimeFlowRateAboveZero >= 30000) {
    // flow rate has been zero for 30 secs
    // do something
}

...R

Duplicate topics moved and merged

Cross-posting is against the rules of the forum. The reason is that duplicate posts can waste the time of the people trying to help. Someone might spend 15 minutes (or more) writing a detailed answer on this topic, without knowing that someone else already did the same in the other topic.

Repeated cross-posting will result in a suspension from the forum.

In the future, please take some time to pick the forum board that best suits the topic of your question and then only post once to that forum board. This is basic forum etiquette, as explained in the sticky “How to use this forum - please read.” post you will find at the top of every forum board. It contains a lot of other useful information. Please read it.

Thanks in advance for your cooperation.

Hi, I have a device that has to be restarted after a condition and I couldn’t figure it out how to do it. The code would be the next:

byte statusLed    = 13;
byte sensorInterrupt = 0;  // 0 = digital pin 2
byte sensorPin       = 2;
float calibrationFactor = 4.5;
volatile byte pulseCount;  
float flowRate;
unsigned int flowMilliLitres;
unsigned long totalMilliLitres;
unsigned long oldTime;

void setup()
{
  

  Serial.begin(9600);

  pinMode(statusLed, OUTPUT);
  digitalWrite(statusLed, HIGH);  
  
  pinMode(sensorPin, INPUT);
  digitalWrite(sensorPin, HIGH);

  pulseCount        = 0;
  flowRate          = 0.0;
  flowMilliLitres   = 0;
  totalMilliLitres  = 0;
  oldTime           = 0;
  attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
}

void loop()
{
   
   if((millis() - oldTime) > 1000)    
  { 

    detachInterrupt(sensorInterrupt);
    flowRate = ((1000.0 / (millis() - oldTime)) * pulseCount) / calibrationFactor;
    oldTime = millis();
    flowMilliLitres = (flowRate / 60) * 1000;
    totalMilliLitres += flowMilliLitres;
    unsigned int frac;
    Serial.print("Flow rate: ");
    Serial.print(int(flowRate)); 
    Serial.print("L/min");
    Serial.print("\t");
    Serial.print("Output Liquid Quantity: ");        
    Serial.print(totalMilliLitres);
    Serial.println("mL"); 
    Serial.print("\t"); 		  
    Serial.print(totalMilliLitres/1000);
    Serial.print("L");
    
    pulseCount = 0;
    attachInterrupt(sensorInterrupt, pulseCounter, FALLING);

  }


    if (flowRate < 0.4 && totalMilliLitres > 10) {
      delay (2000);
        if (flowRate < 0.4 && totalMilliLitres > 10 ) {
         delay (2000);
           if (flowRate < 0.4 && totalMilliLitres > 10) {
            delay (2000);
             if (flowRate < 0.4 && totalMilliLitres > 10 ) {
              delay (2000);
               if (flowRate < 0.4 && totalMilliLitres > 10 ) {

/*


HERE IT SHOULD RESTART OF SOMETHING SIMILAR



*/



}


void pulseCounter()
{

  pulseCount++;
}

why do you keep testing the same values in an if() statement and then delaying 2000 msec? If the first if() evaluates to true, all the other ones will as well since nothing has changed?

What exactly are you trying to do?