'CR1000 Series Datalogger
'JASTREBARSKO METEO STATION
'version A1
'date: 17/09/2007
'program author: Giorgio Alberti, DISAA, University of Udine, Udine

' ************************** WIRING DIAGRAM **************************************
' ------------------------------- CR1000  ----------------------------------------
'Analog Channels
'  H1 AM416 COM1 H1
'  L1 AM416 COM1 L1
'  H2 AM416 COM2 H2
'  L2 AM416 COM2 L2
'  H3 
'  L3
'  H4
'  L4
'  H5 
'  L5 
'  H6 
'  L6
'Control Channels
'  C1 LI-7500 SDM Data
'  C2 LI-7500 SDM Clock
'  C3 LI-7500 SDM Enable
'  C4 AM416 RES
'  C5 AM416 CLK
'  C6 To TDR1, TDR2, TDR3 control (orange)
'  C7
'  C8 
'  12Vsw to HFP01SC power (red)
'  12V To power box at the top of the tower
'Excitation channels
'  E1 Wind sensor excitation
'  E2
'Pulse channels
'  P1 Raingage
'  P2 Wind speed
'  G  To power box at the top of the tower
'  G  GND raingage
'  G  GND wind speed
'  G  HFP01SC ground (black)
'  G  HFP01SC shield (clear)
'  G  LI-7500 SDM reference
'  G  LI-7500 SDM shield
' AG  

' --------------------------------- AM416 ----------------------------------------
'1  H1 CMP3 High
'   L1 CMP3 Low           
'   H2 NR Lite High
'   L2 NR Lite Low           
'2  H1 Li-190 up High
'   L1 Li-190 up Low          
'   H2 Li-190 down High
'   L2 Li-190 down Low             
'3  H1 Calex IR Temp. High
'   L1 Calex IR Temp. Low           
'   H2 Vaisala HMCP Ta High
'   L2 To Ch. 4 L1            
'4  H1 Vaisala HMP45C RH High
'   L1 Vaisala HMP45C RH Low and to CR1000 AG               					
'   H2 Wind direction High
'   L2 Wind direction Low              								
'5  H1 Soil Tcp 1-4 blue
'   L1 Soil Tcp 1-4 red              									
'   H2 Soil Tcp 2-5 blue
'   L2 Soil Tcp 2-5 red               									
'6  H1 Soil Tcp 3-6 blue
'   L1 Soil Tcp 3-6 red
'   H2 Soil Tcp 7-10 blue
'   L2 Soil Tcp 7-10 red
'7  H1 Soil Tcp 8-11 blue
'   L1 Soil Tcp 8-11 red                                    
'   H2 Soil Tcp 9-12 blue
'   L2 Soil Tcp 9-12 red
'8  H1 SHF plates 1-2 red
'   L1 SHF plates 1-2 black                                     
'   H2 SHF plates 3-4 red
'   L2 SHF plates 3-4 black
'9  H1 TDR1
'   L1 TDR2
'   H2 TDR3
'   L2
'10 H1 HFP01SC soil heat flux 1 sensor signal (White)
'   L1 HFP01SC soil heat flux 1 sensor reference (green)
'   H2 HFP01SC soil heat flux 2 sensor signal (White)
'   L2 HFP01SC soil heat flux 2 sensor reference (green)
'11 H1 HFP01SC soil heat flux 3 sensor signal (White)
'   L1 HFP01SC soil heat flux 3 sensor reference (green)
'   H2 HFP01SC soil heat flux 4 sensor signal (White)
'   L2 HFP01SC soil heat flux 4 sensor reference (green)    
'12 H1 HFP01SC soil heat flux 1 heater resistor signal (yellow)
'   L1 HFP01SC soil heat flux 1 heater resistor reference (purple)                     
'   H2 HFP01SC soil heat flux 2 heater resistor signal (yellow)
'   L2 HFP01SC soil heat flux 2 heater resistor reference (purple) 
'13 H1 HFP01SC soil heat flux 3 heater resistor signal (yellow) 
'   L1 HFP01SC soil heat flux 3 heater resistor reference (purple) 
'   H2 HFP01SC soil heat flux 4 heater resistor signal (yellow) 
'   L2 HFP01SC soil heat flux 4 heater resistor reference (purple) 
'14 H1
'   L1
'   H2
'   L2
'15 H1
'   L1
'   H2
'   L2
'16 H1
'   L1                     
'   H2
'   L2
'

' ******************************** VARIABLES *************************************

PUBLIC I, j
PUBLIC Vbat, time
UNITS Vbat = mV

PUBLIC Tref
UNITS Tref = Celsius

PUBLIC P, WS, WD, Rn, Rg, PPFD, PPFDd, Tc, Ta, Rh
PUBLIC WD_mV, Rg_mV, Rn_mV, PPFD_mV, PPFDd_mV, Tc_mV
PUBLIC Ts(6)
PUBLIC G(2)

UNITS P = mm
UNITS WD = m/s
UNITS WD = degree
UNITS Rn = W/m^2
UNITS Rg = W/m^2
UNITS PPFD = umol/(m^2*s)
UNITS PPFDd = umol/(m^2*s)
UNITS Tc = Celsius
UNITS Ta = Celsius
UNITS Rh = percentage
UNITS Ts(6) = Celsius
UNITS G(2) = W/m^2

PUBLIC period(3)
PUBLIC periodc(3)
PUBLIC SWC(3)
PUBLIC shf_cal(4)
PUBLIC shf(4)
DIM irga_raw(4)
DIM AGC as LONG

UNITS period(3) = unitless
UNITS periodc(3) = unitless
UNITS shf(4) = W/m^2
UNITS AGC = unitless

' HFP01SC plates
ALIAS shf(1) = hfp01sc_1
ALIAS shf(2) = hfp01sc_2
ALIAS shf(3) = hfp01sc_3
ALIAS shf(4) = hfp01sc_4

' Soil heat flux calibration variables
Dim shf_mV(4)
Dim shf_mV_run(4)
Dim shf_mV_0(4)
Dim shf_mV_180(4)
Dim shf_mV_end(4)
Dim V_Rf(4)
Dim V_Rf_run(4)
Dim V_Rf_180(4)
Dim shf_cal_on
Dim sw_12_1_state   'state of the SW-12V port

' IRGA VARIABLES
ALIAS irga_raw(1) = co2_raw
ALIAS irga_raw(2) = h2O_raw
ALIAS irga_raw(3) = press_raw
ALIAS irga_raw(4) = diag_irga_raw

UNITS co2_raw = umol/m^3
UNITS h2O_raw = umol/m^3
UNITS press_raw = kPa
UNITS diag_irga_raw = unitless


' ******************************* CONSTANTS ****************************************

' TDR CS616 Water Content Reflectometry
CONST C0 = -0.0663
CONST C1 = -0.0063
CONST C2 = 0.0007
CONST C3 = 0.526
CONST C4 = -0.052
CONST C5 = 0.00136

' CMP3 Global radiation sensor
CONST M1 = 10.85/1000
CONST M2 = 11.30/1000

' NR-Lite Net radiation
CONST M3 = 13.1/1000

' Soil heat flux plates
CONST m_SHF1 = 5.97
CONST m_SHF2 = 5.10

' Wind speed and direction
CONST m_WS = 1
CONST m_WD = 1

' HFP01SC
CONST HFP01_SC_CAL_1 = 15
CONST HFP01_SC_CAL_2  = 15
CONST HFP01_SC_CAL_3  = 15
CONST HFP01_SC_CAL_4  = 15
CONST CAL_INTERVAL = 180

' *********************************** OUTPUT VARIABLES ****************************
DataTable (Meteo,1,-1)
	OpenInterval
	DataInterval (0,30,Min,10)
	Average(1,Vbat,FP2,0)
	Average(1,Ta,FP2,0)
	Average(1,Tc,FP2,0)
	Totalize(1,P,FP2,0)
	Average(1,WD,FP2,0)
	Totalize(1,WS,FP2,0)
	Average(1,Rn,FP2,0)
	Average(1,Rg,FP2,0)
	Average(1,PPFD,FP2,0)
	Average(1,PPFDd,FP2,0)
	Average(6,Ts(),FP2,0)
	Average(3,SWC(),FP2,0)
	Average(2,G(),FP2,0)
	Average(4,hfp01sc_1, IEEE4,shf_cal_on)
	Sample(4,shf_cal(1),IEEE4)
	Average(1,WD_mV,FP2,0)
	Average(1,Rn_mV,IEEE4,0)
	Average(1,Rg_mV,IEEE4,0)
	Average(1,PPFD_mV,IEEE4,0)
	Average(1,PPFDd_mV,IEEE4,0)
	Average(1,Tc_mV,IEEE4,0)
	Average(3,period(),IEEE4,0)
	Average (1,co2_raw,IEEE4,0)
	Average (1,h2O_raw,IEEE4,0)
	Average (1,press_raw,IEEE4,0)
	Average (1,AGC,IEEE4,0)
EndTable

' ************************ SUBROUTINES *******************************************
'Perform in situ calibration HFP01C
Sub hfp01_sc_cal
	If IfTime(1,CAL_INTERVAL,Min) Then
		shf_cal_on = TRUE
		move (shf_mV_0(1),4,shf_mV_run(1),4)
		sw_12_1_state = TRUE
		SW12 (1)
	endIf
	
	If (IfTime(4,CAL_INTERVAL,Min)) Then
		Move(shf_mV_180(1),4,shf_mV_run(1),4)
		Move(V_Rf_180(1),4,V_Rf_run(1),4)
		sw_12_1_state = FALSE
		SW12 (0)					 
	EndIf
	
	If IfTime(19,CAL_INTERVAL,Min) Then
		Move(shf_mV_end(1),4,shf_mV_run(1),4)
		For j = 1 to 4
			shf_cal(j) = V_Rf_180(j)*V_Rf_180(j)*128.7/ABS(((shf_mV_0(j)+shf_mV_end(j))/2)-shf_mV_180(j))
		Next j
		shf_cal_on = FALSE
	EndIf
				
Endsub
		
' ************************************ MAIN PROGRAM ******************************
' Run the program every 10 s

BeginProg
	Scan (10,Sec,3,0)
		PanelTemp (Tref,250)
		Battery (Vbat)

'Read CR1000 

	' Rain
					PulseCount (P,1,1,2,0,0.2,0)
					
	' Wind speed
					PulseCount(WS,1,2,0,0,1,0)
					WS = WS * m_WS
					
	' LI-7500 CO2, H2O, air pressure and diagnostic
					CS7500 (co2_raw,1,7,6)
	
	' Compute the AGC
	AGC = INT ((diag_irga_raw AND &h000f) * 6.25 + 0.5)
	
' Read multiplexer
				PortSet (4,1)
				PulsePort(5,35000)
						
		' Radiazione globale
				VoltDiff (Rg_mV,1,mV25,1,True ,0,250,1.0,0)
				Rg=Rg_mV / M1
		
		' Radiometro netto NR - Lite & CR3
				VoltDiff (Rn_mV,1,mV250,2,True ,0,_60Hz,1.0,0)
				Rn = Rn_mV / M3		
			
		' Incoming and outcoming PPFD (0V = 0 - 5 mV = 1000 umol m-2 s-1)
				PulsePort(5,35000)
				VoltDiff (PPFD_mV,1,mV7_5,1,True ,0,250,1,0)
				VoltDiff (PPFDd_mV,1,mV7_5,2,True ,0,250,1,0)
				PPFD=PPFd_mV*200
				PPFDd=PPFDd_mV*200
				
		' Outcoming long wave radiation (0V = -20 - 5V = 100 C)
				PulsePort (5,35000)
				VoltDiff (Tc_mV,1,mV5000,1,True ,0,250,1.0,0)
				Tc = Tc_mV * 0.024 - 20
		
		' Air temperature and air humidity
				VoltDiff (Ta,1,mV5000,2,True ,0,250,0.1,0)
				Ta = Ta - 40
				
				PulsePort (5,35000)
				VoltDiff (Rh,1,mV5000,1,True ,0,250,0.1,0)
				
		' Wind direction
				VoltDiff (WD_mV,1,mV5000,2,True ,0,250,1,0)
				WD = WD_mV * m_WD
		
		' Soil temperature				
				For I=1 To 3 Step 2
																		
					PulsePort (5,35000)
					TCDiff (Ts(I),2,mV2_5C,1,TypeT,TRef,True ,0,250,1.0,0)
																					
				Next I
		
		' Soil heat flux plates
				For I=1 To 2 Step 2 
				
					PulsePort (5,35000)
					VoltDiff (G(I),2,mV250,1,True ,0,250,1.0,0)
										
				Next I		
						
						' Convert SHF in W m-2
						G(1)= - m_SHF1*G(1)
						G(2)= - m_SHF2*G(2)
						
		' Read CS616 Water Content Reflectometry
				PulsePort (5,35000)
				CS616 (period(),3,1,6,4,1.0,0)	
				
						' Correct CS616 for soil temperature
						For I=1 To 3
									
							periodc(I)= period(I) + (20-Ts(1))*(0.526 - 0.052*period(I) + 0.00136 * (period(I))^2)
							SWC(I)=C0 + C1 * periodc(I) + C2 * period(I)^2
				
						Next I
		
		' Read HFP01SC plates
		
					' Load the HFP01SC factory calibration
					shf_cal(1) = HFP01_SC_CAL_1
					shf_cal(2) = HFP01_SC_CAL_2
					shf_cal(3) = HFP01_SC_CAL_3
					shf_cal(4) = HFP01_SC_CAL_4
				
					PulsePort (5,35000)
					VoltDiff (shf_mV(1),2,mV250C,1,True ,200,250,1.0,0)
					PulsePort (5,35000)
					VoltDiff (shf_mV(3),2,mV250C,1,True ,200,250,1.0,0)
		
					' Apply HFP01SC soil heat flux plate calibration
					For j = 1 to 4
						shf(j) = shf_mV(j) * shf_cal(j)
					next j
						
					'Measure voltage accross the heater
					PulsePort(5,35000)
					VoltDiff (V_Rf(1),2,mV5000,1,True ,200,250,0.001,0)
					PulsePort(5,35000)
					VoltDiff (V_Rf(3),2,mV5000,1,True ,200,250,0.001,0)
									
					'Maintain a 100 sample running average
					AvgRun (shf_mV_run(1),4,shf_mV(1),100)
					AvgRun (V_Rf_run(1),1,V_Rf(1),100)
				
					Call hfp01_sc_cal
			
			' Tutnoff multiplexer		
			PortSet (4,0)
				
' ****************************** DO OUTPUT ***************************************		
			
		CallTable meteo
	NextScan
EndProg

