2020-11-26, 12:52 PM
Its all working. Here is my updated code including OTA as well since my hardware will be installed on top of my sailboat mast.
Code:
#include "WiFi.h"
#include "AsyncUDP.h"
#include <WiFi.h>
#include <WiFiClient.h>
#include <WebServer.h>
#include <ESPmDNS.h>
#include <Update.h>
#include <math.h>
#define WindSensorPin (13)
#include "DHT.h"
#define DHTPIN 14 // Digital pin connected to the DHT sensor
#define DHTTYPE DHT11 // DHT 22 (AM2302), AM2321
DHT dht(DHTPIN, DHTTYPE);
float WindSpeed; // speed miles per hour
int rotations = 0;
int flag = 0;
const char* host = "esp32";
const char* ssid = "nameofnetwork";
const char* password = "codeofnetwork";
int count = 0;
int count_wifi = 0;
AsyncUDP udp;
WebServer server(80);
/*
* Login page
*/
const char* loginIndex =
"<form name='loginForm'>"
"<table width='20%' bgcolor='A09F9F' align='center'>"
"<tr>"
"<td colspan=2>"
"<center><font size=4><b>ESP32 Login Page</b></font></center>"
"<br>"
"</td>"
"<br>"
"<br>"
"</tr>"
"<td>Username:</td>"
"<td><input type='text' size=25 name='userid'><br></td>"
"</tr>"
"<br>"
"<br>"
"<tr>"
"<td>Password:</td>"
"<td><input type='Password' size=25 name='pwd'><br></td>"
"<br>"
"<br>"
"</tr>"
"<tr>"
"<td><input type='submit' onclick='check(this.form)' value='Login'></td>"
"</tr>"
"</table>"
"</form>"
"<script>"
"function check(form)"
"{"
"if(form.userid.value=='admin' && form.pwd.value=='admin')"
"{"
"window.open('/serverIndex')"
"}"
"else"
"{"
" alert('Error Password or Username')/*displays error message*/"
"}"
"}"
"</script>";
/*
* Server Index Page
*/
const char* serverIndex =
"<script src='https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js'></script>"
"<form method='POST' action='#' enctype='multipart/form-data' id='upload_form'>"
"<input type='file' name='update'>"
"<input type='submit' value='Update'>"
"</form>"
"<div id='prg'>progress: 0%</div>"
"<script>"
"$('form').submit(function(e){"
"e.preventDefault();"
"var form = $('#upload_form')[0];"
"var data = new FormData(form);"
" $.ajax({"
"url: '/update',"
"type: 'POST',"
"data: data,"
"contentType: false,"
"processData:false,"
"xhr: function() {"
"var xhr = new window.XMLHttpRequest();"
"xhr.upload.addEventListener('progress', function(evt) {"
"if (evt.lengthComputable) {"
"var per = evt.loaded / evt.total;"
"$('#prg').html('progress: ' + Math.round(per*100) + '%');"
"}"
"}, false);"
"return xhr;"
"},"
"success:function(d, s) {"
"console.log('success!')"
"},"
"error: function (a, b, c) {"
"}"
"});"
"});"
"</script>";
/*
* setup function
*/
void setup(void) {
Serial.begin(115200);
dht.begin();
pinMode(WindSensorPin, INPUT);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
if (WiFi.waitForConnectResult() != WL_CONNECTED) {
Serial.println("WiFi Failed");
while(1) {
delay(1000);
}
}
if(udp.connect(IPAddress(10,10,10,1), 3333)) {
Serial.println("UDP connected");
udp.onPacket([](AsyncUDPPacket packet) {
Serial.print("UDP Packet Type: ");
Serial.print(packet.isBroadcast()?"Broadcast":packet.isMulticast()?"Multicast":"Unicast");
Serial.print(", From: ");
Serial.print(packet.remoteIP());
Serial.print(":");
Serial.print(packet.remotePort());
Serial.print(", To: ");
Serial.print(packet.localIP());
Serial.print(":");
Serial.print(packet.localPort());
Serial.print(", Length: ");
Serial.print(packet.length());
Serial.print(", Data: ");
Serial.write(packet.data(), packet.length());
Serial.println();
//reply to the client
packet.printf("Got %u bytes of data", packet.length());
});
//Send unicast
udp.print("Hello Server!");
}
/*use mdns for host name resolution*/
if (!MDNS.begin(host)) { //http://esp32.local
Serial.println("Error setting up MDNS responder!");
while (1) {
delay(1000);
}
}
Serial.println("mDNS responder started");
/*return index page which is stored in serverIndex */
server.on("/", HTTP_GET, []() {
server.sendHeader("Connection", "close");
server.send(200, "text/html", loginIndex);
});
server.on("/serverIndex", HTTP_GET, []() {
server.sendHeader("Connection", "close");
server.send(200, "text/html", serverIndex);
});
/*handling uploading firmware file */
server.on("/update", HTTP_POST, []() {
server.sendHeader("Connection", "close");
server.send(200, "text/plain", (Update.hasError()) ? "FAIL" : "OK");
ESP.restart();
}, []() {
HTTPUpload& upload = server.upload();
if (upload.status == UPLOAD_FILE_START) {
Serial.printf("Update: %s\n", upload.filename.c_str());
if (!Update.begin(UPDATE_SIZE_UNKNOWN)) { //start with max available size
Update.printError(Serial);
}
} else if (upload.status == UPLOAD_FILE_WRITE) {
/* flashing firmware to ESP*/
if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) {
Update.printError(Serial);
}
} else if (upload.status == UPLOAD_FILE_END) {
if (Update.end(true)) { //true to set the size to the current progress
Serial.printf("Update Success: %u\nRebooting...\n", upload.totalSize);
} else {
Update.printError(Serial);
}
}
});
server.begin();
}
void loop()
{
int sensorValue = digitalRead(13);
//Serial.println(sensorValue);
if (sensorValue == 0 && flag == 0)
{
rotations++;
flag = 1;
}
if (sensorValue != 0)
{
flag = 0;
}
server.handleClient();
delay(1);
count++;
count_wifi++;
if (count > 1500)
{
count = 0;
WindSpeed = rotations * 0.40;
//Serial.print(rotations); Serial.print("\t\t");
//Serial.println(WindSpeed);
char udpmessage[1024];
sprintf(udpmessage, "{\"updates\":[{\"$source\":\"esp32.wind.apparent\",\"values\":[{\"path\":\"environment.wind.speedApparent\",\"value\":%f}]}]}", WindSpeed);
udp.print(udpmessage);
Serial.println(udpmessage);
rotations = 0;
float h = dht.readHumidity() / 100;
// Read temperature as Celsius (the default)
float t = dht.readTemperature() + 273.15;
char udpmessage2[1024];
sprintf(udpmessage2, "{\"updates\":[{\"$source\":\"esp32.wind.apparent\",\"values\":[{\"path\":\"environment.outside.temperature\",\"value\":%f}]}]}", t);
udp.print(udpmessage2);
Serial.println(udpmessage2);
char udpmessage3[1024];
sprintf(udpmessage3, "{\"updates\":[{\"$source\":\"esp32.wind.apparent\",\"values\":[{\"path\":\"environment.outside.humidity\",\"value\":%f}]}]}", h);
udp.print(udpmessage3);
Serial.println(udpmessage3);
}
if (count_wifi > 60000)
{
count_wifi = 0;
if(WiFi.status() == WL_CONNECTED)
{
Serial.println("wificonnect!!! !");
}
else
{
Serial.println("failed"); // WiFi.reconnect(); // ESP.restart();
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
}
}
}