Shop OBEX P1 Docs P2 Docs Learn Events
Apogee (or Sun Systems) PAR Meter with integrated or separate sensor, DATA reading with Propeller. — Parallax Forums

Apogee (or Sun Systems) PAR Meter with integrated or separate sensor, DATA reading with Propeller.

Clock LoopClock Loop Posts: 2,069
edited 2018-01-18 09:22 in Customer Projects
The data on the Apogee MQ-200,
the Sun Systems Part# 748200
and the Sun Systems Part# 748205,
can be read using a propeller, directly connected.
These meters are basically identical, the sun systems units, are just apogee units with a different manufacturer sticker.

image_apogee-mq-200-par-meter_1.jpg
Apogee MQ-200
http://www.apogeeinstruments.com/mq-200-quantum-separate-sensor-with-handheld-meter/

748205-01.jpg
Sun Systems #748205
http://www.sunlightsupply.com/shop/bycategory/timers-and-instruments/par-meter-with-remote-sensor-sun-system

PAR (Photosynthetically Active Radiation) is the energy source required for photosynthesis, created by photons in the wavelengths of 400 to 700nm.
The energy source, PAR, is expressed in Photosynthetic Photon Flux Density (PPFD) units µmol m-2 s-1.
quantum-spectral-response.gif


The USB port on all 3 of these PAR meters is 3.3v TTL serial data. 2400 Baud 8N1
They used a usb port to connect 3.3v TTL serial logic. Tisk Tisk.

So I cut a usb cable in half and connected it to a propeller.
Connect USB Pin#2 (D- White wire) to a propellers spare pin, P26, and named it ParTx. This is the pin the PAR meter transmits its data on.
Connect USB Pin#3 (D+ Green wire) to a propellers spare pin, P27, and named it ParRx. This is the pin the PAR meter receives command data on.
Yea, you need the black ground too.
These Meters have a usb mini-b receptacle on the right side of the meter.
60333_fig_05.jpg

You CAN power the meter using the same 3.3v DC supply that the propeller uses(not eaisly tho), you must pull out the coin cell battery in the meter, open the meter up and solder usb pin #1 (red wire) to the coin cell's + connection. And make sure to NEVER connect this meter to a regular usb plug. The usb plug doesn't have eaisly exposed pads inside the meter, I had to remove protective silicon and solder to the usb plugs small pcb pad. Wired this way it will not remember readings after you power off the propeller's power. But you won't need batteries.


This par meter only accepts 4 commands.
Identify Command: Hex: 08
Par meter replies with the same command you send, then "q u a n t u m 0 SUB"
Reply from meter in hex is: $08 $71 $75 $61 $6E $74 $75 $6D $00 $1A


30 Minute average data: Hex $31 and $0A.
Par meter replies with the same command you send Hex $31 and $0A, then every measured value with $0D $0A at the end of each measured value.
Reply from meter in hex is: $xx $xx $xx $xx $xx $0D $0A, the x's are normally real hex measurements.
At the end of all measurements, the meter sends a $1A.

Daily Par average data: Hex $32 and $0A.
Par meter replies with the same command you send Hex $32 and $0A, then every measured value with $0D $0A at the end of each measured value.
Reply from meter in hex is: $xx $xx $xx $xx $xx $0D $0A, the x's are normally real hex measurements.
At the end of all measurements, the meter sends a $1A.

Manual Par readings data: Hex $33 and $0A.
Par meter replies with the same command you send Hex $33 and $0A, then every measured value with $0D $0A at the end of each measured value.
Reply from meter in hex is: $xx $xx $xx $xx $xx $0D $0A, the x's are normally real hex measurements.
At the end of all measurements, the meter sends a $1A.

Each measurement it sends is 7 bytes of data, counting the $0D $0A.

Each of the 3 types of data have up to 99 readings, no more. But the meter only sends the readings it has, and will not send zeros if it has not measured 99 readings.

The code here is only for the par meter communication, the attached file has the entire propeller program. The forum won't allow full code in the code box.
'' =================================================================================================
'   File......  ParMeter.spin       
'   Purpose...  Reads Apogee MQ-200, the Sun Systems Part# 748200 and the Sun Systems Part# 748205
'   Author....  Clock Loop @ parallax forums  
'   Started...  9-10-2016
'   Updated...  9-18-2016
'' =================================================================================================
        
Pub ParMeterRead | rollcount0, rollcount1, rollcount2


  rollcount0 := 0
  ParName[0] := 0
  ParName[1] := 0   
  ParMeter.tx($08)
  If ParMeter.rx == $08
    Repeat rollcount0 from 0 to 8
      ParName.byte[rollcount0] := ParMeter.rx      
      If ParName.byte[rollcount0] == $1A
        ParName.byte[rollcount0] := $00

        
  rollcount1 := 0
  rollcount2 := 0
  Repeat rollcount1 from 0 to 99 
    Par30Min[rollcount1] := 0 

  Repeat rollcount2 from 0 to 6
    StrPar.byte[rollcount2] := 0

  rollcount1 := 0
  rollcount2 := 0


  waitcnt(1_000_000 + cnt) 
  ParMeter.tx($31)
  ParMeter.tx($0A)  
  If ParMeter.rx == $31
    If ParMeter.rx == $0A
      Repeat rollcount1 from 0 to 99
        Repeat rollcount2 from 0 to 6
          StrPar.byte[rollcount2] := ParMeter.rxtime(5)
          
          If StrPar.byte[rollcount2] == $0D
            StrPar.byte[rollcount2] := $00
          ElseIf StrPar.byte[rollcount2] == $0A
            StrPar.byte[rollcount2] := $00
          ElseIf StrPar.byte[rollcount2] == -1
            StrPar.byte[rollcount2] := $00
          ElseIf StrPar.byte[rollcount2] == $1A
            StrPar.byte[rollcount2] := $00
              
        Par30Min[rollcount1] := ParMeter.StrToDec(@StrPar)

  
  waitcnt(1_000_000 + cnt)
  rollcount1 := 0
  rollcount2 := 0
  Repeat rollcount1 from 0 to 99 
    ParDaily[rollcount1] := 0
    
  Repeat rollcount2 from 0 to 6
    StrPar.byte[rollcount2] := 0

  rollcount1 := 0
  rollcount2 := 0       

  ParMeter.tx($32)
  ParMeter.tx($0A)  
  If ParMeter.rx == $32
    If ParMeter.rx == $0A
      Repeat rollcount1 from 0 to 99
        Repeat rollcount2 from 0 to 6
          StrPar.byte[rollcount2] := ParMeter.rxtime(5)
          
          If StrPar.byte[rollcount2] == $0D
            StrPar.byte[rollcount2] := $00
          ElseIf StrPar.byte[rollcount2] == $0A
            StrPar.byte[rollcount2] := $00
          ElseIf StrPar.byte[rollcount2] == -1
            StrPar.byte[rollcount2] := $00
          ElseIf StrPar.byte[rollcount2] == $1A
            StrPar.byte[rollcount2] := $00
              
        ParDaily[rollcount1] := ParMeter.StrToDec(@StrPar)

        
  waitcnt(1_000_000 + cnt)          
  rollcount1 := 0
  rollcount2 := 0
  Repeat rollcount1 from 0 to 99 
    ParSample[rollcount1] := 0

  Repeat rollcount2 from 0 to 6
    StrPar.byte[rollcount2] := 0

  rollcount1 := 0
  rollcount2 := 0 

  
  ParMeter.tx($33)
  ParMeter.tx($0A)  
  If ParMeter.rx == $33
    If ParMeter.rx == $0A
      Repeat rollcount1 from 0 to 99
        Repeat rollcount2 from 0 to 6
          StrPar.byte[rollcount2] := ParMeter.rxtime(5)
          
          If StrPar.byte[rollcount2] == $0D
            StrPar.byte[rollcount2] := $00
          ElseIf StrPar.byte[rollcount2] == $0A
            StrPar.byte[rollcount2] := $00
          ElseIf StrPar.byte[rollcount2] == -1
            StrPar.byte[rollcount2] := $00
          ElseIf StrPar.byte[rollcount2] == $1A
            StrPar.byte[rollcount2] := $00
              
        ParSample[rollcount1] := ParMeter.StrToDec(@StrPar)
          
Dat
  
  Secs                  long    0
  Mnit                  long    0
  Hour                  long    0
  Dayz                  long    0
                               
  ParName               long    0,0,0,0,0,0,0,0,0,0
                        
  StrPar                long    0,0,0,0,0,0,0,0,0,0

  Par30min              long    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 
                        long    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  
  ParDaily              long    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 
                        long    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  
  ParSample             long    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
                        long    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
                                 
Dat
{{

  Terms of Use: MIT License

  Permission is hereby granted, free of charge, to any person obtaining a copy of this
  software and associated documentation files (the "Software"), to deal in the Software
  without restriction, including without limitation the rights to use, copy, modify,
  merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
  permit persons to whom the Software is furnished to do so, subject to the following
  conditions:

  The above copyright notice and this permission notice shall be included in all copies
  or substantial portions of the Software.

  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
  INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
  PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
  HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
  CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
  OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 

}}    

Comments

  • ClockLoop,
    Congratulations on a well documented and complete post.
    I have no knowledge of the technology or benefits of reading these devices, but I am sure it a useful advancement.
  • This probably qualifies as a project...

    Mods, move it to projects, if u would like.
  • All moved over Clock Loop.

    Thanks for all the interesting great projects.

    Keep 'em coming !
Sign In or Register to comment.