#include // resistance at 25 degrees C #define THERMISTORNOMINAL 10000 // temp. for nominal resistance (almost always 25 C) #define TEMPERATURENOMINAL 25 // how many samples to take and average, more takes longer // but is more 'smooth' #define NUMSAMPLES 5 // The beta coefficient of the thermistor (usually 3000-4000) //#define BCOEFFICIENT 3950 #define BCOEFFICIENT 3435 // the value of the 'other' resistor #define SERIESRESISTOR 10000 int samples[NUMSAMPLES]; #undef HASUART // pin definition #define RED_LED 0 #define GREEN_LED 1 #define BLUE_LED 2 // which analog pin to connect #define THERMISTORPIN A3 // idealised temperature range 37.0 <= bath <= 44 void setup(void) { #ifdef HASUART Serial.begin(9600); #endif analogReference(DEFAULT); pinMode(RED_LED, OUTPUT); pinMode(GREEN_LED, OUTPUT); pinMode(BLUE_LED, OUTPUT); } float readTemp(int pin) { uint8_t i; float average; // take N samples in a row, with a slight delay for (i=0; i 1020) return NAN; // convert the value to resistance average = 1023 / average - 1; average = SERIESRESISTOR * average; //change to divide to flip #ifdef HASUART Serial.print("Thermistor resistance "); Serial.println(average); #endif float steinhart; steinhart = average / THERMISTORNOMINAL; // (R/Ro) steinhart = log(steinhart); // ln(R/Ro) steinhart /= BCOEFFICIENT; // 1/B * ln(R/Ro) steinhart += 1.0 / (TEMPERATURENOMINAL + 273.15); // + (1/To) steinhart = 1.0 / steinhart; // Invert steinhart -= 273.15; // convert to C return steinhart; } void loop(void) { float temp = readTemp(THERMISTORPIN); #ifdef HASUART Serial.print("Temperature "); Serial.print(temp); Serial.println(" *C"); Serial.println(""); #endif if (isnan(temp)) { // error digitalWrite(RED_LED, HIGH); digitalWrite(GREEN_LED, LOW); digitalWrite(BLUE_LED, HIGH); } else if (temp < 1.0) { //0 // white, freezing digitalWrite(RED_LED, HIGH); digitalWrite(GREEN_LED, HIGH); digitalWrite(BLUE_LED, HIGH); } else if (temp < 37.0 ) { //37.0 // blue, cold digitalWrite(RED_LED, LOW); digitalWrite(GREEN_LED, LOW); digitalWrite(BLUE_LED, HIGH); } else if (temp >= 44.0) { //44.0 // Red, hot digitalWrite(RED_LED, HIGH); digitalWrite(GREEN_LED, LOW); digitalWrite(BLUE_LED, LOW); } else { // green, just right digitalWrite(RED_LED, LOW); digitalWrite(GREEN_LED, HIGH); digitalWrite(BLUE_LED, LOW); } delay(500); }