{"id":1011,"date":"2025-11-12T09:26:05","date_gmt":"2025-11-12T09:26:05","guid":{"rendered":"https:\/\/tipcontrol.com\/?page_id=1011"},"modified":"2025-11-12T09:43:47","modified_gmt":"2025-11-12T09:43:47","slug":"tipcontrol-arduino-demo","status":"publish","type":"page","link":"https:\/\/tipcontrol.com\/?page_id=1011","title":{"rendered":"Tipcontrol Arduino Demo"},"content":{"rendered":"\n<h3 class=\"wp-block-heading\">Description<\/h3>\n\n\n\n<p>This Arduino sketch demonstrates how to use an ESP32 board to connect to WiFi, establish an MQTT connection, and send commands to a Tipcontrol device. The Tipcontrol device receives MQTT messages and executes the code contained in those messages directly on its chip.<\/p>\n\n\n\n<p>This means you can send <strong>any code snippet<\/strong> (written in Tipcontrol\u2019s scripting language) over MQTT, and the device will run it as if it were local code.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Important Note<\/h4>\n\n\n\n<p>For this example to work:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The <strong>Tipcontrol device must have its own WiFi connection<\/strong>.<\/li>\n\n\n\n<li>It must be connected to the <strong>same MQTT server<\/strong> as the ESP32.<\/li>\n\n\n\n<li>If either device is on a different network or broker, the messages will not be delivered.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Features of this example<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Connects ESP32 to a WiFi network.<\/li>\n\n\n\n<li>Configures and connects to an MQTT broker.<\/li>\n\n\n\n<li>Publishes command strings to a Tipcontrol device.<\/li>\n\n\n\n<li>Subscribes to a topic to receive messages back.<\/li>\n\n\n\n<li>Demonstrates two examples:\n<ol start=\"1\" class=\"wp-block-list\">\n<li>Cycling NeoPixel LEDs with random colors.<\/li>\n\n\n\n<li>Publishing temperature and humidity readings from an SHT40 sensor.<\/li>\n<\/ol>\n<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Configuration<\/h4>\n\n\n\n<h2 class=\"wp-block-heading\">Configuration<\/h2>\n\n\n\n<p>Before running, update the following variables with your own values:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>std::string ssid = \"your-SSID\";          \/\/ WiFi SSID\nstd::string password = \"your-PASSWORD\";  \/\/ WiFi password\n\nstd::string mqtt_server = \"your-MQTT-SERVER_URL\"; \/\/ MQTT broker URL\nstd::string mqtt_user = \"your-MQTT-USER\";         \/\/ MQTT username\nstd::string mqtt_password = \"your-MQTT-PASSWORD\"; \/\/ MQTT password\nuint16_t mqtt_port = 1883;                        \/\/ MQTT port (default 1883)\n<\/code><\/pre>\n\n\n\n<p>Also set the <strong>topics<\/strong>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>std::string subscribeTopic = \"demo.demo\/arduino\"; \nstd::string publishTopic = \"demo.demo.esp32\/exec\"; \n<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>subscribeTopic<\/code>: where this ESP32 listens for incoming messages.<\/li>\n\n\n\n<li><code>publishTopic<\/code>: where this ESP32 sends commands for the Tipcontrol device to execute.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Code<\/h3>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>#include &lt;Arduino.h>\n#include &lt;WiFi.h>\n#include \"ESP32MQTTClient.h\" \/\/ Custom MQTT client library for ESP32\n#include \"esp_idf_version.h\" \/\/ Used to check ESP-IDF version\n\n\/\/ ==========================\n\/\/ User configuration\n\/\/ ==========================\n\n\/\/ WiFi credentials \u2013 replace these with your network information\nstd::string ssid = \"your-SSID\";         \nstd::string password = \"your-PASSWORD\"; \n\n\/\/ MQTT server information \u2013 replace with your broker info\nstd::string mqtt_server = \"your-MQTT-SERVER_URL\"; \nstd::string mqtt_user = \"your-MQTT-USER\";     \nstd::string mqtt_password = \"your-MQTT-PASSWORD\"; \nuint16_t mqtt_port = 1883; \/\/ Default MQTT port\n\n\/\/ ==========================\n\/\/ MQTT Client instance\n\/\/ ==========================\nESP32MQTTClient mqttClient;\n\n\/\/ Function prototype for MQTT connection callback\nvoid onMqttConnect(esp_mqtt_client_handle_t client);\n\n\/\/ Topics for subscribing and publishing\nstd::string subscribeTopic = \"demo.demo\/arduino\"; \/\/ topic this device listens to needs to start with user.project if using the tipcontrol mqtt server\nstd::string publishTopic = \"demo.demo.esp32\/exec\"; \/\/ user.project.chipName of the tipcontrol device you want to send the command to \n\n\/\/ ==========================\n\/\/ IDF version compatibility\n\/\/ ==========================\n\/\/ Different ESP-IDF versions require different MQTT event handler signatures\n#if ESP_IDF_VERSION &lt; ESP_IDF_VERSION_VAL(5, 0, 0)\nesp_err_t handleMQTT(esp_mqtt_event_handle_t event)\n{\n  mqttClient.onEventCallback(event); \/\/ Call the MQTT client event handler\n  return ESP_OK;\n}\n#else\nvoid handleMQTT(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data)\n{\n  auto *event = static_cast&lt;esp_mqtt_event_handle_t>(event_data);\n  mqttClient.onEventCallback(event); \/\/ Call the MQTT client event handler\n}\n#endif\n\n\/\/ ==========================\n\/\/ Arduino setup function\n\/\/ ==========================\nvoid setup()\n{\n  Serial.begin(115200); \/\/ Initialize serial monitor for debugging\n  delay(2000);          \/\/ Short delay to stabilize\n\n  \/\/ Connect to WiFi\n  WiFi.begin(ssid->c_str(), password->c_str());\n  while (WiFi.status() != WL_CONNECTED)\n  {\n    delay(500);\n    Serial.print(WiFi.status()); \/\/ Print status code while connecting\n  }\n  Serial.println(\"connected\");\n\n  \/\/ Configure MQTT client\n  mqttClient.setURL(mqtt_server->c_str(), mqtt_port, mqtt_user->c_str(), mqtt_password->c_str());\n\n  \/\/ Enable Last Will and Testament (message sent if device disconnects unexpectedly)\n  mqttClient.enableLastWillMessage(\"lwt\", \"I am going offline\");\n\n  \/\/ Set MQTT keep-alive interval (seconds)\n  mqttClient.setKeepAlive(30);\n\n  \/\/ Start MQTT event loop in background\n  mqttClient.loopStart();\n\n  delay(2000); \/\/ Give time for connections to stabilize\n}\n\nvoid loop()\n{\n  \/\/ ==========================\n  \/\/ Example 1: Publish a command to cycle neopixel LEDs with random colors\n  \/\/ ==========================\n  String msg = \":{ \"                              \/\/ remember to start the code with :\n               \"for (i = 0, i &lt; 25, i += 1) { \"   \/\/ loop 25 times\n               \"red = lib.math.random(0,255); \"    \/\/ generate random red value\n               \"green = lib.math.random(0,255); \"  \/\/ generate random green value\n               \"blue = lib.math.random(0,255); \"   \/\/ generate random blue value\n               \"drv.neopixel.setLeds(red, green, blue, 1, 0); \" \/\/ set the neopixel LED colors\n               \"delay(1000);}; } \"; \/\/ wait 1 second before next iteration\n\n  \/\/ Try publishing the message until it succeeds\n  while (!mqttClient.publish(publishTopic.c_str(), msg.c_str()))\n  {\n    Serial.println(\"publish failed, retrying in 5s\");\n    delay(5000); \/\/ retry every 5 seconds\n  }\n\n  delay(35000); \/\/ wait 35 seconds before sending next command\n\n  \/\/ ==========================\n  \/\/ Example 2: Publish temperature and humidity readings\n  \/\/ ==========================\n  String topic = String(subscribeTopic.c_str()); \/\/ Convert the subscribe topic to Arduino String\n\n  \/\/ Build a command message string to send sensor readings\n  msg = \":{ \"\n        \"send = \\\"Temperature: \\\" + drv.sht40.var.temperature + \\\" Humidity: \\\" + drv.sht40.var.humidity;\" \n        \/\/ 'send' is a variable that concatenates the current temperature and humidity values\n        \"drv.mqtt.publish(\\\"\" + topic + \"\\\",send,0);}\" \n        \/\/ publish the 'send' message to the subscribed MQTT topic with QoS 0\n        ;\n\n  \/\/ Retry publishing until it succeeds\n  while (!mqttClient.publish(publishTopic.c_str(), msg.c_str()))\n  {\n    Serial.println(\"publish failed, retrying in 5s\");\n    delay(5000);\n  }\n\n  delay(15000); \/\/ wait 15 seconds before next loop iteration\n}\n\n\n\/\/ ==========================\n\/\/ MQTT connection callback\n\/\/ ==========================\nvoid onMqttConnect(esp_mqtt_client_handle_t client)\n{\n  Serial.println(\"Connected to MQTT\");\n\n  \/\/ Subscribe to a topic and print any received messages to the serial monitor\n  mqttClient.subscribe(subscribeTopic, [](const std::string &amp;payload)\n                       { Serial.println(payload.c_str()); }); \/\/ Lambda function callback\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">#<\/span><span style=\"color: #9CDCFE\">include<\/span><span style=\"color: #D4D4D4\"> &lt;<\/span><span style=\"color: #9CDCFE\">Arduino<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">h<\/span><span style=\"color: #D4D4D4\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">#<\/span><span style=\"color: #9CDCFE\">include<\/span><span style=\"color: #D4D4D4\"> &lt;<\/span><span style=\"color: #9CDCFE\">WiFi<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">h<\/span><span style=\"color: #D4D4D4\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">#<\/span><span style=\"color: #9CDCFE\">include<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;ESP32MQTTClient.h&quot;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #6A9955\">\/\/ Custom MQTT client library for ESP32<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">#<\/span><span style=\"color: #9CDCFE\">include<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;esp_idf_version.h&quot;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #6A9955\">\/\/ Used to check ESP-IDF version<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ ==========================<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ User configuration<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ ==========================<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ WiFi credentials \u2013 replace these with your network information<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C8C8C8\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #9CDCFE\">string<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">ssid<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">&quot;your-SSID&quot;<\/span><span style=\"color: #D4D4D4\">;         <\/span><\/span>\n<span class=\"line\"><span style=\"color: #C8C8C8\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #9CDCFE\">string<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">password<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">&quot;your-PASSWORD&quot;<\/span><span style=\"color: #D4D4D4\">; <\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ MQTT server information \u2013 replace with your broker info<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C8C8C8\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #9CDCFE\">string<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">mqtt_server<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">&quot;your-MQTT-SERVER_URL&quot;<\/span><span style=\"color: #D4D4D4\">; <\/span><\/span>\n<span class=\"line\"><span style=\"color: #C8C8C8\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #9CDCFE\">string<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">mqtt_user<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">&quot;your-MQTT-USER&quot;<\/span><span style=\"color: #D4D4D4\">;     <\/span><\/span>\n<span class=\"line\"><span style=\"color: #C8C8C8\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #9CDCFE\">string<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">mqtt_password<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">&quot;your-MQTT-PASSWORD&quot;<\/span><span style=\"color: #D4D4D4\">; <\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">uint16_t<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">mqtt_port<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #B5CEA8\">1883<\/span><span style=\"color: #D4D4D4\">; <\/span><span style=\"color: #6A9955\">\/\/ Default MQTT port<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ ==========================<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ MQTT Client instance<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ ==========================<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">ESP32MQTTClient<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">mqttClient<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Function prototype for MQTT connection callback<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">void<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">onMqttConnect<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">esp_mqtt_client_handle_t<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">client<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Topics for subscribing and publishing<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C8C8C8\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #9CDCFE\">string<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">subscribeTopic<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">&quot;demo.demo\/arduino&quot;<\/span><span style=\"color: #D4D4D4\">; <\/span><span style=\"color: #6A9955\">\/\/ topic this device listens to needs to start with user.project if using the tipcontrol mqtt server<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C8C8C8\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #9CDCFE\">string<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">publishTopic<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">&quot;demo.demo.esp32\/exec&quot;<\/span><span style=\"color: #D4D4D4\">; <\/span><span style=\"color: #6A9955\">\/\/ user.project.chipName of the tipcontrol device you want to send the command to <\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ ==========================<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ IDF version compatibility<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ ==========================<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Different ESP-IDF versions require different MQTT event handler signatures<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">#<\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">ESP_IDF_VERSION<\/span><span style=\"color: #D4D4D4\"> &lt; <\/span><span style=\"color: #DCDCAA\">ESP_IDF_VERSION_VAL<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">5<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">esp_err_t<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">handleMQTT<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">esp_mqtt_event_handle_t<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">event<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">mqttClient<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">onEventCallback<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">event<\/span><span style=\"color: #D4D4D4\">); <\/span><span style=\"color: #6A9955\">\/\/ Call the MQTT client event handler<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4FC1FF\">ESP_OK<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">#<\/span><span style=\"color: #C586C0\">else<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">void<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">handleMQTT<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">void<\/span><span style=\"color: #D4D4D4\"> *<\/span><span style=\"color: #9CDCFE\">handler_args<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">esp_event_base_t<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">base<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">int32_t<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">event_id<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">void<\/span><span style=\"color: #D4D4D4\"> *<\/span><span style=\"color: #9CDCFE\">event_data<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">auto<\/span><span style=\"color: #D4D4D4\"> *<\/span><span style=\"color: #9CDCFE\">event<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">static_cast<\/span><span style=\"color: #D4D4D4\">&lt;<\/span><span style=\"color: #4EC9B0\">esp_mqtt_event_handle_t<\/span><span style=\"color: #D4D4D4\">&gt;(<\/span><span style=\"color: #9CDCFE\">event_data<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">mqttClient<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">onEventCallback<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">event<\/span><span style=\"color: #D4D4D4\">); <\/span><span style=\"color: #6A9955\">\/\/ Call the MQTT client event handler<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">#<\/span><span style=\"color: #9CDCFE\">endif<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ ==========================<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ Arduino setup function<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ ==========================<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">void<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">setup<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">Serial<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">begin<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">115200<\/span><span style=\"color: #D4D4D4\">); <\/span><span style=\"color: #6A9955\">\/\/ Initialize serial monitor for debugging<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #DCDCAA\">delay<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">2000<\/span><span style=\"color: #D4D4D4\">);          <\/span><span style=\"color: #6A9955\">\/\/ Short delay to stabilize<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Connect to WiFi<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">WiFi<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">begin<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">ssid<\/span><span style=\"color: #D4D4D4\">-&gt;<\/span><span style=\"color: #DCDCAA\">c_str<\/span><span style=\"color: #D4D4D4\">(), <\/span><span style=\"color: #9CDCFE\">password<\/span><span style=\"color: #D4D4D4\">-&gt;<\/span><span style=\"color: #DCDCAA\">c_str<\/span><span style=\"color: #D4D4D4\">());<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">while<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #9CDCFE\">WiFi<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">status<\/span><span style=\"color: #D4D4D4\">() != <\/span><span style=\"color: #4FC1FF\">WL_CONNECTED<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #DCDCAA\">delay<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">500<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">Serial<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">WiFi<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">status<\/span><span style=\"color: #D4D4D4\">()); <\/span><span style=\"color: #6A9955\">\/\/ Print status code while connecting<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">Serial<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">println<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;connected&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Configure MQTT client<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">mqttClient<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">setURL<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">mqtt_server<\/span><span style=\"color: #D4D4D4\">-&gt;<\/span><span style=\"color: #DCDCAA\">c_str<\/span><span style=\"color: #D4D4D4\">(), <\/span><span style=\"color: #9CDCFE\">mqtt_port<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #9CDCFE\">mqtt_user<\/span><span style=\"color: #D4D4D4\">-&gt;<\/span><span style=\"color: #DCDCAA\">c_str<\/span><span style=\"color: #D4D4D4\">(), <\/span><span style=\"color: #9CDCFE\">mqtt_password<\/span><span style=\"color: #D4D4D4\">-&gt;<\/span><span style=\"color: #DCDCAA\">c_str<\/span><span style=\"color: #D4D4D4\">());<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Enable Last Will and Testament (message sent if device disconnects unexpectedly)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">mqttClient<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">enableLastWillMessage<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;lwt&quot;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&quot;I am going offline&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Set MQTT keep-alive interval (seconds)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">mqttClient<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">setKeepAlive<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">30<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Start MQTT event loop in background<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">mqttClient<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">loopStart<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #DCDCAA\">delay<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">2000<\/span><span style=\"color: #D4D4D4\">); <\/span><span style=\"color: #6A9955\">\/\/ Give time for connections to stabilize<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">void<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">loop<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ ==========================<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Example 1: Publish a command to cycle neopixel LEDs with random colors<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ ==========================<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">String<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">msg<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">&quot;:{ &quot;<\/span><span style=\"color: #D4D4D4\">                              <\/span><span style=\"color: #6A9955\">\/\/ remember to start the code with :<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">               <\/span><span style=\"color: #CE9178\">&quot;for (i = 0, i &lt; 25, i += 1) { &quot;<\/span><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">\/\/ loop 25 times<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">               <\/span><span style=\"color: #CE9178\">&quot;red = lib.math.random(0,255); &quot;<\/span><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">\/\/ generate random red value<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">               <\/span><span style=\"color: #CE9178\">&quot;green = lib.math.random(0,255); &quot;<\/span><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ generate random green value<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">               <\/span><span style=\"color: #CE9178\">&quot;blue = lib.math.random(0,255); &quot;<\/span><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #6A9955\">\/\/ generate random blue value<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">               <\/span><span style=\"color: #CE9178\">&quot;drv.neopixel.setLeds(red, green, blue, 1, 0); &quot;<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #6A9955\">\/\/ set the neopixel LED colors<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">               <\/span><span style=\"color: #CE9178\">&quot;delay(1000);}; } &quot;<\/span><span style=\"color: #D4D4D4\">; <\/span><span style=\"color: #6A9955\">\/\/ wait 1 second before next iteration<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Try publishing the message until it succeeds<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">while<\/span><span style=\"color: #D4D4D4\"> (!<\/span><span style=\"color: #9CDCFE\">mqttClient<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">publish<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">publishTopic<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">c_str<\/span><span style=\"color: #D4D4D4\">(), <\/span><span style=\"color: #9CDCFE\">msg<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">c_str<\/span><span style=\"color: #D4D4D4\">()))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">Serial<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">println<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;publish failed, retrying in 5s&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #DCDCAA\">delay<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">5000<\/span><span style=\"color: #D4D4D4\">); <\/span><span style=\"color: #6A9955\">\/\/ retry every 5 seconds<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #DCDCAA\">delay<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">35000<\/span><span style=\"color: #D4D4D4\">); <\/span><span style=\"color: #6A9955\">\/\/ wait 35 seconds before sending next command<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ ==========================<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Example 2: Publish temperature and humidity readings<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ ==========================<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">String<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">topic<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">String<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">subscribeTopic<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">c_str<\/span><span style=\"color: #D4D4D4\">()); <\/span><span style=\"color: #6A9955\">\/\/ Convert the subscribe topic to Arduino String<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Build a command message string to send sensor readings<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">msg<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">&quot;:{ &quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #CE9178\">&quot;send = <\/span><span style=\"color: #D7BA7D\">\\&quot;<\/span><span style=\"color: #CE9178\">Temperature: <\/span><span style=\"color: #D7BA7D\">\\&quot;<\/span><span style=\"color: #CE9178\"> + drv.sht40.var.temperature + <\/span><span style=\"color: #D7BA7D\">\\&quot;<\/span><span style=\"color: #CE9178\"> Humidity: <\/span><span style=\"color: #D7BA7D\">\\&quot;<\/span><span style=\"color: #CE9178\"> + drv.sht40.var.humidity;&quot;<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">\/\/ &#39;send&#39; is a variable that concatenates the current temperature and humidity values<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #CE9178\">&quot;drv.mqtt.publish(<\/span><span style=\"color: #D7BA7D\">\\&quot;<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #9CDCFE\">topic<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D7BA7D\">\\&quot;<\/span><span style=\"color: #CE9178\">,send,0);}&quot;<\/span><span style=\"color: #D4D4D4\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">\/\/ publish the &#39;send&#39; message to the subscribed MQTT topic with QoS 0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        ;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Retry publishing until it succeeds<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">while<\/span><span style=\"color: #D4D4D4\"> (!<\/span><span style=\"color: #9CDCFE\">mqttClient<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">publish<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">publishTopic<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">c_str<\/span><span style=\"color: #D4D4D4\">(), <\/span><span style=\"color: #9CDCFE\">msg<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">c_str<\/span><span style=\"color: #D4D4D4\">()))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #9CDCFE\">Serial<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">println<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;publish failed, retrying in 5s&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #DCDCAA\">delay<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">5000<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #DCDCAA\">delay<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">15000<\/span><span style=\"color: #D4D4D4\">); <\/span><span style=\"color: #6A9955\">\/\/ wait 15 seconds before next loop iteration<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ ==========================<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ MQTT connection callback<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">\/\/ ==========================<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">void<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">onMqttConnect<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">esp_mqtt_client_handle_t<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">client<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">Serial<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">println<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;Connected to MQTT&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\">\/\/ Subscribe to a topic and print any received messages to the serial monitor<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">mqttClient<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">subscribe<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">subscribeTopic<\/span><span style=\"color: #D4D4D4\">, [](<\/span><span style=\"color: #9CDCFE\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #9CDCFE\">string<\/span><span style=\"color: #D4D4D4\"> &amp;<\/span><span style=\"color: #9CDCFE\">payload<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                       { Serial.println(payload.c_str()); }); <\/span><span style=\"color: #6A9955\">\/\/ Lambda function callback<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span><\/code><\/pre><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Description This Arduino sketch demonstrates how to use an ESP32 board to connect to WiFi, establish an MQTT connection, and send commands to a Tipcontrol device. The Tipcontrol device receives MQTT messages and executes the code contained in those messages directly on its chip. This means you can send any code snippet (written in Tipcontrol\u2019s [&hellip;]<\/p>\n","protected":false},"author":7,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1011","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/tipcontrol.com\/index.php?rest_route=\/wp\/v2\/pages\/1011","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tipcontrol.com\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/tipcontrol.com\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/tipcontrol.com\/index.php?rest_route=\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/tipcontrol.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1011"}],"version-history":[{"count":2,"href":"https:\/\/tipcontrol.com\/index.php?rest_route=\/wp\/v2\/pages\/1011\/revisions"}],"predecessor-version":[{"id":1015,"href":"https:\/\/tipcontrol.com\/index.php?rest_route=\/wp\/v2\/pages\/1011\/revisions\/1015"}],"wp:attachment":[{"href":"https:\/\/tipcontrol.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1011"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}