Go Down

Topic: How would I make this if statement? (if somehting is within x amount?) (Read 3225 times) previous topic - next topic

XOIIO

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.

Code: [Select]
  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);
  }

AWOL

"Pete, it's a fool looks for logic in the chambers of the human heart." Ulysses Everett McGill.
Do not send technical questions via personal messaging - they will be ignored.

wildbill

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

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.

XOIIO

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:

Code: [Select]

  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.

Code: [Select]
#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.

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy