Pages: 1 2 [3] 4   Go Down
Author Topic: How would I make this if statement? (if somehting is within x amount?)  (Read 2295 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Sr. Member
****
Karma: 0
Posts: 258
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

if I threw this line in to set the temperature
  if (currentMillis - previousMillis > interval) {

then they would sync up.
Logged

California
Offline Offline
Faraday Member
**
Karma: 88
Posts: 3380
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

then they would sync up.

Who would? Avoid using pronouns when describing issues.
Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 258
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

if I used the same delay to set lasttemp and check it they would both sync up.

I've tried setting the code like this which you would think would work fine, it sets lasttemp every 10 seconds, and on each run the current temperature is compared, however unless there is a drastic change (of .3 degrees or so) the light just stays on).

Code:
   if ( (celsius >= lasttemp - 00.10) && (celsius <= lasttemp + 00.10) ) {
    digitalWrite(13, HIGH);
  }
  else {
    digitalWrite(13, LOW);
  }
 
  lcd.print(" C ");
  lcd.setCursor(0, 1);
  lcd.print(fahrenheit);
  lcd.print(" F ");
 
    if (currentMillis - previousMillis > interval) {
  lasttemp = celsius;}
  }
Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 258
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Also when it is climbing the light stays on which makes no sense, unless there's a problem when it's checking if the temperature is within + / - .10
Logged

California
Offline Offline
Faraday Member
**
Karma: 88
Posts: 3380
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

By sampling the previous temperature at a different rate than the current temperature, you're making time a variable. Previously, time was a variable, but it took relatively the same amount of time for the loop to complete, so the variable time could be neglected.

This if statement:
Code:
if ( (celsius >= lasttemp - 00.10) && (celsius <= lasttemp + 00.10)
does not take into account how long it has been since lasttemp was sampled. If you want to calculate the derivative, you need to take into account time. The easiest way to do this, would be to every X amount of time, calculate the difference in temperature and call it delta. delta divided by X seconds will give you the rate of change (derivative). If its under a certain amount, then its stable.
Logged

California
Offline Offline
Faraday Member
**
Karma: 88
Posts: 3380
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Also when it is climbing the light stays on which makes no sense, unless there's a problem when it's checking if the temperature is within + / - .10

Because you're missing an important statement in the code copied from the blink without delay example. Without said statement, you're not doing things in intervals, you're implementing a time delay.
Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 258
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

By sampling the previous temperature at a different rate than the current temperature, you're making time a variable. Previously, time was a variable, but it took relatively the same amount of time for the loop to complete, so the variable time could be neglected.

This if statement:
Code:
if ( (celsius >= lasttemp - 00.10) && (celsius <= lasttemp + 00.10)
does not take into account how long it has been since lasttemp was sampled. If you want to calculate the derivative, you need to take into account time. The easiest way to do this, would be to every X amount of time, calculate the difference in temperature and call it delta. delta divided by X seconds will give you the rate of change (derivative). If its under a certain amount, then its stable.
[/quote

well, that sounds good, but difficult to figure out :/

I guess I have no choice but to try, although I doubt I'll figure it out today.
Logged

California
Offline Offline
Faraday Member
**
Karma: 88
Posts: 3380
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

well, that sounds good, but difficult to figure out :/


It's actually not that difficult:

Code:
If (its been X seconds since the lastTime)
{
  set lastTime to Now
  set difference to absolute value of thisValue minus lastValue
  set derivative equal to difference divided by X
  set lastReading to thisReading
  check if the deriviative is within a certain threshold and do something based on it
}
Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 258
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

well, that sounds good, but difficult to figure out :/


It's actually not that difficult:

Code:
If (its been X seconds since the lastTime)
{
  set lastTime to Now
  set difference to absolute value of thisValue minus lastValue
  set derivative equal to difference divided by X
  set lastReading to thisReading
  check if the deriviative is within a certain threshold and do something based on it
}

yeah these lines are stumping me, I'm not sure if it's because of fatigue or not, I do know that I've never dealt with this sort of stuff though

  set difference to absolute value of thisValue minus lastValue
  set derivative equal to difference divided by X

I guess I'm going to sleep and work on it tomorrow (which will actually be tonight), not sure if that will help much though.

« Last Edit: June 21, 2013, 12:56:27 pm by XOIIO » Logged

California
Offline Offline
Faraday Member
**
Karma: 88
Posts: 3380
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

yeah these lines are stumping me, I'm not sure if it's because of fatigue or not, I do know that I've never dealt with this sort of stuff though

  set difference to absolute value of thisValue minus lastValue
  set derivative equal to difference divided by X
difference and derivative are simply variables, and the rest of it is simple arithmetic.
Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 258
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hmm, making some progress, however I am still kind of stuck, at this point.

set derivative equal to difference divided by X

Does that mean that it should be divided by the amount of time, or something like that?
anyways here's hat I have, not much, once that middle line is solved the rest will be easy.

  if (currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;
    delta = celsius - lasttemp;
  }
Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 258
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hmm, not sure if this is getting closer, derivative is always 0.00

Code:
  if (currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;
    delta = celsius - lasttemp;
    derivative = delta / interval;
    celsius = currenttemp;
    Serial.print(derivative);
  }
Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 258
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hmm, I thought this would work, it kind of is it seems, although when the temp was climbing it turned on once for no reason, same thing just happened as it was dropping. I think I it's not comparing the time properly or something.

Code:
  if (currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;
    delta = celsius - lasttemp;
    derivative = delta / 5;
    celsius = currenttemp;
    if ((delta < 00.10) && (delta > -00.10)) {
      digitalWrite(13, HIGH); }
      else {
        digitalWrite(13, LOW);
      }
  }
Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 258
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I think part of the problem is that it only checks to turn the led on or off is at that interval, I'm not sure how to solve that.
Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 258
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ok, i refined it, now the only problem that is left seems to be that it doesn't turn the led off until it sets delta, I need to find a way to change that, maybe using a second if statement, I'm not sure.

Code:
  if (currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;
    delta = celsius - lasttemp;
    derivative = delta / 5;
  }

  if ((delta < 00.05) && (delta > -00.05)) {
    digitalWrite(13, HIGH);
  }
  else {
    digitalWrite(13, LOW);
  }
Logged

Pages: 1 2 [3] 4   Go Up
Jump to: