139
правок
Строка 947: | Строка 947: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
==Добавление настроек== | |||
Допустим, мы захотели управлять какой-то настройкой еще, пускай это будет скорость обновления светодиодов. Ранее у нас была определена константа | |||
<syntaxhighlight lang="c++"> | |||
#define UPDATES_PER_SECOND 500 | |||
</syntaxhighlight> | |||
теперь нам её придётся сделать обычной переменной: | |||
<syntaxhighlight lang="c++"> | |||
int UPDATES_PER_SECOND = 500; | |||
</syntaxhighlight> | |||
теперь нужно подписать на новый топик: | |||
<syntaxhighlight lang="c++"> | |||
void modbusCallback(char* topic, byte* payload, unsigned int length) { | |||
char payloadChar[sizeof(payload)]; | |||
Serial.print("Message arrived ["); | |||
Serial.print(topic); | |||
Serial.print("] "); | |||
for (int i = 0; i < length; i++) { | |||
Serial.print((char)payload[i]); | |||
payloadChar[i] = (char)payload[i]; | |||
} | |||
Serial.println(); | |||
String payloadStr = String(payloadChar); | |||
payloadStr.trim(); | |||
if (strcmp(topic, "/devices/ws2812b/controls/brightness") == 0) { | |||
BRIGHTNESS = payloadStr.toInt(); | |||
Serial.printf("brithness set to %d\n", BRIGHTNESS); | |||
} | |||
if (strcmp(topic, "/devices/ws2812b/controls/hueLoop") == 0) { | |||
if(payloadStr.toInt() == 1) { | |||
hueLoop = true; | |||
} else { | |||
hueLoop = false; | |||
} | |||
} | |||
if (strcmp(topic, "/devices/ws2812b/controls/updatesPerSecond") == 0) { | |||
UPDATES_PER_SECOND = payloadStr.toInt(); | |||
} | |||
} | |||
void modbusReconnect() { | |||
// Loop until we're reconnected | |||
while (!pubSubClient.connected()) { | |||
Serial.print("Attempting MQTT connection..."); | |||
// Create a random client ID | |||
String clientId = "ESP32Client-"; | |||
clientId += String(random(0xffff), HEX); | |||
// Attempt to connect | |||
if (pubSubClient.connect(clientId.c_str())) { | |||
Serial.println("connected"); | |||
pubSubClient.subscribe("/devices/ws2812b/controls/brightness"); | |||
pubSubClient.subscribe("/devices/ws2812b/controls/hueLoop"); | |||
pubSubClient.subscribe("/devices/ws2812b/controls/updatesPerSecond"); | |||
} else { | |||
Serial.print("failed, rc="); | |||
Serial.print(pubSubClient.state()); | |||
Serial.println(" try again in 5 seconds"); | |||
// Wait 5 seconds before retrying | |||
delay(5000); | |||
} | |||
} | |||
} | |||
</syntaxhighligh> | |||
заливаем прошивку в esp32. | |||
осталось обновить виртуальное устройство в wirenboard: | |||
<syntaxhighlight lang="javascript"> | |||
defineVirtualDevice("ws2812b", { | |||
title: "ws2812b", | |||
cells: { | |||
enabled: { | |||
title: "состояние", | |||
type: "switch", | |||
value: false, | |||
}, | |||
brightness: { | |||
title: "яркость", | |||
type: "range", | |||
min: 0, | |||
max: 255, | |||
value: 50, | |||
}, | |||
hueLoop: { | |||
title: "смена оттенков", | |||
type: "switch", | |||
value: true, | |||
}, | |||
updatesPerSecond: { | |||
title: "скорость обновления светодиодов", | |||
type: "range", | |||
min: 10, | |||
max: 1000, | |||
value: 100, | |||
}, | |||
} | |||
}) | |||
</syntaxhighlight> | |||
после применения виртуального устройства можно управлять скорость обновления светодиодов из интерфейса wirenboard. |
правок