Introduction
In this lesson, we will use a Raspberry Pi and an ADC0832 to make a voltmeter.
Experimental Conditions
– 1*Raspberry Pi
– 1*Breadboard
– 1*Network cable (or USB wireless network adapter)
– 1*ADC0832
– 1*Potentiometer
– Jumper wires
Experimental Principle
In this experiment, we use the potentiometer to divide voltage.
Since the Raspberry Pi can only read digital signals, but what the adjusting end of the potentiometer outputs is an analog signal, so we need to convert the analog signal into digital signal with an ADC (Analog to Digital Convertor). Then we make this digital output voltage display on the screen.
Experimental Procedures
Step 1: Connect the circuit as shown in the following diagram
Step 2: Edit and save the code (see path/Rpi_UniversalStartKit /11_voltmeter/vol.c)
Step 3: Compile the code
gcc vol.c -lwiringPi
Step 4: Run the program
./a.out
Press Enter, if you adjust the potentiometer , you will see the voltage value displayed on the screen changed.
vol.c
#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
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;
float vol;
if(wiringPiSetup() == -1){
printf("setup wiringPi failed !");
return 1;
}
pinMode(ADC_CS, OUTPUT);
pinMode(ADC_CLK, OUTPUT);
while(1){
pinMode(ADC_DIO, OUTPUT);
adcVal = get_ADC_Result();
printf("Current Voltage : %0.2f V\n", adcVal*(5.0/255));
delay(400);
}
return 0;
}
Python Code
#!/usr/bin/env python
import ADC0832
import time
def init():
ADC0832.setup()
def loop():
while True:
res = ADC0832.getResult()
v = res * (3.3 / 255)
print 'Current voltage: %.2f V' % v
time.sleep(0.2)
if __name__ == '__main__':
init()
try:
loop()
except KeyboardInterrupt:
ADC0832.destroy()
print 'The end !'