#!/usr/bin/python # # Read sensors and store them in individual files # # author: Vasilis.Vlachoudis@cern.ch # version: 0.0 # date: Sep 2012 import os import sys import time import math import serial import struct recordFmt = "=dBHHff" recordLength = struct.calcsize(recordFmt) recordSeekStep = 20 # Seeking record block port = "/dev/ttyAMA0" baudrate = 4800 #parity = "N" tempR = R10 = 10000.0 # Ohm tempB = 3988.0 # K tempA = tempR / math.exp(tempB / (273.0+25.0)) # ----------------------------------------------------------------------------- # Convert adc reading to temperature # Rt = A*exp(B/T(K)) # # V1 = V / (R10 + Rt) * R10 # adc = V1/V * 255(max) # Rt = (255/adc - 1.0)*R10 # T(C) = B/log(Rt/A) - 273.0 # ----------------------------------------------------------------------------- def temp(adc): Rt = (255.0/float(adc) - 1.0) * R10 t = tempB / math.log(Rt/tempA) - 273.0 return max(-30.0,min(t,45.0)) # Limit to -30 .. 45 # ----------------------------------------------------------------------------- def humidity(adc, temp): return 0.0 # ----------------------------------------------------------------------------- # Read a sensors record to database # ----------------------------------------------------------------------------- def writeRecord(f, timestamp, record): if len(record) != 6: return False if record[0] != "DATA": return False try: sid = int(record[1]) switch = int(record[2]) adc1 = int(record[3]) adc2 = int(record[4]) chk = int(record[5]) except: return False # Verify checksum sum = 2*switch + sid sum += 3*adc1 sum += 4*adc2 sum %= 256 if chk != sum: return False t = temp(adc1) h = humidity(adc2,t) f.write(struct.pack(recordFmt, timestamp, switch, adc1, adc2, t, h)) f.flush() #sys.stdout.write('insert into Sensors values (%d,%f,%d,%d,%d,%f)\n' % \ # (sid, timestamp, switch, adc1, adc2, t)) return True # ----------------------------------------------------------------------------- def readRecord(f): try: return f.read(recordLength) except: return None # ----------------------------------------------------------------------------- def seekTime(f, tstart): # Seek to the end try: f.seek(-recordSeekStep*recordLength,2) except: pass while True: record = readRecord(f) if record is None: break rec = unpack(record) if rec is None: break if rec[0] > tstart: # roll back another block try: f.seek(-recordSeekStep*recordLength,1) continue except: break # We are getting close # read one by one the records and stop when > for i in range(recordSeekStep-1): record = readRecord(f) if record is None: break rec = unpack(record) if rec is None: break if rec[0] > tstart: # seek one back f.seek(-recordLength,1) break break return f.tell() # ----------------------------------------------------------------------------- def unpack(record): if len(record)!=recordLength: return None return struct.unpack(recordFmt, record) # ----------------------------------------------------------------------------- # Open communication port with PICAXE # ----------------------------------------------------------------------------- def openComm(): return serial.Serial(port, baudrate) #, parity=parity) #, rtscts=rtscts, xonxoff=xonxoff, timeout=1)