CRBasic Code Templates

Quick-start templates for common CRBasic programming tasks

Basic Temperature Logging
CR1000

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
Voltage Measurement
CR1000

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
Data Table with Averaging
CR1000

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
SDI-12 Sensor Communication
CR1000

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
Conditional Data Storage
CR1000

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
Multi-Sensor System
CR1000X

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
ClimaVue50 Weather Sensor
CR1000X

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
HMP155A Humidity/Temperature
CR1000

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
SR50A Snow Depth Sensor
CR1000

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
CS655 Soil Moisture Sensor
CR1000X

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
TE525 Rain Gauge (Tipping Bucket)
CR1000

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