#include <SPI.h>
#include <Ethernet2.h>
#include <ICMPPing.h>
#include <ESP8266WiFi.h>
#include <ESPAsyncTCP.h>
#include <ESPAsyncWebServer.h>
#include <FS.h>
#define TTL 64
#define CS_PIN 16 // SPI Chip Select pin
#define LED_ON LOW
#define LED_OFF HIGH
#define setLocalIP 1
#define setGatewayIP 2
#define setSubnet 3
#define passIP 4
#define LINK_DOWN 0
#define LINK_UP 1
float VBmin = 3.30;
float VBmax = 4.10;
byte mac[] = { 0x36, 0xF2, 0xCC, 0xF2, 0xE5, 0xC0 };
IPAddress pingAddr(192, 168, 1, 1); // ip address to ping
IPAddress destGateway(192, 168, 1, 1);
const char* ssid = "SERVER_SLT";
const char* password = "admin8266";
bool submit = false;
bool Rsubmit = false;
bool initPing = false;
bool eLink;
byte idx = 0;
byte idy = 0;
bool updt;
//bool clearReply = false;
String nullStr = "";
bool btnGetIP = false;
bool btnSetIP = false;
byte IPSW;
bool repeatPing;
bool initPingRepeat;
String pingResponse;
byte scs_cnt;
byte pktLoss;
byte pLoss;
String endStr = "% loss)";
String null_IP = "xxx.xxx.xxx.xxx" ;
unsigned int pTime[4] = {0,0,0,0};
unsigned int minT;
unsigned int maxT;
unsigned int avgT;
byte bat; // temp var
// Create AsyncWebServer object on port 80
AsyncWebServer server(80);
AsyncEventSource events("/events"); // new
// new user variables
unsigned long lastTime = 0;
unsigned long timerDelay = 2000; // send readings timer
char buffer [256];
IPAddress local_IP(192,168,10,1);
IPAddress gateway(192,168,10,1);
IPAddress subnet(255,255,255,0);
SOCKET pingSocket = 1;
ICMPPing ping(pingSocket, (uint16_t)random(1, 1023), TTL);
ICMPEchoReply echoReply;
void setup(){
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LED_OFF);
Serial.begin(9600);
Serial.println("---Serial Monitor---");
w5500.init(CS_PIN);
w5500.setRCR(0);
w5500.setPTimer(40);
repeatPing = 1;
updt = true;
// Initialize SPIFFS
if(!SPIFFS.begin()){
Serial.println("An Error has occurred while mounting SPIFFS");
return;
}
// Connect to Wi-Fi
WiFi.softAPConfig(local_IP, gateway, subnet);//
WiFi.softAP(ssid, password); //
delay(500);
digitalWrite(LED_BUILTIN, LOW);
// Route for root / web page
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
request->send(SPIFFS, "/esp8266slt.html", String(), false, processor);
});
// Route to load style.css file
server.on("/style.css", HTTP_GET, [](AsyncWebServerRequest *request){
request->send(SPIFFS, "/style.css", "text/css");
});
// Route to load script.js file
server.on("/script.js", HTTP_GET, [](AsyncWebServerRequest *request){
request->send(SPIFFS, "/script.js", "text/javascript");
});
// Route to load image file
server.on("/sltlogo.jpg", HTTP_GET, [](AsyncWebServerRequest *request){
request->send(SPIFFS, "/sltlogo.jpg", "image/png");
});
// Route to load image file
server.on("/EthConnected.png", HTTP_GET, [](AsyncWebServerRequest *request){
request->send(SPIFFS, "/EthConnected.png", "image/png");
});
// Route to load image file
server.on("/EthDisconnected.png", HTTP_GET, [](AsyncWebServerRequest *request){
request->send(SPIFFS, "/EthDisconnected.png", "image/png");
});
// Route to load image file
server.on("/EthBussy.png", HTTP_GET, [](AsyncWebServerRequest *request){
request->send(SPIFFS, "/EthBussy.png", "image/png");
});
// Route to load image file
server.on("/WIFI.jpg", HTTP_GET, [](AsyncWebServerRequest *request){
request->send(SPIFFS, "/WIFI.jpg", "image/jpg");
});
// Route to load image file
server.on("/FULL.jpg", HTTP_GET, [](AsyncWebServerRequest *request){
request->send(SPIFFS, "/FULL.jpg", "image/jpg");
});
// Route to load image file
server.on("/HIGH.jpg", HTTP_GET, [](AsyncWebServerRequest *request){
request->send(SPIFFS, "/HIGH.jpg", "image/jpg");
});
// Route to load image file
server.on("/LOW.jpg", HTTP_GET, [](AsyncWebServerRequest *request){
request->send(SPIFFS, "/LOW.jpg", "image/jpg");
});
// Route to load image file
server.on("/EMT.jpg", HTTP_GET, [](AsyncWebServerRequest *request){
request->send(SPIFFS, "/EMT.jpg", "image/jpg");
});
// Route to load image file
server.on("/CHRG.jpg", HTTP_GET, [](AsyncWebServerRequest *request){
request->send(SPIFFS, "/CHRG.jpg", "image/jpg");
});
// Route to load image file
server.on("/BAT.jpg", HTTP_GET, [](AsyncWebServerRequest *request){
request->send(SPIFFS, "/BAT.jpg", "image/jpg");
});
server.on("/get_IP", HTTP_GET, [](AsyncWebServerRequest *request){
btnGetIP = true;
btnSetIP = true;
updt = true;
request->send(SPIFFS, "/esp8266slt.html", String(), false, processor);
});
server.on("/action", HTTP_GET, [](AsyncWebServerRequest *request){
pingAddr[0] = request->getParam("IP0")-> value().toInt() ;
pingAddr[1] = request->getParam("IP1")-> value().toInt() ;
pingAddr[2] = request->getParam("IP2")-> value().toInt() ;
pingAddr[3] = request->getParam("IP3")-> value().toInt() ;
submit = 1;
IPSW = setLocalIP;
request->send(SPIFFS, "/esp8266slt.html", String(), false, processor);
});
server.on("/action_2", HTTP_GET, [](AsyncWebServerRequest *request){
repeatPing = !repeatPing;
pingAddr[0] = request->getParam("IP0")-> value().toInt() ;
pingAddr[1] = request->getParam("IP1")-> value().toInt() ;
pingAddr[2] = request->getParam("IP2")-> value().toInt() ;
pingAddr[3] = request->getParam("IP3")-> value().toInt() ;
Rsubmit = 1;
IPSW = setLocalIP;
idy = 0;
updt = true;
request->send(SPIFFS, "/esp8266slt.html", String(), false, processor);
});
// Start server
server.addHandler(&events); // new
server.begin();
}
void loop(){
handleWDT();
handlePing();
handleRepeatPing();
handleBtnFn();
handleDSPIP();
handleEthIcon();
handleBkgrndPrcs();
}
////////
void handleBtnFn(){
if(btnSetIP){
IPSW = setLocalIP;
btnSetIP = false;
idx = 0;
}
if(initPing){
lastTime = millis();
idx = 1;
updt = false;
initPing = false;
scs_cnt = 0;
minT = 5000;
maxT = 0;
avgT = 0;
}
if(initPingRepeat){
lastTime = millis();
idy = 1;
updt = false;
initPingRepeat = 0;
}
delay(100);
}
void handleDSPIP(){
if(IPSW == setLocalIP){
events.send(" ",NULL);
delay(500);
events.send(strLocalIP().c_str(),"LCIP");
IPSW ++ ;
}else if(IPSW == setGatewayIP){
events.send(strGatewayIP().c_str(),"GWIP");
IPSW ++ ;
}else if(IPSW == setSubnet){
events.send(strSubnet().c_str(),"SNM");
IPSW ++ ;
if(submit) initPing = true; ////
if(Rsubmit && !repeatPing) initPingRepeat = true; //// repeatPing
submit = 0;
Rsubmit=0;
}
if(Ethernet.linkStatus() == LinkOFF) delay(600);
}
void handlePing(){
if( (millis() - lastTime > timerDelay) && idx){
if (idx == 1) {
events.send("",NULL);
delay(100);
}else if (idx == 2) {
events.send(pingEthernet(pingAddr).c_str(),"R1");
}else if (idx == 3) {
events.send(pingEthernet(pingAddr).c_str(),"R2");
}else if (idx == 4) {
events.send(pingEthernet(pingAddr).c_str(),"R3");
}else if (idx == 5) {
events.send(pingEthernet(pingAddr).c_str(),"R4");
}else if (idx == 6) {
if(Ethernet.linkStatus() == LinkOFF){
events.send("Please Check Ethernet Link","S1");
}else{
events.send("Ping Statistics:","S1");
delay(100);
events.send((pingStat() + endStr).c_str(),"S2");
delay(100);
}
if(scs_cnt){
events.send("Approximate Round Trip:","S3");
delay(100);
events.send(rTrip().c_str(),"S4");
delay(100);
}
}else{
events.send("",NULL,millis());
idx = 0;
updt = true;
}
if(idx > 0 && idx < 7)idx++;
lastTime = millis();
}
}
void handleRepeatPing(){
if( (millis() - lastTime > timerDelay) && idy){
handleWDT();
if(idy == 1){
events.send("",NULL);
delay(100);
updateWAPSN();
chngBtnClr();
updateBTRYL();
}else if(idy == 2){
events.send(pingEthernet(pingAddr).c_str(),"R1");
}else if (idy == 3) {
events.send(pingEthernet(pingAddr).c_str(),"R2");
}else if (idy == 4) {
events.send(pingEthernet(pingAddr).c_str(),"R3");
}else if (idy == 5) {
events.send(pingEthernet(pingAddr).c_str(),"R4");
}else if (idy == 6) {
events.send("","R1"); delay(100);
events.send("","R2"); delay(100);
events.send("","R3"); delay(100);
events.send("","R4"); delay(100);
}else{
idy = 1;
}
if(idy>0 && idy<7) idy++;
lastTime = millis();
delay(1000);
}
}
///////////
String pingStat(){
pktLoss = 4 - scs_cnt;
pLoss = pktLoss*25;
sprintf(buffer,
"Packets: Sent=4, Received=%d, Lost=%d (%d",
scs_cnt,
pktLoss,
pLoss
);
return buffer;
}
unsigned int tMin(){
for(byte n = 0; n < scs_cnt; n++){
minT = min(minT,pTime[n] );
}
return minT;
}
unsigned int tMax(){
for(byte n = 0; n < scs_cnt; n++){
maxT = max(maxT,pTime[n] );
}
return maxT;
}
unsigned int tAvg(){
for(byte n = 0; n < scs_cnt; n++){
avgT += pTime[n];
}
avgT = avgT / scs_cnt;
return avgT;
}
String rTrip(){
sprintf(buffer,
"Min=%d ms, Max=%d ms, Avg=%d ms",
tMin(),
tMax(),
tAvg()
);
return buffer;
}
///////////////////
void handleWDT(){
ESP.wdtDisable();
yield();
}
//placeholder
String processor(const String& var){
if (var == "IP0"){
if(btnGetIP) return String(destGateway[0]);
else return String(pingAddr[0]);
}else if (var == "IP1"){
if(btnGetIP) return String(destGateway[1]);
else return String(pingAddr[1]);
}else if (var == "IP2"){
if(btnGetIP) return String(destGateway[2]);
else return String(pingAddr[2]);
}else if (var == "IP3"){
if(btnGetIP){
btnGetIP = false;
return String(destGateway[3]);
}
else{
return String(pingAddr[3]);
}
}else if (var == "PingLoop"){ // Change button label
if(repeatPing){
return "REPEAT";
}else{
return "STOP";
}
}else{
return String();
}
}
String strLocalIP(){
String param_IP;
if(Ethernet.linkStatus() == LinkON){
Ethernet.begin(mac);
for (byte x = 0; x < 4; x++) {
param_IP += String(Ethernet.localIP()[x], DEC);
if(x<3)param_IP += ".";
}
}else{
param_IP = "xxx.xxx.xxx.xxx" ;
}
return param_IP;
}
String strGatewayIP(){
String param_IP;
if(Ethernet.linkStatus() == LinkON){
destGateway = Ethernet.gatewayIP();
for (byte x = 0; x < 4; x++) {
param_IP += String(Ethernet.gatewayIP()[x], DEC);
if(x<3)param_IP += ".";
}
}else{
param_IP = "xxx.xxx.xxx.xxx" ;
}
return param_IP;
}
String strSubnet(){
String param_IP;
if(Ethernet.linkStatus() == LinkON){
for (byte x = 0; x < 4; x++) {
param_IP += String(Ethernet.subnetMask()[x], DEC);
if(x<3)param_IP += ".";
}
}else{
param_IP = "xxx.xxx.xxx.xxx" ;
}
return param_IP;
}
///////////////////
//////////////////////////////////////
String pingEthernet(IPAddress pingIP){
if(Ethernet.linkStatus() == LinkON){
eLink = LinkON;
// // Ethernet.begin(mac);
echoReply = ping(pingIP, 1);
if (echoReply.status == SUCCESS){
pTime[scs_cnt] = millis() - echoReply.data.time;
sprintf(buffer,
"Reply from:%d.%d.%d.%d: Bytes=%d Time=%ldms TTL=%d",
echoReply.addr[0],
echoReply.addr[1],
echoReply.addr[2],
echoReply.addr[3],
REQ_DATASIZE,
pTime[scs_cnt],
echoReply.ttl);
scs_cnt ++;
}else{
String echoReplyStatus;
switch(echoReply.status){
case SEND_TIMEOUT : echoReplyStatus = "SEND TIMEOUT" ; break;
case NO_RESPONSE : echoReplyStatus = "NO RESPONSE" ; break;
case BAD_RESPONSE : echoReplyStatus = "BAD RESPONSE" ; break;
default: echoReplyStatus = "UNKNOWN ERR" ; break;
}
sprintf(buffer, ("Echo request failed: " + echoReplyStatus).c_str());
}
return buffer;
}else{
eLink = LinkOFF;
return "Failed_to_begin_MAC";
}
}
/////////
void handleEthIcon(){
if((millis() - lastTime > timerDelay) && !idx){
if(Ethernet.linkStatus() == LinkON){
events.send("UP","eth");
delay(200);
} else{
events.send("DWN","eth");
delay(200);
}
}
}
void handleBkgrndPrcs(){
if( (millis() - lastTime > timerDelay) && updt){
updateWAPSN();
chngBtnClr();
updateBTRYL();
lastTime = millis();
}
}
// Update the WIFI Access Point Station Number
void updateWAPSN(){
String StNum;
sprintf(buffer, "%d",WiFi.softAPgetStationNum());
StNum = buffer;
events.send(StNum.c_str(), "StNum");
delay(200);
}
// Update Battery Level
void updateBTRYL(){
/*
int VB_an = analogRead(A0);
float V_bat = (3.30*VB_an)/1023.0 ;
bat = map(V_bat, VBmin, VBmax, 0, 3);
*/
bat = 4;
switch(bat){
case 0: events.send("EMT" , "BAT"); delay(100); break;
case 1: events.send("LOW" , "BAT"); delay(100); break;
case 2: events.send("HIGH", "BAT"); delay(100); break;
case 3: events.send("FULL", "BAT"); delay(100); break;
case 4: events.send("CHRG", "BAT"); delay(100); break;
default: events.send("BAT" , "BAT"); delay(100); break;
}
}
// Change Repeat Ping button color
void chngBtnClr(){
if(repeatPing){
events.send("REPEAT", "pingMode");
delay(200);
}else{
events.send("STOP", "pingMode");
delay(200);
}
}
Loading
esp32-s2-devkitm-1
esp32-s2-devkitm-1