2/11/98 4:52 PM 48 Monitor, Wizard, Perception GroWeather, Energy, & Health WeatherLink Protocol 02-11-98 Rev 3.3 Table of Contents:I. IntroductionII. DefinitionsIII. Pseudo code description of WeatherLink command processing loop.IV. Code illustration of the Communication functions used in the examples.V. Link Types and Revision LevelsVI. Command DescriptionVII. Command SummaryVIII. Illustrated Examples A. Reading Calibrated Data 1. Temperature CAL 2. Humidity CAL 3. Barometer 4. Rain 5. Wind Speed 6. Rain Rate 7. UV MED's B. Using the LOOP command C. Using MDMP command D. Invalid Data values E. Calculated Data values 1. Wind Chill 2. Dew Point 3. Temperature-Humidity Index 4. THSWI 5. Wind Run 6. Degree-Days 7. Solar Energy 8. UV Dose 9. Rain Rate F. CRC Checking G. Reading Hi/Low Times and DatesIX. Memory addresses. A. Monitor, Wizard, and Perception Station B. Monitor, Wizard, and Perception Link C. GroWeather Station D. GroWeather Link E. Energy Station F. Energy Link G. Health Station H. Health LinkAppendices (Contained in "appendix.txt") A Bar/Power Bit definitions B Control Module communication status codes (AOM Status) C Model Numbers D Power Voltage Codes E THSWI Latitude Codes F Wind Direction Sector Codes G1 GroWeather Alarm Bits G2 ET Status bits G3 Leaf Wetness Data/Status byte in the LOOP packet. E1 Energy Alarm Bits H1 Health Alarm BitsI. Introduction This document is a technical description of the softwareinterface to both the Standard WeatherLink, which can connect tothe Monitor, Wizard, and Perception models, and the GroWeatherWeatherLink, the Energy WeatherLink, and the Health WeatherLink.The WeatherLink interprets commands sent by a PC over an RS232Cserial link (8 bits, 1 stop bit, no parity). The commands are acombination of ASCII and binary data. The command structure andformat are almost identical for the 4 kinds of WeatherLink, butthe available data and their locations are different. The diagram below illustrates the relationship between thePC, WeatherLink, and Weather Station. The sensor image, archiveimage, and the archive memory belong to the WeatherLink. Asshown in the diagram the PC sends commands and receives data fromthe WeatherLink. The WeatherLink sends commands and receivesdata from the Weather Station. Data is contained in both theWeatherLink and the Weather Station. You will notice you canread data from the WeatherLink faster than the Weather Station.Therefore, if the data exists in the WeatherLink and is beingupdated fast enough for your purposes, read it from theWeatherLink. Study the "Command Processing Loop" carefully tounderstand what is in the WeatherLink and when it is updated."RRD" commands read from the WeatherLink. "WRD" commands readfrom the Weather Station. The addresses of the data available inthe WeatherLink and the Weather Station are given in section IX. cmds cmds (Monitor Station)PC -> Weather -> Weather Station (Wizard Station) Link (Perception Station) data data (GroWeather) <- . <- (Energy Station) . (Health Station) . sensor image archive image archive memory The Appendices, in the separate file "appendix.txt", containdescriptions of coded numerical values and Bit definitions. Please note Davis Instruments is not responsible for anydamages your use of this information may cause. Furthermore, wereserve the right to modify our designs without notice.II. Definitions station processor memory - 256 bytes of memory directly accessible by the station processor, organized into 2 banks of 256 nibbles. link processor memory - 256 bytes of memory directly accessible by the link processor, organized into 2 banks of 256 nibbles. archive memory - 32K of memory where weather data is stored before downloading to PC. sensor image - Memory containing the latest data from the weather station. Part of the link processor memory archive image - Memory where archive entries are assembled before being written to the archive memory. Part of the link processor memoryIII. Pseudo code description of WeatherLink command processing loop. All references to Inside temperature apply to Soil temperature on the GroWeather station. Items marked (G) are only applicable to the GroWeather station (E) are only applicable to the Energy Station (H) are only applicable to the Health Station (O) are only applicable to the Monitor, Wizard, & Perception (N) are only applicable to the GroWeather, Energy, & Health // Initialize the Link chip memory Set archive interval to be 30 minutes. Set sample interval to be 20 seconds. Test archive memory. If (memory test passes) Do a beep on the weather station. /* Wind speed and wind direction are read and stored in the sensor image each time around the loop. Temperature is read once for every ten wind speed readings. Humidity, Barometer, and Rain are updated every time the sensor image is updated. */ while (1) // beginning of command processing loop GetWindSpeed (); Test for new Gust Value; GetWindDirection (); For every 10 wind speed reads { read Inside and Outside temperature; Read Rain Rate (N) read Solar Rad (N) read UV Intensity (H) read Alarm and Control-Module communication status (N) Check current Outside Temp for new Hi/Low in this period And record in archive image. Check for new Hi Rain Rate (N) Check for new Hi Solar Rad (H) Check for new Hi UV Intensity (H) } if (in loop mode) Transmit copy of sensor image. if (time to sample sensor image) Sample sensor image: Add current data values for variables that are averaged: Inside & Outside Temperature Wind Speed Solar Radiation (N) UV Intensity (H) If wind speed is > wind threshold (0), then add one to the direction bin corresponding to the current wind direction Read other values not read in above: (GetRBH) read Rain read Barometer read outside Humidity read inside Humidity (H) (O) read Wind Run (G) (E) read Total ET (G) read Total Growing Degree-Days (G) read Total Heating, Chill, Cooling, & THI Degree-Days (E) read Total Solar Energy (G) (E) read Bar and Power status bits (N) read Leaf Wetness value (G) read Rain Cal (N) Every 18 seconds collect data from the ET Sensors to calculate hourly ET (G) if ( Time to check archive clock ) // Every 16 seconds. { Call GetRBH as above (N) if (it is time to calculate ET) (G) calculate ET and store in archive Image (G) if (lastArchiveTime - currentTime >= archiveInterval) { // Make sure the sensor image is up to date. Call GetRBH as above (O) // Fill in the archive image before archiving // Hi and Low Outside temps are already set (see above) // The following reads are stored in the sensor image. Read current barometric pressure. Read current outside humidity. Read the current Leaf Wetness Value (G) Read current inside humidity. (H) (O) // The following are incremental values derived from the difference between the current value and the previous value Calculate rain in period. Calculate Wind Run in Period (G) (E) Calculate Growing Degree Days in period (G) Calculate Heating Degree Days in period (E) Calculate Wind Chill Degree Days in period (E) Calculate Cooling Degree Days in period (E) Calculate Temp-Hum-Index Degree Days in period (E) Calculate Solar energy in Period (G) (E) Calculate UV Dose in period (H) // The following are average values are derived by dividing an accumulator by the number of samples taken Calculate average Inside temperature for period. Calculate average Outside temperature for period. Calculate average wind speed for period. Calculate Average Solar Rad for period. (N) Calculate Average UV Intensity (H) Calculate dominant wind direction for period Finally, read the primary power voltage code from the station (G) (E) Write data to archive memory. Update last archive time: (O) Set the "last time" to the current station time (N) set the "last time" so that the next archive happens on the hour Clear Hi/Low entries in Archive image Clear Accumulators and sample count Set the "Previous" registers to the current values Reset ET data to FFFF (G) } // create archive record } // 16 second polling if (A command is available) Process the command. } // End while (1)...IV. Code illustration of the Communication functions used in the examples. The functions "put_serial_char()", "put_serial_string()","send_unsigned()", "get_serial_char()" "get_acknowledge()","fill_buffer()", and "fill_crc_buffer()" are used in the examplesin the next sections to send commands and data to theWeatherLink. You must provide these functions. The illustrationsgiven here are for reference. All of the example code included with this programmer'sreference disk assumes that the "int" data type is a 16 bit (2byte) signed number. On some machines you may be required to usethe "short int" data type. In most cases, the "char" data type isexplicitly stated as being unsigned. In a few places (i.e. HumCal on GroWeather, etc.) a one byte number needs to be treated asa signed value. "receive_buffer" is an external (global) array of unsignedchar that is at least 32K in length (the size of the SRAM). /* +----------------------------------------------------------+ Output a character to current serial port. */ int put_serial_char (unsigned char c) { // write character c to the current serial port } /* +-------------------------------------------------------------+ Output a string to current serial port. */ int put_serial_string (char *s) { int i; for (i = 0; s [i] != '\0'; i++) put_serial_char (s [i]); } /* +-------------------------------------------------------------+ Outputs the unsigned integer (16 bits) to the current serial port. assumes "Intel" least significant byte first. */ int send_unsigned (unsigned d) { unsigned char *cp; cp = (unsigned char *) &d; put_serial_char (*cp); // Low order byte put_serial_char (*(cp+1)); // Hi order byte } /* +-------------------------------------------------------------+ Read a character from the current serial port. */ int get_serial_char () { int c // read a character from the current serial port and assign it to c // If there has been a timeout or some other error, set c to a negative // value that indicates the type of error return c; } /* +-------------------------------------------------------------+ anticipates an ACK to verify that the link has understood the command it has just received. If the character received is not ACK, or there has been some serial error (i.e. timeout), return an error value, otherwise return OK */ int get_ acknowledge () { int c c = get_serial_char(); if (c == ACK) return OK; else if (c < 0) // serial error return serial_error_code; else // did not receive ACK return c } /* +------------------------------------------------------------------+ Read a series of bytes from the current serial port and store them in the receive buffer. */ int fill_buffer (int n) { int i; for (i=0; i= 0) recieve_buffer[i] = c; else // there has been an error getting the next character return serial_error_code; } return OK; // we have read in n bytes } /* +------------------------------------------------------------------+ Read a series of bytes from the current serial port, perform a CRC check on the data, and store them in the receive buffer. */ int fill_crc_buffer (int n) // n includes the CRC bytes { int i; int crc = 0; // initialize the CRC checksum to 0 for (i=0; i= 0) { recieve_buffer[i] = c; // Store the data crc = crc_table [(crc >> 8) ^ c] ^ (crc << 8); } else // there has been an error getting the next character return serial_error_code; } if (crc == 0) return OK; // we have read in n bytes and the CRC is OK else return CRC_ERROR; // The CRC check failed. }V. Link Types and Revision Levels WeatherLink hardware modules can be classified by thestation model they are intended for, and by revision level. There is one link type for the Monitor, Wizard, andPerception stations. The WeatherLink logs all the sensors foreach of these stations, Any sensor or calculated value that thestation does not support will be filled with the appropriateInvalid Data value (see below). The GroWeather, Energy, and Health stations are substatialydifferent from each other, both in the sensors supported, and inthe types of calculated values. The corresponding Links aretherefore also different. The primary difference, from theprogrammer's viewpoint, is the memory locations of the desireddata which can be found in the corresponding memory address tablebelow. There are 3 different revision levels of WeatherLinkmodules. These represent changes and upgrades made over the lifeof the product. The Rev C (and earlier) level is only used forMonitor/Wizard/ Perception Links. This version does not supportthe use of SR modems for communicating with the PC at distancesgreater than 50 feet The only difference between Monitor Links made at Rev D andRev C is that the Rev D WeatherLinks support the use of SRmodems. The GroWeather, Energy, and Health Links are alsomanufactured at the Rev D level. The Rev E Link implements a slightly differentcommunication protocol between it and the PC to provide greatercommunication reliability. This consists, primarily, of extra CRCinformation that must be provided by the PC so that theWeatherLink can verify every command. Also, ALL data returned bythe WeatherLink has a CRC code included, not just LOOP, MDMP, andSRD data. This means that the Rev E link is software incompatiblewith previous versions. The actual commands used to program aRev E link, however, are the same as the corresponding Rev Dlink. Two additional commands are added to allow Rev E links tooperate with the Rev D communication protocol ("Rev D EmulationMode"). In addition, the GroWeather and Energy versions of the RevE link implements a simple powersavings procedure with the AOMfor use with solar powered radio installations. At this time only the GroWeather link is available in Rev Eversions. Contact Davis' technical support atsupport@davisnet.com for information on getting Energy or Healthversions of the Rev E link if required. Most of the included software examples assume you are NOTusing a Rev E WeatherLink. Please read the "CRC Checking"(section VIII-F) for information on how to generate the necessaryCRC codes. Or, read the description of the "CRC0" command for howto disable CRC command checking.VI. Command Description Commands must be in upper case and terminated with acarriage return (0dh). Do not insert spaces between binary dataarguments. If an argument description uses the character '|' thenone byte of data is to be formed from the 4 bit values on eitherside. For example: "bank | n-1" becomes the single byte "0x13"where bank = 1 and n = 4 Rev E links must also include a two byte CRC code with eachcommand so that the WeatherLink can verify correct transmission.The CRC code is transmitted BEFORE the command. It is possible toprogram Rev E links to use the Rev D communication protocol, ifdesired. If a command is understood, an ASCII 6 (0x06) (ACK) isreturned (before any returned data). If the command was notunderstood, an ASCII 33 (0x21) (!) is returned. Note that thisimplies that the command passed its CRC check sum if the link isa Rev E. For Rev E links, if the command does not pass its CRCcheck sum, then an ASCII 24 (0x18) (CAN) is returned. Some commands return a data stream and a CRC check sum. Thegenerator polynomial for the check sum is x^16 + x^12 + x^5 + 1(CRC-CCITT backward). All binary data is transferred in "Intel" format: leastsignificant byte first. In addition, multi-nibble data values onthe station are stored least significant nibble first. This doesnot make a difference when you look at byte sized pieces ofmemory, since the Link will correctly align the nibbles whensending byte data. Use the appropriate table in section IX to determine thememory locations and sizes for the data you would like to operateon. If you read data with an odd length, the upper nibble of thelast (most significant) byte will be set to 0, not sign extended.If you write data with an odd length, the upper nibble of thelast byte will be ignored. Sign extension is taken care of fordata in the sensor image and archive image on the link. The commands "RRD" and "RWR" operate on the link processormemory. These commands execute faster than the "WRD" and "WWR"commands which operate on the station processor memory. The MDMP command is only available on the GroWeather,Energy, and Health Links. The CRC0 and CRC1 commands are only available on Rev E links.DMP Transfer the contents of the archive memory beginning ataddress 0 using the XMODEM CRC protocol. This command can beused with any standard communication package (i.e. Procomm). Thearchive memory is organized as a set of equal sized archiverecords. The appropriate link memory addresses section contains adescription of the size and structure of an archive image, whichis the same as the format of the archive records.i.e.put_serial_string ("DMP");put_serial_char (0x0d);MDMP Dumps an image of the current contents of the Stationprocessor memory to the serial port. This typically takes around6 seconds and is much faster than requesting lots of piecesseparately. 256 bytes are sent along with a 2 byte CRC check sumin a similar fashion to the SRD command below. The memory tablesbelow show how this data is organized. See "Using the MDMPcommand" (section VIII-C) below for how to do the appropriate bitmasking and shifting to extract data from the received data. NOTE: MDMP uses archive memory 7F00-7FFF to record thememory image from the station before sending it on the computer.This archive memory is not available for normal archive purposes,but the last MDMP can be read by using the SRD command, or theDMP command. The MDMP command is only available on the GroWeather,Energy, and Health Links.put_serial_string ("MDMP");put_serial_char (0x0d);LOOP 65536-n Send 'n' packets of weather data (sensor image) from theWeatherLink. The first byte (01) signals the start of a newblock. This is followed by binary data (15 bytes for theMonitor/Wizard/Perception, 33 bytes for the GroWeather, 27 bytesfor the Energy, or 25 bytes for the Health) and a 2 byte CRCcheck sum. The CRC check sum is calculated on the data only. The"start of block" byte is not included in the CRC calculation. See"CRC Checking" (section VIII-F) below for how to use the CRCinformation.Monitor, Wizard, and Perception Sensor Image: start of block 1 byte inside temperature 2 bytes outside temperature 2 bytes wind speed 1 byte wind direction 2 bytes barometer 2 bytes inside humidity 1 byte outside humidity 1 byte total rain 2 bytes not used 2 bytes CRC checksum 2 bytes -------- 18 bytesGroWeather Sensor Image: start of block 1 byte Archive memory address of the next Archive record 2 bytes Bar/Power status bits 1 byte See Appendix A Soil temperature 2 bytes Air temperature 2 bytes wind speed 1 byte wind direction 2 bytes barometer 2 bytes Rain Rate 1 byte outside humidity 1 byte total rain 2 bytes Solar Radiation 2 bytes Total Wind Run 3 bytes Total ET 2 bytes Total Degree-Days 3 bytes Total Solar Energy 3 bytes Alarm Bits and AOM status 3 bytes See Appendices G1 & B Leaf Wetness Data and status 1 byte See Appendix G3 CRC checksum 2 bytes -------- 36 bytesEnergy Sensor Image: start of block 1 byte Archive memory address of the next Archive record 2 bytes Bar/Power status bits 1 byte See Appendix A Inside temperature 2 bytes Outside temperature 2 bytes wind speed 1 byte wind direction 2 bytes barometer 2 bytes Rain Rate 1 byte outside humidity 1 byte total rain 2 bytes Solar Radiation 2 bytes Total Wind Run 3 bytes Total Solar Energy 3 bytes Alarm Bits and AOM status 3 bytes See Appendices E1 & B CRC checksum 2 bytes -------- 30 bytesHealth Sensor Image: start of block 1 byte Archive memory address of the next Archive record 2 bytes Bar/Power status bits 1 byte See Appendix A Inside temperature 2 bytes Outside temperature 2 bytes wind speed 1 byte wind direction 2 bytes barometer 2 bytes Rain Rate 1 byte total rain 2 bytes Solar Radiation 2 bytes Inside humidity 1 byte outside humidity 1 byte UV Intensity 1 bytes UV Dose 2 bytes Alarm Bits and AOM status 3 bytes See Appendices H1 & B CRC checksum 2 bytes -------- 28 bytesExample: put_serial_string ("LOOP"); send_unsigned ((unsigned) (65536 - n)); put_serial_char (0x0d); See "Using the LOOP command" (section VIII-B) for examplesof how to extract data from a Loop imageRRD bank address n-1 Read 'n' nibbles from the link processor memory from'address' in bank 'bank'. n = 1...8 On Rev E links, the data returned will also include a 2 byteCRC code. See "CRC Checking" (section VIII-F) for how to use theCRC information.put_serial_string ("RRD"); // Send the command.put_serial_char (bank); // bank = 0 or 1.put_serial_char (address); // address = 0..FFput_serial_char (n - 1); // Get n nibbles..put_serial_char (0x0d); // Send CR...RWR bank | n-1 address data Write 'n' nibbles of 'data' into the link processor memorybeginning at 'address' in bank 'bank.' n = 1..8put_serial_string("RWR"); // Send the command.put_serial_char(0x13); // bank = 1 n = 4put_serial_char(0x54); // address = 54h (Last Archive Time)send_unsigned (0); // write 0.put_serial_char(0x0D); // Send CR...SRD address n-1 Read 'n' bytes of archive memory beginning at 'address.'Both 'address' and 'n-1' are 16 bit numbers between 0 and 0x7FFF.A two byte CRC checksum is sent at the end of the data stream.See "CRC Checking" (section VIII-F) for how to use the CRCinformation.put_serial_string ("SRD"); // Send the command.send_unsigned (address); // Start sending from address.send_unsigned (n-1); // Send n bytes.put_serial_char (0x0d); // Send CR...SWR address data Write 'data' (one byte) to 'address' in archive memory.'address' is a 16 bit number between 0 and 0x7FFF.put_serial_string ("SWR"); // Send the command.send_unsigned (address); // Send two byte address.put_serial_char (data); // Send byte of data.put_serial_char (0x0d); // Send CR...WRD n | bank address Read 'n' nibbles of data from the station processor memorystarting at 'address' in bank 'bank'. For bank 0 use 'bank' = 2for bank 1 use 'bank' = 4. A maximum of 8 nibbles can be read. On Rev E links, the data returned will also include a 2 byteCRC code. See "CRC Checking" (section VIII-F) for how to use theCRC information.put_serial_string ("WRD"); // Send read command.put_serial_char (0x44); // read 4 nibbles from bank 1.put_serial_char (0xB0); // Read beginning at B0h. // (Period Length on GroWeather)put_serial_char (0x0D); // Send CR...WWR n | bank address data Write 'n' nibbles of data to the station processor memorystarting at 'address' in bank 'bank'. For bank 0 use 'bank' = 1for bank 1 use 'bank' = 3. A maximum of 8 nibbles can be written.put_serial_string ("WWR"); // Send write command.put_serial_char (0x31); // n = 3, writing to bank 0.put_serial_char (0x34); // Write to AAh.= // Daily ET Alarm Threshold on GroWeathersend_unsigned (0x0FFF); // Send 4095 or 0FFFh.put_serial_char (0x0D); // Send CR...SAP n Set the archive interval to 'n' minutes. 'n' is one byte.put_serial_string ("SAP"); // Send the command.put_serial_char (n); // Set interval to 'n' minutes.put_serial_char (0x0D); // Send CR...SSP 256-n Set the time interval between samples of the sensor image inthe WeatherLink to 'n' seconds. 'n' is one byte. At eachsampling instant the sensor image is sampled and variables thatare "averaged" are accumulated. The maximum number of samples inan interval is 255.put_serial_string ("SSP"); // Send the command...put_serial_char ((unsigned char) (256 - newSamplePeriod));put_serial_char (0x0D); // Send CR...STOP Tell the WeatherLink to stop it's constant updating ofweather information from the weather station. The command alsodisables the archive timer on the WeatherLink. Stopping weatherstation reads allows the WeatherLink to process commands morequickly.put_serial_string ("STOP");put_serial_char (0x0d);START Tell the WeatherLink to begin "reading" the weather stationand archiving weather information. This command is only needed ifyou have previously sent a STOP command.put_serial_string ("START");put_serial_char (0x0d);ARC Force a write to archive memory.put_serial_string ("ARC");put_serial_char (0x0d);IMG Force a sampling of the sensor image.put_serial_string ("IMG");put_serial_char (0x0d);DBT Disable the archive timer.put_serial_string ("DBT");put_serial_char (0x0d);EBT Enable the archive timer.put_serial_string ("EBT");put_serial_char (0x0d);CRC0 Disable CRC command checking for Rev E links. This commandwill set a Rev E WeatherLink into Rev D emulation mode. This meansthat CRC check sums are not required (not allowed either!) forcommands sent to the WeatherLink. Also, only LOOP, MDMP, and SRDdata from the WeatherLink include CRC check sums. If CRC command checking is enabled when you issue thiscommand, you MUST include the CRC code. CRC command checking isonly disabled AFTER the command is received and validated. The CRCcode is given below. CRC0 command is only available on Rev E Links. Note, the last character of the command is an ASCII zerocharacter.put_serial_char (44); // CRC code first byte (decimal)put_serial_char (247); // CRC code second byte (decimal)put_serial_string ("CRC0"); // The fourth character is a zeroput_serial_char (0x0d);CRC1 Enable CRC command checking for Rev E links. This command willreturn a Rev E WeatherLink to normal operation. This means that CRCcheck sums ARE required for commands sent to the WeatherLink. Also,ALL data from the WeatherLink includes CRC check sums. If CRC command checking is disabled when you issue thiscommand, you MUST NOT include the CRC code. CRC command checking isonly enabled AFTER the command is received. CRC1 command is only available on Rev E Links.put_serial_string ("CRC1");put_serial_char (0x0d);VII. Command SummaryDMP Transfer the contents of the archive memory using the XMODEMCRC protocol.MDMP Dumps an image of Station processor memory to the serialport. This command is only available on the GroWeather, Energy,and Health Links.LOOP 65536-n Send 'n' packets of weather data (sensor image) from theWeatherLink.RRD bank address n-1 Read 'n' (1-8) nibbles from the link memory from 'address' in'bank'.RWR bank | n-1 address data Write 'n' (1-8) nibbles of 'data' into the link memory at'address' in 'bank.'SRD address n-1 Read 'n' bytes of archive memory beginning at 'address.' Both'address' and 'n-1' are 16 bit numbers.SWR address data Write 'data' (one byte) to 'address' (2 bytes) in archivememory.WRD n | bank address Read 'n' (1-8) nibbles of data from the station memorystarting at 'address' For a bank 0 use 'bank' = 2, for a bank 1use 'bank' = 4.WWR n | bank address data Write 'n' (1-8) nibbles of data to the station memorystarting at 'address' For bank 0 use 'bank' = 1, for bank 1 use'bank' = 3.SAP n Set the archive interval to 'n' minutes. 'n' is one byte.SSP 256-n Set the time interval between samples of the sensor image to'n' seconds. 'n' is one byte. The maximum number of samples inan interval is 255.STOP Tell the WeatherLink to stop updating the sensor image andarchiving.START Tell the WeatherLink to begin updating the sensor image andarchiving data. This command is only needed if you havepreviously sent a stop command.ARC Force a write to archive memory.IMG Force a sampling of the sensor image.DBT Disable the archive timer.EBT Enable the archive timer.CRC0 Disable CRC command checking for Rev E links.CRC1 Enable CRC command checking for Rev E links.VIII. Illustrated ExamplesA. Reading Calibrated Data Most of the data values displayed on the Station's LCD havebeen calibrated. The term "calibrated" here means a user suppliedoffset has been added to the "raw" number read by the weatherstation. The data stored in "XxxxDta" memory locations (i.e.Tp1Dta, SpdDta, etc. See Section IX) are uncalibrated. This goesfor LOOP data, and archived data as well. Thus, you may have tocalibrate the data you read off the station (or link). You shouldtake the time to read the station's user manual to familiarizeyourself with some of the Cal number basics. There are several approaches to how to implement Calnumbers. 1: Your program takes input from the user and recordsthe Cal numbers in a configuration file on the PC. Optionally theprogram could set the station's Cal numbers at the same time sothey agree. 2. Or, the user could set the Cal number on thestation (either manually or with another program) and yourprogram reads the required Cal numbers off the station. Always check sensor values for invalid data BEFORE applyingcalibration numbers. Do not apply a calibration number to aninvalid data value. See "Invalid Data values" below for moreinformation. The rest of this section will explain how to use the secondapproach. The following Cal Numbers are explained: 1 Temperature,2 Humidity, 3 Barometer, 4 Rain, 5 Wind Speed, 6 Rain Rate, and 7UV MED's.1. Temperature CAL Each of the two temperature sensors has a separate Calnumber. Only the current station data and all Linkdata--including the sensor image (LOOP) and archived data--needsto be calibrated. Hi/Low data on the station and "derived" data(i.e. Dewpoint, Wind chill, and THI) already have the Cal numbertaken into account. The value at the Cal number location is anoffset (in Degrees F*10) to be added to the data. Note: thisvalue is a signed data value. Reading Inside Temp on the Monitor (or Wizard orPerception):put_serial_string ("WRD"); // Send read command.put_serial_char (0x44); // read 4 nibbles from bank 1.put_serial_char (0x52); // Read beginning at 52h. // (Inside Temp Cal on Monitor)put_serial_char (0x0D); // Send CR...get_acknowledge(); // verify that the command wasreceived and got ACKfill_buffer(2); // get the returned data (in bytes)InTempCAL = *((int *) receive_buffer) // read the Cal number out of thebufferput_serial_string ("WRD"); // Send read command.put_serial_char (0x44); // read 4 nibbles from bank 1.put_serial_char (0x30); // Read beginning at 30h. // (Inside Temp Data on Monitor)put_serial_char (0xd); // Send CR...get_acknowledge(); // verify that the command wasreceived and got ACKfill_buffer(2); // get the returned data (in bytes)InTemp = *((int *) receive_buffer) // read the Raw Temperature out of thebuffer// Verify that the Raw Temperature is not an invalid data valuebefore// applying the cal number. See "Invalid Data values" below for// more information.InTemp = InTemp + InTempCal // InTemp is now Calibrated Reading Outside Temp on the Energy Station:put_serial_string ("WRD"); // Send read command.put_serial_char (0x34); // read 3 nibbles from bank 1.put_serial_char (0x45); // Read beginning at 45h. // (Outside Temp Cal on Energy)put_serial_char (0xd); // Send CR...get_acknowledge(); // verify that the command wasreceived and got ACKfill_buffer(2); // get the returned data (in bytes) // Note that the upper nibble of the last byte will be set // to 0 Also, even though the address was odd, the nibbles // are aligned so that the addressed nibble is the least // significant nibble of the first byteOutTempCAL = *((int *) receive_buffer) // read the Cal number out of thebufferif(OutTempCAL > 2048) // Check for negative numbers { OutTempCAL = OutTempCAL - 4096; // convert a 3 nibble 2's complementnegative // number into a "real" negativenumber }put_serial_string ("WRD"); // Send read command.put_serial_char (0x34); // read 3 nibbles from bank 1.put_serial_char (0x36); // Read beginning at 36h. // (Outside Temp Data on Energy)put_serial_char (0xd); // Send CR...get_acknowledge(); // verify that the command wasreceived and got ACKfill_buffer(2); // get the returned data (in bytes)OutTemp = *((int *) receive_buffer) // read the Raw Temperature out of thebufferif(OutTemp > 2048) // Check for negative numbers { OutTemp = OutTemp - 4096; // convert a 3 nibble 2's complementnegative // number into a "real" negativenumber }// Verify that the Raw Temperature is not an invalid data value// before applying the cal number. See "Invalid Data values" // below for more information.OutTemp = OutTemp + OutTempCAL // OutTemp is now Calibrated2. Humidity CAL Only Outside Humidity on the GroWeather, Energy, Health,and on the Monitor Rev C or later have a CAL number. It consistsof either a signed 2-byte number (on the Monitor) or a signed 1-byte number (on the other stations) to be added to the currentstation data and Link data including the sensor image (LOOP) andarchived data. Hi/Low and "Derived" values (dewpoint, THI, etc.)already take the Cal number into account. After adding the Cal number to the data, you will need tomake sure that the result is in the range 1 to 100. If not, thenclip the data at these boundaries.Reading Outside Hum on the Monitor:put_serial_string ("WRD"); // Send read command.put_serial_char (0x44); // read 4 nibbles from bank 1.put_serial_char (0xDA); // Read beginning at DAh. // (Outside Hum Cal on Monitor)put_serial_char (0xd); // Send CR...get_acknowledge(); // verify that the command wasreceived and got ACKfill_buffer(2); // get the returned data (in bytes)OutHumCAL = *((int *) receive_buffer) // read the Cal number out of thebufferput_serial_string ("WRD"); // Send read command.put_serial_char (0x24); // read 2 nibbles from bank 1.put_serial_char (0x98); // Read beginning at 98h. // (Outside Hum Data on Monitor)put_serial_char (0xd); // Send CR...get_acknowledge(); // verify that the command wasreceived and got ACKfill_buffer(1); // get the returned data (in bytes)OutHum = *((unsigned char *) receive_buffer) // read the Raw Humidity out of thebufferif (OutHum == 128) // if the raw sensor value is 128,then either the return HUM_ERROR_VALUE // hum sensor is not working or not attached.OutHum = OutHum + OutHumCal // OutHum is now Calibrated, but possiblyout of rangeif (OutHum >100) OutHum = 100;else if (OutHum < 1) OutHum = 1; // OutHum has been clipped to therange 1 - 100.3. Barometer The weather station measures the absolute atmosphericpressure. In order to convert this to a Standard Barometricpressure, the station subtracts a calibration offset value. Thisis determined by having the user enter the desired Barometricreading (derived from some other source i.e. airport, newspaperetc.). The station stores the difference between the desiredreading and the actual reading in the "StnDrd" memory register.This calibration number must be subtracted from the currentStation data and Link data including the sensor interface (LOOP)and archived data. Note: since at higher elevations the absolute pressuredecreases, the barometric pressure is generally larger than theatmospheric pressure and since the calibration number issubtracted from the data, it is generally a negative number. Itis 2 bytes longReading Barometer on the Monitor (or Perception):put_serial_string ("WRD"); // Send read command.put_serial_char (0x44); // read 4 nibbles from bank 1.put_serial_char (0x2C); // Read beginning at 2Ch. // (Barometer Standard on Monitor)put_serial_char (0xd); // Send CR...get_acknowledge(); // verify that the command wasreceived and got ACKfill_buffer(2); // get the returned data (in bytes)BarCAL = *((int *) receive_buffer) // read the Cal number outof the bufferput_serial_string ("WRD"); // Send read command.put_serial_char (0x44); // read 4 nibbles from bank 1.put_serial_char (0x00); // Read beginning at 00h. // (Barometer Data on Monitor)put_serial_char (0xd); // Send CR...get_acknowledge(); // verify that the command wasreceived and got ACKfill_buffer(2); // get the returned data (in bytes)Barometer = *((int *) receive_buffer) // read the Raw Barometer out of thebufferBarometer = Barometer - BarCal // Barometer is now Calibrated4. Rain Rain data on all stations and links are stored in "unit-less" clicks. The RainCal number tells how many clicks are in aninch of rain. The most common numbers are: 10 for the 0.1" raincollector, 100 for the 0.01" rain collector, and 127 for the0.2mm rain collector.Reading Yearly Rain on the Monitor (or Wizard):put_serial_string ("WRD"); // Send read command.put_serial_char (0x44); // read 4 nibbles from bank 1.put_serial_char (0xD6); // Read beginning at D6h. // (Rain Cal on Monitor)put_serial_char (0xd); // Send CR...get_acknowledge(); // verify that the command wasreceived and got ACKfill_buffer(2); // get the returned data (in bytes)RainCAL = *((int *) receive_buffer) // read the Cal number outof the bufferput_serial_string ("WRD"); // Send read command.put_serial_char (0x44); // read 4 nibbles from bank 1.put_serial_char (0xCE); // Read beginning at CEh. // (Yearly Rain Data on Monitor)put_serial_char (0xd); // Send CR...get_acknowledge(); // verify that the command wasreceived and got ACKfill_buffer(2); // get the returned data (in bytes)RainClicks = *((int *) receive_buffer) // read the Raw Rain out of the bufferYearRain = (float) RainClicks / (float) RainCal // Make sure this is a floating pointcalculation // YearRain is now Calibrated inInches Reading Daily Rain on the GroWeather Station:put_serial_string ("WRD"); // Send read command.put_serial_char (0x44); // read 4 nibbles from bank 1.put_serial_char (0xCF); // Read beginning at CFh. // (Rain Cal on GroWeather)put_serial_char (0xd); // Send CR...get_acknowledge(); // verify that the command wasreceived and got ACKfill_buffer(2); // get the returned data (in bytes)RainCAL = *((int *) receive_buffer) // read the Cal number out of thebufferput_serial_string ("WRD"); // Send read command.put_serial_char (0x34); // read 3 nibbles from bank 1.put_serial_char (0xC9); // Read beginning at C9h. // (Daily Rain Data on GroWeather)put_serial_char (0xd); // Send CR...get_acknowledge(); // verify that the command wasreceived and got ACKfill_buffer(2); // get the returned data (in bytes) // Note that the upper nibble of the last byte will be set // to 0 Also, even though the address was odd, the nibbles // are aligned so that the addressed nibble is the least // significant nibble of the first byteRainClicks = *((int *) receive_buffer) // read the Raw Rain out // of the buffer. Since Rain is unsigned, we do not need to // Check for negative numbersDailyRain = (float) RainClicks / (float) RainCal // Make sure this is a floating point calculation // YearRain is now Calibrated in Inches5. Wind Speed While all of the stations have a Wind Speed cal number,there are very few situations where it is useful. Primarily ifyou do not attach a Davis anemometer, or if you are not measuringwind speed. The formula for Wind Speed in MPH is "SpdDta" * 1600/ "SpdCal". Since, the default Cal number is 1600, you can justread "SpdDta" in MPH directly without any further calculation. The Speed Cal only effects the LCD display of the currentand Hi wind speed. It is not used in any "Derived" calculations(i.e. Wind Chill, THSWI, or ET). Setting the Cal Number to 3600 will cause the display to bein Hz. That is it will show the number of anemometer revolutionsper second.6. Rain Rate Rain Rate is only available on the GroWeather, Energy, andHealth stations. There are two different ways that the Rain Ratedata is stored. On the Links (both Sensor Image and archiveddata), the rate is stored in inches per hour times 10. Thecurrent station rain cal is used to calculate this value. SeeBelow. On the Station, the current rain rate (and the Hi rate onthe Health station) is stored as "The number of half-secondsbetween the last rain click and the previous rain click. Giventhe information above about the station's rain Cal number, theformula for converting raw rate data is:Rate(in/hr) = 7200(1/2 sec/hr) / ("RateDta"(1/2sec/clicks)* "RainCal"(clicks/In))7. UV MED's The UV MED's Cal number is designed to allow the UV MED'sdisplays to be adjusted for different skin types. UV Intensitydata is stored in tenths of an Index, but can be displayed inboth Index and MED's per Hour. UV Doses are stored as "Standard"MED's and always displayed in MED's. The UV MED's Cal number is anumber between 1 and 14 which represents a multiplication factorof 0.1 to 1.4. The "Standard" Cal number is 10, representing amultiplication factor of 1.0. The formula for converting UV Index to "Standard" MED's is:UV_MEDs = (3/7) * UV_Index The formula to convert "Standard" MED's to calibrated MED'sis:Caled_MEDs = Standard_MEDs * "UVCal" / 10Note: Make sure that you perform both of the above conversionsusing floating point arithmetic!B. Using the LOOP command The LOOP command is the preferred way to acquire real timeupdates of weather data. The data sent in a LOOP packet is thedata from the Link's Sensor interface. The pseudo-codedescription of the link processing loop above describes how oftenthis data is updated from the station. The answer to the question"How often is the data updated?" in the FAQ contains some usefulapproximate timing figures. LOOP data is also CRC checked (Seebelow for how to implement CRC Checking). Assuming that you want a virtually continuous stream of looppackets, one approach is to ask for a large number (say 1000) ofpackets in one LOOP command, another approach is to ask for a fewpackets (5-10) in one LOOP command and repeat the request whenthey have arrived. In either case there is the possibility thatmissed characters or other communication difficulties may causethe receiver to become unsynchronized with the link as to wherethe data packets begin. If this happens you should first stop thestream of LOOP data by sending another valid command (like a readof Link memory). Then clear your receive buffer and send the LOOPcommand again. Another feature of the LOOP command, only available on theGroWeather, Energy, and Health stations, is the ability tomonitor the archiving of data. On these stations, one of the datafields is the "NewPtr" that indicates the SRAM address where thenext archive record is to be written. If this number changesduring the course of reading LOOP packets, you know that thestation has created a new archive record. This feature is used inthe "Strip Charts" in the GroWeather, Energy, and Health softwareto keep the PC database current with the archive memory. The following examples show how to extract data from a databuffer filled with LOOP data. See above for a description offill_crc_buffer() and see below for how CRC checking is done. Example of reading a Monitor Sensor Image. (reading a Wizardor a Perception is the same only omitting the fields of non-existing sensors).put_serial_string ("LOOP");send_unsigned ((unsigned) (65535)); // request 1 LOOP packetput_serial_char (0x0d);get_acknowledge(); // verify that the command wasreceived and got ACKheader = get_serial_char(); // This should be the block headerbyteif (header != 1) { error = 1;} // If the header byte is not 1 thenthere is an error// assuming there is no error ...CRC_Error = fill_crc_buffer(17); // 15 data bytes + 2 CRC bytes. // Header Byte is not includedin CRC check// assuming there is no CRC error, the data is stored inrecieve_buffer ...inside_temperature = *((int *)(receive_buffer+0));outside_temperature = *((int *)(receive_buffer+2));wind_speed = *((unsigned char *)(receive_buffer+4));wind_direction = *((int *)(receive_buffer+5));barometer = *((int *)(receive_buffer+7));inside_humidity = *((unsigned char *)(receive_buffer+9));outside_humidity = *((unsigned char*)(receive_buffer+10));rain = *((unsigned *)(receive_buffer+11)); Example of reading a GroWeather sensor imageput_serial_string ("LOOP");send_unsigned ((unsigned) (65535)); // request 1 LOOP packetput_serial_char (0x0d);get_acknowledge(); // verify that the command wasreceived and got ACKheader = get_serial_char(); // This should be the block headerbyteif (header != 1) { error = 1;} // If the header byte is not 1 then there is an error// assuming there is no error ...CRC_Error = fill_crc_buffer(34); // 32 data bytes + 2 CRC bytes. // Header Byte is not included in CRC check// assuming there is no CRC error, the data is stored inreceive_buffer ...New_pointer = *((unsigned int *)(receive_buffer));bar_power_flag = *(( unsigned char *)(receive_buffer+2));soil_temperature = *((int *)(receive_buffer+3));air_temperature = *((int *)(receive_buffer+5));wind_speed = *((unsigned char *)(receive_buffer+7));wind_dir = *((int *)(receive_buffer+8));barometer = *((int *)(receive_buffer+10));rain_rate = *((unsigned char *)(receive_buffer+12));outside_humidity = *((unsigned char*)(receive_buffer+13));rain = *((unsigned *)(receive_buffer+14));solar_rad = *((int *)(receive_buffer+16));wind_run = *((unsigned char *) (recieve_buffer+18)) + *((unsigned char *) (recieve_buffer+19))*256 + *((unsigned char *) (recieve_buffer+20))*65536ET = *((unsigned char *) (recieve_buffer+21))ET_Flags = *((unsigned char *) (recieve_buffer+22))Deg_Days = *((unsigned char *) (recieve_buffer+23)) + *((unsigned char *) (recieve_buffer+24))*256 + *((unsigned char *) (recieve_buffer+25))*65536Energy = *((unsigned char *) (recieve_buffer+26)) + *((unsigned char *) (recieve_buffer+27))*256 + *((unsigned char *) (recieve_buffer+28))*65536Alarm_Flags = *((unsigned char *) (recieve_buffer+29)) + *((unsigned char *) (recieve_buffer+30))*256 + (*((unsigned char *) (recieve_buffer+31)) & 0x0F)*65536AOM_status = (*((unsigned char *)(recieve_buffer+31)) & 0xF0) >> 4LeafWetnessData = (*((unsigned char *)(recieve_buffer+32)) & 0xF);LeafWetnessEnabled = (*((unsigned char *)(recieve_buffer+32)) & 0x40) == 0x40; // Check the value of bit 6C. Using MDMP command While the MDMP command is only available on the GroWeather,Energy, and Health stations, it is very useful any time you wantto examine several station memory locations at once. Forinstance, looking at all the Hi/Lows or all the Alarm thresholds.You could, in principal, use MDMP as an alternative to the LOOPcommand to provide real time data, but it imposes a greaterburden on the Station, Link, and PC processing power andbandwidth. It is therefore not recommend for continuous use. There are 2 difficulties that must be addressed whenextracting MDMP data. First, locating the desired data in thedata buffer. Second, making sure that the number is sign extendedif the value is supposed to be a negative number. Assuming that the MDMP data is stored in a continuous bytesized buffer starting with byte 0, Bank 0 data from the stationwill be found in Bytes 0-127. Bank 1 data from the station willbe found in Bytes 128-255. Remembering that the addresses in thetables below are in nibbles, even addresses are stored in theLeast-Significant-Nibble of their corresponding byte, and oddaddresses are in the Most-Significant-Nibble. To request and store a memory dump:put_serial_string ("MDMP"); // Request Memory Dumpput_serial_char (0x0d);get_acknowledge(); // verify that the command was // received and got ACKCRC_Error = fill_crc_buffer(258); // 256 data bytes + 2 CRC bytes. // receive_buffer has memory dump data.Some examples of reading data out of this buffer: Wind speed on the GroWeather is located at address 0x060 =96. This corresponds to byte 48 in the buffer. Since the datastarts on an even address and is only 2 nibbles long andunsigned, byte 48 is the Wind Speed without any furtherprocessing.WindSpeed = receive_buffer(48); Daily ET on the GroWeather is located at address 0x0A7 =167. This corresponds to the upper nibble of byte 83 in thebuffer. Since the data value is 3 nibbles long, the whole of byte84 is also part of this data field. The data is unsigned so we donot have to worry about sign extension.// Mask and shift nibble 1nibble1 = (receive_buffer[83] & 0xF0) >> 4; // Add in the upper 2 nibblesDayET = nibble1 + (receive_buffer[84] * 16); Hi Air Temp on the GroWeather is located at address 0x145 =325 (69 in Bank 1). This corresponds to the upper nibble of byte162 (128 + 34.5). The data field also includes all of byte 163.After extracting the data, we must check for a negative value.// Mask and shift nibble 1nibble1 = (receive_buffer[162] & 0xF0) >> 4; // Add in the upper 2 nibblesHiAirTemp = nibble1 + (receive_buffer[163] * 16);// Check the sign bit of a 3-nibble 2's complement numberif (HiAirTemp > 2048) HiAirTemp = HiAirTemp - 4096; // If negative, make it so And finally, Soil Temp Low Alarm Threshold on the GroWeatheris located at address 0x13C = 316 (60 in Bank 1). Thiscorresponds to byte 158. The data also extends into the lowernibble of byte 159. Again the data needs to be sign extended ifnecessary// Mask out the Hi nibblenibble3 = (receive_buffer[159] & 0x0F) * 256; // add lower byte to nibble3SoilLowAlarm = receive_buffer[158] + nibble3; // Check the sign bit of a 3-nibble numberif (SoilLowAlarm > 2048) // If negative, make it so SoilLowAlarm = SoilLowAlarm - 4096; D. Invalid Data values In general there are 2 different ways that numerical data isstored on the weather station: Signed and Unsigned. These twomethods use different values to indicate that the sensor is notattached (or not working). Signed data can use either thelargest positive or smallest negative number that fits into it'sdata size. Unsigned data uses the largest value. You must keep in mind the size (in nibbles) of the datafield you are examine since this will affect the numerical valuesto be checked for. These Data values are also used in Alarm Thresholds toindicate that no threshold has been set and therefore not to testfor that particular alarm condition. Always check sensor values for invalid data BEFORE applyingcalibration numbers. Do not apply a calibration number to aninvalid data value. Rain Rate is a special case dealt with below. Data that accumulates over time (i.e. Rain, ET, Degree-Days,Wind Run, Solar Energy, and UV Dose) is unsigned data. The errorvalue is used only for inactive alarm thresholds.Signed Data Values: Temperature: All temperatures, Hi/Lows, Alarm thresholds,and Cal numbers are Signed data. On the Monitor, the Wizard, andthe Perception, these values are stored in 4 nibble fields.Therefore the error values are 0x7FFF = 32767 and 0x8000 = -32768.On the GroWeather, Energy, and Health stations, these values arestored in 3 nibble fields. And the error values are 0x7FF = 2047and 0x800 = -2048. Barometer: The current and stored barometer data is storedin 4 nibble fields on all stations. The barometer alarm is storedin 2 nibbles, and uses the value 0x7F = 127 or 0x80 = -128 forinvalid data. Wind Direction: On the Monitor, and Wizard stations, thewind direction is stored in a 4 nibble field and uses the values0x7FFF or 0x8000 to indicate an invalid wind direction. On the GroWeather, Energy, and Health stations, winddirection is stored in a 3 nibble field and uses the values 0x7FFor 0x800 to indicate an invalid wind direction. This information only applies to the current wind directionon the station, or in the sensor image on the link (i.e. LOOPdata packet). The data stored in the archive memory is anunsigned byte with the compass direction of the prevailing windfrom 0-15. The value 255 is used to indicate that there waseither no wind or no wind direction data during the archiveperiod. In addition, the GroWeather, Energy, and Health stationsalso have 1 nibble fields that record both the current winddirection and the wind direction at the time of the hi windspeed. All 16 values of a 1 nibble number are needed to representthe 16 different compass points. You will need to check the valueof the appropriate status bit in order to determine if the datais valid. Humidity: Since valid Humidity values only range from 1% to100%, it does not make much difference whether humidity isconsidered a signed or unsigned value. An illegal Humidityreading is represented by the value 0x80 which can either bethought of as 128 or -128 depending upon whether the data issigned or unsigned. The weather station treats the data as signedfor the purposes of clearing Hi/Low values.Unsigned Data Values: Wind Speed: Except for Rev A Monitors, and Wizards, windspeed data on all stations is 2 nibbles long and unsigned. On theRev A Monitors and Wizards, the data is signed. The wind speed hi alarm threshold on all Monitors andWizards is a 4 nibble signed number using 0x7FFF or 0x8000 toindicate an invalid alarm. On the GroWeather, Energy, and Health stations, the windspeed hi alarm is a 2 nibble unsigned number which uses 0xFF =255 to indicate an invalid alarm. Note that this means that whilethe current (and Hi) data can display the value of 255, the alarmcan not be set to this value, since that value is used toindicate the absence of a wind speed alarm. Solar Rad: Solar rad is a 3 nibble unsigned number that uses0xFFF = 4095 to indicate invalid data. UV Intensity: UV Intensity is stored as a 2 nibble unsignednumber. The current value, hi value, and hi alarm use the value0xFF = 255 to indicate invalid data.Rain Rate Data The rain rate data is stored as a 3 nibble unsigned number.Because of the way that rain rate is measured and calculated,larger data values correspond to smaller rain rates. Setting thehi rain rate to zero, for instance, results in an infinite rainrate that is displayed with dashes. These dashes will not go awayuntil the hi rain rate is cleared. When a rain rate value iscleared, it is set to 0xFFF = 4095, the display will read 0.0inches per hour. In some cases, the station treats this value asa signed number and uses the value 0x7FF = 2047 to indicate acleared rain rate.E. Calculated Data values Here are some formulas and code examples for how tocalculate some of the "Derived" data values found on the station:1. Wind Chill Wind chill represents how cold the temperature feels in thepresence of wind. It is based on the current wind speed(calibration is ignored) and the current outside temperature(calibration is used). The following C code shows how this isdone. Note that if the temperature is above 91, the wind has noeffect on the wind chill./* Chill Factor (cf) at 5 MPH intervals */unsigned char chillTableOne [] ={156, 151, 146, 141, 133, 123, 110, 87, 61, 14, 0};/* delta cf for interpolation of table one */unsigned char chillTableTwo [] ={0, 16, 16, 16, 25, 33, 41, 74, 82, 152, 0};/*+-----------------------------------------+ Assumes temperature is in F. & speed is in Mph Returns Chill in F*/float ChillCalc (int speed, float t){ int index; float cf, chill; if (speed > 50) // Max. speed of 50 mph. speed = 50; index = 10 - speed / 5; // this division is notrounded! cf = chillTableOne [index] + (chillTableTwo [index] / 16.0) * (speed % 5); // '%' is the mod operator that gives the remainder when the // first operand is divided by the second operand // Only apply chill factor if the temperature is less that 91.4 if ( t < 91.4 ) chill = cf * ((t - 91.4) / 256.0) + t; else chill = t;return chill;}2. Dew Point The dewpoint is the temperature that dew begins to form.Water will condense on an object that is colder that the dewpointof the surrounding air. It represents the absolute amount ofwater in the atmosphere -- a higher dewpoint means there is morewater in the air. This value is based on the outside temperatureand outside humidity (both calibrated)./****************** * DewCalc Computes the dew point based on Relative Hum & Temp * rh in % (i.e. 0.0 - 100.0), temp in F * Computes dp in C and converts to F if using those units ******************/float DewCalc (float rh, float temp){ // verify that the input data is valid before continuing if (rh<1 || rh>100 || temp<-100 || temp>200) { return NO_DATA; // return with "error" if input is invalid. } float dp, ews, num, den; temp= (5.0/9.0)*(temp-32.0); // convert temp to C ews= rh*0.01*exp((17.502*temp)/(240.9+temp)); // ews is proportional to the vapor pressure num= 240.9*(log(ews)); // "log" is really "ln" (i.e. log base e) den= 17.5-(log(ews)); dp= num/den; if (tempUnits == FAHRENHEIT) // Convert back to F if required. dp= (9.0/5.0)*dp+32; return dp;}3. Temperature-Humidity Index Temperature-Humidity Index (THI) is a measure of"sultriness", or "how hot does it feel?". Based on a paper byR.G. Steadman, it uses outside temperature and outside humidity(both calibrated). The station determines THI by interpolationfrom the table in the file thitable.h. This table is indexed bytemperature in 1 degree intervals for each row, and humidity in10 percent intervals for each column. Because this measurement is primarily intended formonitoring human health and comfort in hot weather, it onlycovers temperatures greater than 68 F (20 C). If the temperatureis less than 68 F then the station only displays that the THI is"LO". In addition, if the calculated THI is greater than 125 F(51 C) then the station reports a THI of 125 F alternated with adisplay of "HI". There are status bits on the station to let youknow if either of these conditions exist.4. THSWI Temperature-Humidity-Sun-Wind Index (THSWI) extends THI byadding in the effects of the Sun and the Wind. For a completediscussion, see the paper "The Assessment of Sultriness. Part II:..." contained in Volume 18 of the Journal of AppliedMeteorology. If either the Solar sensor, or the anemometer is notattached (or not working) then the corresponding component ofTHSWI will not be calculated. Wind direction is used to determineif the anemometer is working since there is no other way todistinguish between an absent anemometer and a valid reading of 0MPH. This means you can not use a Wizard II-S anemometer (speedonly, no wind direction) if you want the station to calculateTHSWI. THSWI has the same temperature limits as THI as describedabove.5. Wind Run Wind run measures the total volume of wind that has passedby the anemometer. It is implemented on the station by countingthe number of revolutions of the anemometer. Every 1600revolutions is one mile of wind run. Thus every 160 revolutionsis one tenth of a mile of wind run. You can use wind run datafrom the archive as an average wind speed after taking intoaccount the archive period. The following table shows how toconvert wind run data into average wind speed data. There is noadvantage to using this technique for archive intervals of 1 or 5minutes. You can also use this table to convert average wind speeddata into wind run by dividing the wind speed data by the givenfactor. The resolution of the resulting wind run data will be thesame as the conversion factor.Conversion factors for Wind Run to Average MPHArchive multiply wind Resolution (0.1 mile of wind run = XXMPH)interval run by MPH120 0.5 0.0560 1.0 0.130 2.0 0.215 4.0 0.410 6.0 0.65 12.0 1.21 60.0 6.06. Degree-Days Degree days are calculated by "integrating" the amount bywhich the current temperature is above (or below) a thresholdover time. Here is how you could calculate degree-day values froman existing temperature database. First, select the temperature threshold you will use, andwhether you are calculating Heating Degree-days (temperature isbelow the threshold), Cooling Degree-days (temperature is abovethe threshold), or Growing Degree-days (like Cooling DD with anoptional hi temperature limit). Also select the time period ofthe calculation. This procedure will give the total Degree-daysover the whole period. Second, Clear out your Degree-day accumulator. Third, for each record in your data base in the specifiedperiod, calculate the difference between the temperature and thethreshold. For Heating degree-days, use threshold - temperature;for Cooling degree-days use, use temperature - threshold; forGrowing degree-days, use MIN(temperature, hi_threshold) -low_threshold. Only use these numbers if the value is greaterthan 0, otherwise use 0. Fourth, multiply the value from step 3 by the number ofminutes in the archive period and add to the accumulator. Repeatsteps 3 and 4 for each record in the data base in the specifiedperiod. Fifth, after all the data points have been accumulated,divide the result by 1440 (the number of minutes in a day). Thisis the total accumulated degree-days during the selected period. Note that degree-day values calculated by the stationconsole may differ from values calculated from the algorithmgiven above because the station samples the temperature values ona real time basis instead of using averaged values.7. Solar Energy Solar energy, measured in Langleys, is Solar radiationintegrated over time. One Langley equals 11.622 Watt hours persquare meter = 697.32 Watt minutes per square meter.8. UV Dose UV Dose is UV Intensity, measured in MED's per hour,integrated over time. See above for how to convert UV Index intoMED's per hour.9. Rain Rate Rain Rate data on the station is stored as the number of «seconds between rain clicks. See above for how to convert this toinches per hour. If the number of « seconds is 0, then thedisplay will dash because the corresponding rate would beinfinite. If the number of « seconds is greater than 720 = 6minutes, then the corresponding rate is less that 0.1 inch perhour. One consequence of the way that rain rate is calculated isthat there can be no rate determination until the second rainclick occurs. Further, there will be some delay before any changein the rain rate is displayed, and this delay will be longer whenthe rate decreases. Any time the station notices that more than 6seconds have gone by without a rain click, the rate value iscleared to 0 (« seconds = 0xFFF = 4095). This is checked every 4seconds, so it might take as long as 10 seconds after the lastrain click for the rate value to be cleared.F. CRC Checking The CRC checking used by the WeatherLink is based on the CRC-CCITT standard. The heart of the method involves a CRC-accumulator that uses the following formula on each successivedata byte. After all the data bytes have been "accumulated",there will be a two byte CRC checksum that will get processed inthe same manner as the data bytes. If there has been notransmission error, then the final CRC-accumulator value will be0 (assuming it was set to zero before accumulating data). In the following code, "crc" is the crc accumulator (16 bitsor 2 bytes), "data" is the data or crc checksum byte to beaccumulated, and "crc_table" is the table of CRC values found inthe CCITT.h header file. The operator "^" is an exclusive-or(XOR), ">> 8" shifts the data right by one byte (divides by 256),and "<< 8" shifts the data left by one byte (multiplies by 256).crc = crc_table [(crc >> 8) ^ data] ^ (crc << 8); Rev E WeatherLinks also require CRC codes on all commandssent from the PC (unless they have been disabled with the "CRC0"command.). The end of line character (0x0D) is included in theCRC calculation. The following code shows one way to implementthis. Basically, the command to be sent is stored in the"command_buffer". A CRC code is calculated on this data and issent to the WeatherLink. Then the command is sent.unsigned char command_buffer [32];int command_len;unsigned int crc;// generate the commandcommand_buffer[0] = 'M';command_buffer[1] = 'D';command_buffer[2] = 'M';command_buffer[3] = 'P';command_buffer[4] = 0x0d; // an MDMP commandcommand_len = 5; // 5 characters in the command// we can not use C string functions since the commands couldcontain// null bytes.// calculate the CRC codecrc = 0; // initialize the crc valuefor (j=0; j> 8) ^ command_buffer[j]] ^ (crc << 8); // accumulate the j'th character into // the crc. Uses the above formula. }// send the CRC codesend_unsigned(crc);// send the commandfor (j=0; j> 8; // minutes now contains the time ofthe hitime.hour = minutes / 60; // integer divisiontime.minutes = minutes % 60; // remainder after dividing by 60if (days_ago < 15) // has the Hi/low expired? // calculate the Hi/low date by subtracting days_ago from the current date hi_low_date = current_date - days_ago;else { // Mark date invalid since we don't know how log ago the hi low happened hi_low_date.day = hi_low_month = 0; }Reading the time of high THI on the Energyput_serial_string ("WRD"); // Send read command.put_serial_char (0x32); // read 3 nibbles from bank 0.put_serial_char (0x9F); // Read beginning at 9Fh. // (Time of hi THI on Energy)put_serial_char (0xd); // Send CR...get_acknowledge(); // verify that the command wasreceived and got ACKfill_buffer(2); // get the returned data (in bytes)minutes = *((unsigned int*) recieve_buffer); // minutes now contains the time of the hitime.hour = minutes / 60; // integer divisiontime.minutes = minutes % 60; // remainder after dividing by 60IX. Memory addresses.NOTES: In the tables below, the third hex digit of the addressindicates the memory bank (0 or 1) where the data is stored. Bit locations are indicated by a memory location namefollowed by a period and a number from 0-3. for example:"BarSteady Equ BarFlag.0" indicates that the Bar Steady flagis located in bit 0 of the nibble named BarFlag. Multi-nibble values are stored least significant nibblefirst. The addresses listed in the tables below are the addressesof the least significant nibble. Commands like WRD will correctlyalign nibbles into bytes before transmission to the PC for valuesthat begin on both even and odd addresses. The station date is encoded in 3 nibbles on the Monitor,Wizard, and Perception stations and 5 nibbles on the GroWeather,Energy and Health stations. The first 2 nibbles store the day ofthe month in BCD. The third nibble is a number (1..12)representing the month. On the GroWeather, Energy and Healthstations, the last 2 nibbles are the year minus 1900 in binary.For example August 5 1996 is stored as "5 0 8 0 6" in increasingaddress order. Day = 05, Month = 8, Year = 60 hex = 96 = 1996; The station time is encoded in 6 nibbles. The first 2nibbles store the hour in BCD. The second 2 nibbles store theminutes in BCD. The last 2 nibbles store the seconds in BCD. On the Monitor, Wizard, and Perception stations, Hi/LowTimes are stored exactly like the station time. Hi/Low Dates use3 nibbles and record the Day and Month of the Hi/Low event in thesame manner as the first 3 nibbles of the station date. On the GroWeather, Energy, and Health stations, Hi/LowTime/Dates are stored differently. On the GroWeather they take 4nibbles and include both time and date information, on the Energyand Health, only the time is recorded. In both storage schemesthe time is recorded in 3 nibbles as a binary number giving thenumber of minutes since midnight. On the GroWeather, 1 nibble,the First, is used to indicate how many days ago the Hi/Low wasrecorded (0-14). If the event was more than 14 days ago, then thevalue 15 is stored. The TimeStamp field in archive records and in the archiveimage consists of 4 bytes that identify the time and date of thestored record, or the current time and date on the station. Thefirst byte is the hours (0-23) in BCD, the second is the minutes(0-60) in BCD, the third is the day of the month (0-31) in BCD,and the fourth is the month (1-12) in binary. Temperatures and Degree-Days are stored in tenths of øF. Humidity is stored as a percent (1-100). Pressure is stored in thousandths of an inch. Wind speeds are stored in miles per hour. Wind Run is stored as tenths of a mile. Rain is stored as "clicks" or rain bucket tips. Rain Rate is stored on the station as 1/2 seconds between clicks, and on the link in Tenths of an inch per hour, calculated from the station's Rain Cal number. Solar Radiation is stored as Watts per square meter. Solar energy is stored in tenths of a Langley. UV Intensity is stored in tenths of a UV Index. UV Dose is stored in tenths of a "standard" MED ET is stored in 100'th of an inch. Leaf Wetness ranges from 0 to 15 with 0 = Dry and 15 = Wet. THI Stands for Temperature-Humidity Index THSWI Stands for Temperature-Humidity-Sun-Wind IndexA. Monitor, Wizard, and Perception StationBank 0Address Data Data Size (nibbles)004D Model: DS 1 ; Weather Station type SeeAppendix C005E SpdDta: DS 2 ; Current wind speed.0060 SpdHi: DS 4 ; Hi wind speed.0064 SpdHTime: DS 4 ; BCD hour and minutes of hi.0068 SpdHDate: DS 3 ; BCD day of month + 1 nibble formonth006B SpdAHi: DS 4 ; Wind speed hi alarm threshold0079 BarFlag: DS 1 ; Indicates the status of the bartrend arrows BarSteady Equ BarFlag.0 ; If BarSteady = 1, thenIgnore BarRise BarRise Equ BarFlag.1 ; and BarFall Bits BarFall Equ BarFlag.2008A DewDta: DS 4 ; Current dew point in tenths F.008E DewHi: DS 4 ; Hi dew point in tenths F.0092 DewLo: DS 4 ; Lo dew point in tenths F.0096 DewHTime: DS 4 ; Time of hi dew point.009A DewLTime: DS 4 ; Time of lo dew point.009E DewLDate: DS 3 ; Date of lo dew point.00A1 DewHDate: DS 3 ; Date of hi dew point.00A4 DewAHi: DS 4 ; Hi dew point alarm.00A8 ChlDta: DS 4 ; Current wind chill in tenths F.00AC ChlLo: DS 4 ; Low wind chill.00B0 ChlLTime: DS 4 ; Time of low wind chill reading.00B4 ChlLDate: DS 3 ; Date of low wind chill reading.00B7 ChlALo: DS 4 ; Low wind chill alarm.Bank 1Address Data Data Size (nibbles)0100 BarDta: DS 4 ; Absolute barometric pressure.011A BarAlm: DS 2 ; Barometric pressure alarm.012C StnDrd: DS 4 ; Bar Calibration offset. ; LCD Display = BarDta - StnDrd0130 Tp1Dta: DS 4 ; Current inside temperature.0134 Tp1Hi: DS 4 ; Hi inside temperature.0138 Tp1Lo: DS 4 ; Low inside temperature.013C Tp1HTime: DS 4 ; Time of hi inside temperature.0140 Tp1LTime: DS 4 ; Time of low inside temperature.0144 Tp1HDate: DS 3 ; Date of hi inside temperature.0147 Tp1LDate: DS 3 ; Date of lo inside temperature.014A Tp1AHi: DS 4 ; Hi inside temperature alarm.014E Tp1ALo: DS 4 ; Low inside temperature alarm.0152 Tp1Cal: DS 4 ; Inside temperature cal number.0156 Tp2Dta: DS 4 ; Current outside temperature.015A Tp2Hi: DS 4 ; Hi outside temperature.015E Tp2Lo: DS 4 ; Lo outside temperature.0162 Tp2HTime: DS 4 ; Time of hi outside temperature.0166 Tp2LTime: DS 4 ; Time of lo outside temperature.016A Tp2HDate: DS 3 ; Date of hi outside temperature.016D Tp2LDate: DS 3 ; Date of low outsidetemperature.0170 Tp2AHi: DS 4 ; Hi outside temperature alarm.0174 Tp2ALo: DS 4 ; Low outside temperature alarm.0178 Tp2Cal: DS 4 ; Outside temperature cal number.0180 Hm1Dta: DS 2 ; Inside humidity.0182 Hm1Hi: DS 2 ; Hi inside humidity.0184 Hm1Lo: DS 2 ; Low inside humidity.0186 Hm1HTime: DS 4 ; Time of hi inside humidity.018A Hm1LTime: DS 4 ; Time of low inside humidity.018E Hm1HDate: DS 3 ; Date of hi inside humidity.0191 Hm1LDate: DS 3 ; Date of low inside humidity.0194 Hm1AHi: DS 2 ; Hi inside humidity alarm.0196 Hm1ALo: DS 2 ; Low inside humidity.0198 Hm2Dta: DS 2 ; Current outside humidity.019A Hm2Hi: DS 2 ; Hi outside humidity.019C Hm2Lo: DS 2 ; Low outside humidity.019E Hm2HTime: DS 4 ; Time of hi outside humidity.01A2 Hm2LTime: DS 4 ; Time of low outside humidity.01A6 Hm2HDate: DS 3 ; Date of hi outside humidity.01A9 Hm2LDate: DS 3 ; Date of low outside humidity.01AC Hm2AHi: DS 2 ; Hi outside humidity alarm.01AE Hm2ALo: DS 2 ; Low outside humidity alarm.01B4 DirDta: DS 4 ; Wind direction (0...359)01BE Time: DS 6 ; Time on station. BCD hour minsecond.01BE Hour (DS 2) ; BCD Hours (00 - 23)01C0 Minute (DS 2) ; BCD Minutes01C2 Second (DS 2) ; BCD Seconds01C4 TimeAlm: DS 4 ; Station alarm.01C4 HrAlm (DS 2) ; BCD Time alarm Hours (00 - 23)01C6 MinAlm (DS 2) ; BCD Time alarm Minutes01C8 Date: DS 5 ; Station date.01C8 Day (DS 2) ; BCD Day of the month01CA Month (DS 1) ; stored in binary 1-1201CE YRnDta: DS 4 ; Rain clicks recorded this year.01D2 DRnDta: DS 4 ; Rain clicks recorded since last ; clear of daily rain.01D6 RnCal: DS 4 ; Number of clicks equivalent to1 inch.01DA Hm2Cal: DS 4 ; Outside hum cal number.B. Monitor, Wizard, and Perception LinkBank 0Address Data Data Size (nibbles)004D Model: DS 1 ; Weather Station type SeeAppendix CBank 1Address Data Data Size (nibbles)0100 NewPtr DS 4 ; Address of next archive entry.0104 OldPtr DS 4 ; Address of oldest archiveentry.; Sensor image begins here. (11Ch) - (139h)011C Tin DS 4 ; Inside temperature0120 Tout DS 4 ; Outside temperature0124 WSp DS 2 ; Wind speed0126 WDir DS 4 ; Wind direction012A Barom DS 4 ; Barometer012E Hin DS 2 ; Inside humidity0130 Hout DS 2 ; Outside humidity0132 Rain DS 4 ; Rain0136 Unused DS 4 ; Unused bytes sent in the LOOPcommand; End of sensor image. (139h) Size = 1Eh = 30 nib = 15 bytes013A SamplePer DS 2 ; Sample Period = 256 - "Data"seconds013C ArcPeriod DS 2 ; Archive interval in minutes.0140 PrevRain DS 4 ; Rain click total at time oflast archive.0148 LastArchiveTime DS 4 ; Time in min. since midnight oflast archive.015E WDirs ds 32 ; Histogram of wind directions.; Archive Image begins here: (188h)-(1B1h)0188 ArchiveImage0188 Barom Ds 4 ; Barometer reading at archivetime.018C Hin Ds 2 ; Inside humidity at archivetime.018E Hout Ds 2 ; Outside humidity at archivetime.0190 Rain Ds 4 ; Rainfall in period.0194 TinAvg Ds 4 ; Average inside temperature.0198 TOutAvg Ds 4 ; Average outside temperature.019C WspAvg Ds 2 ; Average wind speed in period.019E Wdir Ds 2 ; Dominant wind direction in archiveperiod. (0-15)01A0 THiOut Ds 4 ; Hi Tout in period.01A4 Gust Ds 2 ; Hi wind speed in period.01A6 TimeStamp Ds 8 ; Archive entry time and date.01AE TLowOut Ds 4 ; Low Tout in period.;End of Archive Image (1DF) Size = 2Ah = 42 Nibbles = 21 BytesC. GroWeather StationBank 0Address Data Data Size (nibbles)000E LWReg DS 1 ; Leaf Wetness Enabled Register LWEnabled Equ LWEnabled.2 ; 0 = Soil Temp, 1 = Leaf Wetness0036 AlarmReg: DS 5 ; Bit flags for each alarm. SeeAppendix G1003B AOMStat: DS 1 ; AOM Load Status report. SeeAppendix B003D DirFlags: DS 1 BadDirF Equ DirFlags.2 ; Is current Dir Bad?1=bad, 0=good BadHiDir Equ DirFlags.3 ; Is Hi Dir Bad?1=bad,0=good004D Model: DS 1 ; Weather Station type. SeeAppendix C0049 HiTHIFlags: DS 1 ; Hi THI status Flags HiTHILowFl Equ HiTHIFlags.2 ; Hi THI Value is >= 125 HiTHIHiFl Equ HiTHIFlags.3 ; Hi THI Value is belowrange005F THIFlags: DS 1 ; THI status flags THILowFl Equ THIFlags.2 ; 1 = Air Temp < 68degrees THIHiFl Equ THIFlags.3 ; 1 = THI >= 125 degrees0060 SpdDta: DS 2 ; # of pulses in 2.25 seconds,equiv. to MPH0062 SpdHi: DS 2 ; High Wind speed (MPH)0064 SpdHTime: DS 4 ; Time of High Wind Speed0068 SpdAHi: DS 2 ; High Wind Speed alarm (MPH)006A SpdCal: DS 4 ; Wind Speed Calibration Number0075 HiDir: DS 1 ; Compass Rose Direction of Hiwind speed ; 0=N, 1=NNE, 2=NE, etc. ; See Appendix F007A BarFlag: DS 1 ; Indicates the status of the bartrend arrows BarSteady Equ BarFlag.0 ; If BarSteady = 1, thenIgnore BarRise BarRise Equ BarFlag.1 ; and BarFall Bits BarFall Equ BarFlag.2007B PwrFlags: DS 1 BattLow Equ PwrFlags.2 ; 1 = the Battery Voltageis low PowLow Equ PwrFlags.3 ; 1 = the primary powervoltage is low008A DewDta: DS 3 ; Current Dewpoint Data (DegreesF*10)008D DewAHi: DS 1 ; Dew point alarm stored here.008E ChlDta: DS 3 ; Current Wind Chill Data(Degrees F*10)0091 ChlLo: DS 3 ; Low Wind Chill0094 ChlLTime: DS 4 ; Time/Date of Low Wind Chill0098 ChlALo: DS 3 ; Wind Chill Low Alarm Threshold009E RunDta: DS 4 ; Daily Wind Run Data (Miles *10)00A2 RunTDta: DS 5 ; Total (Period) Wind RunData(Miles *10)00A7 ETDDta: DS 3 ; Daily ET (Inches *100)00AA ETDAl: DS 3 ; Daily ET Alarm Threshold(Inches *100)00AD ETTDta: DS 4 ; Total ET (Inches *100)00B1 ETTAl: DS 4 ; Total ET Alarm Threshold(Inches *100)Bank 1Address Data Data Size (nibbles)0100 BarDta: DS 4 ; Current Barometer Data (Inches*1000)0118 BarSto: DS 4 ; Stored Bar Data011C BarStoT: DS 4 ; Stored Bar Time and Date0120 StnDrd: DS 4 ; Bar Calibration Offset ; LCD Display = BarDta - StnDrd0124 BarAlm: DS 2 ; Bar Trend Alarm Threshold0130 Tp1Dta: DS 3 ; Current Soil Temperature Data(Degrees F*10)0133 Tp1Hi: DS 3 ; Hi Soil Temp Data0136 Tp1Lo: DS 3 ; Low Soil Temp Data0139 Tp1AHi: DS 3 ; Soil Temp Hi Alarm Threshold013C Tp1ALo: DS 3 ; Soil Temp Low Alarm Threshold013F Tp1Cal: DS 3 ; Soil Temp Cal Number0142 Tp2Dta: DS 3 ; Current Air Temp Data(DegreesF*10)0145 Tp2Hi: DS 3 ; Hi Air Temp Data0148 Tp2Lo: DS 3 ; Low Air Temp Data014B Tp2AHi: DS 3 ; Air Temp Hi Alarm Threshold014E Tp2ALo: DS 3 ; Air Temp Low Alarm Threshold0151 Tp2Cal: DS 3 ; Air Temp Cal Number0154 Tp2HTime: DS 4 ; Time/Date of Hi Air Temp0158 Tp2LTime: DS 4 ; Time/Date of Low Air Temp015C DDDDta: DS 3 ; Daily Degree-Day Data (DegreesF*10)015F DDTDta: DS 5 ; Total Degree-Day Data (DegreesF*10)0164 DDBase: DS 3 ; Degree-Day Base temp (DegreesF*10)0167 DDTAHi: DS 5 ; Degree-Day Total AlarmThreshold016C DDMax: DS 3 ; Degree-Day Max temp (DegreesF*10)0173 Hm2Dta: DS 2 ; Current Outside Humidity Data(0-100%)0175 Hm2Hi: DS 2 ; Hi Outside Hum Data0177 Hm2Lo: DS 2 ; Low Outside Hum Data0179 Hm2HTime: DS 4 ; Time/Date of Hi Outside Hum017D Hm2LTime: DS 4 ; Time/Date of Low Outside Hum0181 Hm2AHi: DS 2 ; Outside Hum Hi Alarm Threshold0183 Hm2ALo: DS 2 ; Outside Hum Low Alarm Threshold0185 Hm2Cal: DS 2 ; Outside Hum Cal Number018B DirDta: DS 3 ; Current Wind Direction Data (0-360)0194 Time: DS 6 ; Current Station Time(HH:MM:SS)0194 Hour (DS 2) ; BCD Hours (00 - 23)0196 Minute (DS 2) ; BCD Minutes0198 Second (DS 2) ; BCD Seconds019A TimeAlm: DS 4 ; Station Time Alarm (HH:MM)019A HrAlm (DS 2) ; BCD Time alarm Hours (00 - 23)019C MinAlm (DS 2) ; BCD Time alarm Minutes019E Date: DS 5 ; Current Station Date (DD:M:YY)019E Day (DS 2) ; BCD Day of the month01A0 Month (DS 1) ; stored in binary 1-1201A1 Year (DS 2) ; Year = 1900+binary data01A3 THIDta: DS 3 ; Current THI Data (Degrees F*10)01A6 THIHi: DS 3 ; Hi THI Data01A9 THIHTime: DS 4 ; Time/Date of Hi THI01AD THIAHi: DS 3 ; THI Hi Alarm Threshold01B0 PerLen: DS 4 ; Length of Period that tracksTotal values ; Low order nibble is in 1/16'ths of aday (90 min)01B1 PerDay (DS 3) ; Upper 3 nibbles are the numberof Whole days ; in the period01B4 ACTime: DS 4 ; AutoClear Time (Same format asTime) (HH:MM)01B8 SradDta: DS 3 ; Current Solar Radiation Data ; (Watts per square Meter)01BB SEngDDta: DS 4 ; Daily Solar Energy Data(Langleys *10)01BF SEngTDta: DS 6 ; Total Solar Energy Data(Langleys *10)01C5 YRnDta: DS 4 ; Total Rain Data01C9 DRnDta: DS 3 ; Daily Rain Data01CC DRnAHi: DS 3 ; Daily Rain Alarm Threshold01CF RnCal: DS 4 ; Rain Cal Number (Number ofclicks in 1 inch)01D3 RateDta: DS 3 ; Current Rain Rate in 1/2seconds per click01D6 RateHi: DS 3 ; Hi Rain Rate Data01D9 RateHTime: DS 4 ; Time/Data of Hi Rain Rate01DD PowVolt: DS 1 ; Voltage of the primary powersource ; See Appendix D01DE LeafDta: DS 1 ; Current Leaf Wetness DataD. GroWeather Link; Memory Bank 0 AT 0hAddress Data Data Size (nibbles)004F Model: DS 1 ; Weather Station type SeeAppendix C; ET data input registers. used to calculate hourly data for ETcalculation.0080 ETTemp ds 5 ; ET Temperature accumulator0085 ETSun ds 5 ; ET Solar Rad accumulator008A ETHum ds 4 ; ET Humidity accumulator008E ETWind ds 4 ; ET Wind Speed accumulator0092 ETTSamp ds 2 ; Count of ET Temp samples0094 ETSSamp ds 2 ; Count of ET Sun samples0096 ETHSamp ds 2 ; Count of ET Hum samples0098 ETWSamp ds 2 ; Count of ET Wind samples009A ETSampCnt ds 2 ; Count of ET Sample readings009E ETDay ds 3 ; Shadow of Station Daily ET Data00A1 ETTot100 ds 5 ; Shadow of Station Total ET Data; Memory Bank 1 AT 100hAddress Data Data Size (nibbles)0106 OldPtr ds 4 ; Points to oldest entry inarchive memory.; Sensor image begins here. (10Ah) - (14Fh); Each Field is in full bytes for ease of PC Loop modeinterpretation010A NewPtr ds 4 ; Points to next free archivememory location.010E SIStatus ds 2 ; Bar trend and Power flags SeeAppendix A0110 GTSoil ds 4 ; Current Soil temperature.0114 GTAir ds 4 ; Current Air temperature.0118 GWSp ds 2 ; Current wind speed.011A GWDir ds 4 ; Current Wind direction indegrees.011E GBarom ds 4 ; Current Barometer reading.0122 GRate ds 2 ; Current Rain Rate0124 GHout ds 2 ; Current outside humidity.0126 GTRain ds 4 ; Total rainfall.012A GSun ds 4 ; Current Solar Rad in W/m^2012E GTRun ds 6 ; Total Wind Run0134 TET ds 4 ; Total ET0138 GTDegDay ds 6 ; Total Degree-Days013E GTEnrgy ds 6 ; Total Solar Energy0144 Galarms ds 6 ; Current Alarm Bits SeeAppendix G1 and B0146 LWData ds 2 ; Current Leaf Wetness Data andStatus ; See Appendix G3; End of sensor image. (14Ah) Size = 42h = 66nib = 33bytes0150 SamplePer ds 2 ; Sample Period = 256 - "Data"seconds0152 ArcPeriod ds 2 ; Archive period in minutes.0154 LastArchiveTime ds 4 ; Time of last archive in min.since midnight.; Accumulation registers.0158 WspAccum ds 4 ; Sum of wind speed samples inarchive per.015C TinAccum ds 5 ; Sum of Soil temp samples inarchive per.0161 ToutAccum ds 5 ; Sum of out temp samples inarchive per.0166 SunAccum ds 5 ; Sum of Solar Rad samples inarchive per.0178 Samples ds 2 ; Number of samples taken inperiod.017C LnkRnCal ds 4 ; Link copy of the Station's RainCal0180 WDirs ds 32 ; Histogram of wind directions.; Archive Image begins here: (1A0h)-(1DFh)01A0 ArchiveImage01A0 Barom Ds 4 ; Barometer reading at archivetime.01A4 Hout Ds 2 ; Outside humidity at archivetime.01A6 WspAvg Ds 2 ; Average wind speed in period.01A8 Gust Ds 2 ; Hi wind speed in period.01AA Wdir Ds 2 ; Dominant wind direction in archiveperiod. (0-15)01AC Rain Ds 4 ; Rainfall in period.01B0 TinAvg Ds 4 ; Average Soil temperature. ; If Leaf Wetness is enabled, holds LWdata instead01B4 TOutAvg Ds 4 ; Average outside temperature.01B8 TimeStamp Ds 8 ; Archive entry time and date.01C0 THiOut Ds 4 ; Hi Tout in period.01C4 TLowOut Ds 4 ; Low Tout in period.01C8 DegDays Ds 4 ; Degree-Days in period01CC ETArc Ds 2 ; ET in period01CE ETStat ds 2 ; bitmapped ET Calc. flagsSee Appendix G201D0 Wind Run Ds 4 ; Wind run in period01D4 Sun Ds 4 ; Average Solar Radiation inperiod01D8 Energy Ds 4 ; Solar energy in period01DC HiRate Ds 2 ; Hi Rain Rate in period01DE GArcPowV DS 2 ; Station Power voltage atarchive time ; See Appendix D;End of Archive Image (1DF) Size = 40h = 64 Nibbles = 32 Bytes; previous values registers: These registers contain the value; of accumulated values at the beginning of the archive period01E0 PrevRun ds 601E6 PrevDD ds 601EC PrevEnrg ds 601F2 PrevRain ds 401FF WindThresh ds 1 ; Wind Direction statistics aremade when the ; wind speed is greater thanWindThresh.E. Energy StationBank 0Address Data Data Size (nibbles)0036 AlarmReg: DS 5 ; Bit flags for each alarm. SeeAppendix G1003B AOMStat: DS 1 ; AOM Load Status report. SeeAppendix B003D DirFlags: DS 1 BadDirF Equ DirFlags.2 ; Is current Dir Bad?1=bad,0=good BadHiDir Equ DirFlags.3 ; Is Hi Dir Bad1=bad,0=good0049 HiTHIFlags: DS 1 ; Hi THI Flags HiTHILowFl Equ HiTHIFlags.2 ; Hi THI Value is >= 125 HiTHIHiFl Equ HiTHIFlags.3 ; Hi THI Value is belowrange004D Model: DS 1 ; Weather Station type SeeAppendix C005F THIFlags: DS 1 ; THI Flags THILowFl Equ THIFlags.2 ; 1 = Air Temp < 68degrees THIHiFl Equ THIFlags.3 ; 1 = THI >= 125 degrees0060 SpdDta: DS 2 ; # of pulses in 2.25 seconds =.to MPH0062 SpdHi: DS 2 ; High Wind speed (MPH)0064 SpdHTime: DS 3 ; Time of High Wind Speed0067 HiDir: DS 1 ; Compass Rose Direction of Hiwind speed ; 0=N, 1=NNE, 2=NE, etc. ; See Appendix F0068 SpdAHi: DS 2 ; High Wind Speed alarm (MPH)006A SpdCal: DS 4 ; Wind Speed Calibration Number007A BarFlag: DS 1 ; Indicates the status of the bartrend arrows BarSteady Equ BarFlag.0 ; If BarSteady = 1, thenIgnore BarRise BarRise Equ BarFlag.1 ; and BarFall Bits BarFall Equ BarFlag.2007B PwrFlags: DS 1 BattLow Equ PwrFlags.2 ; 1 = the Battery Voltageis low PowLow Equ PwrFlags.3 ; 1 = the primary powervoltage is low008A DewDta: DS 3 ; Current Dewpoint Data (DegreesF*10)008D ChlDta: DS 3 ; Current Wind Chill Data(Degrees F*10)0090 ChlLo: DS 3 ; Low Wind Chill Data0093 ChlLTime: DS 3 ; Time of Low Wind Chill0096 ChlALo: DS 3 ; Wind Chill Low Alarm Threshold0099 THIDta: DS 3 ; Current THI Data (Degrees F*10)009C THIHi: DS 3 ; Hi THI Data009F THIHTime: DS 3 ; Time of Hi THI00A2 THIAHi: DS 3 ; THI Hi Alarm Threshold00A5 RunDta: DS 4 ; Daily Wind Run Data (Miles *10)00A9 RunTDta: DS 5 ; Total (Period) Wind Run Data(Miles *10)00B2 DirDta: DS 3 ; Current Wind Direction Data (0-360)00B5 DewAHi: DS 1 ; Dew point alarm stored hereBank 1Address Data Data Size (nibbles)0100 BarDta: DS 4 ; Current Barometer Data (Inches*1000)0118 StnDrd: DS 4 ; Bar Calibration Offset ; LCD Display = BarDta - StnDrd011C BarAlm: DS 2 ; Bar Trend Alarm Threshold0124 Tp1Dta: DS 3 ; Current Inside Temp. Data(Degrees F*10)0127 Tp1Hi: DS 3 ; Hi Inside Temperature Data012A Tp1Lo: DS 3 ; Low Inside Temperature Data012D Tp1HTime: DS 3 ; Time of Hi Inside TemperatureData0130 Tp1LTime: DS 3 ; Time of Low Inside TemperatureData0133 Tp1Cal: DS 3 ; Inside Temperature Cal Number0136 Tp2Dta: DS 3 ; Current Outside Temp. Data(Degrees F*10)0139 Tp2Hi: DS 3 ; Hi Outside Temperature Data013C Tp2Lo: DS 3 ; Low Outside Temperature Data013F Tp2HTime: DS 3 ; Time of Hi Outside TemperatureData0142 Tp2LTime: DS 3 ; Time of Low Outside TemperatureData0145 Tp2Cal: DS 3 ; Outside Temperature Cal Number0148 Tp2AHi: DS 3 ; Outside Temperature Hi AlarmThreshold014B Tp2ALo: DS 3 ; Outside Temperature Low AlarmThreshold0151 HtDDDDta: DS 3 ; Heating Degree-Day Daily(Degrees F*10)0154 HtDDTDta: DS 5 ; Heating Degree-Day Total(Degrees F*10)015C ChDDDDta: DS 3 ; Wind Chill Degree-Day Daily(Degs F*10)015F ChDDTDta: DS 5 ; Wind Chill Degree-Day Total(Degs F*10)0164 HtDDBase: DS 3 ; Heating/Wind Chill Degree-DayBase temp ;(Degrees F*10)016A CoDDDDta: DS 3 ; Cooling Degree-Day Daily(Degrees F*10)016D CoDDTDta: DS 5 ; Cooling Degree-Day Total(Degrees F*10)0175 THDDDDta: DS 3 ; THI Degree-Day Daily (DegreesF*10)0178 THDDTDta: DS 5 ; THI Degree-Day Total (DegreesF*10)017D CoDDBase: DS 3 ; Cooling/THI Degree-Day Basetemp ; (Degrees F*10)0184 Hm2Dta: DS 2 ; Current Outside Humidity Data(0-100%)0186 Hm2Hi: DS 2 ; Hi Outside Hum Data0188 Hm2Lo: DS 2 ; Low Outside Hum Data018A Hm2HTime: DS 3 ; Time of Hi Outside Hum Data018D Hm2LTime: DS 3 ; Time of Low Outside Hum Data0190 Hm2AHi: DS 2 ; Outside Hum Hi Alarm Threshold0192 Hm2ALo: DS 2 ; Outside Hum Low Alarm Threshold0194 Hm2Cal: DS 2 ; Outside Hum Cal Number019C Time: DS 6 ; Current Station Time (HH:MM:SS)019C Hour (DS 2) ; BCD Hours (00 - 23)019E Minute (DS 2) ; BCD Minutes01A0 Second (DS 2) ; BCD Seconds01A2 TimeAlm: DS 4 ; Station Time Alarm (HH:MM)01A2 HrAlm (DS 2) ; BCD Time Alarm Hours (00 - 23)01A4 MinAlm (DS 2) ; BCD Time Alarm Minutes01A6 PerLen: DS 4 ; Length of Period that tracksTotal values ; Low order nibble is in 1/16'ths of aday (90 min)01A7 PerDay (DS 3) ; Upper 3 nibbles are the numberof Whole days ; in the period.01AA ACTime: DS 4 ; AutoClear Time (Same format asTime) (HH:MM)01AE Date: DS 5 ; Current Station Date (DD:M:YY)01AE Day (DS 2) ; BCD Day of the month01B0 Month (DS 1) ; stored in binary 1-1201B1 Year (DS 2) ; Year = 1900+binary data01B3 SRadDta: DS 3 ; Solar Radiation(Watts persquare Meter)01B6 SEngDDta: DS 4 ; Daily Solar Energy (Langleys*10)01BA SEngTDta: DS 6 ; Total Solar Energy (Langleys*10)01C0 YRnDta: DS 4 ; Total Rain Data01C4 DRnDta: DS 3 ; Daily Rain Data01C7 DRnAHi: DS 3 ; Daily Rain Alarm Threshold01CA RnCal: DS 4 ; Rain Cal Number (Number ofclicks in 1 inch)01D1 RateDta: DS 3 ; Current Rain Rate in 1/2seconds per click01D4 RateHi: DS 3 ; Hi Rain Rate Data01D7 RateHTime: DS 3 ; Time of Hi Rain Rate01DD PowVolt: DS 1 ; Voltage code of the primarypower source ; See Appendix DF. Energy LinkBank 0Address Data Data Size (nibbles)004F Model: DS 1 ; Weather Station type SeeAppendix C0080 PrevChDD ds 6 ; previous Wind Chill Degree-DaysTotal0086 PrevCoDD ds 6 ; previous Cooling Tot Degree-Days Total008C PrevTHDD ds 6 ; previous THI Degree-Days TotalBank 1Address Data Data Size (nibbles)0106 OldPtr ds 4 ; Points to oldest entry inarchive memory.; Sensor image begins here. (10Ah) - (14Fh); Each Field is in full bytes for ease of PC Loop modeinterpretation010A NewPtr ds 4 ; Points to next free archivememory location.010E SIStatus ds 2 ; Bar trend and Power flags SeeAppendix A0110 TIn ds 4 ; Current Inside temperature.0114 TAir ds 4 ; Current Air temperature.0118 WSp ds 2 ; Current wind speed.011A WDir ds 4 ; Wind direction in degrees.011E Barom ds 4 ; Current Barometer reading.0122 Rate ds 2 ; Current Rain Rate0124 Hout ds 2 ; Current outside humidity.0126 TRain ds 4 ; Total rain.012A Sun ds 4 ; Current Solar Rad in W/m^2012E TRun ds 6 ; Total Wind Run0134 TEnrgy ds 6 ; Total Solar Energy013A Alarms ds 6 ; Current Alarm Bits SeeAppendix E1 & B; End of sensor image. (13Fh) Size = 36h = 54 nibbles = 27 bytes0150 SamplePer ds 2 ; Sample Period = 256 - "Data"seconds0152 ArcPeriod ds 2 ; Archive period in minutes.0154 LastArchiveTime ds 4 ; Time of last archive in min.since midnight; Accumulation registers.0158 WspAccum ds 4 ; Sum of wind speed samples inarchive per.015C TinAccum ds 5 ; Sum of Soil temp samples inarchive per.0161 ToutAccum ds 5 ; Sum of out temp samples inarchive per.0166 SunAccum ds 5 ; Sum of Solar Rad samples inarchive per.0178 Samples ds 2 ; Number of samples taken inperiod.017C LnkRnCal ds 4 ; Link copy of the Station's RainCal0180 WDirs ds 32 ; Histogram of wind directions.; Archive Image begins here: (1A0h)-(1DFh)01A0 ArchiveImage01A0 Barom Ds 4 ; Barometer reading at archivetime.01A4 Hout Ds 2 ; Outside humidity at archivetime.01A6 WspAvg Ds 2 ; Average wind speed in period.01A8 Gust Ds 2 ; Hi wind speed in period.01AA Wdir Ds 2 ; Dominant wind direction in archiveperiod. (0-15)01AC Rain Ds 4 ; Rainfall in period.01B0 TinAvg Ds 4 ; Average inside temperature.01B4 TOutAvg Ds 4 ; Average outside temperature.01B8 Time Ds 4 ; Archive entry time in BCD(HH:MM).01BC Date Ds 4 ; Archive entry date in BCD(MM:DD)01C0 THiOut Ds 4 ; Hi Tout in period.01C4 TLowOut Ds 4 ; Low Tout in period.01C8 HtDegDays Ds 2 ; Heating Degree-Days in period01CA ChDegDays Ds 2 ; Wind Chill Degree-Days inperiod01CC CoDegDays Ds 2 ; Cooling Degree-Days in period01CE THDegDays Ds 2 ; THI Degree-Days in period01D0 Wind Run Ds 4 ; Wind run in period01D4 Sun Ds 4 ; Average Solar Radiation inperiod01D8 Energy Ds 4 ; Solar energy in period01DC HiRate Ds 2 ; Hi Rain Rate in period01DE PowerVolt Ds 2 ; Station Power Voltage atarchive time ; See Appendix D;End of Archive Image (1DF). Size = 40h = 64 Nibbles = 32 Bytes; previous values registers01E0 PrevRun ds 6 ; Previous Total Wind Run01E6 PrevHtDD ds 6 ; Previous Heating DD01EC PrevEnrg ds 6 ; Previous Total Solar Energy01F2 PrevRain ds 4 ; Used to archive Previous Rainamount.01FF WindThresh ds 1 ; Wind Direction statistics aremade when the ; wind speed is greater thanWindThresh.G. Health StationBank 0Address Data Data Size (nibbles)000A BarFlag: DS 1 ; Indicates the status of the bartrend arrows BarSteady Equ BarFlag.0 ; If BarSteady = 1, thenIgnore BarRise BarRise Equ BarFlag.1 ; and BarFall Bits BarFall Equ BarFlag.2000B PwrFlags: DS 1 BattLow Equ PwrFlags.2 ; 1 = the Battery Voltageis low PowLow Equ PwrFlags.3 ; 1 = the primary powervoltage is low000D OTHIRange: DS 1 ; Range bits for Outside THI OTHILowFl Equ OTHIRange.0 ; 1 = Outside Temp < 68degrees OTHIHiFl Equ OTHIRange.1 ; 1 = THI >= 125 degrees HiOTHILowFl Equ OTHIRange.2 ; 1 = Hi THI Value isbelow range HiOTHIHiFl Equ OTHIRange.3 ; 1 = Hi THI Value is >=125000E THSWIRange: DS 1 ; Range bits for Outside THSWI THSWILoFl Equ THSWIRange.0 ; 1 = Outside Temp < 68degrees THSWIHiFl Equ THSWIRange.1 ; 1 = THSWI >= 125degrees HiTHSWILoFl Equ THSWIRange.2 ; 1 = Hi THSWI Value isbelow range HiTHSWIHiFl Equ THSWIRange.3 ; 1 = Hi THSWI Value is>= 125000F ITHIRange: DS 1 ; Range bits for Inside THI ITHILowFl Equ ITHIRange.0 ; 1 = Inside Temp < 68degrees ITHIHiFl Equ ITHIRange.1 ; 1 = THI >= 125 degrees HiITHILowFl Equ ITHIRange.2 ; 1 = Hi THI Value is >=125 HiITHIHiFl Equ ITHIRange.3 ; 1 = Hi THI Value isbelow range0037 LatCode: DS 1 ; Code for the current Latitudezone ; See Appendix E0038 AlarmReg: DS 5 ; Bit flags for each alarm SeeAppendix H1003D AOMStat: DS 1 ; AOM Load Status report SeeAppendix B003E DirFlags: DS 1 BadDirF Equ DirFlags.2 ; Is current Dir Bad?1=bad,0=good BadHiDir Equ DirFlags.3 ; Is Hi Dir Bad1=bad,0=good004D Model: DS 1 ; Weather Station type SeeAppendix C0060 SpdDta: DS 2 ; # of pulses in 2.25 seconds =MPH0062 SpdHi: DS 2 ; High Wind speed (MPH)0064 SpdHTime: DS 3 ; Time of High Wind Speed0067 HiDir: DS 1 ; Compass Rose Direction of Hiwind speed ; 0=N, 1=NNE, 2=NE, etc. ; See Appendix F0068 SpdAHi: DS 2 ; High Wind Speed alarm (MPH)006A SpdCal: DS 4 ; Wind Speed Calibration Number008A DewDta: DS 3 ; Current Dewpoint Data (DegreesF*10)008D DewAHi: DS 1 ; Dewpoint Alarm is stored here008E ChlDta: DS 3 ; Current Wind Chill Data(Degrees F*10)0091 ChlLo: DS 3 ; Low Wind Chill0094 ChlLTime: DS 3 ; Time of Low Wind Chill0097 ChlALo: DS 3 ; Wind Chill Low Alarm Threshold009A ITHIDta: DS 3 ; Current Inside THI Data(Degrees F*10)009D ITHIHi: DS 3 ; Hi Inside THI00A0 ITHIHTime: DS 3 ; Time of Hi Inside THI00A3 ITHIAHi: DS 3 ; Inside THI Hi Alarm Threshold00AA DirDta: DS 3 ; Current Wind Direction Data (0-360)00AD SRadDta: DS 3 ; Current Solar Radiation Data ; (Watts per square Meter)00B0 SRadHDta: DS 3 ; Hi Solar Radiation00B3 SRadHTim: DS 3 ; Time of Hi Solar RadBank 1Address Data Data Size (nibbles)0100 BarDta: DS 4 ; Current Barometer Data (Inches*1000)0118 StnDrd: DS 4 ; Bar Calibration Offset ; LCD Display = BarDta - StnDrd011C BarAlm: DS 2 ; Bar Trend Alarm Threshold0124 Tp1Dta: DS 3 ; Current Inside Temperature Data0127 Tp1Hi: DS 3 ; Hi Inside Temperature012A Tp1Lo: DS 3 ; Low Inside Temperature012D Tp1HTime: DS 3 ; Time of Hi Inside Temp0130 Tp1LTime: DS 3 ; Time of Low Inside Temp0133 Tp1AHi: DS 3 ; Inside Temp Hi Alarm Threshold0136 Tp1ALo: DS 3 ; Inside Temp Low Alarm Threshold0139 Tp1Cal: DS 3 ; Inside Temp Cal Number013C Tp2Dta: DS 3 ; Current outside TempData(Degrees F*10)013F Tp2Hi: DS 3 ; Hi Outside Temp0142 Tp2Lo: DS 3 ; Low Outside Temp0145 Tp2HTime: DS 3 ; Time of Hi Outside Temp0148 Tp2LTime: DS 3 ; Time of Low Outside Temp014B Tp2AHi: DS 3 ; Outside Temp Hi Alarm Threshold014E Tp2ALo: DS 3 ; Outside Temp Low AlarmThreshold0151 Tp2Cal: DS 3 ; Outside Temp Cal Number0154 OTHIDta: DS 3 ; Current Outside THI Data(Degrees F*10)0157 OTHIHi: DS 3 ; Hi Outside THI015A OTHIHTime: DS 3 ; Time of Hi Outside THI015D OTHIAHi: DS 3 ; Outside THI Hi Alarm Threshold0160 THSWDta: DS 3 ; Current Outside THSWI Data(Degrees F*10)0163 THSWHi: DS 3 ; Hi THSWI0166 THSWHTime: DS 3 ; Time of Hi THSWI0169 THSWAHi: DS 3 ; THSWI Hi Alarm Threshold0170 Hm1Dta: DS 2 ; Current Inside Humidity Data (0-100%)0172 Hm1Hi: DS 2 ; Hi Inside Hum Data0174 Hm1Lo: DS 2 ; Low Inside Hum Data0176 Hm1HTime: DS 3 ; Time of Hi Inside Hum0179 Hm1LTime: DS 3 ; Time of Low Inside Hum017C Hm1AHi: DS 2 ; Inside Hum Hi Alarm Threshold017E Hm1ALo: DS 2 ; Inside Hum Low Alarm Threshold0180 Hm2Dta: DS 2 ; Current Outside Humidity Data(0-100%)0182 Hm2Hi: DS 2 ; Hi Outside Hum Data0184 Hm2Lo: DS 2 ; Low Outside Hum Data0186 Hm2HTime: DS 3 ; Time of Hi Outside Hum0189 Hm2LTime: DS 3 ; Time of Low Outside Hum018C Hm2AHi: DS 2 ; Outside Hum Hi Alarm Threshold018E Hm2ALo: DS 2 ; Outside Hum Low Alarm Threshold0190 Hm2Cal: DS 2 ; Outside Hum Calibration Number0198 Time: DS 6 ; Current Station Time (HH:MM:SS)0198 Hour (DS 2) ; BCD Hour (00 - 23)019A Minute (DS 2) ; BCD Minutes019C Second (DS 2) ; BCD Seconds019E TimeAlm: DS 4 ; Station Time Alarm (HH:MM)019E HrAlm (DS 2) ; BCD Hour (00 - 23)01A0 MinAlm (DS 2) ; BCD Minutes01A2 PerLen: DS 4 ; Length of Period that tracksTotal values ; Low order nibble is in 1/16'ths of aday01A3 PerDay (DS 3) ; Upper 3 nibbles are the numberof Whole days ; in the period01A6 Date: DS 5 ; Current Station Date (DD:M:YY)01A6 Day (DS 2) ; BCD Day of the month01A8 Month (DS 1) ; stored in binary 1-1201A9 Year (DS 2) ; Year = 1900 + binary01AB ACTime: DS 4 ; AutoClear Time (Same format atTime) (HH:MM)01AF YRnDta: DS 4 ; Total Rain Data01B3 DRnDta: DS 3 ; Daily Rain Data01B6 DRnAHi: DS 3 ; Daily Rain Alarm Threshold01B9 RnCal: DS 4 ; Rain Cal Number (Number ofclicks in 1 inch)01C0 RateDta: DS 3 ; Rain Rate in 1/2 seconds perclick01C3 RateHi: DS 3 ; Hi Rain Rate Data01C6 RateHTime: DS 3 ; Time of Hi Rain Rate01C9 UVIdxDta: DS 2 ; Current UV Intensity Data(Index*10)01CB UVIdxHDta: DS 2 ; Hi UV Intensity01CD UVIdxHTim: DS 3 ; Time of Hi UV Intensity01D0 UVIdxHAlm: DS 2 ; UV Intensity Hi Alarm Threshold01D2 UVTDose: DS 4 ; Total UV Dose01D6 UVDDose: DS 3 ; Daily UV Dose01D9 UVDHAlm: DS 3 ; Daily UV Dose Hi Alarm01DC UVCal: DS 2 ; MED's Cal number (x10)H. Health LinkBank 0Address Data Data Size (nibbles)004F Model: DS 1 ; Weather Station type SeeAppendix CBank 1Address Data Data Size (nibbles)0106 OldPtr ds 4 ; Points to oldest entry inarchive memory.; Sensor image begins here. (10Ah) - (14Fh); Each Field is in full bytes for ease of PC Loop modeinterpretation010A NewPtr ds 4 ; Points to next free archivememory location.010E SIStatus ds 2 ; Bar trend and Power flags SeeAppendix A0110 TIn ds 4 ; Current Inside temperature.0114 TAir ds 4 ; Current Air temperature.0118 WSp ds 2 ; Current wind speed.011A WDir ds 4 ; Wind direction in degrees.011E Barom ds 4 ; Current Barometer reading.0122 Rate ds 2 ; Current Rain Rate0124 TRain ds 4 ; Total rainfall.0128 Sun ds 4 ; Current Solar Rad in W/m^2012C HIn ds 2 ; Current inside humidity.012E Hout ds 2 ; Current outside humidity.0130 UVIdx ds 2 ; current UV Intensity0132 UVDose ds 4 ; Total UV Dose0136 Alarms ds 6 ; Current Alarm Bits; End of sensor image. (13Bh) Size = 32h = 50 nib = 25 bytes0150 SamplePer ds 2 ; Sample Period = 256 - "Data"seconds0152 ArcPeriod ds 2 ; Archive period in minutes.0154 LastArchiveTime ds 4 ; Time of last archive in minutessince midnight; Accumulation registers.0158 WspAccum ds 4 ; Sum of wind speed samples inarchive per.015C TinAccum ds 5 ; Sum of Soil temp samples inarchive per.0161 ToutAccum ds 5 ; Sum of out temp samples inarchive per.0166 SunAccum ds 5 ; Sum of Solar Rad samples inarchive per.016B UVAccum ds 5 ; Sum of UV Rate samples inarchive per.0178 Samples ds 2 ; Number of samples taken inperiod.017C LnkRnCal ds 4 ; Link copy of the Station's RainCal0180 WDirs ds 32 ; Histogram of wind directions.; Archive Image begins here: (1A0h)-(1DFh)01A0 ArchiveImage01A0 Barom Ds 4 ; Barometer reading at archivetime.01A4 WspAvg Ds 2 ; Average wind speed in period.01A6 Gust Ds 2 ; Hi wind speed in period.01A8 Wdir Ds 2 ; Dominant wind direction in archiveperiod. (0-15)01AA HiRate Ds 2 ; Hi Rain Rate in period01AC Rain Ds 4 ; Rainfall in period.01B0 TinAvg Ds 4 ; Average inside temperature.01B4 TOutAvg Ds 4 ; Average outside temperature.01B8 Time Ds 8 ; Archive entry time and date.01C0 THiOut Ds 4 ; Hi Tout in period.01C4 TLowOut Ds 4 ; Low Tout in period.01C8 HIn Ds 2 ; Inside humidity at archivetime.01CA Hout Ds 2 ; Outside humidity at archivetime.01CC UVIndex Ds 2 ; Average UV Intensity01CE HHiIdx ds 2 ; Hi UV Intensity in period01D0 UVDose Ds 4 ; UV Dosage in period01D4 Sun Ds 4 ; Average Solar Radiation inperiod01D8 HiSun Ds 4 ; High Solar Rad in period;End of Archive Image (1DB). Size = 3Ch = 60 Nibbles = 30 Bytes; Accumulation previous values registers01E0 PrevDose ds 4 Used to archive Previous UV Doseamount.01F2 PrevRain ; ds 4 Used to archive Previous Rainamount.01FF WindThresh ; ds 1 0-7 Mph for wind directioncalculations.