Thanks! I can now get good readings from it.
One quick question, though, I have no 4.7k pulldown resistor, and when i use one i don't get a temp. reading. Can this damage anything?
#include <OneWire.h>
//Temp sensor DS18B20 pin
OneWire ds(3);
int ambient = 50;
void setup(void) {
Serial.begin(115200);
//
pinMode(13, OUTPUT);
int fanspd=1;
int fmin = 26.56;
int fmax = 55;
//Turn off onboard LED (used as Protect indicator)
digitalWrite(13, HIGH);
delay(1);
digitalWrite(13, LOW);
}
void loop(void) {
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
int del = 750;
int fanspd = 1;
int protect = 0;
int fmin = 26.56;
int fmax = 55;
float celsius, fahrenheit;
if ( !ds.search(addr)) {
ds.reset_search();
}
ds.reset();
ds.select(addr);
ds.write(0x44,0); // start conversion, with parasite power on at the end
delay(del); // 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
for ( i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds.read();
}
// convert the data to actual temperature
unsigned int 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);
if (cfg == 0x00) raw = raw << 3; // 9 bit resolution, 93.75 ms
else if (cfg == 0x20) raw = raw << 2; // 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;
Serial.print(celsius);
Serial.print(" °C");
Serial.println();
//Find ambient
//Overheat
if ((float)raw / 16.0 < ambient) {if (protect = 0) {
ambient = ((float)raw / 16.0);
Serial.print("Ambient=");
Serial.print(ambient);
Serial.print(" ");}}
//Error Checking
//Temp is warmer than Min
if ((float)raw / 16.0 >= fmin)
{
fanspd=1;
Serial.print("Cooling ");
}
//No sensor readout (data pin connection lost)
if (OneWire::crc8(addr, 7) != addr[7] or (float)raw / 16.0 == 0)//((float)raw / 16.0 == 0)
{
fanspd=100;
protect = 2;
}
//Overheat - Temp higher than fmax
if ((float)raw / 16.0 >= fmax) {fanspd=100;
Serial.println("Error 1 - Overheat");
protect = 1;
}
if (protect == 1) {
fanspd=100;
digitalWrite(13, HIGH);
delay(50);
digitalWrite(13, LOW);
if ((float)raw / 16.0 <= fmax - 1)
{
protect = 0;
}
}
if (protect == 2)
{
fanspd=100;
Serial.println("Error 2 - Sensor missing or quite cold (0.00 C)");
digitalWrite(13, HIGH);
delay(50);
digitalWrite(13, LOW);
delay(100);
digitalWrite(13, HIGH);
delay(50);
digitalWrite(13, LOW);
if ((float)raw / 16.0 != 0)
{
protect = 0;
}
}
}