Monitor en Tiempo Real de Piscina con Arduino MKR1000 y Samsung ARTIK Cloud
Componentes y materiales
| Componente | Cantidad |
|---|---|
| Arduino MKR1000 | 1 |
| Cables jumper | 1 set |
| Medidor de pH DFRobot | 1 |
| Resistencia 4.75 kΩ | 1 |
| Sonda de temperatura (DS18B20) | 1 |
Aplicaciones y servicios en línea
- Samsung ARTIK Cloud para IoT
- Arduino IDE
Descripción del proyecto
I. Objetivo
El objetivo principal es usar Samsung ARTIK Cloud para monitorizar los niveles de pH y temperatura de piscinas.
II. Configuración de ARTIK Cloud
Paso 1: Crear un nuevo tipo de dispositivo
- Regístrese en ARTIK Cloud. Vaya al portal de desarrolladores y cree un nuevo device type.
- Ingrese nombre visible y nombre único.
- Cree un nuevo Manifest definiendo los campos (pH, temperatura).
- Guarde y active el manifest.
Paso 2: Crear la aplicación
- Vaya a ARTIK Cloud Applications y cree una nueva.
- Ingrese nombre y Authentication Redirect URL (requerida para autenticar usuarios; usamos
https://localhost/index/de ejemplo). - Establezca permisos de lectura/escritura para su dispositivo.
Paso 3: Conectar el dispositivo
- En My Devices, haga clic en Connect another device.
- Seleccione su device type y conéctelo.
- Anote el Device ID y Device Token; los necesitará en el código.
III. Configuración del hardware y sensores
Paso 1: Conectar sensores al MKR1000
Sonda de temperatura (DS18B20):
- GND → GND del MKR1000
- OUT → Pin digital 1 del MKR1000
- VCC → 5V del MKR1000
- Resistencia 4.7 kΩ entre VCC y OUT
Sensor de pH (DFRobot):
- GND → GND del MKR1000
- OUT → Pin analógico A1 del MKR1000
- VCC → 5V del MKR1000
Opcional: añadí un conector jack de audio para desacoplar fácilmente la sonda de temperatura.
Paso 2: Software necesario
En Arduino IDE:
- Añada la placa MKR1000: Tools → Board → Boards Manager, busque "mkr1000" e instale.
- Instale librerías:
ArduinoJson,ArduinoHttpClient,OneWire,DallasTemperature.
Paso 3: Subir el programa
- Conecte el MKR1000 al PC.
- Descargue el código desde GitHub.
- Modifique: SSID WiFi, contraseña, Device ID y Device Token de ARTIK Cloud.
- Suba el código.
Nota: Su WiFi debe tener conexión a Internet.
IV. Pruebas de campo
Probamos el hardware en piscinas privada, pública y escolar. La recopilación de datos nos permitió analizar la capacidad del sistema.
Puede colocar el MKR1000 y sensores en una caja estanca y flotarla en la piscina, lejos de contaminación directa. Así monitoriza la calidad del agua y la normaliza añadiendo los químicos necesarios.
V. Resultados
Este tutorial ayuda a construir su propio monitor DIY de calidad de agua para piscinas. Busca concienciar sobre la degradación continua de la calidad del agua, ya que a menudo se priorizan las comodidades sobre la seguridad. También aporta a la comunidad una forma eficiente y efectiva de testar la calidad del agua sin sacrificio innecesario de recursos.
¡Feliz construcción! :)
Código completo (Arduino MKR1000)
/******************** Código para Monitor de Calidad de Agua ********************/
#include <WiFi101.h>
#include <WiFiClient.h>
#include <ArduinoJson.h>
#include <ArduinoHttpClient.h>
#include <SPI.h>
#include <OneWire.h>
#include <DallasTemperature.h>
/** Sensor de temperatura **/
#define ONE_WIRE_BUS 1
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
/** ARTIK Cloud REST **/
char server[] = "api.artik.cloud";
int port = 443;
char buf[200];
String deviceID = "SU_DEVICE_ID_AQUI";
String deviceToken = "SU_DEVICE_TOKEN_AQUI";
/** Sensor de pH **/
#define SensorPin A1
#define Offset 0.00
#define samplingInterval 20
#define ArrayLenth 40
int pHArray[ArrayLenth];
int pHArrayIndex = 0;
int status = -1;
unsigned long millis_start;
/** WiFi **/
#define WIFI_AP "SU_SSID"
#define WIFI_PWD "SU_PASSWORD"
WiFiSSLClient wifi;
HttpClient client = HttpClient(wifi, server, port);
void setup() {
millis_start = millis();
Serial.begin(9600);
startWifi();
}
void loop() {
/* Temperatura */
float celsius = 0;
sensors.requestTemperatures();
celsius = sensors.getTempCByIndex(0);
sensors.requestTemperatures();
celsius = sensors.getTempCByIndex(0);
/* pH */
static unsigned long samplingTime = millis();
static unsigned long printTime = millis();
static float pHValue, voltage;
if (millis() - samplingTime > samplingInterval) {
pHArray[pHArrayIndex++] = analogRead(SensorPin);
if (pHArrayIndex == ArrayLenth) pHArrayIndex = 0;
voltage = avergearray(pHArray, ArrayLenth) * 5.0 / 1024;
pHValue = 3.5 * voltage + Offset;
samplingTime = millis();
}
Serial.println("===========================================");
Serial.println("Enviando datos JSON:");
Serial.print("data: { ph: "); Serial.print(pHValue);
Serial.print(" , temp: "); Serial.print(celsius); Serial.println("} ");
String contentType = "application/json";
String AuthorizationData = "Bearer " + deviceToken;
int len = loadBuffer(celsius, pHValue);
Serial.println("Enviando temp: " + String(celsius) + " y ph: " + String(pHValue));
Serial.println("POST a ARTIK Cloud API");
client.beginRequest();
client.post("/v1.1/messages");
client.sendHeader("Authorization", AuthorizationData);
client.sendHeader("Content-Type", "application/json");
client.sendHeader("Content-Length", len);
client.endRequest();
client.print(buf);
int statusCode = client.responseStatusCode();
String response = client.responseBody();
Serial.print("Status code: "); Serial.println(statusCode);
Serial.print("Response: "); Serial.println(response);
delay(1000);
}
void startWifi() {
Serial.println("Conectando MKR1000 a la red...");
while (status != WL_CONNECTED) {
Serial.print("Intentando conectar a WPA SSID: "); Serial.println(WIFI_AP);
WiFi.begin(WIFI_AP, WIFI_PWD);
delay(10000);
status = WiFi.status();
}
}
double avergearray(int* arr, int number) {
if (number <= 0) return 0;
if (number < 5) {
long amount = 0;
for (int i = 0; i < number; i++) amount += arr[i];
return (double)amount / number;
} else {
int i, min, max;
long amount = 0;
if (arr[0] < arr[1]) { min = arr[0]; max = arr[1]; }
else { min = arr[1]; max = arr[0]; }
for (i = 2; i < number; i++) {
if (arr[i] < min) { amount += min; min = arr[i]; }
else if (arr[i] > max) { amount += max; max = arr[i]; }
else amount += arr[i];
}
return (double)amount / (number - 2);
}
}
int loadBuffer(float temp, float ph) {
StaticJsonBuffer<200> jsonBuffer;
JsonObject& root = jsonBuffer.createObject();
root["sdid"] = deviceID;
root["type"] = "message";
JsonObject& dataPair = root.createNestedObject("data");
dataPair["temp"] = temp;
dataPair["ph"] = ph;
root.printTo(buf, sizeof(buf));
return root.measureLength();
}
Proceso de manufactura
- Construya un sensor de temperatura remoto con Raspberry Pi y Python – Guía paso a paso
- Centro de Energía Doméstica: Monitorización de paneles solares fotovoltaicos, térmicos y temperaturas con Raspberry Pi y Moteino
- Control de temperatura casero para cerveza: monitorizar y regular con Arduino
- Monitorización meteorológica remota con Raspberry Pi 3 y PubNub
- Sistema inteligente de monitorización de calidad del aire interior y residuos
- Construye un Voltímetro Inteligente con Arduino y Smartphone – Proyecto DIY Fácil
- Navegando SaaS y Cloud: por qué la gestión de datos meticulosa importa
- Expandiendo horizontes cloud: Nuevas zonas, contenedores y estrategias multicloud
- Dominando la monitorización de aplicaciones en la nube: claves para líderes de TI
- Por qué Cloud Linux impulsa seguridad, estabilidad y rendimiento en hosting compartido
- Cómo las Soluciones de Monitoreo de Gas Mejoran la Seguridad en Entornos Industriales y Automotrices