Pages: 1 2 3 [4]   Go Down
Author Topic: How would I make this if statement? (if somehting is within x amount?)  (Read 2415 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

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

Global Moderator
UK
Offline Offline
Brattain Member
*****
Karma: 309
Posts: 26495
I don't think you connected the grounds, Dave.
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I don't really like keyhole debugging.
Logged

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

New Jersey
Online Online
Faraday Member
**
Karma: 70
Posts: 3734
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

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

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:
  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:
#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.
« Last Edit: June 22, 2013, 06:06:05 am by XOIIO » Logged

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