{"id":4483,"date":"2025-04-13T20:58:50","date_gmt":"2025-04-14T00:58:50","guid":{"rendered":"https:\/\/dft.wiki\/?p=4483"},"modified":"2026-01-17T10:28:12","modified_gmt":"2026-01-17T15:28:12","slug":"programming-esp32-wifi-with-arduino-ide","status":"publish","type":"post","link":"https:\/\/dft.wiki\/?p=4483","title":{"rendered":"Programming ESP32 Wifi with Arduino IDE"},"content":{"rendered":"<p><strong>COMMANDS<\/strong><\/p>\n<pre>~\/Downloads\/arduino-ide_2.3.4_Linux_64bit.AppImage &amp;&gt; \/dev\/null\r\nsudo apt install python3-pip\r\npip3 install pyserial\r\nsudo usermod -aG userName dialout\r\nsudo chmod a+rw \/dev\/ttyUSB0<\/pre>\n<hr \/>\n<p><strong>EXAMPLES<\/strong><\/p>\n<p><strong>(1)<\/strong>\u00a0HTTP API Enpoints with JSON<\/p>\n<pre>\/\/ ESP32-WROOM-32U\r\n\r\n#include &lt;WiFi.h&gt;\r\n#include &lt;WebServer.h&gt;\r\n#include &lt;ArduinoJson.h&gt;\r\n#include &lt;HTTPClient.h&gt;\r\n\r\n\/\/ Wifi credentials\r\nconst char* ssid = \"<strong>wifi_name<\/strong>\";\r\nconst char* password = \"<strong>wifi_password<\/strong>\";\r\n\r\n\/\/ Create a WebServer object on port 80\r\nWebServer server(80);\r\n\r\n\/\/ Handler for \"\/\"\r\nvoid handleRoot() {\r\n  String body = \"&lt;!DOCTYPE html&gt;&lt;html&gt;&lt;head&gt;&lt;title&gt;ESP32&lt;\/title&gt;&lt;\/head&gt;&lt;body&gt;\";\r\n  body += \"&lt;h1&gt;ESP32 HTTP Server!&lt;\/h1&gt;\\n\\n\";\r\n  body += \"&lt;a href=\\\"\/status\\\"&gt;Show Status&lt;\/a&gt;&lt;br&gt;\\n\";\r\n  body += \"&lt;a href=\\\"\/push\\\"&gt;Push Status&lt;\/a&gt;&lt;br&gt;\\n\";\r\n  body += \"&lt;a href=\\\"\/serial\\\"&gt;Output Status&lt;\/a&gt;&lt;br&gt;\\n\";\r\n  body += \"&lt;\/body&gt;&lt;\/html&gt;\";\r\n  server.send(200, \"text\/html\", body);\r\n  Serial.println(\"Client IP: \" + server.client().remoteIP().toString());\r\n}\r\n\r\nString getStatusJson() {\r\n  StaticJsonDocument&lt;512&gt; jsonData;\r\n  jsonData[\"wifi_connected\"] = String(WiFi.status() == WL_CONNECTED ? \"true\" : \"false\");\r\n  jsonData[\"signal_strength\"] = String(WiFi.RSSI());\r\n  jsonData[\"ssid\"] = WiFi.localIP().toString();\r\n  jsonData[\"ip\"] = WiFi.localIP().toString();\r\n  jsonData[\"uptime\"] = String(millis() \/ 1000);\r\n  jsonData[\"free_heap\"] = String(ESP.getFreeHeap());\r\n  jsonData[\"chip_model\"] = String(ESP.getChipModel());\r\n  jsonData[\"flash_size\"] = String(ESP.getFlashChipSize());\r\n  String jsonString;\r\n  serializeJson(jsonData, jsonString);\r\n  return jsonString;\r\n}\r\n\r\nvoid pushNotification(const String &amp;message = \"\"){\r\n  \/\/ Perform an HTTP GET request\r\n  if (WiFi.status() == WL_CONNECTED) {\r\n    HTTPClient http;\r\n    http.begin(\"http:\/\/ntfy.sh\/<strong>subscription_topic<\/strong>\");\r\n    http.addHeader(\"Content-Type\", \"application\/json\");\r\n\r\n    String payload;\r\n    if (message.length() &gt; 0){\r\n      payload = message;\r\n    } else {\r\n      payload = getStatusJson();\r\n    }\r\n\r\n    int httpResponseCode = http.POST(payload);\r\n    if (httpResponseCode == 200){\r\n      Serial.println(\"Push notification succeeded!\");\r\n    } else {\r\n      Serial.println(\"Push failed with error: \" + httpResponseCode);\r\n    }\r\n\r\n    http.end();\r\n  }\r\n}\r\n\r\n\/\/ Handler for \"\/status\"\r\nvoid handleStatus() {\r\n  server.send(200, \"application\/json\", getStatusJson());\r\n}\r\n\r\n\/\/ Handler for \"\/push\"\r\nvoid handlePush() {\r\n  pushNotification();\r\n  server.send(200, \"text\/plain\", \"\");\r\n}\r\n\r\n\/\/ Handler for \"\/serial\"\r\nvoid handleSerial() {\r\n  Serial.println(getStatusJson());\r\n  server.send(200, \"text\/plain\", \"\");\r\n}\r\n\r\n\/\/ Handler for 404\r\nvoid handleNotFound() {\r\n  server.send(404, \"text\/plain\", \"404: Not Found\");\r\n}\r\n\r\nvoid setup() {\r\n  \/\/ Setting up the Serial\r\n  Serial.begin(115200);\r\n  delay(1000);\r\n\r\n  Serial.println(\"\");\r\n  Serial.println(\"\");\r\n  Serial.println(\"Serial Started\");\r\n\r\n  \/\/ Connect to Wi-Fi\r\n  Serial.println(\"Starting WIFI\");\r\n  WiFi.begin(ssid, password);\r\n  while (WiFi.status() != WL_CONNECTED) {\r\n    delay(500);\r\n    Serial.println(\"Connecting...\");\r\n  }\r\n  Serial.println(\"Connected to Wi-Fi!\");\r\n  Serial.println(\"IP Address: \" + WiFi.localIP().toString());\r\n\r\n  \/\/ Define URL routes\r\n  server.on(\"\/\", handleRoot);\r\n  server.on(\"\/status\", handleStatus);\r\n  server.on(\"\/push\", handlePush);\r\n  server.on(\"\/serial\", handleSerial);\r\n  server.onNotFound(handleNotFound);\r\n\r\n  \/\/ Start the server\r\n  server.begin();\r\n  Serial.println(\"HTTP server started\");\r\n\r\n  \/\/ Push notification\r\n  StaticJsonDocument&lt;48&gt; jsonData;\r\n  jsonData[\"ip\"] = WiFi.localIP().toString();\r\n  String jsonString;\r\n  serializeJson(jsonData, jsonString);\r\n  pushNotification(jsonString);\r\n}\r\n\r\nvoid loop() {\r\n  \/\/ Handle client requests\r\n  server.handleClient();\r\n}<\/pre>\n<p>(in progress)<\/p>\n<hr \/>\n<p><strong>DOCUMENTATIONS<\/strong><\/p>\n<ul>\n<li>ESP32 WebServer [<a href=\"https:\/\/github.com\/espressif\/arduino-esp32\/blob\/master\/libraries\/WebServer\/src\/WebServer.h\">Link<\/a>]<\/li>\n<li>ESP32 HTTPClient [<a href=\"https:\/\/github.com\/espressif\/arduino-esp32\/blob\/master\/libraries\/HTTPClient\/src\/HTTPClient.h\">Link<\/a>]<\/li>\n<li>ArduinoJson [<a href=\"https:\/\/github.com\/bblanchon\/ArduinoJson\/blob\/7.x\/ArduinoJson.h\">Link<\/a>]<\/li>\n<\/ul>\n<hr \/>\n<p><strong>ONLINE SERVICES<\/strong><\/p>\n<p><strong>ntfy<\/strong> (pronounced notify) is a simple HTTP-based pub-sub service that sends notifications to your phone or desktop [<a href=\"https:\/\/ntfy.sh\/\">Link<\/a>]. Since it is open-source, it can be easily self-hosted [<a href=\"https:\/\/github.com\/binwiederhier\/ntfy\">Link<\/a>].<\/p>\n<p><strong>healthchecks.io<\/strong> is another HTTP-based open source tool that allows one to get general events from many origins, displayed in a single dashboard, and generate notifications for failures or absence of events [<a href=\"https:\/\/github.com\/healthchecks\/healthchecks\">Link<\/a>]. Read more about self-hosting it at [<a href=\"https:\/\/dft.wiki\/?p=2456#healthchecks\">Link<\/a>].<\/p>\n","protected":false},"excerpt":{"rendered":"<p>COMMANDS ~\/Downloads\/arduino-ide_2.3.4_Linux_64bit.AppImage &amp;&gt; \/dev\/null sudo apt install python3-pip pip3 install pyserial sudo usermod -aG userName [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":["post-4483","post","type-post","status-publish","format-standard","hentry","category-general"],"_links":{"self":[{"href":"https:\/\/dft.wiki\/index.php?rest_route=\/wp\/v2\/posts\/4483","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dft.wiki\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dft.wiki\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dft.wiki\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dft.wiki\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4483"}],"version-history":[{"count":10,"href":"https:\/\/dft.wiki\/index.php?rest_route=\/wp\/v2\/posts\/4483\/revisions"}],"predecessor-version":[{"id":5243,"href":"https:\/\/dft.wiki\/index.php?rest_route=\/wp\/v2\/posts\/4483\/revisions\/5243"}],"wp:attachment":[{"href":"https:\/\/dft.wiki\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4483"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dft.wiki\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4483"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dft.wiki\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4483"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}