Wemos D1 Mini Frimware zur Steuerung einer RGBW-LED-Lampe
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

LEDLamp.ino 5.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  1. #include "Arduino.h"
  2. #include <ESP8266WiFi.h>
  3. #include <ESP8266WebServer.h>
  4. #include <EEPROM.h>
  5. #include <DNSServer.h>
  6. const int ledPin = LED_BUILTIN; // The built-in LED on the Wemos D1 Mini is on GPIO2 (D4)
  7. ESP8266WebServer webServer(80);
  8. WiFiServer server(1234);
  9. DNSServer dnsServer;
  10. const byte DNS_PORT = 53;
  11. // AP Daten
  12. const char *ap_ssid = "Wemos_Setup";
  13. const char *ap_pass = "admin123";
  14. // WLAN Config
  15. struct Config {
  16. char ssid[32];
  17. char pass[64];
  18. bool valid;
  19. };
  20. Config config;
  21. // ---------- EEPROM ----------
  22. void saveConfig() {
  23. EEPROM.begin(sizeof(Config));
  24. EEPROM.put(0, config);
  25. EEPROM.commit();
  26. }
  27. void loadConfig() {
  28. EEPROM.begin(sizeof(Config));
  29. EEPROM.get(0, config);
  30. if (config.valid != true) {
  31. config.valid = false;
  32. }
  33. }
  34. // ---------- CAPTIVE PORTAL PAGE ----------
  35. void handleRoot() {
  36. String mac = WiFi.macAddress();
  37. String html =
  38. R"rawliteral(
  39. <!DOCTYPE html>
  40. <html>
  41. <head>
  42. <meta name="viewport" content="width=device-width, initial-scale=1">
  43. <title>Wemos Setup</title>
  44. <style>
  45. body {
  46. margin: 0;
  47. font-family: Arial, sans-serif;
  48. background: linear-gradient(135deg, #1e1e2f, #2b5876);
  49. color: white;
  50. display: flex;
  51. justify-content: center;
  52. align-items: center;
  53. height: 100vh;
  54. }
  55. * {
  56. box-sizing: border-box;
  57. }
  58. .card {
  59. background: rgba(255,255,255,0.08);
  60. backdrop-filter: blur(10px);
  61. padding: 25px;
  62. border-radius: 16px;
  63. width: 90%;
  64. max-width: 360px;
  65. box-shadow: 0 8px 20px rgba(0,0,0,0.3);
  66. animation: fadeIn 0.8s ease;
  67. }
  68. h2 {
  69. margin-top: 0;
  70. text-align: center;
  71. }
  72. .info {
  73. font-size: 12px;
  74. opacity: 0.8;
  75. margin-bottom: 15px;
  76. text-align: center;
  77. }
  78. input {
  79. width: 100%;
  80. padding: 12px;
  81. margin: 8px 0;
  82. border-radius: 10px;
  83. border: none;
  84. outline: none;
  85. font-size: 14px;
  86. transition: 0.2s;
  87. }
  88. input:focus {
  89. transform: scale(1.02);
  90. }
  91. button {
  92. width: 100%;
  93. padding: 12px;
  94. margin-top: 10px;
  95. border: none;
  96. border-radius: 10px;
  97. background: #00c6ff;
  98. color: white;
  99. font-size: 16px;
  100. cursor: pointer;
  101. transition: 0.3s;
  102. }
  103. button:hover {
  104. background: #0072ff;
  105. transform: translateY(-2px);
  106. }
  107. .mac {
  108. font-size: 11px;
  109. text-align: center;
  110. margin-bottom: 15px;
  111. opacity: 0.7;
  112. word-break: break-all;
  113. }
  114. @keyframes fadeIn {
  115. from {opacity: 0; transform: translateY(10px);}
  116. to {opacity: 1; transform: translateY(0);}
  117. }
  118. </style>
  119. </head>
  120. <body>
  121. <div class="card">
  122. <h2>Wemos Setup</h2>
  123. <div class="mac">Device: )rawliteral"
  124. + mac
  125. + R"rawliteral(</div>
  126. <form action="/save" method="POST">
  127. <input name="ssid" placeholder="WLAN Name (SSID)">
  128. <input name="pass" type="password" placeholder="Passwort">
  129. <button type="submit">Verbinden</button>
  130. </form>
  131. <div class="info">
  132. Verbinde deinen Wemos mit einem WLAN Netzwerk
  133. </div>
  134. </div>
  135. </body>
  136. </html>
  137. )rawliteral";
  138. webServer.send(200, "text/html", html);
  139. }
  140. // ---------- SAVE ----------
  141. void handleSave() {
  142. String ssid = webServer.arg("ssid");
  143. String pass = webServer.arg("pass");
  144. ssid.toCharArray(config.ssid, 32);
  145. pass.toCharArray(config.pass, 64);
  146. config.valid = true;
  147. saveConfig();
  148. webServer.send(200, "text/html", "<h2>Gespeichert!</h2><p>Wemos startet neu...</p>");
  149. delay(1500);
  150. ESP.restart();
  151. }
  152. // ---------- NOT FOUND (CAPTIVE REDIRECT) ----------
  153. void handleNotFound() {
  154. webServer.sendHeader("Location", "http://192.168.4.1/", true);
  155. webServer.send(302, "text/plain", "");
  156. }
  157. // ---------- START ACCESS POINT ----------
  158. void startAP() {
  159. WiFi.mode(WIFI_AP);
  160. WiFi.softAP(ap_ssid, ap_pass);
  161. delay(500);
  162. IPAddress apIP = WiFi.softAPIP();
  163. Serial.print("AP IP: ");
  164. Serial.println(apIP);
  165. // DNS: ALLE Domains auf ESP IP umleiten
  166. dnsServer.start(DNS_PORT, "*", apIP);
  167. // Webserver Routes
  168. webServer.on("/", handleRoot);
  169. webServer.on("/save", HTTP_POST, handleSave);
  170. webServer.onNotFound(handleNotFound);
  171. webServer.begin();
  172. Serial.println("Captive Portal gestartet");
  173. }
  174. // ---------- CONNECT STA ----------
  175. bool connectSTA() {
  176. WiFi.mode(WIFI_STA);
  177. WiFi.begin(config.ssid, config.pass);
  178. Serial.println();
  179. Serial.print("Verbinde mit WLAN: ");
  180. Serial.println(config.ssid);
  181. int tries = 0;
  182. while (WiFi.status() != WL_CONNECTED && tries < 20) {
  183. delay(500);
  184. Serial.print(".");
  185. tries++;
  186. }
  187. if (WiFi.status() == WL_CONNECTED) {
  188. Serial.println();
  189. Serial.println("\nVerbunden!");
  190. Serial.print("IP: ");
  191. Serial.println(WiFi.localIP());
  192. server.begin();
  193. Serial.println("TCP Server gestartet auf Port 1234");
  194. return true;
  195. }
  196. return false;
  197. }
  198. // ---------- SETUP ----------
  199. void setup() {
  200. Serial.begin(115200);
  201. loadConfig();
  202. if (config.valid && connectSTA()) {
  203. Serial.println("STA Mode aktiv");
  204. } else {
  205. Serial.println();
  206. Serial.println();
  207. Serial.println("Starte Captive Portal");
  208. startAP();
  209. }
  210. }
  211. // ---------- LOOP ----------
  212. void loop() {
  213. if (WiFi.getMode() == WIFI_AP) {
  214. dnsServer.processNextRequest();
  215. webServer.handleClient();
  216. return;
  217. }
  218. webServer.handleClient(); // optional auch im STA Mode
  219. WiFiClient client = server.available();
  220. if (!client) {
  221. return;
  222. }
  223. Serial.println("Client verbunden");
  224. client.println("Connected");
  225. while (client.connected()) {
  226. if (!client.available()) {
  227. delay(1);
  228. continue;
  229. }
  230. String msg = client.readStringUntil('\n');
  231. msg.trim();
  232. Serial.print("Empfangen: ");
  233. Serial.println(msg);
  234. client.println("ACK: " + msg);
  235. if (msg.equalsIgnoreCase("/ledOn")) {
  236. digitalWrite(ledPin, LOW);
  237. }
  238. if (msg.equalsIgnoreCase("/ledOff")) {
  239. digitalWrite(ledPin, HIGH);
  240. }
  241. if (msg.equalsIgnoreCase("quit")) {
  242. break;
  243. }
  244. }
  245. client.stop();
  246. Serial.println("Client getrennt");
  247. }