{"id":1312,"date":"2020-04-07T14:37:57","date_gmt":"2020-04-07T07:37:57","guid":{"rendered":"http:\/\/wiki.rdd-tech.com\/?post_type=ht_kb&#038;p=1312"},"modified":"2020-08-13T13:26:41","modified_gmt":"2020-08-13T06:26:41","slug":"gravity-analog-dissolved-oxygen-sensor","status":"publish","type":"ht_kb","link":"https:\/\/wiki.rdd-tech.com\/index.php\/knowledge-base\/gravity-analog-dissolved-oxygen-sensor\/","title":{"rendered":"Gravity: Analog Dissolved Oxygen Sensor"},"content":{"rendered":"\n<h2 id=\"pendahuluan\" >Pendahuluan<\/h2>\n\n\n\n<p>Kit ini merupakan perangkat sensor oksigen terlarut yang kompatibel dengan Arduino Board. Produk ini digunakan untuk mengukur oksigen terlarut dalam air, untuk mengetahui kualitas air. Kit ini banyak diterapkan dalam banyak aplikasi kualitas air, seperti akuakultur, pemantauan lingkungan, dan sebagainya. Kualitas air yang baik sangat penting bagi organisme akuatik. Oksigen terlarut adalah salah satu parameter penting untuk mencerminkan kualitas air. Oksigen terlarut yang rendah dalam air akan menyebabkan organisme akuatik kesulitan bernafas, hal itu dapat mengancam kehidupan organisme tersebut. Oleh karena itu, dfrobot meluncurkan <em>Analog Dissolved Oxygen Sensor Kit<\/em> yang kompatibel dengan Arduino. Kit sensor ini membantu Anda dengan cepat membuat detektor oksigen terlarut sendiri.<br>Papan konverter sinyal plug and play, dan memiliki kompatibilitas yang baik, dapat dengan mudah diintegrasikan ke sistem kontrol. Kit ini menggunakan probe galvanic yang memakai konektor BNC, wadah pengisian dan tutup membran dapat di ganti. Kit ini sangat cocok untuk proyek Anda dalam mendeteksi konsentrasi oksigen terlarut dalam air.<\/p>\n\n\n\n<h2 id=\"spesifikasi\" >Spesifikasi<\/h2>\n\n\n\n<h3 id=\"dissolved-oxygen-probe\" ><strong>Dissolved Oxygen Probe<\/strong><\/h3>\n\n\n\n<ul><li>Type: Galvanic Probe<\/li><li>Detection Range: 0~20 mg\/L<\/li><li>Temperature Range: 0~40 \u2103<\/li><li>Response Time: Up to 98% full response, within 90 seconds (25\u2103)<\/li><li>Pressure Range: 0~50 PSI<\/li><li>Electrode Service Life: 1 year (normal use)<\/li><li>Maintenance Period:Membrane Cap Replacement Period:1~2 months (in muddy water);<\/li><li>Maintenance Period:Membrane Cap Replacement Period:4~5 months (in clean water)<\/li><li>Filling Solution Replacement Period: Once every month<\/li><li>Cable Length: 2 meters<\/li><li>Probe Connector: BNC<\/li><\/ul>\n\n\n\n<h3 id=\"signal-converter-board\" ><strong>Signal Converter Board<\/strong><\/h3>\n\n\n\n<ul><li>Supply Voltage: 3.3~5.5V<\/li><li>Output Signal: 0~3.0V<\/li><li>Cable Connector: BNC<\/li><li>Signal Connector: Gravity Analog Interface (PH2.0-3P)<\/li><li>Dimension: 42mm x 32mm<\/li><\/ul>\n\n\n\n<h2 id=\"gambar-papan-konverter-sinyal\" >Gambar Papan Konverter Sinyal<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"500\" height=\"243\" src=\"http:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/04\/Oxygen_board_function.png\" alt=\"\" class=\"wp-image-1316\" srcset=\"https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/04\/Oxygen_board_function.png 500w, https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/04\/Oxygen_board_function-300x146.png 300w, https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/04\/Oxygen_board_function-50x24.png 50w, https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/04\/Oxygen_board_function-320x156.png 320w\" sizes=\"(max-width: 500px) 100vw, 500px\" \/><figcaption>Sumber:dfrobot.com<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-table aligncenter\"><table><tbody><tr><td>No<\/td><td>Label<\/td><td>Deskripsi<\/td><\/tr><tr><td>1<\/td><td>A<\/td><td>Keluaran Sinyal Analog (0-3.0V)<\/td><\/tr><tr><td>2<\/td><td>+<\/td><td>VCC (3.3~5.5V)<\/td><\/tr><tr><td>3<\/td><td>&#8211;<\/td><td>GND<\/td><\/tr><tr><td>4<\/td><td>BNC<\/td><td>Probe Konektor Sensor<\/td><\/tr><\/tbody><\/table><figcaption>Tabel Deskripsi Papan Koverter<\/figcaption><\/figure>\n\n\n\n<h2 id=\"tutorial\" >Tutorial<\/h2>\n\n\n\n<p>Tutorial ini akan menunjukkan cara menggunakan dissolved oxygen Sensor. Probe oksigen terlarut adalah memakai sensor precision electrochemical sensor. Mohon perhatikan detail penggunaannya.<\/p>\n\n\n\n<h4 id=\"perhatian\" >Perhatian:<\/h4>\n\n\n\n<ul><li><strong>Sebelum Menggunakan Kit ini, wadah membran harus diisi dengan cairan 0.5mol\/L NaOH. NaOH merupakan larutan yang sangat korosif, palai sarung tangan sebelum mengisinya. Jika NaOH terjatuh dan mengenai kulit, cuci atau bersihkan kulit tersebut dengan air yang banyak sesegera mungkin. Membran oksigen pada wadah membran sangat sensitif dan juga rentan. Hati2 saat memegangnya. Selama proses pengkuran, probe sensor akan sedikit memakai oksigen. Kita perlu memutar air dengan perlahan dan biarkan oksigen didistribusikan secara merata di dalam air. Jangan mengaduk dengan air dengan cepat, hal ini mencegah oksigen di udara masuk dengan cepat ke dalam air.<\/strong><\/li><\/ul>\n\n\n\n<h4 id=\"alat-yang-dibutuhkan\" >Alat yang Dibutuhkan<\/h4>\n\n\n\n<ul><li>Dissolved Oxygen Probe (With Membrane Cap) x 1<\/li><li>0.5mol\/L NaOH Solution x 1<\/li><li>Arduino Board  x 1<\/li><li>Dissolved Oxygen Signal Converter Board x 1<\/li><li>Analog Cable (3Pin) x 1<\/li><li>Arduino IDE Software<\/li><\/ul>\n\n\n\n<h3 id=\"persiapan-probe-sensor\" >Persiapan Probe Sensor<\/h3>\n\n\n\n<p>Probe Sensor yang baru dipakai harus di isi dengan 0.5 mol\/L larutan NaOH ke dalam wadah membran sensor. Jika probe sudah pernah di pakai selama beberapa waktu dan error yang di hasilkan probe tersebut sangat besar, sudah waktunya untuk menggati lurutannya atau mengganti sensor probe oksigen. <\/p>\n\n\n\n<p>Buka tutup wadah membran dari probe dan isi sekitar 2\/3 volume wadah dengan 0,5 mol \/ L larutan NaOH. Saat melakukan pengisian, pastikan probe dalam posisi vertikal. Pasang kembali wadah membran ke dalam probe dengan hati-hati. Alangkah baiknya pada saat di pasang kembali larutan NaOH meluap keluar dari tutupnya\/wadah membran untuk memastikan probe terisi penuh dengan larutan NaOH. Setelah digunakan, segera tutup botol larutan NaOH untuk mencegah CO2 di udara memengaruhi larutan tersebut. Gambar proses pengisian NaOH dapat di lihat pada gambar dibawah ini.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"1024\" height=\"620\" src=\"http:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/04\/AddSolution2-1024x620.png\" alt=\"\" class=\"wp-image-1328\" srcset=\"https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/04\/AddSolution2-1024x620.png 1024w, https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/04\/AddSolution2-300x182.png 300w, https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/04\/AddSolution2-768x465.png 768w, https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/04\/AddSolution2-50x30.png 50w, https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/04\/AddSolution2-920x557.png 920w, https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/04\/AddSolution2-600x363.png 600w, https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/04\/AddSolution2-320x194.png 320w, https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/04\/AddSolution2.png 1057w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption>Sumber:dfrobot.com<\/figcaption><\/figure>\n\n\n\n<h3 id=\"diagram-koneksi\" >Diagram Koneksi<\/h3>\n\n\n\n<p>Ketika probe sudah diisi dengan larutan NaOH, kit sensor memerlukan kalibrasi. Sebelum melakukan kalibrasi, hubungkan probe dengan arduino seperti gambar dibawah ini. <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"1024\" height=\"1000\" src=\"http:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/04\/DOapplication-1024x1000.png\" alt=\"\" class=\"wp-image-1329\" srcset=\"https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/04\/DOapplication-1024x1000.png 1024w, https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/04\/DOapplication-300x293.png 300w, https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/04\/DOapplication-768x750.png 768w, https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/04\/DOapplication-50x50.png 50w, https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/04\/DOapplication-1536x1500.png 1536w, https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/04\/DOapplication-2048x2000.png 2048w, https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/04\/DOapplication-60x60.png 60w, https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/04\/DOapplication-920x899.png 920w, https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/04\/DOapplication-600x586.png 600w, https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/04\/DOapplication-320x313.png 320w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption>Sumber:dfrobot.com<\/figcaption><\/figure>\n\n\n\n<h3 id=\"proses-kalibrasi\" >Proses Kalibrasi<\/h3>\n\n\n\n<p>Dalam melakukan kalibrasi sensor ini, terdapat 2 metode, yaitu metode <em>single point calibration<\/em> dan metode <em>double point calibration<\/em>. <em>Single point calibration <\/em>yaitu proses kalibrasi dengan cara mencari nilai saturasi dari oksigen yang terlarut dalam air.<em> Double point calibration <\/em>yaitu proses kalibrasi dengan cara mencari nilai saturasi dari oksigen yang terlarut dalam air dan nilai 0 (Tidak ada oksigen) pada oksigen yang terlarut dalam air. Tetapi dalam banyak kasus, <em>single point calibration<\/em> paling banyak digunakan. Tutorial kali ini akan menggunakan <em>single point calibration<\/em>. <\/p>\n\n\n\n<h4 id=\"tutorial-single-point-calibration\" >Tutorial Single Point Calibration<\/h4>\n\n\n\n<ol><li>Upload program sample code ke arduino board dan buka serial monitor. Nilai dari oksigen yang terlarut akan muncul setiap 1 detik.<\/li><li>Celupkan probe ke dalam air oksigen terlarut jenuh dan aduk perlahan. Tunggu sampai pembacaan dalam serial monitor stabil. Biasanya pembacaan akan stabil setelah lebih dari 1 menit, hal ini karena reaksi elektrokimia di dalam probe butuh waktu yang tidak sebentar. Jika air oksigen yang terlarut jenuh tidak ada, udara dapat menjadi penggantinya. Celupkan probe kedalam air dan aduk wair beberapa kali unutk membasahi membran pada wadah. Paparkan probe ke udara selama lebih dari 1 menit.<\/li><li>Tunggu sampai pembacaan nilai oksigen terlarut stabil. Setelah itu kita dapat melakukan proses kalibrasi. Langkah-langkah adalah sebagai berikut:<\/li><\/ol>\n\n\n\n<ul><li>Ketik &#8220;Calibration&#8221; di serial monitor untuk masuk kedalam mode kalibrasi<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"1024\" height=\"699\" src=\"http:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/04\/image-5-1024x699.png\" alt=\"\" class=\"wp-image-1330\" srcset=\"https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/04\/image-5-1024x699.png 1024w, https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/04\/image-5-300x205.png 300w, https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/04\/image-5-768x524.png 768w, https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/04\/image-5-50x34.png 50w, https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/04\/image-5-920x628.png 920w, https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/04\/image-5-600x410.png 600w, https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/04\/image-5-320x219.png 320w, https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/04\/image-5.png 1107w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<ul><li>Ketik &#8220;SATCAL&#8221; untuk melakukan kalibrasi. Program akan memberitahukan<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"1024\" height=\"699\" src=\"http:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/04\/image-6-1024x699.png\" alt=\"\" class=\"wp-image-1331\" srcset=\"https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/04\/image-6-1024x699.png 1024w, https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/04\/image-6-300x205.png 300w, https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/04\/image-6-768x524.png 768w, https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/04\/image-6-50x34.png 50w, https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/04\/image-6-920x628.png 920w, https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/04\/image-6-600x410.png 600w, https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/04\/image-6-320x219.png 320w, https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/04\/image-6.png 1107w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<ul><li>Setelah melakukan kalibrasi, ketik &#8220;EXIT&#8221;untuk keluar dari mode kalibrasi<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"1024\" height=\"699\" src=\"http:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/04\/image-7-1024x699.png\" alt=\"\" class=\"wp-image-1332\" srcset=\"https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/04\/image-7-1024x699.png 1024w, https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/04\/image-7-300x205.png 300w, https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/04\/image-7-768x524.png 768w, https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/04\/image-7-50x34.png 50w, https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/04\/image-7-920x628.png 920w, https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/04\/image-7-600x410.png 600w, https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/04\/image-7-320x219.png 320w, https:\/\/wiki.rdd-tech.com\/wp-content\/uploads\/2020\/04\/image-7.png 1107w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<ul><li>Setelah proses diatas diselesaikan, kit sudah siap dipakai untuk melakukan pengukuran.<\/li><\/ul>\n\n\n\n<h3 id=\"sample-code\" >Sample Code<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>\/***************************************************\n DFRobot Gravity: Analog Dissolved Oxygen Sensor \/ Meter Kit for Arduino\n &lt;https:\/\/www.dfrobot.com\/wiki\/index.php\/Gravity:_Analog_Dissolved_Oxygen_Sensor_SKU:SEN0237>\n\n ***************************************************\n This example reads the concentration of dissolved oxygen in water.\n The saturated oxygen calibration is available by UART commends with NL &amp; CR:\n calibration  ----  enter the calibration mode\n satcal       ----  calibrate the parameters with saturated oxygen value\n exit         ----  exit the calibration mode\n\n Created 2017-5-22\n By Jason &lt;jason.ling@dfrobot.com@dfrobot.com>\n\n GNU Lesser General Public License.\n See &lt;http:\/\/www.gnu.org\/licenses\/> for details.\n All above must be included in any redistribution\n ****************************************************\/\n\n \/***********Notice and Trouble shooting***************\n 1. This code is tested on Arduino Uno and Leonardo with Arduino IDE 1.0.5 r2 and 1.8.2.\n 2. More details, please click this link: &lt;https:\/\/www.dfrobot.com\/wiki\/index.php\/Gravity:_Analog_Dissolved_Oxygen_Sensor_SKU:SEN0237>\n ****************************************************\/\n\n#include &lt;avr\/pgmspace.h>\n#include &lt;EEPROM.h>\n\n#define DoSensorPin  A1    \/\/dissolved oxygen sensor analog output pin to arduino mainboard\n#define VREF 5000    \/\/for arduino uno, the ADC reference is the AVCC, that is 5000mV(TYP)\nfloat doValue;      \/\/current dissolved oxygen value, unit; mg\/L\nfloat temperature = 25;    \/\/default temperature is 25^C, you can use a temperature sensor to read it\n\n#define EEPROM_write(address, p) {int i = 0; byte *pp = (byte*)&amp;(p);for(; i &lt; sizeof(p); i++) EEPROM.write(address+i, pp&#91;i]);}\n#define EEPROM_read(address, p)  {int i = 0; byte *pp = (byte*)&amp;(p);for(; i &lt; sizeof(p); i++) pp&#91;i]=EEPROM.read(address+i);}\n\n#define ReceivedBufferLength 20\nchar receivedBuffer&#91;ReceivedBufferLength+1];    \/\/ store the serial command\nbyte receivedBufferIndex = 0;\n\n#define SCOUNT  30           \/\/ sum of sample point\nint analogBuffer&#91;SCOUNT];    \/\/store the analog value in the array, readed from ADC\nint analogBufferTemp&#91;SCOUNT];\nint analogBufferIndex = 0,copyIndex = 0;\n\n#define SaturationDoVoltageAddress 12          \/\/the address of the Saturation Oxygen voltage stored in the EEPROM\n#define SaturationDoTemperatureAddress 16      \/\/the address of the Saturation Oxygen temperature stored in the EEPROM\nfloat SaturationDoVoltage,SaturationDoTemperature;\nfloat averageVoltage;\n\nconst float SaturationValueTab&#91;41] PROGMEM = {      \/\/saturation dissolved oxygen concentrations at various temperatures\n14.46, 14.22, 13.82, 13.44, 13.09,\n12.74, 12.42, 12.11, 11.81, 11.53,\n11.26, 11.01, 10.77, 10.53, 10.30,\n10.08, 9.86,  9.66,  9.46,  9.27,\n9.08,  8.90,  8.73,  8.57,  8.41,\n8.25,  8.11,  7.96,  7.82,  7.69,\n7.56,  7.43,  7.30,  7.18,  7.07,\n6.95,  6.84,  6.73,  6.63,  6.53,\n6.41,\n};\n\nvoid setup()\n{\n    Serial.begin(115200);\n    pinMode(DoSensorPin,INPUT);\n    readDoCharacteristicValues();      \/\/read Characteristic Values calibrated from the EEPROM\n}\n\nvoid loop()\n{\n   static unsigned long analogSampleTimepoint = millis();\n   if(millis()-analogSampleTimepoint > 30U)     \/\/every 30 milliseconds,read the analog value from the ADC\n   {\n     analogSampleTimepoint = millis();\n     analogBuffer&#91;analogBufferIndex] = analogRead(DoSensorPin);    \/\/read the analog value and store into the buffer\n     analogBufferIndex++;\n     if(analogBufferIndex == SCOUNT)\n         analogBufferIndex = 0;\n   }\n\n   static unsigned long tempSampleTimepoint = millis();\n   if(millis()-tempSampleTimepoint > 500U)  \/\/ every 500 milliseconds, read the temperature\n   {\n      tempSampleTimepoint = millis();\n      \/\/temperature = readTemperature();  \/\/ add your temperature codes here to read the temperature, unit:^C\n   }\n\n   static unsigned long printTimepoint = millis();\n   if(millis()-printTimepoint > 1000U)\n   {\n      printTimepoint = millis();\n      for(copyIndex=0;copyIndex&lt;SCOUNT;copyIndex++)\n      {\n        analogBufferTemp&#91;copyIndex]= analogBuffer&#91;copyIndex];\n      }\n      averageVoltage = getMedianNum(analogBufferTemp,SCOUNT) * (float)VREF \/ 1024.0; \/\/ read the value more stable by the median filtering algorithm\n      Serial.print(F(\"Temperature:\"));\n      Serial.print(temperature,1);\n      Serial.print(F(\"^C\"));\n      doValue = pgm_read_float_near( &amp;SaturationValueTab&#91;0] + (int)(SaturationDoTemperature+0.5) ) * averageVoltage \/ SaturationDoVoltage;  \/\/calculate the do value, doValue = Voltage \/ SaturationDoVoltage * SaturationDoValue(with temperature compensation)\n      Serial.print(F(\",  DO Value:\"));\n      Serial.print(doValue,2);\n      Serial.println(F(\"mg\/L\"));\n   }\n\n   if(serialDataAvailable() > 0)\n   {\n      byte modeIndex = uartParse();  \/\/parse the uart command received\n      doCalibration(modeIndex);    \/\/ If the correct calibration command is received, the calibration function should be called.\n   }\n\n}\n\nboolean serialDataAvailable(void)\n{\n  char receivedChar;\n  static unsigned long receivedTimeOut = millis();\n  while ( Serial.available() > 0 )\n  {\n    if (millis() - receivedTimeOut > 500U)\n    {\n      receivedBufferIndex = 0;\n      memset(receivedBuffer,0,(ReceivedBufferLength+1));\n    }\n    receivedTimeOut = millis();\n    receivedChar = Serial.read();\n    if (receivedChar == '\\n' || receivedBufferIndex == ReceivedBufferLength)\n    {\n    receivedBufferIndex = 0;\n    strupr(receivedBuffer);\n    return true;\n    }else{\n        receivedBuffer&#91;receivedBufferIndex] = receivedChar;\n        receivedBufferIndex++;\n    }\n  }\n  return false;\n}\n\nbyte uartParse()\n{\n    byte modeIndex = 0;\n    if(strstr(receivedBuffer, \"CALIBRATION\") != NULL)\n        modeIndex = 1;\n    else if(strstr(receivedBuffer, \"EXIT\") != NULL)\n        modeIndex = 3;\n    else if(strstr(receivedBuffer, \"SATCAL\") != NULL)\n        modeIndex = 2;\n    return modeIndex;\n}\n\nvoid doCalibration(byte mode)\n{\n    char *receivedBufferPtr;\n    static boolean doCalibrationFinishFlag = 0,enterCalibrationFlag = 0;\n    float voltageValueStore;\n    switch(mode)\n    {\n      case 0:\n      if(enterCalibrationFlag)\n         Serial.println(F(\"Command Error\"));\n      break;\n\n      case 1:\n      enterCalibrationFlag = 1;\n      doCalibrationFinishFlag = 0;\n      Serial.println();\n      Serial.println(F(\">>>Enter Calibration Mode&lt;&lt;&lt;\"));\n      Serial.println(F(\">>>Please put the probe into the saturation oxygen water! &lt;&lt;&lt;\"));\n      Serial.println();\n      break;\n\n     case 2:\n      if(enterCalibrationFlag)\n      {\n         Serial.println();\n         Serial.println(F(\">>>Saturation Calibration Finish!&lt;&lt;&lt;\"));\n         Serial.println();\n         EEPROM_write(SaturationDoVoltageAddress, averageVoltage);\n         EEPROM_write(SaturationDoTemperatureAddress, temperature);\n         SaturationDoVoltage = averageVoltage;\n         SaturationDoTemperature = temperature;\n         doCalibrationFinishFlag = 1;\n      }\n      break;\n\n        case 3:\n        if(enterCalibrationFlag)\n        {\n            Serial.println();\n            if(doCalibrationFinishFlag)\n               Serial.print(F(\">>>Calibration Successful\"));\n            else\n              Serial.print(F(\">>>Calibration Failed\"));\n            Serial.println(F(\",Exit Calibration Mode&lt;&lt;&lt;\"));\n            Serial.println();\n            doCalibrationFinishFlag = 0;\n            enterCalibrationFlag = 0;\n        }\n        break;\n    }\n}\n\nint getMedianNum(int bArray&#91;], int iFilterLen)\n{\n      int bTab&#91;iFilterLen];\n      for (byte i = 0; i&lt;iFilterLen; i++)\n      {\n      bTab&#91;i] = bArray&#91;i];\n      }\n      int i, j, bTemp;\n      for (j = 0; j &lt; iFilterLen - 1; j++)\n      {\n      for (i = 0; i &lt; iFilterLen - j - 1; i++)\n          {\n        if (bTab&#91;i] > bTab&#91;i + 1])\n            {\n        bTemp = bTab&#91;i];\n            bTab&#91;i] = bTab&#91;i + 1];\n        bTab&#91;i + 1] = bTemp;\n         }\n      }\n      }\n      if ((iFilterLen &amp; 1) > 0)\n    bTemp = bTab&#91;(iFilterLen - 1) \/ 2];\n      else\n    bTemp = (bTab&#91;iFilterLen \/ 2] + bTab&#91;iFilterLen \/ 2 - 1]) \/ 2;\n      return bTemp;\n}\n\nvoid readDoCharacteristicValues(void)\n{\n    EEPROM_read(SaturationDoVoltageAddress, SaturationDoVoltage);\n    EEPROM_read(SaturationDoTemperatureAddress, SaturationDoTemperature);\n    if(EEPROM.read(SaturationDoVoltageAddress)==0xFF &amp;&amp; EEPROM.read(SaturationDoVoltageAddress+1)==0xFF &amp;&amp; EEPROM.read(SaturationDoVoltageAddress+2)==0xFF &amp;&amp; EEPROM.read(SaturationDoVoltageAddress+3)==0xFF)\n    {\n      SaturationDoVoltage = 1127.6;   \/\/default voltage:1127.6mv\n      EEPROM_write(SaturationDoVoltageAddress, SaturationDoVoltage);\n    }\n    if(EEPROM.read(SaturationDoTemperatureAddress)==0xFF &amp;&amp; EEPROM.read(SaturationDoTemperatureAddress+1)==0xFF &amp;&amp; EEPROM.read(SaturationDoTemperatureAddress+2)==0xFF &amp;&amp; EEPROM.read(SaturationDoTemperatureAddress+3)==0xFF)\n    {\n      SaturationDoTemperature = 25.0;   \/\/default temperature is 25^C\n      EEPROM_write(SaturationDoTemperatureAddress, SaturationDoTemperature);\n    }\n}<\/code><\/pre>\n","protected":false},"author":3,"comment_status":"open","ping_status":"closed","template":"","format":"standard","meta":{"_bbp_topic_count":0,"_bbp_reply_count":0,"_bbp_total_topic_count":0,"_bbp_total_reply_count":0,"_bbp_voice_count":0,"_bbp_anonymous_reply_count":0,"_bbp_topic_count_hidden":0,"_bbp_reply_count_hidden":0,"_bbp_forum_subforum_count":0},"ht_kb_category":[50],"ht_kb_tag":[],"_links":{"self":[{"href":"https:\/\/wiki.rdd-tech.com\/index.php\/wp-json\/wp\/v2\/ht_kb\/1312"}],"collection":[{"href":"https:\/\/wiki.rdd-tech.com\/index.php\/wp-json\/wp\/v2\/ht_kb"}],"about":[{"href":"https:\/\/wiki.rdd-tech.com\/index.php\/wp-json\/wp\/v2\/types\/ht_kb"}],"author":[{"embeddable":true,"href":"https:\/\/wiki.rdd-tech.com\/index.php\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/wiki.rdd-tech.com\/index.php\/wp-json\/wp\/v2\/comments?post=1312"}],"version-history":[{"count":3,"href":"https:\/\/wiki.rdd-tech.com\/index.php\/wp-json\/wp\/v2\/ht_kb\/1312\/revisions"}],"predecessor-version":[{"id":1333,"href":"https:\/\/wiki.rdd-tech.com\/index.php\/wp-json\/wp\/v2\/ht_kb\/1312\/revisions\/1333"}],"wp:attachment":[{"href":"https:\/\/wiki.rdd-tech.com\/index.php\/wp-json\/wp\/v2\/media?parent=1312"}],"wp:term":[{"taxonomy":"ht_kb_category","embeddable":true,"href":"https:\/\/wiki.rdd-tech.com\/index.php\/wp-json\/wp\/v2\/ht_kb_category?post=1312"},{"taxonomy":"ht_kb_tag","embeddable":true,"href":"https:\/\/wiki.rdd-tech.com\/index.php\/wp-json\/wp\/v2\/ht_kb_tag?post=1312"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}