Ok, i am using a DS18B20 temp sensor with a servo for greenhouse thermostat use,
When temperature reach a certain degree Celcius it moves the servo to a specified position,It opens a led light at final position (hotter)
My problem is that sometimes my temp sensor spikes and gives values of like 500 degrees, or -49 degrees, making the servo move to various positions.
Is that a problem with my connections? Or with my code?
If someone could help me would be greatly appreciated,
Below is the code, and a connection diagram for my temp sensor:
#include <Servo.h>
#include <OneWire.h>
int DS18S20_Pin = 3; // Set temperature sensor in pin 0
int thresholdcold = 20; // Threshold for cold temperature
int thresholdhot = 22; // Threshold for hot temperature
int thresholdnormal =21; // Threshold for normal temperature
int servocold = 175; // Angle in which servo will go to
int servohot = 0; // Angle in which servo will go to
int servonormal = 80; // Angle in which servo will go to
int previousPosition = 176;
Servo servo1;
int ServoDelay = 30; // Servo delay
OneWire ds(DS18S20_Pin); //Library for Temp sensor
int led = 13;
void setup(void)
{
Serial.begin(9600); // Begin communicating with computer
servo1.attach(9); // Attaches servo to specified pin
pinMode(13, OUTPUT);
}
void loop(void) {
int HighByte, LowByte, TReading, SignBit, Tc_100, Whole, Fract;
byte i;
byte present = 0;
byte data[12];
byte addr[8];
if ( !ds.search(addr)) {
// Serial.print("No more addresses.\n");
ds.reset_search();
return;
}
//Serial.print("R=");
for( i = 0; i < 8; i++) {
//Serial.print(addr*, HEX);*
- Serial.print(" ");*
- }*
- if ( OneWire::crc8( addr, 7) != addr[7]) {*
- Serial.print("CRC is not valid!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n");*
- present = ds.reset();*
- 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("P=");*
- //Serial.print(present,HEX);*
- Serial.print(" ");*
- for ( i = 0; i < 9; i++) { // we need 9 bytes*
_ data = ds.read();_
_ //Serial.print(data*, HEX);
Serial.print(" ");
}
//Serial.print(" CRC=");
//Serial.print( OneWire::crc8( data, 8), HEX);
Serial.println();*_
* LowByte = data[0];*
* HighByte = data[1];*
* TReading = (HighByte << 8) + LowByte;*
* SignBit = TReading & 0x8000; // test most sig bit*
* if (SignBit) // negative*
* {*
* TReading = (TReading ^ 0xffff) + 1; // 2's comp*
* }*
Tc_100 = (6 * TReading) + TReading / 4; // multiply by (100 * 0.0625) or 6.25
* Whole = Tc_100 / 100; // separate off the whole and fractional portions*
* Fract = Tc_100 % 100;
_ if (SignBit) // If its negative*
* {
Serial.print("-");
}
Serial.print(Whole);
Serial.print(".");
if (Fract < 10)
{
Serial.print("0");
}
Serial.print(Fract);
Serial.print("\n");*_
* if(Whole <= thresholdcold) // If temperature is above the threshold, activate sequence*
* {*
* if (servocold != previousPosition){*
* for(previousPosition != 0; previousPosition < servocold; previousPosition += 1) // goes from 0 degrees to 180 degrees*
* { // in steps of 1 degree*
* servo1.write(previousPosition); // tell servo to go to position in variable 'pos'*
* delay(ServoDelay); // waits 15ms for the servo to reach the position*
* }*
* servo1.write(servocold);*
* previousPosition = servocold;*
* }*
* }*
* else if(Whole >= thresholdhot) // If temperature is above the threshold, activate sequence*
* {*
* if (servohot != previousPosition){*
* for(previousPosition != thresholdhot; previousPosition -= 1;) // goes from 0 degrees to 180 degrees*
* { // in steps of 1 degree*
* servo1.write(previousPosition); // tell servo to go to position in variable 'pos'*
* delay(ServoDelay); // waits 15ms for the servo to reach the position*
* }*
* servo1.write(servohot);*
* previousPosition = servohot;*
* }*
* digitalWrite(led, HIGH);*
* }*
* else if(Whole >= thresholdnormal) // If Fract is above the threshold, activate sequence*
* {*
* if (servonormal != previousPosition){*
* for(previousPosition != servonormal;previousPosition > servonormal; previousPosition -= 1) // goes from 0 degrees to 180 degrees*
* { // in steps of 1 degree*
* servo1.write(previousPosition); // tell servo to go to position in variable 'pos'*
* delay(ServoDelay); // waits 15ms for the servo to reach the position*
* }*
* for(previousPosition != servonormal;previousPosition < servonormal; previousPosition += 1) // goes from 0 degrees to 180 degrees*
* { // in steps of 1 degree*
* servo1.write(previousPosition); // tell servo to go to position in variable 'pos'*
* delay(ServoDelay); // waits 15ms for the servo to reach the position*
* }*
* servo1.write(servonormal);*
* previousPosition = servonormal;*
* digitalWrite(led, LOW);*
* }*
* }*
}
