139
правок
Строка 247: | Строка 247: | ||
* инициируем заливку прошивки при помощи кнопки [[Файл:Снимок экрана 2023-12-06 205336.jpg]], когда система напишет "Connecting..." - зажимаем кнопку Boot на dev-плате esp32 | * инициируем заливку прошивки при помощи кнопки [[Файл:Снимок экрана 2023-12-06 205336.jpg]], когда система напишет "Connecting..." - зажимаем кнопку Boot на dev-плате esp32 | ||
* если прошивка залилась успешно, перезагружаем esp32 соответствующей кнопкой, после этого у вас должна заработать лента, алгоритм будет менять каждые 5 секунд, всего 12 алгоритмов | * если прошивка залилась успешно, перезагружаем esp32 соответствующей кнопкой, после этого у вас должна заработать лента, алгоритм будет менять каждые 5 секунд, всего 12 алгоритмов | ||
Подробно останавливаться на коде прошивки мы не будем, в Интернете полно разных алгоритмов, их можно добавлять к нашей оснастке, переключать их реже или чаще, можно даже кнопку прикрутить под это дело на один из пинов, тут кому насколько фантазии хватит. | |||
==Подключаемся к wifi== | |||
Приступаем к следующему этапу - нам нужно подключить нашу esp32 к wifi (чтобы далее подключиться к modbus tcp от wirenboard) | |||
добавим к нашему файлу main.cpp следующий код: | |||
<syntaxhighlight lang="c++"> | |||
#include <Arduino.h> | |||
#include <WiFi.h> | |||
#define WIFI_SSID "ssid" | |||
#define WIFI_PASSWORD "password" | |||
void setupWifi() { | |||
WiFi.mode(WIFI_STA); | |||
WiFi.begin(WIFI_SSID, WIFI_PASSWORD); | |||
char emptyMsg[1] = ""; | |||
char pointMsg[2] = "."; | |||
Serial.println(emptyMsg); | |||
// Wait for connection | |||
while (WiFi.status() != WL_CONNECTED) { | |||
delay(500); | |||
Serial.println(pointMsg); | |||
} | |||
Serial.println(emptyMsg); | |||
char connectedToMsg[14] = "Connected to "; | |||
Serial.println(connectedToMsg); | |||
Serial.println(WIFI_SSID); | |||
char ipAddrMsg[30]; | |||
sprintf(ipAddrMsg, "IP address: %s", WiFi.localIP().toString().c_str()); | |||
Serial.println(ipAddrMsg); | |||
} | |||
</syntaxhighlight> | |||
а также модифицируем функцию setup: | |||
<syntaxhighlight lang="c++"> | |||
void setup() { | |||
setupWifi(); | |||
} | |||
</syntaxhighlight> | |||
теперь после прошивки esp32 подключится к вашей wifi сети, IP-адрес можно будет посмотреть на роутере, либо в отладочных сообщения на Serial-порте, который связывает ваш комп с esp32, для этого нажмите кнопку [[Файл:Снимок экрана 2023-12-06 210510.jpg]] на нижней панели | |||
==Подключение к Modbus TCP== | |||
После настройки wifi мы можем подключаться к mqtt-брокеру wirenboard, для этого нужно установить библиотеку, как мы это делали ранее, называется она PubSubClient | |||
подключимся к брокеру, для этого добавим немного кода: | |||
<syntaxhighlight lang="c++"> | |||
#include <Arduino.h> | |||
#include <WiFi.h> | |||
#include <PubSubClient.h> | |||
#include <WiFiClient.h> | |||
#define MODBUS_SERVER "192.168.0.10" | |||
#define MODBUS_PORT 1883 | |||
WiFiClient wifiClient; | |||
PubSubClient pubSubClient(wifiClient); | |||
void modbusCallback(char* topic, byte* payload, unsigned int length) { | |||
Serial.print("Message arrived ["); | |||
Serial.print(topic); | |||
Serial.print("] "); | |||
for (int i = 0; i < length; i++) { | |||
Serial.print((char)payload[i]); | |||
} | |||
Serial.println(); | |||
// Switch on the LED if an 1 was received as first character | |||
if ((char)payload[0] == '1') { | |||
digitalWrite(BUILTIN_LED, LOW); // Turn the LED on (Note that LOW is the voltage level | |||
// but actually the LED is on; this is because | |||
// it is active low on the ESP-01) | |||
} else { | |||
digitalWrite(BUILTIN_LED, HIGH); // Turn the LED off by making the voltage HIGH | |||
} | |||
} | |||
void setupModbus() { | |||
pubSubClient.setServer(MODBUS_SERVER, MODBUS_PORT); | |||
pubSubClient.setCallback(modbusCallback); | |||
pubSubClient.publish("outTopic", "hello world"); | |||
pubSubClient.subscribe("inTopic"); | |||
} | |||
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"); | |||
} else { | |||
Serial.print("failed, rc="); | |||
Serial.print(client.state()); | |||
Serial.println(" try again in 5 seconds"); | |||
// Wait 5 seconds before retrying | |||
delay(5000); | |||
} | |||
} | |||
} | |||
void setup() { | |||
setupWifi(); | |||
setupModbus(); | |||
} | |||
void loop() { | |||
if (!pubSubClient.connected()) { | |||
modbusReconnect(); | |||
} | |||
pubSubClient.loop(); | |||
} | |||
</syntaxhighlight> | |||
что мы здесь видим: мы можем создавать подписку на нужные топики либо сами публиковать какие то значения в нужные нам топики. | |||
в нашем случае понадобится управлять настройками ленты, поэтому нам надо слушать некоторые топики, изменения которых будут влиять на поведение ленты, допустим, мы хотим управлять: | |||
- яркостью | |||
- выключать (яркость 0) | |||
- включать (яркость 50%) | |||
- останавливать и запускать автоматическую смену режима | |||
- вручную выбирать нужный режим |
правок