Skip to content

Commit

Permalink
Analog input added!
Browse files Browse the repository at this point in the history
  • Loading branch information
videoman committed Mar 5, 2013
1 parent 9ea786e commit 18d8e87
Show file tree
Hide file tree
Showing 2 changed files with 211 additions and 0 deletions.
100 changes: 100 additions & 0 deletions Analog_and_temp.py
@@ -0,0 +1,100 @@
#!/usr/bin/env python
import time
import datetime
import os
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)
DEBUG = 1
LOGGER = 1

# read SPI data from MCP3008 chip, 8 possible adc's (0 thru 7)
def readadc(adcnum, clockpin, mosipin, misopin, cspin):
if ((adcnum > 7) or (adcnum < 0)):
return -1
GPIO.output(cspin, True)

GPIO.output(clockpin, False) # start clock low
GPIO.output(cspin, False) # bring CS low

commandout = adcnum
commandout |= 0x18 # start bit + single-ended bit
commandout <<= 3 # we only need to send 5 bits here
for i in range(5):
if (commandout & 0x80):
GPIO.output(mosipin, True)
else:
GPIO.output(mosipin, False)
commandout <<= 1
GPIO.output(clockpin, True)
GPIO.output(clockpin, False)

adcout = 0
# read in one empty bit, one null bit and 10 ADC bits
for i in range(12):
GPIO.output(clockpin, True)
GPIO.output(clockpin, False)
adcout <<= 1
if (GPIO.input(misopin)):
adcout |= 0x1

GPIO.output(cspin, True)

adcout /= 2 # first bit is 'null' so drop it
return adcout

# change these as desired - they're the pins connected from the
# SPI port on the ADC to the Cobbler
SPICLK = 18
SPIMISO = 23
SPIMOSI = 24
SPICS = 25

# set up the SPI interface pins
GPIO.setup(SPIMOSI, GPIO.OUT)
GPIO.setup(SPIMISO, GPIO.IN)
GPIO.setup(SPICLK, GPIO.OUT)
GPIO.setup(SPICS, GPIO.OUT)

# temperature sensor connected channel 0 of mcp3008
adcnum = 0

while True:
# read the analog pin (temperature sensor LM35)
read_adc0 = readadc(adcnum, SPICLK, SPIMOSI, SPIMISO, SPICS)

# convert analog reading to millivolts = ADC * ( 3300 / 1024 )
millivolts = read_adc0 * ( 3300.0 / 1024.0)

# 10 mv per degree
temp_C = ((millivolts - 100.0) / 10.0) - 40.0

# convert celsius to fahrenheit
temp_F = ( temp_C * 9.0 / 5.0 ) + 32

# remove decimal point from millivolts
millivolts = "%d" % millivolts

# show only one decimal place for temprature and voltage readings
temp_C = "%.1f" % temp_C
temp_F = "%.1f" % temp_F

if DEBUG:
# Print what we have gathered to the Screen!
print "read_adc0:\t", read_adc0
print "millivolts:\t", millivolts
print "temp_C:\t\t", temp_C
print "temp_F:\t\t", temp_F
print

if LOGGER:
# open a file for writing... append mode
logtime = datetime.datetime.now()
temphist = open('temp_hist', 'a')
temphist.write(logtime.strftime("%Y-%m-%d %H:%M") + '\t' + 'temp_C:\t' + temp_C + '\t' + 'temp_F:' + '\t' + temp_F + '\n')


# Sleep for 5 seconds...
time.sleep(5)

#If you want to log this data, check out adafruit-cosm-temp.py program
111 changes: 111 additions & 0 deletions adafruit-cosm-temp.py
@@ -0,0 +1,111 @@
#!/usr/bin/env python
import time
import os
import RPi.GPIO as GPIO
import eeml

GPIO.setmode(GPIO.BCM)
DEBUG = 1
LOGGER = 0

# read SPI data from MCP3008 chip, 8 possible adc's (0 thru 7)
def readadc(adcnum, clockpin, mosipin, misopin, cspin):
if ((adcnum > 7) or (adcnum < 0)):
return -1
GPIO.output(cspin, True)

GPIO.output(clockpin, False) # start clock low
GPIO.output(cspin, False) # bring CS low

commandout = adcnum
commandout |= 0x18 # start bit + single-ended bit
commandout <<= 3 # we only need to send 5 bits here
for i in range(5):
if (commandout & 0x80):
GPIO.output(mosipin, True)
else:
GPIO.output(mosipin, False)
commandout <<= 1
GPIO.output(clockpin, True)
GPIO.output(clockpin, False)

adcout = 0
# read in one empty bit, one null bit and 10 ADC bits
for i in range(12):
GPIO.output(clockpin, True)
GPIO.output(clockpin, False)
adcout <<= 1
if (GPIO.input(misopin)):
adcout |= 0x1

GPIO.output(cspin, True)

adcout /= 2 # first bit is 'null' so drop it
return adcout

# change these as desired - they're the pins connected from the
# SPI port on the ADC to the Cobbler
SPICLK = 18
SPIMISO = 23
SPIMOSI = 24
SPICS = 25

# set up the SPI interface pins
GPIO.setup(SPIMOSI, GPIO.OUT)
GPIO.setup(SPIMISO, GPIO.IN)
GPIO.setup(SPICLK, GPIO.OUT)
GPIO.setup(SPICS, GPIO.OUT)

# COSM variables. The API_KEY and FEED are specific to your COSM account and must be changed
#API_KEY = '5RNOO3ShYJxYiq2V2sgSRtz3112SAKxFQjNDQmNXc0RScz0g'
#FEED = 68872
API_KEY = 'YOUR_API_KEY'
FEED = YOUR_FEED_ID

API_URL = '/v2/feeds/{feednum}.xml' .format(feednum = FEED)

# temperature sensor connected channel 0 of mcp3008
adcnum = 0

while True:
# read the analog pin (temperature sensor LM35)
read_adc0 = readadc(adcnum, SPICLK, SPIMOSI, SPIMISO, SPICS)

# convert analog reading to millivolts = ADC * ( 3300 / 1024 )
millivolts = read_adc0 * ( 3300.0 / 1024.0)

# 10 mv per degree
temp_C = ((millivolts - 100.0) / 10.0) - 40.0

# convert celsius to fahrenheit
temp_F = ( temp_C * 9.0 / 5.0 ) + 32

# remove decimal point from millivolts
millivolts = "%d" % millivolts

# show only one decimal place for temprature and voltage readings
temp_C = "%.1f" % temp_C
temp_F = "%.1f" % temp_F

if DEBUG:
print "read_adc0:\t", read_adc0
print "millivolts:\t", millivolts
print "temp_C:\t\t", temp_C
print "temp_F:\t\t", temp_F
print

if LOGGER:
# open up your cosm feed
pac = eeml.Pachube(API_URL, API_KEY)

#send celsius data
pac.update([eeml.Data(0, temp_C, unit=eeml.Celsius())])

#send fahrenheit data
pac.update([eeml.Data(1, temp_F, unit=eeml.Fahrenheit())])

# send data to cosm
pac.put()

# hang out and do nothing for 10 seconds, avoid flooding cosm
time.sleep(30)

0 comments on commit 18d8e87

Please sign in to comment.