How would I make this if statement? (if somehting is within x amount?)

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

then they would sync up.

XOIIO:
then they would sync up.

Who would? Avoid using pronouns when describing issues.

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

   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;}
  }

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

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:

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.

XOIIO:
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.

Arrch:
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:

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 :confused:

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

XOIIO:
well, that sounds good, but difficult to figure out :confused:

It's actually not that difficult:

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
}

Arrch:

XOIIO:
well, that sounds good, but difficult to figure out :confused:

It's actually not that difficult:

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.

XOIIO:
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.

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;
}

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

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

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.

  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);
      }
  }

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.

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.

  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);
  }

ok this seems to be almost done, however, pin 13 (the led) stays on high for a few seconds when the temperature destabilizes, and I'm not sure why.

  if (currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;
    if ((delta < 00.05) && (delta > -00.05)) {
      digitalWrite(13, HIGH); 
  }
  if ((delta > 00.05) && (delta < -00.05)) {
    digitalWrite(13, LOW);
  }

I don't really like keyhole debugging.

I've lost track of what you're trying to do, but this is a problem:

 if ((delta > 00.05) && (delta < -00.05)) {
    digitalWrite(13, LOW);

delta will never be greater than 0.05 and less than -0.05. You could use or (||) instead, though it looks like you should just drop the if adn make this an else clause for the previous if.

Well, I've tweaked in at I think I've got it just about perfect like this. I need to tweak the limits of it though so that it is satisfactory, and found that delta sometimes has 3 digits after the decimal, but here it is. The only complaint is that the LED stays on while the tempo changes a little bit but I suppose I am just complaining, since it's supposed to be rough.

Here's the snippet:

  if (currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;
    if ((delta < 00.05) && (delta > -00.05)) {
      digitalWrite(13, HIGH); 
    }
  }
  if (delta >= 00.3) {
    digitalWrite(13, LOW);
  }
  if (delta <= -00.3) {
    digitalWrite(13, LOW);
  }

and here's the full code.

#include <OneWire.h>
#include <LiquidCrystal.h>

OneWire  ds(10);
LiquidCrystal lcd(6, 7, 5, 4, 3, 2);
float lasttemp;                        //Variable for last temperature
float delta;                           //Variable for temperaturechange
long previousMillis = 0;
long interval = 20000;                 //Check once every 20 seconds

void setup(void) {
  pinMode(13, OUTPUT);
  Serial.begin(115200);
  lcd.begin(8, 2);
  lcd.setCursor(0,0);
  lcd.print("STARTING");
  lcd.setCursor(0, 1);
  lcd.print("STARTING");
  delay(1000);
  lcd.clear();
}

void loop(void) {
  unsigned long currentMillis = millis();
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius, fahrenheit;

  if ( !ds.search(addr)) {
    Serial.println("No more addresses.");
    Serial.println();
    ds.reset_search();
    delay(250);
    return;
  }

  Serial.print("ROM =");
  for( i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(addr[i], HEX);
  }

  if (OneWire::crc8(addr, 7) != addr[7]) {
    Serial.println("CRC is not valid!");
    return;
  }
  Serial.println();

  // the first ROM byte indicates which chip
  switch (addr[0]) {
  case 0x10:
    Serial.println("  Chip = DS18S20");  // or old DS1820
    type_s = 1;
    break;
  case 0x28:
    Serial.println("  Chip = DS18B20");
    type_s = 0;
    break;
  case 0x22:
    Serial.println("  Chip = DS1822");
    type_s = 0;
    break;
  default:
    Serial.println("Device is not a DS18x20 family device.");
    return;
  } 

  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);        // start conversion, with parasite power on at the end

  delay(1000);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.

  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // Read Scratchpad

  Serial.print("  Data = ");
  Serial.print(present, HEX);
  Serial.print(" ");
  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
    Serial.print(data[i], HEX);
    Serial.print(" ");
  }
  Serial.print(" CRC=");
  Serial.print(OneWire::crc8(data, 8), HEX);
  Serial.println();

  // Convert the data to actual temperature
  // because the result is a 16 bit signed integer, it should
  // be stored to an "int16_t" type, which is always 16 bits
  // even when compiled on a 32 bit processor.
  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // "count remain" gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } 
  else {
    byte cfg = (data[4] & 0x60);
    // at lower res, the low bits are undefined, so let's zero them
    if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
    //// default is 12 bit resolution, 750 ms conversion time
  }

  celsius = (float)raw / 16.0;
  fahrenheit = celsius * 1.8 + 32.0;
  Serial.print("  Temperature = ");
  Serial.print(celsius);
  Serial.print(" Celsius, ");
  Serial.print(fahrenheit);
  Serial.println(" Fahrenheit");

  delta = celsius - lasttemp;                       //Create value to check how much temperature has changed

  if (currentMillis - previousMillis > interval) {  //If it has been 20 seconds, check to turn LED on
    previousMillis = currentMillis;
    if ((delta < 00.05) && (delta > -00.05)) {      //If temperature hasn't changed by +/- .05 turn led on.
      digitalWrite(13, HIGH); 
    }
  }
  if (delta >= 00.1) {                             //If temperature has changed by more than .1 turn LED off
    digitalWrite(13, LOW);
  }
  if (delta <= -00.1) {
    digitalWrite(13, LOW);                         // If temperature has changed by more than -.1 turn LED off
  }

  lcd.setCursor(0, 0);
  lcd.print(celsius);
  lcd.print(" C ");
  lcd.setCursor(0, 1);
  lcd.print(fahrenheit);
  lcd.print(" F ");
  lasttemp = celsius;

}

I'm sure it looks horrid to more experienced programmers, but it works so I'm happy.