Introduction

This document describes the interface for the ANB Sensor S Series pH sensor when tethered to a remote operating system.

Message Protocol

The following section defines the message protocol.

Serial Configuration

The serial connection protocol and settings are:

  • RS232/485
  • 115200 bps
  • 8 Data bits
  • 1 Stop bit
  • No Parity

Protocol

ENSURE SENSOR IS IMMERSED IN OCEAN WATER BEFORE COMMENCING SCANNING

After power-up, a scan command must be issued to the sensor with a valid communication protocol in order to commence sampling (scanning). The sensor will then stream samples when they become available. The streaming interface minimizes interruptions to the sensor’s processing which would otherwise occur with a polled interface.

A shutdown command should be issued to the sensor before power is removed to allow it to shut down safely. However, provision is also made within the sensor to shut down safely in the event of unexpected power loss.

To restart scanning the unit must be power cycled.

Command Format

All commands consist of a single line of ASCII characters terminated by the ASCII character <CR> (0x0D). No CRC is used. The maximum length of any command line is 100 characters, including the terminator.

Note: Command strings are case sensitive

Sample/Response Format

All samples/responses consist of a single line of ASCII characters terminated by the ASCII character <CR> (0x0D). A <LF> (0x0A) may follow the <CR>, but this should be ignored when handling the sample/response. Each sample/response begins with the start delimiter $ANB, followed by two or more comma-separated parameter values. The first parameter is the checksum (see below). The next parameter is the status. The status will be set to 0 to indicate success or will otherwise signal an error condition.

The maximum length of any sample/response line is 100 characters, including the terminator. Sample/Response strings are case sensitive.




Checksum

The checksum in all samples/responses is a 16-bit CRC16-CCITT cyclic redundancy check (CRC) calculated for all bytes between (and including) the <STATUS> parameter and the <CR> terminator (but not the optional <LF>). It is represented as a 4-digit hexadecimal string. See here for details of the CRC implementation.

Operation

SCAN command

Command Format: SCAN<CR>

The SCAN command instructs the sensor to commence scanning immediately, and to stream samples over the serial interface. This command can be issued at power on after a 1000ms start up time has elapsed.

If the SCAN command succeeds the sensor responds immediately with a basic status. The format of the response is as follows:

Response format: $ANB,<CRC>,<STATUS>,<SN>,<TIME><CR>

ParameterDescriptionFormat
<CRC>checksum
<STATUS>0
<SN>Sensor serial numberUnsigned integer
<TIME>Current sensor clock time (seconds since the Unix epoch)Unsigned integer

If the SCAN command fails (invalid command or sensor error), the status parameter is set appropriately, and no additional parameters follow. The format of the response is as follows:

Response format: $ANB,<CRC>,<STATUS><CR>

ParameterDescriptionFormat
<CRC>ChecksumHex string
<STATUS>Status: 1 (Invalid command) 2 (Sensor error)Unsigned integer

In either case the sensor begins its response to the SCAN command within 500ms.

– If a timeout is incurred waiting for the response, the command should be retried.

– If still no response the sensor should be power cycled.

SCAN sample format

Once scanning is enabled, the sensor will automatically send samples as soon as they are available. The status parameter in a streamed sample is always 0. The format of the streamed samples is defined as follows:

Sample format: $ANB,<CRC>,<STATUS>,<TIMESTAMP>,<PH>,<ELECTODE>,<TEMP>,<HEALTH><CR>

ParameterDescriptionFormat
<CRC>Checksum
<STATUS>0
<TIMESTAMP>Sample timestamp (seconds since the Unix epoch)Unsigned integer
<PH>Sample pH value (pH)Float (3 decimal places)
<ELECTODE>Electrode numberUnsigned integer
<TEMP>Sample temperature (°C)Float (3 decimal places)
<HEALTH>Sensor health status code (0=OK)Unsigned integer

The minimum interval between samples is currently around 23s. If the interval between samples exceeds 180s the sensor should be power cycled.

For example:

$ANB,702D,0,2021:07:24:10:35:52,07.283,10,298.400,6

Where:

$ANB = an identifier, to allow an automated data collection software to recognize this as ANB response data. In manual use this can be ignored.

702D = A checksum of the following line of data. Can be used by receiving software to check data integrity. In manual use this can be ignored.

0 = System status, can be used by receiving software to anticipate system issues. In manual use this can be ignored.

2021:07:24:10:35:52 = Date and time that this result was obtained.

07.283 = The pH result obtained. (Refer to Understanding your Sensor Display).

10 = The individual number of the sensor in the array.

298.400 = The temperature of the solution when the result was obtained.

6 = The health of this sensor. (See here).

SLEEP command

This function places the sensor into the low power mode. The following text will be displayed after selecting this function:

Command Format: SLEEP<CR>

The Sensor will now enter Sleep Mode.
This is a low power mode, during which there will be no scanning function.

To leave low power sleep mode, just hit any key twice on the terminal keyboard. The Sensor will reset and be ready for commands.

SHUTDOWN command

Command Format: SHUTDOWN<CR>

The SHUTDOWN command notifies the sensor that power will be removed imminently. A period of 500ms should be allowed between sending the command and removing power. This allows the sensor to perform a clean shutdown prior to power loss.

No response is required to the SHUTDOWN command.

CRC16-CCITT Generation

The following section provides example code for calculating the 16 bit CRC16-CCITT cyclic redundancy check

Function

uint16_t crc16_ccitt(const uint8_t *data, uint32_t data_length) 
{ 
    uint32_t i; uint16_t crc; 
    crc = 0; 
    
    for (i = 0U; i < data_length; i++) 
    { 
       crc = (crc << 8) ^ crc16_ccitt_table[(crc >> 8) ^ data[i]]; 
    } 
    return (crc); 
}

Lookup-table

static const uint16_t crc16_ccitt_table[] =
{
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0 };

Please do not hesitate to contact us at support@anbsensors.com if you have any questions.