СпойлерПоказать
Код: Выделить всё
/*
Скетч отправляет данные по MQTT с ёмкостного датчика жидкости
Non-contact Liquid Level Sensor probe XKC-Y25-T12V и выводит
информацию в MajorDoMo
*/
#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>
// Задаём mac и ip адреса в Локальной сети
byte mac[] = { 0xDE, 0xFD, 0xDA, 0xFE, 0xFE, 0xED };
IPAddress ip{192, 168, 1, 17}; //ip Адрес Ethernet Shild'a Arduino
IPAddress server{192, 168, 1, 40}; //ip Адрес MajorDoMo server
// Шапка Функции Callback (обратный вызов)
void callback(char* topic, byte* payload, unsigned int length);
EthernetClient ethClient; //Инициализируем Ethernet client
PubSubClient client(server, 1883, callback, ethClient); //Инициализируем MQTT client
bool Liquid_level = 0;
// Функция Callback
void callback(char* topic, byte* payload, unsigned int length)
{
// Выделяем необходимое кол-во памяти для копии payload
byte* p = (byte*)malloc(length);
// Копирование payload в новый буфер
memcpy(p, payload, length);
client.publish("Vessel/Liquid", p, length);
// Освобождаем память
free(p);
}
void setup()
{
Serial.begin(9600);
pinMode(2,INPUT);
Ethernet.begin(mac, ip);
}
void loop()
{
Liquid_level = digitalRead(2);
Serial.print("Liquid_level= ");
Serial.println(Liquid_level,DEC);
delay(500);
if (client.connect("MD"))
{
//Отправка данных по MQTT в Брокер
client.publish("Vessel/Liquid/level", (Liquid_level == 0) ? "0" : "1"); //когда датчик фиксирует достаточный уровень- 0, кода жидкости не хватает (упала ниже датчика)- 1
delay(2000); // Задержка в секундах
client.disconnect(); // Отключиться
}
}