' ' Stromschnittstellen Datenlogger Rev 1.03 ' (c) Avisaro AG, 21.08.2014 ' ' ------------------------------------------------ ' ' Unterschied zu 1.02 ' - mkdir logs Bug behoben ' ' ' Every Day a new File (1= yes, 0 = no) ? let new_file = 1 ' Aufzeichnung in s (integer value) let sample_time = 1 ' ------------------------------------------------ ' max filesize in MByte let size = 10 let file = 0 ' ------------------------------------------------ ' Hardware specific settings let red = -202 let green = -203 let inkey = -204 ' ------------------------------------------------ inmode -2 outmode -3 let size = size * 1000000 ' ------------------------------------------------ ' Arrays für I2C Datenverkehr DIM A(3) DIM B(2) DIM C(1) 'Individuelle Kalibrierparameter pro Kanal let RA = 4990 let RB = 4990 let i = 0 ' ------------------------------------------------ inmode -3 input A 'open I2C Interface auxopen -5, 400000 , 72, 0, 0, 0 ' -------------------------------------------- 'WEBPAGE / LED OUTPUT löschen put red, #0 put green, #0 let xx$ = " " put -100, xx$, len(xx$) put -101, xx$, len(xx$) put -102, xx$, len(xx$) put -103, xx$, len(xx$) put -104, xx$, len(xx$) put -105, xx$, len(xx$) 'ALTE WERTE LÖSCHEN let DDIFA = 0 let DDIFB = 0 let FVALUE = 0 let FVALUE$ = "0" BEGIN: let n$ = date$ put green, #1 gosub Datei_erzeugen ' War Öffnen der Datei OK? if LASTERR <> 0 then close 1 goto BEGIN end if do if n$ <> date$ then close 1 goto BEGIN end if put red, #1 let t = time 'Auswahl des Register let a(0) = 1 let a(2) = 227 'AD-Wandler für Diff 0-1 'select input let a(1) = 133 GET_A: put -5, a, 3 WAIT_A: get -5, C if C(0) < 128 then if i > 10 then let i = 0 goto GET_A end if let i = i+1 goto WAIT_A end if let i = 0 let c(0) = 0 put -5, c, 1 get -5, B let temp = (B(0)*256+B(1)) if temp >= 32768 then let temp = temp -65535 end if let DDIFA = temp if DDIFA = DDIFB then if i > 10 then let i = 0 goto A_SAME end if let i = i + 1 goto GET_A end if A_SAME: let i = 0 'AD-Wandler für Diff 2-3 'select input let a(1) = 181 GET_B: put -5, a, 3 WAIT_B: get -5, C if C(0) < 128 then if i > 10 then let i = 0 goto GET_B end if let i = i+1 goto WAIT_B end if let i = 0 let c(0) = 0 put -5, c, 1 get -5, B let temp = (B(0)*256+B(1)) if temp >= 32768 then let temp = temp -65535 end if let DDIFB = temp if DDIFB = DDIFA then if i > 10 then let i = 0 goto B_SAME end if let i = i + 1 goto GET_B end if B_SAME: let i = 0 ' AUSWERTUNG ' Channel A if ABS(DDIFA) < 32767 then let DCURRA = (((DDIFA*50000)/32768) * 2048 ) / RA let DCURRA = DCURRA * 2 ' let statusA$ = statusA$+str$(DCURRA)+"uA" let FVALUE = ABS(DCURRA) gosub MAKE_FLOAT let DCURRA$ = FVALUE$ + " mA" let TEMPTXT$ = str$(DCURRA) else let DCURRA$ = "limit exceeded" end if put -100, TEMPTXT$ put -102, DCURRA$ ' AUSWERTUNG ' Channel B if ABS(DDIFB) < 32767 then let DCURRB = (((DDIFB*50000)/32768) * 2048 ) / RB let DCURRB = DCURRB * 2 ' let statusB$ = statusB$+str$(DCURRB)+"uA" let FVALUE = ABS(DCURRB) gosub MAKE_FLOAT let DCURRB$ = FVALUE$ + " mA" let TEMPTXT$ = str$(DCURRB) else let DCURRB$ = "limit exceeded" end if put -101, TEMPTXT$ put -103, DCURRB$ ' write timestamp to SD card let T$ = date$ + " " + time$ let T$ = T$ + " " put 1, T$ ' Save Current Value let D$ = " " 'let D$ = D$ + DCURRA$ + " " +str$(DDIFA) + " " +DCURRB$ + " " +str$(DDIFB) let D$ = D$ + DCURRA$ + " " +DCURRB$ put 1, D$ ' Write Line Delimiter put 1 , #13 put 1 , #10 if lof(0) = 0 or status(1) <> 2 then close 1 put red, #0 goto BEGIN end if if lof(0) > size then file = file + 1 close 1 put red, #0 goto BEGIN end if WAIT_SAMPLE: ' ENDE? get inkey, in if in = 0 then close 1 goto FIN_KEY end if sleep 10 if ((t + sample_time) > time) then goto WAIT_SAMPLE end if loop Datei_erzeugen: exec "mkdir logs" if new_file = 1 then let f$ = "logs/" let f$ = f$ + mid$(date$, 3 , 2) + mid$(date$, 6 , 2) + mid$(date$, 9 , 2) + str$(file) + ".txt" else ' wenn einmal ein Datei gefordert let f$ = "logs/" let f$ = f$ + "log"+str$(file)+".txt" end if sleep 1 open "AB", 1, f$ if LASTERR <> 0 then open "WB", 1, f$ return if LASTERR <> 0 then end if end if return FIN_KEY: put red, #0 REM Warten bis Taste nicht gedrückt get inkey, in if in = 0 then close 1 goto FIN_KEY end if FINISH: close 1 put red, #0 sleep 1000 REM Warten bis Karte entnommen oder Taste gedrückt let x = lof(0) get inkey, in if (x < 10) or (in = 0) then goto BEGIN else goto FINISH end if goto BEGIN MAKE_FLOAT: let FVALUE$ = str$(FVALUE) 'WENN NUR ZWEI NACHKOMMASTELLEN GEWÜNSCHT - AUFRUNDEN?: ' if len(FVALUE$) > 2 then 'let lastZNKS$ = right$(FVALUE$, 1) 'if VAL(lastZNKS$) > 4 then 'let FVALUE = FVALUE +5 'goto MAKE_FLOAT 'end if 'end if ' bis hier und unten if len(FVALUE$) > 2 then let FVALUE$ = "." + right$(FVALUE$, 3) else if len(FVALUE$) > 1 then let FVALUE$ = ".0" + right$(FVALUE$, 2) else let FVALUE$ = ".00" + right$(FVALUE$, 1) end if end if if ABS(FVALUE) > 999 then let FVALUE = FVALUE / 1000 let temp$ = str$(FVALUE) let FVALUE$ = temp$ + FVALUE$ else let FVALUE$ = "0"+FVALUE$ end if 'WENN NUR ZWEI NACHKOMMASTELLEN GEWÜNSCHT- letzte Stelle abschneiden: 'let znks = len(FVALUE$) - 1 'let FVALUE$ = left$(FVALUE$, znks) return goto BEGIN ' +++