Here is the code for the “sensors bench”:
// A1 : thermistor 10k SR PASSIVES (Ref tme.eu NTCC-10K)
// A2 : thermistor 10k noname (Ref tme.eu 640-10K)
// A3 : LM35DZ
// A4 : LM335Z
// A5 : MCP9700
// resultat LM35 = NTCC-10K > 640-10K > MCP9700 (impedance) > LM335 (nocal)
#include <math.h>;
int therm1Pin = A1;
int therm2Pin = A2;
int lm35Pin = A3;
int lm335Pin = A4;
int mcp9700Pin = A5;
void setup() {
Serial.begin(9600);
Serial.println("Ready.");
}
//this function copy pasted from an example I found
double Thermistor(int RawADC) {
double Temp;
// See http://en.wikipedia.org/wiki/Thermistor for explanation of formula
Temp = log(((10240000/RawADC) - 10000));
Temp = 1 / (0.001129148 + (0.000234125 * Temp) + (0.0000000876741 * Temp * Temp * Temp));
Temp = Temp - 273.15; // Convert Kelvin to Celcius
return Temp;
}
void loop() {
// display labels
Serial.println("\t\tTherm1\t\tTherm2\t\tLM35\t\tLM335\t\tMCP9700");
// read every sensor senseurs
int therm1 = analogRead(therm1Pin);
int therm2 = analogRead(therm2Pin);
int lm35 = analogRead(lm35Pin); //
delay(5); // multiplexage?
lm35 = analogRead(lm35Pin); //
int lm335 = analogRead(lm335Pin);
delay(5);
lm335 = analogRead(lm335Pin);
int mcp9700= analogRead(mcp9700Pin);
delay(5);
mcp9700 = analogRead(mcp9700Pin);
// display raw analog
Serial.print("Analog:\t\t");
Serial.print(therm1); Serial.print("\t\t");
Serial.print(therm2); Serial.print("\t\t");
Serial.print(lm35); Serial.print("\t\t");
Serial.print(lm335); Serial.print("\t\t");
Serial.println(mcp9700);
// convert to volts
float voltTherm1 = therm1 / 1023.0 * 5.0;
float voltTherm2 = therm2 / 1023.0 * 5.0;
float voltLm35 = lm35 * (5.0 / 1023);
float voltLm335 = lm335 / 1023.0 * 5.0;
float voltMcp9700= mcp9700 / 1023.0 * 5.0;
// display voltages
Serial.print("Voltages:\t");
Serial.print(voltTherm1, 4); Serial.print("\t\t");
Serial.print(voltTherm2, 4); Serial.print("\t\t");
Serial.print(voltLm35, 4); Serial.print("\t\t");
Serial.print(voltLm335, 4); Serial.print("\t\t");
Serial.println(voltMcp9700, 4);
// convert to celsius
float celsTherm1 = Thermistor(therm1);
float celsTherm2 = Thermistor(therm2);
float celsLm35 = (voltLm35*100);
float celsLm335 = (voltLm335*100)-273.15;
float celsMcp9700 = ((voltMcp9700-.5)*100);
// display celsius
Serial.print("Temps:\t\t");
Serial.print(celsTherm1); Serial.print("\t\t");
Serial.print(celsTherm2); Serial.print("\t\t");
Serial.print(celsLm35); Serial.print("\t\t");
Serial.print(celsLm335); Serial.print("\t\t");
Serial.println(celsMcp9700);
// new line
Serial.println("*******************************************************************************************************************************");
delay(1000);
}
And for the second schematics. This is going to be a fridge temperature monitoring alarm. Note there are provisions for lights and a piezzo. It used to work the way it was in Fritzing and with the same code the first time I wired it around. When I saw the sensor's mess, I disconnected everything but the sensor to try and narrow down the problem:
// prend la temperature sur A0 (MCP9700), la converti en Volts puis en Celsius puis
// imprime sur port serie
int tempPin = 0;
int loLedPin = 8;
int okLedPin = 9;
int hiLedPin = 10;
int piezoPin = 11;
int analogTempRead;
float celsiusTempRead;
int aref_voltage;
void setup() {
Serial.begin(9600);
aref_voltage = 50; // *10 to avoid setting a float if using 3.3V
pinMode(loLedPin, OUTPUT);
pinMode(okLedPin, OUTPUT);
pinMode(hiLedPin, OUTPUT);
pinMode(piezoPin, OUTPUT);
Serial.println("Ready.");
}
void loop() {
analogTempRead = 0;
for (int i =0; i<16; i++) analogTempRead += analogRead(tempPin);
float volt = analogTempRead * (aref_voltage/10.0)/16368;
Serial.print(volt); Serial.println(" V");
int celsiusTempRead = ((volt-.5)*100)+0.5; // +0.5 to round up
//celsiusTempRead = 150;
Serial.print("Temperature = "); Serial.print(celsiusTempRead);
Serial.println(" C");
if (celsiusTempRead >= -30 && celsiusTempRead <= 0) {
digitalWrite(loLedPin, HIGH);
digitalWrite(okLedPin, LOW);
digitalWrite(hiLedPin, LOW);
delay(300);
}
if (celsiusTempRead > 0 && celsiusTempRead <= 8) {
digitalWrite(loLedPin, LOW);
digitalWrite(okLedPin, HIGH);
digitalWrite(hiLedPin, LOW);
delay(300);
}
if (celsiusTempRead > 8 && celsiusTempRead <= 100) {
digitalWrite(loLedPin, LOW);
digitalWrite(okLedPin, LOW);
digitalWrite(hiLedPin, HIGH);
delay(300);
}
if (celsiusTempRead < -30 || celsiusTempRead > 100) {
digitalWrite(loLedPin, HIGH);
digitalWrite(okLedPin, LOW);
digitalWrite(hiLedPin, HIGH);
analogWrite(piezoPin, 1);
delay(150);
digitalWrite(loLedPin, LOW);
digitalWrite(okLedPin, HIGH);
digitalWrite(hiLedPin, LOW);
delay(150);
}
}