DS18B20 with Arduino Micro

Thread Starter

james211

Joined May 29, 2012
283
Looking for a bit of help...I swear I've had this working before, but right now all I can get is the 185 reading. I have two DS18B20 sensors, one standard and one waterproof. With both I get the 185 reading. Any thoughts?

Included code and pics of breadboard.

Here is my code:
Code:
<#include <OneWire.h>

int DS18S20_Pin = 4; //DS18S20 Signal pin on digital 2
int relay = 7;

//Temperature chip i/o
OneWire ds(DS18S20_Pin);  // on digital pin 2

void setup(void) {
  Serial.begin(9600);
}

void loop(void) {
  float temperature = getTemp();
  float tempF = (temperature * 9.0)/ 5.0 + 32.0;
  Serial.println(tempF);
  if (tempF >60) {
  digitalWrite(7,HIGH);
  } else {
  digitalWrite(7,LOW);
  }
 
  delay(100); //just here to slow down the output so it is easier to read
 
}


float getTemp(){
  //returns the temperature from one DS18S20 in DEG Celsius

  byte data[12];
  byte addr[8];

  if ( !ds.search(addr)) {
  //no more sensors on chain, reset search
  ds.reset_search();
  return -1000;
  }

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

  if ( addr[0] != 0x10 && addr[0] != 0x28) {
  Serial.print("Device is not recognized");
  return -1000;
  }

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

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

 
  for (int i = 0; i < 9; i++) { // we need 9 bytes
  data[i] = ds.read();
  }
 
  ds.reset_search();
 
  byte MSB = data[1];
  byte LSB = data[0];

  float tempRead = ((MSB << 8) | LSB); //using two's compliment
  float TemperatureSum = tempRead / 16;
 
  return TemperatureSum;
 
}
 

Attachments

Thread Starter

james211

Joined May 29, 2012
283
I ended up getting it to work, not really sure where I went wrong to be honest. The hookup seems pretty standard, but for some reason not all the codes work from the examples.

Quick question, since I'll be using this with a relay to turn a fan on and off, is there a way to put a delay in so that once the temp hits the off point, the relay will stay off for a minimum amount of time? I know the delay would have to be in seconds, I just don't know how or where in the code to put it.
 

shteii01

Joined Feb 19, 2010
4,644
Quick question, since I'll be using this with a relay to turn a fan on and off, is there a way to put a delay in so that once the temp hits the off point, the relay will stay off for a minimum amount of time? I know the delay would have to be in seconds, I just don't know how or where in the code to put it.
First you say you want delay.
Then you say you want relay off for MINIMUM amount of time.

You are not making sense.
 

sirch2

Joined Jan 21, 2013
1,037
I read that as him wanting hysteresis, he wants to delay the fan coming back on for an amount of time. The simplest thing to do may be to just increase the delay(100) at the end of your loop function to delay (10000) or whatever - the value is in mS so 10000 would give you a 10 second delay between temperature measurements.

However a better approach would be to not use a delay but use a temperature range to create a dead-band. So if temp is >60.5 turn on and if temp is <59.5 turn off.
 
Top