· 4 months ago · May 24, 2025, 01:50 AM
1#include <WiFi.h>
2#include <TinyGPS++.h>
3#include <WebServer.h>
4
5#define RXD2 16
6#define TXD2 17
7#define GPS_BAUD 9600
8
9TinyGPSPlus gps;
10HardwareSerial gpsSerial(2);
11
12const char* ssid = "ESP32-Server";
13const char* password = "12345678";
14
15WebServer server(80);
16
17String latestData = "No data received yet";
18unsigned long lastCheckTime = 0;
19const unsigned long checkInterval = 1000;
20bool dataReceived = false;
21
22float totalTemp = 0, totalHumidity = 0, totalDust = 0, totalMQ135 = 0, totalMQ2 = 0;
23int sampleCount = 0;
24
25float latestTemp, latestHumidity, latestDust, latestMQ135, latestMQ2;
26String lat = "14.8", lon = "121.7";
27
28void handleRoot() {
29 String html = R"rawliteral(
30 <!DOCTYPE html>
31 <html>
32 <head>
33 <meta charset="UTF-8">
34 <meta http-equiv='refresh' content='2'>
35 <title>ESP32 Telemetry</title>
36 <style>
37 body {
38 font-family: Arial, sans-serif;
39 background-color: #f0f8ff;
40 text-align: center;
41 padding: 50px;
42 }
43 table {
44 margin: auto;
45 border-collapse: collapse;
46 width: 80%;
47 background-color: #ffffff;
48 box-shadow: 0 0 10px rgba(0,0,0,0.1);
49 }
50 th, td {
51 padding: 12px 15px;
52 border-bottom: 1px solid #ddd;
53 }
54 th {
55 background-color: #007acc;
56 color: white;
57 }
58 tr:hover {
59 background-color: #f1f1f1;
60 }
61 </style>
62 </head>
63 <body>
64 <h2>ESP32 Telemetry Data</h2>
65 <table>
66 <tr><th>Parameter</th><th>Latest</th><th>Average</th></tr>
67 )rawliteral";
68
69 if (sampleCount > 0) {
70 html += "<tr><td>Temperature</td><td>" + String(latestTemp, 1) + " °C</td><td>" + String(totalTemp / sampleCount, 1) + " °C</td></tr>";
71 html += "<tr><td>Humidity</td><td>" + String(latestHumidity, 1) + " %</td><td>" + String(totalHumidity / sampleCount, 1) + " %</td></tr>";
72 html += "<tr><td>Dust</td><td>" + String(latestDust, 2) + " µg/m³</td><td>" + String(totalDust / sampleCount, 2) + " µg/m³</td></tr>";
73 html += "<tr><td>MQ135</td><td>" + String(latestMQ135, 2) + " ppm</td><td>" + String(totalMQ135 / sampleCount, 2) + " ppm</td></tr>";
74 html += "<tr><td>MQ2</td><td>" + String(latestMQ2, 2) + " ppm</td><td>" + String(totalMQ2 / sampleCount, 2) + " ppm</td></tr>";
75 html += "<tr><td>Latitude</td><td colspan='2'>" + lat + " °</td></tr>";
76 html += "<tr><td>Longitude</td><td colspan='2'>" + lon + " °</td></tr>";
77 } else {
78 html += "<tr><td colspan='3'>" + latestData + "</td></tr>";
79 }
80
81 html += "</table></body></html>";
82 server.send(200, "text/html", html);
83}
84
85void setup() {
86 Serial.begin(9600);
87 Serial.setTimeout(100);
88
89 WiFi.softAP(ssid, password);
90 IPAddress IP = WiFi.softAPIP();
91 Serial.print("Access Point IP address: ");
92 Serial.println(IP);
93
94 gpsSerial.begin(GPS_BAUD, SERIAL_8N1, RXD2, TXD2);
95 server.on("/", handleRoot);
96 server.begin();
97 Serial.println("Web server started");
98
99 lastCheckTime = millis();
100}
101
102void loop() {
103 server.handleClient();
104
105 if (Serial.available()) {
106 String input = Serial.readStringUntil('\n');
107 Serial.println("Received: " + input);
108 latestData = input + ", Lat: 14.8, Long: 121.7";
109
110 int t1 = input.indexOf("Temp:");
111 int h1 = input.indexOf("Humidity:");
112 int d1 = input.indexOf("Dust:");
113 int m1 = input.indexOf("MQ135:");
114 int m2 = input.indexOf("MQ2:");
115
116 if (t1 != -1 && h1 != -1 && d1 != -1 && m1 != -1 && m2 != -1) {
117 latestTemp = input.substring(t1 + 5, h1).toFloat();
118 latestHumidity = input.substring(h1 + 9, d1).toFloat();
119 latestDust = input.substring(d1 + 5, m1).toFloat();
120 latestMQ135 = input.substring(m1 + 6, m2).toFloat();
121 latestMQ2 = input.substring(m2 + 4).toFloat();
122
123 totalTemp += latestTemp;
124 totalHumidity += latestHumidity;
125 totalDust += latestDust;
126 totalMQ135 += latestMQ135;
127 totalMQ2 += latestMQ2;
128 sampleCount++;
129 }
130
131 dataReceived = true;
132 lastCheckTime = millis();
133 }
134
135 if (!dataReceived && millis() - lastCheckTime >= checkInterval) {
136 latestData = "No data received";
137 lastCheckTime = millis();
138 }
139}
140