Lesson 13 Temperature Monitoring and Alarm

Share for us

Introduction

In this lesson, we will use a thermistor and a buzzer to make a temperature monitoring and alarm system.

Components

– 1*Raspberry Pi

– 1*Breadboard

– 1*Network cable (or USB wireless network adapter)

– 1*Thermistor

– 1*Buzzer

– 1*NPN transistor (8050)

– 1*Resistor (1KΩ)

– 1*Resistor (10KΩ)

– 1*ADC0832

– Jumper wires

Experimental Principle

We use an ADC0832 to convert the analog temperature collected by the thermistor to digital temperature. When the result is greater than 200 degrees Celsius, the buzzer will alarm.

Experimental Procedures

Step 1: Connect the circuit 

Step 2: Edit and save the code(see path/Rpi_UniversalStartKit /13_tempMonitor/tempMonitor.c)

Step 3: Compile the code

           gcc  tempMonitor.c  -lwiringPi

Step 4: Run the program

           ./a.out

Press Enter, if use a lighter to burn the thermistor, you will hear the buzzer alarm.

C Code

#include <wiringPi.h>
#include <stdio.h>

typedef unsigned char uchar;
typedef unsigned int  uint;

#define     ADC_CS    0
#define     ADC_CLK   1
#define     ADC_DIO   2

#define     Beep      3

void beepInit(void)
{
 pinMode(Beep, OUTPUT);
 digitalWrite(Beep, 0);
}

void beep(void)
{
 digitalWrite(Beep, 1);
 delay(200);
 digitalWrite(Beep, 0);
 delay(200);
}

uchar get_ADC_Result(void)
{
 //10:CH0
 //11:CH1
 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); //CH0 10
 digitalWrite(ADC_CLK,1); delayMicroseconds(2);
 digitalWrite(ADC_CLK,0);

 digitalWrite(ADC_DIO,0); delayMicroseconds(2); //CH0 0
 
 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);

 pinMode(ADC_DIO, OUTPUT);
 
 return(dat1==dat2) ? dat1 : 0;
}

int main(void)
{
 uchar adcVal;

 if(wiringPiSetup() == -1){
  printf("setup wiringPi failed !");
  return 1;
 }

 pinMode(ADC_CS,  OUTPUT);
 pinMode(ADC_CLK, OUTPUT);

 beepInit();

 while(1){
  pinMode(ADC_DIO, OUTPUT);
  adcVal = get_ADC_Result();
  printf("adcval : %d\n",adcVal);
  if(adcVal > 200){
   beep();
  }
 }

 return 0;
}

Python Code

#!/usr/bin/env python
import RPi.GPIO as GPIO
import ADC0832
import time

BeepPin = 15

def printMsg():
 print 'Press Ctrl+C to end the program...'

def adcInit():
 ADC0832.setup()

def beepInit():
 GPIO.setmode(GPIO.BOARD)
 GPIO.setup(BeepPin, GPIO.OUT)
 GPIO.output(BeepPin, GPIO.LOW)

def beep():
 GPIO.output(BeepPin, GPIO.HIGH)
 time.sleep(0.2)
 GPIO.output(BeepPin, GPIO.LOW)
 time.sleep(0.2)

def loop():
 while True:
  res = ADC0832.getResult()
  print 'res = %d' % res
  if res > 200:
   beep()
 
if __name__ == '__main__':
 printMsg()
 adcInit()
 beepInit()
 try:
  loop()
 except KeyboardInterrupt:
  ADC0832.destroy()
  print 'The end !'