The Outdoor Unit Picaxe Code

 

The Outdoor Unit - Picaxe Code

This is the latest code but is subject to change. [October 2013]

Corrected error in negative temperature maths and replaced faulty Humidity Sensor [08/11/2011]

Variable Assignment Table



	; ==================================================================
	; Main 18M2 code for the Picaxe Weather Station Outdoor (Transmitter) Unit

	; Decimal precision Humidity & Temperature routines,
	; copyright, Peter H Anderson, Baltimore, MD, Jan, '04
	; 
	; ==================================================================

	 #Picaxe 18M2

 	  Symbol HValue = w0
   	  Symbol HighWord = w1
  	  Symbol LowWord = w2
  	  Symbol RH10 = w3
  	  Symbol HQuotient = b0
   	  Symbol HFract = b1
  	  Symbol X = b0
  	  Symbol aDig = b1
   	  Symbol TFactor = b2
  	  Symbol Tc = b3
  	  Symbol SignBit = b4
   
  	  Symbol TValue = w4
  	  Symbol TQuotient = b10
  	  Symbol TFract = b11  
   	  Symbol TempC_100 = w6
   
   	  Symbol MagDir = w7
  	  Symbol MagDirLo = b14
  	  Symbol MagDirHi = b15
   
  	  Symbol WindSpeed = w8
  	  Symbol WindSpeedLo = b16
   	  Symbol WindSpeedHi = b17
  	  Symbol ThisHour = b18
  	  Symbol LastHour = b19
  	  Symbol RainRequest = b20
   
   
   	  ; Hardware
  	  Symbol HumidRaw = B.7
  	  Symbol TempRaw = B.6
  	  Symbol DirRaw = B.3
  	  Symbol Speed = B.0 
 
      do
   	  ; Read Humidity

   	  ReadADC10 HumidRaw, HValue			;Get Humidity (HValue)
   	  HighWord = 1613 ** HValue			; calculate RH
  	  LowWord = 1613 * HValue
   	  RH10 = LowWord / 1024
  	  LowWord = Highword * 64
  	  RH10 = RH10 + LowWord
  	  RH10 = RH10 - 258
   
  	  pause 100
   
   	  ; Read temperature
   
  	  Readtemp12 TempRaw, TValue			; Get temperature
 
          SignBit = TValue / 256 / 128

          if SignBit = 0 then positive			; It's negative so
          TValue = TValue ^ $ffff + 1                   ; take twos comp


       positive:
   
          TempC_100 =  TValue * 6	       	        ; TC = value * 0.0625
          TValue = TValue * 25 / 100
          TempC_100 = TempC_100 + TValue
          TQuotient = TempC_100 / 100
          TFract = TempC_100 % 100 / 10 
   
          X = TQuotient / 10				; Calculate temperature correction factor for Humidity
   
          if SignBit = 0 then
             SignBit = " "
          else
             SignBit = "-"
          endif           


          if SignBit = "-" then
             X = 4 - X
          else
             X = X + 4
          endif


          GoSub TempCorrection				; compensate RH

          HQuotient = RH10 / 10			        ; Calculate RH Quotient and...
          HFract = RH10 % 10 				; ...decimal place.

          if HQuotient > 99 then 			; Over range
             HQuotient = 99
             HFract = 9  
          endif
   
          if HQuotient > 127 then 			; Under range
             HQuotient = 0
             HFract = 0
          endif
   
          ; Read AS540 magnetic encoder for wind direction
  
          readadc10 DirRaw, MagDir			; Read from AS5040 magnetic bearing
          pause 100
      
          ; Read rpm from windspeed counter
   
          count  Speed, 1000, WindSpeed
   
          ; Every 30th cycle (approx 1 minute), request rain gauge data from 08M
   
          inc RainRequest
          if RainRequest >= 30 then
             high C.1
             serin [500], C.0, N2400, ("r"), LastHour, ThisHour   ; Rain counters
             low C.1
             RainRequest = 0
          endif
   
          ; Send data to Indoor Unit in 8 byte blocks
          ; First group needs no calibration so calculations are done here first.
          ; Second group will need "tweaking" - more easily done at indoor end.

          serout C.2, N2400, ("t", SignBit, TQuotient, TFract, HQuotient, HFract, "A", "B")
          pause 100
          serout C.2, N2400, ("m", MagDirHi, MagDirLo, WindSpeedHi, WindSpeedLo, LastHour, ThisHour, "C")
      loop



      TempCorrection:
          Lookup X, (87, 89, 91, 93, 95, 97, 99, 101, 103, 106, 108, 110, 113, 116, 119, 122, 126), TFactor
                  ' -40 -30 -20 -10  0   10  20   30   40   50   60   70   80   90  100  110  120

          if TFactor < 100 then 
             aDig = TFactor / 10
             RH10 = RH10 * aDig / 10
             TFactor = TFactor % 10

             aDig = TFactor
             RH10 = RH10 * aDig / 100 + RH10

          else 
             TFactor = TFactor % 100
             aDig = TFactor / 10
             RH10 = RH10  * aDig / 10  + RH10
             TFactor = TFactor % 10

             aDig = TFactor
             RH10 = RH10  * aDig / 100 + RH10
          endif

          ; [October 2013] The humidity has consistently returned too high a value, frequently above 99.9%.
          ; To get a feel for how high the reading is, I've added the following two lines to reduce the
          ; returned value by 20%.  So far, the new value is agreeing well with a local commercial 
          ; weather station.
          
          aDig = RH10 * 20 / 100
          RH10 = RH10 - aDig

          return


   {Memory used = 295 bytes out of 2048}


The Rain Gauge 08M Picaxe Code


This site and its contents are © Copyright 2005 - 2011 - All Rights Reserved.