REM Temperature & Pressure & Humidity Logger REM with BMP280 & AM2320 for MachiKania type P USEVAR T1,T2,T3,P1,P2,P3,P4,P5,P6,P7,P8,P9 USEVAR IX,TB,PB,HB,TMAX,TMIN,PMAX,PMIN USEVAR FNAME,LCD USEVAR C_TIME,C_PRES,C_TEMP,C_HUMD W=3600:REM Interval 1sec:60,1min:3600,1hour:216000 C_TIME=7:C_PRES=4:C_TEMP=2:C_HUMD=1 CLS USEVAR DX DX=236 DIM D(1):REM Buffer for AM2320 DIM TB#(DX),PB#(DX),HB#(DX),B(5) FOR I=0 TO DX-1:PB#(I)=0:NEXT I2C 100:REM Set I2C Baudrate 100KHz FNAME$="TPHLOG.TXT" GOSUB INIBMP:REM Initialize BMP280 FOPEN FNAME$,"w":FPRINT "Temperature,Pressure,Humidity":FCLOSE F=0:IX=0 REM Main Loop WHILE 1 GOSUB AM2320,D H#=FLOAT#(PEEK(D+2)*256+PEEK(D+3))/10.0 T#=FLOAT#(PEEK(D+4)*256+PEEK(D+5))/10.0 P#=GOSUB#(GETPRS) TB#(IX)=T#:PB#(IX)=P#:HB#(IX)=H# GOSUB PLOT GPRINT 80,0,C_TIME,-1,SPRINTF$("%.1f",T#)+"ßC "+DEC$(INT(P#))+"hPa "+DEC$(INT(H#))+"%" FOPEN FNAME$,"a":FPRINT T#;",";P#;",";H#;"%":FCLOSE IX=IX+1:IF IX=DX THEN IX=0:F=1 WAIT W WEND LABEL PLOT VAR I,J,Y,A,B,D GCLS REM Get Minimum & Max TMIN#=TB#(0):TMAX#=TB#(0) PMIN#=PB#(0):PMAX#=PB#(0) FOR I=1 TO DX-1 IF PB#(I)=0 THEN CONTINUE IF TB#(I)TMAX# THEN TMAX#=TB#(I) IF PB#(I)PMAX# THEN PMAX#=PB#(I) NEXT REM Plot Time Axis LINE 22,220,DX+36,220,C_TIME IF W>=15000 THEN D=5190672/W ELSEIF W>=600 THEN D=216300/W ELSE D=3600/W ENDIF IF F=0 THEN J=IX ELSE J=DX-1 FOR I=J TO 0 STEP -D LINE I+35,221,I+35,222,C_TIME IF W>=15000 THEN GPRINT I+31,224,C_TIME,0,DEC$((I-J)/D)+"d" ELSEIF W>=600 THEN GPRINT I+31,224,C_TIME,0,DEC$((I-J)/D)+"h" ELSE GPRINT I+31,224,C_TIME,0,DEC$((I-J)/D)+"m" ENDIF NEXT REM PLOT Temperature Graph GPRINT 0,8,C_TEMP,-1,"[ßC]" LINE 22,16,22,220,C_TEMP A=INT(TMIN#/5-1)*5:B=INT(TMAX#/5+2)*5 FOR I=A TO B STEP 5 Y=GOSUB(YAXIS,FLOAT#(I),A,B) GPRINT 0,Y-4,C_TEMP,-1,DEC$(I) LINE 19,Y,21,Y,C_TEMP NEXT J=(IX+1)*F%DX FOR I=0 TO DX-1 IF PB#(J) THEN Y=GOSUB(YAXIS,TB#(J),A,B) PSET I+35,Y,C_TEMP ENDIF J=J+1:IF J=DX THEN J=0 NEXT REM PLOT Pressure Graph GPRINT DX+40,8,C_PRES,-1,"[hPa]" LINE DX+37,16,DX+37,220,C_PRES A=INT(PMIN#/5-1)*5:B=INT(PMAX#/5+2)*5 FOR I=A TO B STEP 5 Y=GOSUB(YAXIS,FLOAT#(I),A,B) GPRINT DX+50,Y-4,C_PRES,-1,DEC$(I) LINE DX+39,Y,DX+44,Y,C_PRES NEXT J=(IX+1)*F%DX FOR I=0 TO DX-1 IF PB#(J) THEN Y=GOSUB(YAXIS,PB#(J),A,B) PSET I+35,Y,C_PRES ENDIF J=J+1:IF J=DX THEN J=0 NEXT REM PLOT Humidity Graph GPRINT 37,8,C_HUMD,-1,"[%]" LINE 34,16,34,220,C_HUMD A=0:B=100 FOR I=A TO B STEP 25 Y=GOSUB(YAXIS,FLOAT#(I),A,B) GPRINT 43,Y-4,C_HUMD,-1,DEC$(I) LINE 35,Y,40,Y,C_HUMD NEXT J=(IX+1)*F%DX FOR I=0 TO DX-1 IF PB#(J) THEN Y=GOSUB(YAXIS,HB#(J),A,B) PSET I+35,Y,C_HUMD ENDIF J=J+1:IF J=DX THEN J=0 NEXT RETURN LABEL YAXIS RETURN 211-INT((ARGS#(1)-FLOAT#(ARGS(2)))/(FLOAT#(ARGS(3)-ARGS(2)))*180) LABEL INIBMP REM Initialize BMP280 IF I2CREAD($76,$D0)!=$58 THEN GPRINT 0,0,C_TIME,-1,"CHIP ID ERROR":END ENDIF I2CREADDATA $76,B,24,$88 T1=PEEK16(B) T2=GOSUB(EXTEND,PEEK16(B+2)) T3=GOSUB(EXTEND,PEEK16(B+4)) P1=PEEK16(B+6) P2=GOSUB(EXTEND,PEEK16(B+8)) P3=GOSUB(EXTEND,PEEK16(B+10)) P4=GOSUB(EXTEND,PEEK16(B+12)) P5=GOSUB(EXTEND,PEEK16(B+14)) P6=GOSUB(EXTEND,PEEK16(B+16)) P7=GOSUB(EXTEND,PEEK16(B+18)) P8=GOSUB(EXTEND,PEEK16(B+20)) P9=GOSUB(EXTEND,PEEK16(B+22)) I2CWRITE $76,$F4,$5F WAIT 10 RETURN LABEL GETPRS:REM Get Pressure VAR T,P,V,W I2CREADDATA $76,B,3,$FA T#=FLOAT#((PEEK(B)<<12)+(PEEK(B+1)<<4)+(PEEK(B+2)>>4)) I2CREADDATA $76,B,3,$F7 P#=FLOAT#((PEEK(B)<<12)+(PEEK(B+1)<<4)+(PEEK(B+2)>>4)) V#=(T#/16384-FLOAT#(T1)/1024)*FLOAT#(T2) W#=(T#/131072-FLOAT#(T1)/8192)*(T#/131072-FLOAT#(T1)/8192)*FLOAT#(T3) V#=(V#+W#)/2-64000 W#=V#*V#*FLOAT#(P6)/32768 W#=W#+V#*FLOAT#(P5)*2 W#=W#/4+FLOAT#(P4)*65536 V#=(FLOAT#(P3)*V#*V#/524288+FLOAT#(P2)*V#)/524288 V#=(1+V#/32768)*FLOAT#(P1) IF V#=0 THEN RETURN 0.0 P#=1048576-P# P#=(P#-W#/4096)*6250/V# V#=FLOAT#(P9)*P#*P#/2147483648 W#=P#*FLOAT#(P8)/32768 P#=P#+(V#+W#+FLOAT#(P7))/16 RETURN P#/100 LABEL EXTEND:REM Sign Extend 16bit to 32bit IF ARGS(1)<$8000 THEN RETURN ARGS(1) RETURN ARGS(1)+$FFFF0000 LABEL AM2320 REM Get Temperature & Humidity from AM2320 I2CWRITE $5C,0:REM Wake Up the Device I2CWRITE $5C,3,0,4 WAIT 2 I2CREADDATA $5C,ARGS(1),8 RETURN