{"id":29404,"date":"2021-04-16T11:09:47","date_gmt":"2021-04-16T09:09:47","guid":{"rendered":"http:\/\/alessandrobuzzi.com\/?p=29404"},"modified":"2021-04-16T11:09:47","modified_gmt":"2021-04-16T09:09:47","slug":"aquardino-v2","status":"publish","type":"post","link":"https:\/\/alessandrobuzzi.com\/aquardino-v2\/","title":{"rendered":"Aquardino v2"},"content":{"rendered":"\n<p>(update 27\/04\/21)<\/p>\n\n\n\n<p>Finalmente il mio sistema arduino per acquario \u00e8 entrato in funzione, \u00e8 stato necessario costruire i cavi ad-hoc e saldare su millefori, al momento Aquardino \u00e8 in grado di mostrare l&#8217;ora, gestire con un timer le luci (relay su presa multipla), misurare la temperatura esterna ed interna dell&#8217;acquario, controllare il PH con la sonda dedicata (quando immersa) e comandare indipendentemente le luci e il filtro\/riscaldatore attraverso un telecomando a IR.<\/p>\n\n\n\n<p><a href=\"https:\/\/create.arduino.cc\/projecthub\/wildbuzz\/aquardino-v2-2e1556\">https:\/\/create.arduino.cc\/projecthub\/wildbuzz\/aquardino-v2-2e1556<\/a><\/p>\n\n\n\n<p>Componenti:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Arduino Uno<\/li><li>DS18B20 Sonda di Temperatura Digitale (n\u00b02)<\/li><li>KY-019 relay 5v<\/li><li>RTC (DS3231)<\/li><li>AZOLED12864-1000 (SSD 1306)&nbsp; 0,96 pollici 128&#215;64 Pixel I2C<\/li><li>Sensore PH con scheda dedicata<\/li><li>Ricevitore IR<\/li><li>varie: cavi, millefori, presa multipla, case, guaina termoretraibile, connettori<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-gallery columns-3 is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\"><ul class=\"blocks-gallery-grid\"><li class=\"blocks-gallery-item\"><figure><img decoding=\"async\" src=\"http:\/\/alessandrobuzzi.com\/wp-content\/uploads\/2021\/04\/DSC_0552.jpg\" alt=\"\" data-id=\"29405\" data-full-url=\"http:\/\/alessandrobuzzi.com\/wp-content\/uploads\/2021\/04\/DSC_0552.jpg\" data-link=\"http:\/\/alessandrobuzzi.com\/?attachment_id=29405\" class=\"wp-image-29405\"\/><\/figure><\/li><li class=\"blocks-gallery-item\"><figure><img decoding=\"async\" src=\"http:\/\/alessandrobuzzi.com\/wp-content\/uploads\/2021\/04\/DSC_0521-1-1024x576.jpg\" alt=\"\" data-id=\"29406\" data-full-url=\"http:\/\/alessandrobuzzi.com\/wp-content\/uploads\/2021\/04\/DSC_0521-1.jpg\" data-link=\"http:\/\/alessandrobuzzi.com\/?attachment_id=29406\" class=\"wp-image-29406\"\/><\/figure><\/li><li class=\"blocks-gallery-item\"><figure><img decoding=\"async\" src=\"http:\/\/alessandrobuzzi.com\/wp-content\/uploads\/2021\/04\/DSC_0549-1024x576.jpg\" alt=\"\" data-id=\"29407\" data-full-url=\"http:\/\/alessandrobuzzi.com\/wp-content\/uploads\/2021\/04\/DSC_0549.jpg\" data-link=\"http:\/\/alessandrobuzzi.com\/?attachment_id=29407\" class=\"wp-image-29407\"\/><\/figure><\/li><li class=\"blocks-gallery-item\"><figure><img decoding=\"async\" src=\"http:\/\/alessandrobuzzi.com\/wp-content\/uploads\/2021\/04\/DSC_0551-1024x576.jpg\" alt=\"\" data-id=\"29408\" data-full-url=\"http:\/\/alessandrobuzzi.com\/wp-content\/uploads\/2021\/04\/DSC_0551.jpg\" data-link=\"http:\/\/alessandrobuzzi.com\/?attachment_id=29408\" class=\"wp-image-29408\"\/><\/figure><\/li><\/ul><\/figure>\n\n\n\n<pre class=\"wp-block-syntaxhighlighter-code\">\/*\n * Aquardino v 2.2\n * alessandrobuzzi.com\n * \n * IR (elegoo)    -> https:\/\/github.com\/Arduino-IRremote\/Arduino-IRremote\n * RTC (DS3231)   -> https:\/\/github.com\/sleemanj\/DS3231_Simple\n * PH sensor      -> https:\/\/wiki.dfrobot.com\/PH_meter_SKU__SEN0161_\n * LCD (I2c 16x2) -> https:\/\/www.maffucci.it\/2019\/01\/25\/utilizzo-delllcd-16x2-hitachi-hd44780-1602-con-modulo-i2c-pcf8574t\/\n * Temp (DS18B20) -> https:\/\/randomnerdtutorials.com\/esp8266-ds18b20-temperature-sensor-web-server-with-arduino-ide\/\n *\/\n\n\n\/\/ ------------------------ IR -----------------------------\/\/\n#define DECODE_NEC\n#include &lt;Arduino.h>\n#define IR_RECEIVE_PIN      7\n#include &lt;IRremote.h>\n\n\/\/ ------------------------ LCD -----------------------------\/\/\n#include &lt;Wire.h>\n#include &lt;LiquidCrystal_I2C.h>\nLiquidCrystal_I2C lcd(0x27, 16, 2); \/\/ impostazione dell'indirizzo dell'LCD 0x27 di 16 caratteri e 2 linee\n\n\/\/ ------------------------ Temperature -----------------------------\/\/\n#include &lt;OneWire.h>\n#include &lt;DallasTemperature.h>\n#define ONE_WIRE_BUS 4\n\/\/ Setup a oneWire instance to communicate with any OneWire devices (not just Maxim\/Dallas temperature ICs)\nOneWire oneWire(ONE_WIRE_BUS);\n\/\/ Pass our oneWire reference to Dallas Temperature. \nDallasTemperature sensors(&amp;oneWire);\nDeviceAddress sensor1 = { 0x28, 0x58, 0xA0, 0x96, 0x42, 0x20, 0x1, 0xAB };\nDeviceAddress sensor2 = { 0x28, 0x62, 0x62, 0x9, 0x42, 0x20, 0x1, 0x53 };\n\n\/\/ ------------------------ PH -----------------------------\/\/\n#define SensorPin A0            \/\/pH meter Analog output to Arduino Analog Input 0\n#define Offset 0.27            \/\/deviation compensate\n#define LED 13\n#define samplingInterval 20\n#define printInterval 800\n#define ArrayLenth  40    \/\/times of collection\nint pHArray[ArrayLenth];   \/\/Store the average value of the sensor feedback\nint pHArrayIndex=0;\n\n\/\/ ------------------------ RTC -----------------------------\/\/\n#include &lt;DS3231_Simple.h>\nDS3231_Simple Clock;\n\/\/ costanti per timing loop\nint Period1, Period2;\nunsigned long Time1, Time2;\n\n\/\/ ------------------------ custom -----------------------------\/\/\nconst int SW1 = 8;  \/\/ the Arduino pin, which connects to the IN pin of relay\nconst int SW2 = 9;  \/\/ the Arduino pin, which connects to the IN pin of relay\nconst int SW3 = 10;  \/\/ the Arduino pin, which connects to the IN pin of relay\n\/\/ time night lights\nconst int OnHour = 18; \/\/SET TIME TO ON RELAY (24 HOUR FORMAT)\nconst int OnMin = 1;\nconst int OffHour = 22; \/\/SET TIME TO OFF RELAY\nconst int OffMin = 1;\n\/\/ time sun lights\nconst int OnHour1 = 9; \/\/SET TIME TO ON RELAY2 (24 HOUR FORMAT)\nconst int OnMin1 = 1;\nconst int OffHour1 = 18; \/\/SET TIME TO OFF RELAY (18)\nconst int OffMin1 = 22;\n\n\/\/ ------------------------ end includes and libraries -----------------------------\/\/\n\nvoid setup() {\n    Serial.begin(115200);\n    \n    \/\/ ------------------------ IR -----------------------------\/\/\n    IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK, USE_DEFAULT_FEEDBACK_LED_PIN);\n    Serial.print(F(\"Ready to receive IR signals at pin \"));\n    Serial.println(IR_RECEIVE_PIN);\n    \n    \/\/ ------------------------ LCD -----------------------------\/\/\n    lcd.begin();      \/\/ inizializzazione dell'LCD\n    lcd.backlight();  \/\/ attivazione della retroilluminazione\n    \n    \/\/ ------------------------ RTC -----------------------------\/\/\n    Clock.begin();\n\n    \/\/ ------------------------ Temperature -----------------------------\/\/\n    sensors.begin();\n\n    \/\/ ------------------------ custom -----------------------------\/\/\n    \/\/ relays on\n    pinMode(SW1, OUTPUT);\n    pinMode(SW2, OUTPUT);\n    pinMode(SW3, OUTPUT);\n    digitalWrite(SW1, HIGH); \/\/ Relay is active low, so HIGH will turn it off at startup\n    digitalWrite(SW2, HIGH); \n    digitalWrite(SW3, HIGH);\n    \/\/ time define\n    Time1 = Time2 = millis();\n    Period1 = 10000; \/\/ 10 sec\n    Period2 = 2000; \/\/ 0,2 sec\n}\n\nvoid loop() {\n\n     \n        \/\/ ------------------------ IR -----------------------------\/\/\n        if (IrReceiver.decode()) {\n              \/\/ Print a short summary of received data\n              IrReceiver.printIRResultShort(&amp;Serial);\n              if (IrReceiver.decodedIRData.protocol == UNKNOWN) {\n                  \/\/ We have an unknown protocol here, print more info\n                  IrReceiver.printIRResultRawFormatted(&amp;Serial, true);\n              }\n              Serial.println();\n              IrReceiver.resume(); \/\/ Enable receiving of the next value\n              \/*\n               * Finally, check the received data and perform actions according to the received command\n               *\/\n              if (IrReceiver.decodedIRData.command == 0xC) {\n                  \/\/ 1\n                  digitalWrite(SW1, LOW);\n              } else if (IrReceiver.decodedIRData.command == 0x18) {\n                  \/\/ 2\n                  digitalWrite(SW1, HIGH);\n              }else if (IrReceiver.decodedIRData.command == 0x8) {\n                  \/\/ 4\n                   digitalWrite(SW2, LOW);\n              }else if (IrReceiver.decodedIRData.command == 0x1C) {\n                  \/\/ 5\n                  digitalWrite(SW2, HIGH);\n              }else if (IrReceiver.decodedIRData.command == 0x42) {\n                  \/\/ 7\n                  digitalWrite(SW3, LOW);\n              }else if (IrReceiver.decodedIRData.command == 0x52) {\n                  \/\/ 8\n                  digitalWrite(SW3, HIGH);  \/\/ tasto 8\n              }else if (IrReceiver.decodedIRData.command == 0x9) {\n                  \/\/ DOWN\n                  digitalWrite(SW1, HIGH); \/\/ All off \n                  digitalWrite(SW2, HIGH);\n                  digitalWrite(SW3, HIGH);\n              }else if (IrReceiver.decodedIRData.command == 0x7) {\n                  \/\/ UP\n                   digitalWrite(SW1, LOW); \/\/ All on \n                   digitalWrite(SW2, LOW);\n                   digitalWrite(SW3, LOW);\n              }\n          }\n    \n \n        \/\/ ------------------------ RTC -----------------------------\/\/ \n        DateTime MyDateAndTime;\n        \/\/ Ask the clock for the data.\n        MyDateAndTime = Clock.read();\n        \n          \/\/timerl luci base\n          if(MyDateAndTime.Hour == OnHour &amp;&amp; MyDateAndTime.Minute == OnMin){\n            digitalWrite(SW1,HIGH);\n            Serial.println(\"LIGHT ON\");\n            }\n            \n            else if(MyDateAndTime.Hour == OffHour &amp;&amp; MyDateAndTime.Minute == OffMin){\n              digitalWrite(SW1,LOW);\n              Serial.println(\"LIGHT OFF\");\n            }\n           \/\/timer luce notturna\n           if(MyDateAndTime.Hour == OnHour1 &amp;&amp; MyDateAndTime.Minute == OnMin1){\n            digitalWrite(SW2,HIGH);\n            Serial.println(\"LIGHT ON\");\n            }\n            \n            else if(MyDateAndTime.Hour == OffHour1 &amp;&amp; MyDateAndTime.Minute == OffMin1){\n              digitalWrite(SW2,LOW);\n              Serial.println(\"LIGHT OFF\");\n            } \n    \n            lcd.setCursor(0,0);\n            lcd.print(MyDateAndTime.Hour);lcd.print(\":\");lcd.print(MyDateAndTime.Minute);\n\n\n       \n        \/\/ ----------- loop time for sensor request\n        if(millis()-Time1>=Period1){       \n              \/\/ ------------------------ Temperature -----------------------------\/\/\n              Serial.print(\"Requesting temperatures...\");\n              sensors.requestTemperatures(); \/\/ Send the command to get temperatures\n              Serial.println(\"DONE\");\n              \n              Serial.print(\"Sensor 1(*C): \");\n              Serial.print(sensors.getTempC(sensor1)); \n              Serial.print(\" Sensor 1(*F): \");\n              Serial.println(sensors.getTempF(sensor1)); \n             \n              Serial.print(\"Sensor 2(*C): \");\n              Serial.print(sensors.getTempC(sensor2)); \n              Serial.print(\" Sensor 2(*F): \");\n              Serial.println(sensors.getTempF(sensor2)); \n              \/\/-----\/\/\n              lcd.setCursor(0,1);\n              lcd.print(\"T: \"); lcd.print(sensors.getTempC(sensor1));\n              lcd.setCursor(10,1);\n              lcd.print(\"\"); lcd.print(sensors.getTempC(sensor2));\n    \n              \/\/ ora\n              Serial.print(MyDateAndTime.Hour);\n              Serial.write(':');\n              Serial.print(MyDateAndTime.Minute);\n              Serial.println();  \n              \/\/ relay attivi\n              Serial.write(\"R1=\");\n              Serial.print(digitalRead (SW1));\n              Serial.println();\n              Serial.write(\"R2=\");\n              Serial.print(digitalRead (SW2));\n              Serial.println();\n              Serial.write(\"R3=\");\n              Serial.print(digitalRead (SW3));\n              Serial.println();\n        \n          \/\/ ------------------------ PH -----------------------------\/\/\n          static unsigned long samplingTime = millis();\n          static unsigned long printTime = millis();\n          static float pHValue,voltage;\n          if(millis()-samplingTime > samplingInterval)\n          {\n              pHArray[pHArrayIndex++]=analogRead(SensorPin);\n              if(pHArrayIndex==ArrayLenth)pHArrayIndex=0;\n              voltage = avergearray(pHArray, ArrayLenth)*5.0\/1024;\n              pHValue = 3.5*voltage+Offset;\n              samplingTime=millis();\n          }\n          if(millis() - printTime > printInterval)   \/\/Every 800 milliseconds, print a numerical, convert the state of the LED indicator\n          {\n            Serial.print(\"Voltage:\");\n                Serial.print(voltage,2);\n                Serial.print(\"    pH value: \");\n            Serial.println(pHValue,2);\n                digitalWrite(LED,digitalRead(LED)^1);\n                printTime=millis();\n            \/\/ LCD display\n             lcd.setCursor(8,0);\n             lcd.print(\"PH: \"); lcd.print(pHValue,2);\n                \n          }\n          \n  Time1=millis();\n  } \/\/ end loop time  for sensors        \n} \/\/end void loop\n\n\n\n\/\/ PH sensor function\ndouble avergearray(int* arr, int number){\n  int i;\n  int max,min;\n  double avg;\n  long amount=0;\n  if(number&lt;=0){\n    Serial.println(\"Error number for the array to avraging!\/n\");\n    return 0;\n  }\n  if(number&lt;5){   \/\/less than 5, calculated directly statistics\n    for(i=0;i&lt;number;i++){\n      amount+=arr[i];\n    }\n    avg = amount\/number;\n    return avg;\n  }else{\n    if(arr[0]&lt;arr[1]){\n      min = arr[0];max=arr[1];\n    }\n    else{\n      min=arr[1];max=arr[0];\n    }\n    for(i=2;i&lt;number;i++){\n      if(arr[i]&lt;min){\n        amount+=min;        \/\/arr&lt;min\n        min=arr[i];\n      }else {\n        if(arr[i]>max){\n          amount+=max;    \/\/arr>max\n          max=arr[i];\n        }else{\n          amount+=arr[i]; \/\/min&lt;=arr&lt;=max\n        }\n      }\/\/if\n    }\/\/for\n    avg = (double)amount\/(number-2);\n  }\/\/if\n  return avg;  \n}\/\/ end PH sensor function<\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"http:\/\/alessandrobuzzi.com\/wp-content\/uploads\/2021\/04\/Aquanrdino-2_bb-1024x727.png\" alt=\"\" class=\"wp-image-29401\"\/><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>(update 27\/04\/21) Finalmente il mio sistema arduino per acquario \u00e8 entrato in funzione, \u00e8 stato necessario costruire i cavi ad-hoc e saldare su millefori, al momento Aquardino \u00e8 in grado di mostrare l&#8217;ora, gestire con un timer le luci (relay su presa multipla), misurare la temperatura esterna ed interna dell&#8217;acquario, controllare il PH con la [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":29407,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[15],"tags":[16,17,3],"class_list":["post-29404","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-acquario","tag-acquario","tag-aquardino","tag-arduino"],"acf":[],"_links":{"self":[{"href":"https:\/\/alessandrobuzzi.com\/wp-json\/wp\/v2\/posts\/29404","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/alessandrobuzzi.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/alessandrobuzzi.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/alessandrobuzzi.com\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/alessandrobuzzi.com\/wp-json\/wp\/v2\/comments?post=29404"}],"version-history":[{"count":0,"href":"https:\/\/alessandrobuzzi.com\/wp-json\/wp\/v2\/posts\/29404\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/alessandrobuzzi.com\/wp-json\/"}],"wp:attachment":[{"href":"https:\/\/alessandrobuzzi.com\/wp-json\/wp\/v2\/media?parent=29404"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/alessandrobuzzi.com\/wp-json\/wp\/v2\/categories?post=29404"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/alessandrobuzzi.com\/wp-json\/wp\/v2\/tags?post=29404"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}