Создание беспроводной сенсорной станции pH/EC для MyCodo с использованием Arduino MKR Wifi 1010 — Наука в гидропонике
В Интернете доступно несколько проектов с открытым исходным кодом для создания станций измерения pH / EC для гидропоники. Однако все те, что я нашел, используют один Arduino или Raspberry Pi для выполнения измерений и хранения любых данных, что делает их непригодными для приложений, где требуется большая гибкость. Например, объекту, использующему несколько разных резервуаров для хранения питательных веществ, может потребоваться несколько станций датчиков pH/EC, а одноплатные проводные установки не смогут обеспечить это без дополнительных дополнительных разработок. В этом посте я собираюсь показать вам простую станцию измерения pH/EC, которую я построил с помощью Arduino MKR Wifi 1010, которая может обмениваться данными с сервером MyCodo с использованием протокола MQTT. Можно построить несколько станций датчиков, и все они могут обмениваться данными с одним и тем же сервером MyCodo.

В этом проекте используются небольшие платы pH/EC, поставляемые uFire, которые имеют меньшую стоимость по сравнению с платами таких компаний, как Atlas, но имеют достаточную электрическую изоляцию, чтобы избежать проблем с показаниями, когда несколько электродов помещаются в один и тот же раствор. Это существенное улучшение по сравнению с другими недорогими платами, где использование нескольких пробников может вызвать сильный электрический шум и помехи. Для того, чтобы построить этот проект, вам потребуются следующие материалы:
Обратите внимание, что некоторые из приведенных ниже ссылок являются партнерскими ссылками Amazon. Это означает, что я получаю небольшую комиссию, если вы покупаете по этим ссылкам без каких-либо дополнительных затрат для вас.. Ссылки на другие сайты не являются партнерскими ссылками.
- Ардуино МКР Wi-Fi 1010
- pH-зонд uFire
- ЕС-зонд uFire
- Прочный pH-зонд с разъемом VNC
- Прочный датчик EC с разъемом VNC
- Два разъема Qwiic-Qwiic
- Один разъем Qwiic-вилка
- Коробка для проекта, чтобы положить все внутрь (необязательно)
- Кабель микро-USB
Код проекта показан ниже:
#include <uFire_EC.h>
#include <uFire_pH.h>
#include <WiFiNINA.h>
#include <ArduinoMqttClient.h>
#define SECRET_SSID "ENTER WIFI SSID HERE"
#define SECRET_PASS "ENTER WIFI PASSWORD HERE"
//calibration solutions used
#define PH_HIGH_SOLUTION_PH 7.0
#define PH_LOW_SOLUTION_PH 4.0
#define EC_HIGH_SOLUTION_EC 10.0
#define EC_LOW_SOLUTION_EC 1.0
#define CALIBRATION_TEMP 20.0
// topics for the mqtt sensors
// Make sure all stations have different topics
#define EC_TOPIC "EC1"
#define PH_TOPIC "PH1"
#define CALIB_TOPIC "CALIB1"
#define MQTT_BROKER "ENTER MQTT SERVER IP HERE"
#define MQTT_PORT 1883
int status = WL_IDLE_STATUS; // the Wifi radio's status
String message;
uFire_pH ph;
uFire_EC ec;
WiFiClient wifiClient;
MqttClient mqttClient(wifiClient);
void check_connection()
{
if (!mqttClient.connected()) {
WiFi.end();
status = WiFi.begin(SECRET_SSID, SECRET_PASS);
delay(10000);
if (!mqttClient.connect(MQTT_BROKER, MQTT_PORT)) {
Serial.print("MQTT connection failed! Error code = ");
Serial.println(mqttClient.connectError());
delay(100);
}
mqttClient.subscribe(CALIB_TOPIC);
}
}
void setup()
{
Serial.begin(9600);
while (!Serial);
// connect to wifi and mqtt broker
check_connection();
// coorectly initialize the uFire sensors
// note the Wire.begin() statement is critical
Wire.begin();
ec.begin();
ph.begin();
}
void loop()
{
// mqtt keep alive
mqttClient.poll();
// read messages
message = "";
while (mqttClient.available()) {
message += (char)mqttClient.read();
}
// execute calibration if requested
Serial.println(message);
if (message == "EC1_HIGH") ec.calibrateProbeHigh(EC_HIGH_SOLUTION_EC, CALIBRATION_TEMP);
if (message == "EC1_LOW") ec.calibrateProbeLow(EC_LOW_SOLUTION_EC, CALIBRATION_TEMP);
if (message == "PH1_HIGH") ph.calibrateProbeHigh(PH_HIGH_SOLUTION_PH);
if (message == "PH1_LOW") ph.calibrateProbeLow(PH_LOW_SOLUTION_PH);
// Measure EC
ec.measureEC();
Serial.println((String) "mS/cm: " + ec.mS);
// Measure pH
ph.measurepH();
Serial.println((String) "pH: " + ph.pH);
// Ensure the wifi and mqtt connections are alive
check_connection();
// post EC to MQTT server
mqttClient.beginMessage(EC_TOPIC);
mqttClient.print(ec.mS);
mqttClient.endMessage();
// post pH to MQTT server
mqttClient.beginMessage(PH_TOPIC);
mqttClient.print(ph.pH);
mqttClient.endMessage();
// ensure sensors are not probed too frequently
delay(1000);
}
Как только вы получите все материалы, вы должны сначала собрать компоненты. Соедините плату pH и EC вместе с помощью разъема Qwiic-to-Qwiic, затем используйте разъем Qwiic-to-male, чтобы подключить одну из этих плат к Arduino (не имеет значения, какую именно). Подсоедините черный кабель к земле, красный кабель к 5В, синий кабель к SDA и желтый кабель к SCL. Настройте плату в соответствии с инструкциями на странице начала работы с Arduino MKR wifi 1010, измените приведенный выше код, чтобы он правильно включал информацию о вашей сети Wi-Fi, решениях для калибровки и сервере MQTT, а затем загрузите код. Arduino подключится к вашим серверам Wi-Fi и MQTT и автоматически переподключится при возникновении проблем с подключением.
Приведенный выше код также будет публиковать показания датчиков pH и EC в темах PH1 и EC1 соответственно. Если вы добавите входные данные в MyCodo для сбора этих показаний, вы сможете сохранить их и выполнять управляющие действия с помощью интерфейса MyCodo. Кроме того, код Arduino будет отвечать на запросы о калибровке, опубликованные в теме «CALIB1». Например, если вы хотите откалибровать свой датчик EC методом двухточечной калибровки со стандартным раствором с EC 10 мСм/см, вы должны поместить электрод в калибровочный раствор, а затем отправить сообщение «EC1_HIGH» на CALIB1. теме, и Arduino выполнит задачу в соответствии с запросом. Код предполагает, что вы захотите выполнить калибровку по 2 точкам как для EC, так и для pH, при этом события калибровки инициируются EC1_HIGH, EC1_LOW, PH1_HIGH и PH1_LOW. Обратите внимание, что определение значений EC и pH калибровочных растворов должно быть изменено на растворы, которые вы будете использовать в коде. Высокие/низкие значения в коде, как есть, составляют 10 мСм/см|1 мСм/см для EC и 7|4 для pH.