Just an additional update where I have included a wind vane (wind direction sensor).
Code:
#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 led 2
#define Offset 0;
#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;
int VaneValue;// raw analog value from wind vane
int Direction;// translated 0 - 360 direction
int CalDirection;// converted value with offset applied
int LastValue;
float count2 = 0;
float value2 = 0;
float wd_array[750] = {0};
const char* host = "esp32";
const char* ssid = "********************";
const char* password = "********************************************";
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) {
pinMode(led,OUTPUT);
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 resolutio
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);
digitalWrite(led, LOW);
float pin35value = analogRead(35);
float pin35valueScaled = map(pin35value, 0, 4000, 0, 1000);
float windDirection = 0;
if(pin35valueScaled < 35)
windDirection = (203-360)*3.1415926536/180 ;
else if (pin35valueScaled < 47.5)
windDirection = 158*3.1415926536/180;
else if (pin35valueScaled < 68)
windDirection = 180*3.1415926536/180;
else if (pin35valueScaled < 113)
windDirection = (248-360)*3.1415926536/180;
else if (pin35valueScaled < 171)
windDirection = (225-360)*3.1415926536/180;
else if (pin35valueScaled < 220)
windDirection = (300-360)*3.1415926536/180;
else if (pin35valueScaled < 298)
windDirection = (270-360)*3.1415926536/180;
else if (pin35valueScaled < 381)
windDirection = 113*3.1415926536/180;
else if (pin35valueScaled < 485)
windDirection = 135*3.1415926536/180;
else if (pin35valueScaled < 595)
windDirection = (330-360)*3.1415926536/180;
else if (pin35valueScaled < 665)
windDirection = 60*3.1415926536/180;
else if (pin35valueScaled < 753)
windDirection = 90*3.1415926536/180;
else if (pin35valueScaled < 891)
windDirection = 30*3.1415926536/180;
else
windDirection = 0;
wd_array[count] = windDirection;
// Serial.println(wd_array[count]);
if (sensorValue == 0 && flag == 0)
{
rotations++;
flag = 1;
}
if (sensorValue != 0)
{
flag = 0;
}
server.handleClient();
delay(1);
count++;
count_wifi++;
int n = 750;
if (count > n)
{
digitalWrite(led, HIGH);
count = 0;
WindSpeed = rotations * 0.6;
//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.outside.temperature\",\"values\":[{\"path\":\"environment.outside.temperature\",\"value\":%f}]}]}", t);
udp.print(udpmessage2);
// Serial.println(udpmessage2);
char udpmessage3[1024];
sprintf(udpmessage3, "{\"updates\":[{\"$source\":\"esp32.outside.humidity\",\"values\":[{\"path\":\"environment.outside.humidity\",\"value\":%f}]}]}", h);
udp.print(udpmessage3);
// Serial.println(udpmessage3);
// Find the dominating element in array
int maxCount = 0;
int index = -1; // sentinels
for (int i = 0; i < n; i++) {
int count3 = 0;
for (int j = 0; j < n; j++) {
if (wd_array[i] == wd_array[j])
count3++;
}
// update maxCount if count of
// current element is greater
if (count3 > maxCount) {
maxCount = count3;
index = i;
}
}
char udpmessage4[1024];
sprintf(udpmessage4, "{\"updates\":[{\"$source\":\"esp32.wind.direction\",\"values\":[{\"path\":\"environment.wind.angleApparent\",\"value\":%f}]}]}", wd_array[index]);
udp.print(udpmessage4);
// Serial.println(udpmessage4);
}
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);
}
}
}