Мониторинг бассейна в реальном времени: Arduino MKR1000 и Samsung ARTIK Cloud
Компоненты и материалы
| Arduino MKR1000 | 1 шт. |
| Перемычки | набор |
| pH-метр DFRobot | 1 шт. |
| Резистор 4.75 кОм | 1 шт. |
| Температурный зонд (DS18B20) | 1 шт. |
Приложения и сервисы
- Samsung ARTIK Cloud для IoT
- Arduino IDE
О проекте
I. Цель
Основная цель — использовать Samsung ARTIK Cloud для мониторинга уровня pH и температуры воды в бассейнах.
II. Настройка ARTIK Cloud
Шаг 1. Создание типа устройства
- Зарегистрируйтесь в ARTIK Cloud. Перейдите на портал разработчика и создайте новый «Device Type».
- Задайте отображаемое и уникальное имя.
- Создайте новый Manifest (манифест). Добавьте поля:
ph(число),temp(число). - Нажмите «Save», затем перейдите на вкладку «Activate Manifest» и активируйте.

Шаг 2. Создание приложения
- Перейдите в раздел «Applications», создайте новое.
- Укажите имя и Redirect URL (например,
https://localhost/index/). - Настройте права доступа: Read и Write для вашего устройства.

Шаг 3. Подключение устройства
- В разделе «My Devices» нажмите «Connect another device».
- Выберите созданный тип устройства и подключите.
- Запишите Device ID и Device Token — они понадобятся в коде.

III. Подключение датчиков к MKR1000
Шаг 1. Схема подключения
- Датчик температуры (DS18B20): GND → GND, OUT → D1, VCC → 5V. Между VCC и OUT — резистор 4.7 кОм.
- pH-метр DFRobot: GND → GND, OUT → A1, VCC → 5V.


Для удобства автор добавил аудиоджек для быстрого отключения температурного зонда (опционально).

Шаг 2. Установка библиотек
В Arduino IDE добавьте поддержку платы MKR1000 (Инструменты → Плата → Менеджер плат → Arduino SAMD Boards).
Установите библиотеки через Менеджер библиотек:
ArduinoJson— для формирования JSONArduinoHttpClient— для HTTPS-запросов к APIOneWire— для работы с DS18B20DallasTemperature— высокоуровневая библиотека для DS18B20

Шаг 3. Загрузка программы
Подключите MKR1000 к ПК. Скачайте код с GitHub. Замените в коде:
WIFI_AP— имя вашей WiFi-сетиWIFI_PWD— пароль WiFideviceID— Device ID из ARTIK ClouddeviceToken— Device Token из ARTIK Cloud
Загрузите скетч. Важно: WiFi должен иметь доступ в интернет.

IV. Полевые испытания
Устройство тестировалось в частном, публичном и школьном бассейнах. Собранные данные позволили оценить работоспособность.
MKR1000 с датчиками размещается в герметичном корпусе на плаву (см. фото), чтобы избежать попадания воды на электронику. Так можно непрерывно мониторить качество воды и дозировать реагенты вовремя.


V. Результаты
Проект помогает построить собственный прибор для мониторинга качества воды в бассейне. Надеемся, это повысит осведомлённость о безопасности воды — часто внимания уделяют удобствам, а не качеству. Устройство делает тестирование эффективным и ресурсосберегающим.
Удачной сборки! :)
Полный код (C/C++ для Arduino MKR1000)
/******************** Water Quality Monitoring for ARTIK Cloud ********************/
#include
#include
#include
#include
#include
#include
#include
/** Temperature Sensor **/
#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 = "your_device_id";
String deviceToken = "your_device_token";
/** pH Meter **/
#define SensorPin A1
#define Offset 0.00
#define samplingInterval 20
#define ArrayLength 40
int pHArray[ArrayLength];
int pHArrayIndex = 0;
int status = -1;
unsigned long millis_start;
#define WIFI_AP "your_wifi_ssid"
#define WIFI_PWD "your_wifi_password"
WiFiSSLClient wifi;
HttpClient client = HttpClient(wifi, server, port);
void setup() {
millis_start = millis();
Serial.begin(9600);
startWifi();
}
void loop() {
// Температура
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 == ArrayLength) pHArrayIndex = 0;
voltage = avergearray(pHArray, ArrayLength) * 5.0 / 1024;
pHValue = 3.5 * voltage + Offset;
samplingTime = millis();
}
Serial.println("===========================================");
Serial.println("Sending 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("Sending temp: " + String(celsius) + " and ph: " + String(pHValue));
Serial.println("POST to 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: "); Serial.println(statusCode);
Serial.print("Response: "); Serial.println(response);
delay(1000);
}
void startWifi() {
Serial.println("Connecting MKR1000 to WiFi...");
while (status != WL_CONNECTED) {
Serial.print("Attempting: "); 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 min, max;
long amount = 0;
if (arr[0] < arr[1]) { min = arr[0]; max = arr[1]; }
else { min = arr[1]; max = arr[0]; }
for (int 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& data = root.createNestedObject("data");
data["temp"] = temp;
data["ph"] = ph;
root.printTo(buf, sizeof(buf));
return root.measureLength();
}
Схемы

Производственный процесс
- Навигация в SaaS и облаке: почему тщательное управление данными критично
- Расширение облачных горизонтов: новые зоны, контейнеры и мультиоблачные стратегии
- Мастерство мониторинга облачных приложений: инсайты для ИТ-лидеров
- Почему Cloud Linux бустит безопасность, стабильность и производительность в shared hosting
- Создание удалённого датчика температуры на Raspberry Pi и Python — пошаговое руководство
- Домашний энергетический центр: мониторинг солнечных панелей, тепловых коллекторов и температуры комнат на Ra…
- Самодельная система термостатирования для домашнего пивоварения: мониторинг и регулирование на Arduino
- Удалённый мониторинг погоды на Raspberry Pi 3 с PubNub
- Умная система мониторинга качества воздуха и заполненности мусорных баков
- Как решения для мониторинга газа повышают безопасность в промышленных и автомобильных средах