Introduction
Analog-temperature sensors are a type of devices to detect temperature changes. Their core component is a thermistor. There are two kinds of analog-temperature sensors in this kit (as shown below). In this lesson, we take the left one (try to use the other sensor yourself!).
Components
– 1 * Raspberry Pi
– 1 * Breadboard
– 1 * Network cable (or USB wireless network adapter)
– 1 * Analog-temperature Sensor module
– 1 * ADC0832
– Several jumper wires
Experimental Principle
This module is developed based on the principle of thermistor, whose resistance varies significantly with ambient temperature changes. When the temperature increases, the resistance decreases; when the temperature decreases, the resistance increases. It can detect surrounding temperature changes in real time.
In this experiment, we need to use an analog-digital converter ADC0832 to convert analog signals into digital ones.
Experimental Procedures
Step 1: Build the circuit
Analog-temperature Sensor ADC0832
S ——————————————— CH0
+ ——————————————— 3.3V
– ——————————————– GND
Step 2: Edit and save the code (see path/Rpi_SensorKit_code/11_analogTempSensor/ analogTempSensor.c)
Step 3: Compile
gcc analogTempSensor.c -lwiringPi
Step 4: Run
./a.out
Now, touch the thermistor on the module and you can see the current temperature value is displayed on the screen and changes accordingly.
Compared with the black module on the left side in Introduction, the red one on the right only adds a digital output. You can adjust the threshold by the potentiometer on the module. When the output is higher than the threshold, the sensor will output HIGH; when it is lower than the threshold, the sensor will output LOW.
analogTempSensor.c
#include <wiringPi.h>
#include <stdio.h>
#include <math.h>
typedef unsigned char uchar;
typedef unsigned int uint;
#define ADC_CS 0
#define ADC_CLK 1
#define ADC_DIO 2
uchar get_ADC_Result(void)
{
uchar i;
uchar dat1=0, dat2=0;
digitalWrite(ADC_CS, 0);
digitalWrite(ADC_CLK,0);
digitalWrite(ADC_DIO,1); delayMicroseconds(2);
digitalWrite(ADC_CLK,1); delayMicroseconds(2);
digitalWrite(ADC_CLK,0);
digitalWrite(ADC_DIO,1); delayMicroseconds(2);
digitalWrite(ADC_CLK,1); delayMicroseconds(2);
digitalWrite(ADC_CLK,0);
digitalWrite(ADC_DIO,0); delayMicroseconds(2);
digitalWrite(ADC_CLK,1);
digitalWrite(ADC_DIO,1); delayMicroseconds(2);
digitalWrite(ADC_CLK,0);
digitalWrite(ADC_DIO,1); delayMicroseconds(2);
for(i=0;i<8;i++)
{
digitalWrite(ADC_CLK,1); delayMicroseconds(2);
digitalWrite(ADC_CLK,0); delayMicroseconds(2);
pinMode(ADC_DIO, INPUT);
dat1=dat1<<1 | digitalRead(ADC_DIO);
}
for(i=0;i<8;i++)
{
dat2 = dat2 | ((uchar)(digitalRead(ADC_DIO))<<i);
digitalWrite(ADC_CLK,1); delayMicroseconds(2);
digitalWrite(ADC_CLK,0); delayMicroseconds(2);
}
digitalWrite(ADC_CS,1);
return(dat1==dat2) ? dat1 : 0;
}
int main(void)
{
uchar analogVal;
double Vr, Rt, temp;
if(wiringPiSetup() == -1){ //when initialize wiring failed,print messageto screen
printf("setup wiringPi failed !");
return 1;
}
pinMode(ADC_CS, OUTPUT);
pinMode(ADC_CLK, OUTPUT);
while(1){
pinMode(ADC_DIO, OUTPUT);
analogVal = get_ADC_Result();
Vr = 5 * (double)(analogVal) / 255;
Rt = 10000 * (double)(Vr) / (5 - (double)(Vr));
temp = 1 / (((log(Rt/10000)) / 3950)+(1 / (273.15 + 25)));
temp = temp - 273.15;
printf("Current temperature : %d C\n", temp);
delay(500);
}
return 0;
}
Python Code
#!/usr/bin/env python
import ADC0832
import time
import math
def init():
ADC0832.setup()
def loop():
while True:
analogVal = ADC0832.getResult()
Vr = 5 * float(analogVal) / 255
Rt = 10000 * Vr / (5 - Vr)
temp = 1/(((math.log(Rt / 10000)) / 3950) + (1 / (273.15+25)))
temp = temp - 273.15
print 'temperature = %d C' % temp
time.sleep(0.2)
if __name__ == '__main__':
init()
try:
loop()
except KeyboardInterrupt:
ADC0832.destroy()
print 'The end !'