Quick-start templates for common CRBasic programming tasks
Simple temperature measurement with Therm108 probe
Public Temp_C
BeginProg
Scan(1,Sec,0,0)
Therm108(Temp_C, 1, 1, VX1, 1.0, 0.0, 0)
NextScan
EndProg
Differential voltage measurement example
Public Voltage
BeginProg
Scan(1,Sec,0,0)
VoltDiff(Voltage, 1, mV2500, 1, True, 0, _60Hz, 1.0, 0.0)
NextScan
EndProg
Measure and store averaged data
Public Temp_C
DataTable(HourlyData, True, -1)
DataInterval(0, 60, Min, 10)
Average(1, Temp_C, FP2, False)
Maximum(1, Temp_C, FP2, False, False)
Minimum(1, Temp_C, FP2, False, False)
EndTable
BeginProg
Scan(1,Sec,0,0)
Therm108(Temp_C, 1, 1, VX1, 1.0, 0.0, 0)
CallTable(HourlyData)
NextScan
EndProg
Read data from SDI-12 compatible sensor
Public SDI12_Data(10)
BeginProg
Scan(10,Sec,0,0)
SDI12Recorder(SDI12_Data(), C1, 0, "M!", 1.0, 0.0, 10)
NextScan
EndProg
Store data only when conditions are met
Public Temp_C
DataTable(HighTemp, True, -1)
DataInterval(0, 1, Min, 10)
Sample(1, Temp_C, FP2)
EndTable
BeginProg
Scan(1,Sec,0,0)
Therm108(Temp_C, 1, 1, VX1, 1.0, 0.0, 0)
If Temp_C > 25 Then
CallTable(HighTemp)
EndIf
NextScan
EndProg
Complete weather station example
Public Air_Temp, Air_RH, Wind_Speed, Rain_mm
DataTable(WeatherData, True, -1)
DataInterval(0, 15, Min, 10)
Average(1, Air_Temp, FP2, False)
Average(1, Air_RH, FP2, False)
Average(1, Wind_Speed, FP2, False)
Totalize(1, Rain_mm, FP2, False)
EndTable
BeginProg
Scan(1,Sec,0,0)
Therm108(Air_Temp, 1, 1, VX1, 1.0, 0.0, 0)
VoltDiff(Air_RH, 1, mV2500, 2, True, 0, _60Hz, 0.1, 0)
VoltDiff(Wind_Speed, 1, mV2500, 3, True, 0, _60Hz, 1.0, 0)
VoltDiff(Rain_mm, 1, mV2500, 4, True, 0, _60Hz, 0.254, 0)
CallTable(WeatherData)
NextScan
EndProg
All-in-one compact weather sensor via SDI-12
' ClimaVue50 Compact Weather Sensor
' Measures: Solar, Precip, Lightning, Wind, Pressure, Temp, RH, Tilt
Public CV50_Data(17)
Alias CV50_Data(1) = Solar_W
Alias CV50_Data(2) = Precip_mm
Alias CV50_Data(3) = Strikes
Alias CV50_Data(4) = StrikeDist_km
Alias CV50_Data(5) = WindSpeed_ms
Alias CV50_Data(6) = WindDir_deg
Alias CV50_Data(7) = GustSpeed_ms
Alias CV50_Data(8) = AirTemp_C
Alias CV50_Data(9) = VaporPres_kPa
Alias CV50_Data(10) = AtmosPres_kPa
Alias CV50_Data(11) = RelHumidity
Alias CV50_Data(12) = Humidity_Temp
Alias CV50_Data(13) = TiltX_deg
Alias CV50_Data(14) = TiltY_deg
DataTable(Weather, True, -1)
DataInterval(0, 1, Min, 10)
Average(1, Solar_W, FP2, False)
Totalize(1, Precip_mm, FP2, False)
Average(1, WindSpeed_ms, FP2, False)
Sample(1, WindDir_deg, FP2)
Maximum(1, GustSpeed_ms, FP2, False, False)
Average(1, AirTemp_C, FP2, False)
Average(1, RelHumidity, FP2, False)
Average(1, AtmosPres_kPa, IEEE4, False)
EndTable
BeginProg
Scan(5, Sec, 0, 0)
SDI12Recorder(CV50_Data(), C1, 0, "R0!", 1.0, 0.0, 17)
CallTable(Weather)
NextScan
EndProg
Vaisala HMP155A probe with heating control
' HMP155A Temperature and Relative Humidity Sensor
' With probe heating control for cold conditions
Public AirTemp_C
Public RelHum
Public HeaterOn As Boolean
Const HEAT_THRESHOLD = 95 ' Enable heater above 95% RH
DataTable(Climate, True, -1)
DataInterval(0, 5, Min, 10)
Average(1, AirTemp_C, FP2, False)
Average(1, RelHum, FP2, False)
Sample(1, HeaterOn, Boolean)
EndTable
BeginProg
Scan(10, Sec, 0, 0)
' Measure temperature (0-1V = -40 to +60C)
VoltDiff(AirTemp_C, 1, mV2500, 1, True, 0, _60Hz, 0.04, -40)
' Measure relative humidity (0-1V = 0 to 100%)
VoltDiff(RelHum, 1, mV2500, 2, True, 0, _60Hz, 0.04, 0)
' Heater control - enable when humidity high
If RelHum > HEAT_THRESHOLD Then
PortSet(C1, 1)
HeaterOn = True
Else
PortSet(C1, 0)
HeaterOn = False
EndIf
CallTable(Climate)
NextScan
EndProg
Ultrasonic snow depth with temperature compensation
' SR50A Ultrasonic Distance Sensor for Snow Depth
' SDI-12 communication with temperature compensation
Public SR50A_Data(2)
Alias SR50A_Data(1) = Distance_m
Alias SR50A_Data(2) = Quality
Public SnowDepth_cm
Const SENSOR_HEIGHT = 2.5 ' Height of sensor above bare ground (m)
DataTable(Snow, True, -1)
DataInterval(0, 15, Min, 10)
Average(1, SnowDepth_cm, FP2, False)
Sample(1, Quality, FP2)
Maximum(1, SnowDepth_cm, FP2, False, False)
EndTable
BeginProg
Scan(60, Sec, 0, 0)
' SR50A SDI-12 measurement (address 0)
SDI12Recorder(SR50A_Data(), C1, 0, "M!", 1.0, 0.0, 2)
' Calculate snow depth from distance
If Quality >= 152 AND Quality <= 600 Then
SnowDepth_cm = (SENSOR_HEIGHT - Distance_m) * 100
If SnowDepth_cm < 0 Then SnowDepth_cm = 0
Else
SnowDepth_cm = NAN ' Invalid reading
EndIf
CallTable(Snow)
NextScan
EndProg
Soil volumetric water content and EC via SDI-12
' CS655 Water Content Reflectometer
' Measures VWC, EC, Soil Temperature, Permittivity
Public CS655_Data(5)
Alias CS655_Data(1) = VWC_pct ' Volumetric water content (%)
Alias CS655_Data(2) = EC_dS ' Electrical conductivity (dS/m)
Alias CS655_Data(3) = SoilTemp_C ' Soil temperature (C)
Alias CS655_Data(4) = Permittivity ' Dielectric permittivity
Alias CS655_Data(5) = Period_us ' Period average (us)
DataTable(Soil, True, -1)
DataInterval(0, 30, Min, 10)
Average(1, VWC_pct, FP2, False)
Average(1, EC_dS, FP2, False)
Average(1, SoilTemp_C, FP2, False)
Sample(1, Permittivity, FP2)
EndTable
BeginProg
Scan(5, Min, 0, 0)
' CS655 SDI-12 measurement (address 0)
SDI12Recorder(CS655_Data(), C1, 0, "M!", 1.0, 0.0, 5)
' Data quality check
If VWC_pct < 0 OR VWC_pct > 100 Then
VWC_pct = NAN
EndIf
CallTable(Soil)
NextScan
EndProg
Tipping bucket rain gauge with pulse counting
' TE525 Tipping Bucket Rain Gauge
' 0.254mm (0.01 inch) per tip
Public Rain_mm
Public RainToday_mm
Public Tips As Long
Const MM_PER_TIP = 0.254
DataTable(Precip, True, -1)
DataInterval(0, 15, Min, 10)
Totalize(1, Rain_mm, FP2, False)
Sample(1, RainToday_mm, FP2)
EndTable
DataTable(DailyRain, True, -1)
DataInterval(0, 1440, Min, 10)
Totalize(1, Rain_mm, FP2, False)
EndTable
BeginProg
Scan(1, Sec, 0, 0)
' Count pulses from rain gauge on pulse channel P1
PulseCount(Tips, 1, P1, 2, 0, 1.0, 0)
' Convert tips to mm
Rain_mm = Tips * MM_PER_TIP
' Daily accumulation (resets at midnight via DailyRain table)
RainToday_mm = RainToday_mm + Rain_mm
' Reset daily total at midnight
If IfTime(0, 1440, Min) Then
RainToday_mm = 0
EndIf
CallTable(Precip)
CallTable(DailyRain)
NextScan
EndProg