Go Down

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

#### XOIIO

#45
##### Jun 22, 2013, 12:24 pm
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

#46
##### Jun 22, 2013, 12:32 pm
I don't really like keyhole debugging.
"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

#47
##### Jun 22, 2013, 12:34 pm
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

#48
##### Jun 22, 2013, 12:41 pmLast Edit: Jun 22, 2013, 01:06 pm by XOIIO Reason: 1
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 temperaturefloat delta;                           //Variable for temperaturechangelong previousMillis = 0;long interval = 20000;                 //Check once every 20 secondsvoid 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