Add MY-136 webserver example

main
Jarda 2023-09-17 22:20:08 +02:00
parent d7101a9871
commit 924e16052f
2 changed files with 306 additions and 0 deletions

View File

@ -0,0 +1,248 @@
/* Webserver reads from SD text file test for LaskaKit ESPlan
* After boot connect to http://esplan.local or to IP adress of ESP32 (for example 192.168.0.98)
* Email:podpora@laskakit.cz
* Web:laskakit.cz
*/
#include <Arduino.h>
#include <WiFi.h>
#include <ETH.h>
#include <WebServer.h>
#include <ESPmDNS.h>
#include "page.h"
const char *host = "esplan"; // Connect to http://esplan.local
// Set web server port number to 80
WebServer server(80);
// LAN8720A parameters
#define ETH_POWER_PIN -1
#define ETH_ADDR 0
#define ETH_MDC_PIN 23
#define ETH_MDIO_PIN 18
#define ETH_NRST_PIN 5
// RS485 parameters
#define RS485_REC_bytes 8
byte readAddr[] = {0x01, 0x03, 0x00, 0x00, 0x00, 0x01, 0x84, 0x0A};
byte readBr[] = {0x01, 0x03, 0x00, 0x01, 0x00, 0x01, 0xD5, 0xCA};
static bool eth_connected = false;
void WiFiEvent(WiFiEvent_t event)
{
switch (event)
{
case ARDUINO_EVENT_ETH_START:
Serial.println("ETH Started");
// set eth hostname here
ETH.setHostname("esplan");
break;
case ARDUINO_EVENT_ETH_CONNECTED:
Serial.println("ETH Connected");
break;
case ARDUINO_EVENT_ETH_GOT_IP:
Serial.print("ETH MAC: ");
Serial.print(ETH.macAddress());
Serial.print(", IPv4: ");
Serial.print(ETH.localIP());
if (ETH.fullDuplex())
{
Serial.print(", FULL_DUPLEX");
}
Serial.print(", ");
Serial.print(ETH.linkSpeed());
Serial.println("Mbps");
eth_connected = true;
break;
case ARDUINO_EVENT_ETH_DISCONNECTED:
Serial.println("ETH Disconnected");
eth_connected = false;
break;
case ARDUINO_EVENT_ETH_STOP:
Serial.println("ETH Stopped");
eth_connected = false;
break;
default:
break;
}
}
uint16_t calcCRC(const unsigned char *indata, int len)
{
uint16_t crc = 0xffff;
uint8_t temp;
int n;
while (len--)
{
crc = *indata ^ crc;
for (uint8_t n = 0; n < 8; n++)
{
char TT;
TT = crc & 1;
crc = crc >> 1;
crc = crc & 0x7fff;
if (TT == 1)
{
crc = crc ^ 0xa001;
crc = crc & 0xffff;
}
}
indata++;
}
return crc;
}
bool getData(byte d[], int16_t i, uint8_t *data)
{
int8_t rcv[7];
uint8_t crc[2];
uint8_t dat[5];
if (Serial1.write(d, i) == 8) // Send command
{
if (Serial1.available())
{
Serial.print("RCV data: ");
for (uint8_t y = 0; y < 7; y++)
{
rcv[y] = Serial1.read();
if (y == 5)
crc[0] = rcv[y];
if (y == 6)
crc[1] = rcv[y];
char buff[2];
sprintf(buff, "%02X", rcv[y]);
Serial.print(buff);
Serial.print(" ");
}
}
else
{
Serial.println("NO DATA RECEIVED!");
return 1;
}
}
for (int i = 0; i < (sizeof rcv) - 2; i++)
{
dat[i] = rcv[i];
}
if ((((uint16_t)crc[1] << 8) | (uint16_t)crc[0]) != calcCRC(dat, sizeof(dat))) // Check CRC
{
Serial.print(" >> ");
Serial.print(crc[1], HEX);
Serial.print(" ");
Serial.print(crc[0], HEX);
Serial.print(" = ");
Serial.println("CRC FAIL!");
return 1;
}
Serial.println();
Serial.print("DATA: ");
for (int i = 0; i < sizeof dat; i++)
{
char buff[2];
sprintf(buff, "%02X", dat[i]);
Serial.print(buff);
Serial.print(" ");
data[i] = dat[i];
}
Serial.println();
return 0;
}
void handleRoot()
{
server.send_P(200, "text/html", index_html); // Send web page
}
void handleNotFound()
{
String message = "Error\n\n";
message += "URI: ";
message += server.uri();
message += "\nMethod: ";
message += (server.method() == HTTP_GET) ? "GET" : "POST";
message += "\nArguments: ";
message += server.args();
message += "\n";
for (uint8_t i = 0; i < server.args(); i++)
{
message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
}
server.send(404, "text/plain", message);
}
void handleSendData()
{
uint8_t data[5] = {0};
char buff[20] = {0};
if (getData(readAddr, RS485_REC_bytes, data))
{
server.send(200, "text/plain", "ERROR");
}
else
{
sprintf(buff, "%02X %02X %02X %02X", data[0], data[1], data[2], data[3]);
server.send(200, "text/plain", buff);
}
}
void rs485_init()
{
Serial1.begin(9600, SERIAL_8N1, 36, 4); // ESP32 RX1 IO36, TX1 IO4
}
void DNS_setup()
{
if (MDNS.begin(host))
{
MDNS.addService("http", "tcp", 80);
Serial.println("MDNS responder started");
Serial.print("You can now connect to http://");
Serial.print(host);
Serial.println(".local");
}
}
void setup()
{
Serial.begin(115200);
rs485_init();
// For reseting LAN8720A
pinMode(ETH_NRST_PIN, OUTPUT);
digitalWrite(ETH_NRST_PIN, LOW);
delay(500);
digitalWrite(ETH_NRST_PIN, HIGH);
WiFi.onEvent(WiFiEvent);
ETH.begin(ETH_ADDR, ETH_POWER_PIN, ETH_MDC_PIN, ETH_MDIO_PIN, ETH_PHY_LAN8720, ETH_CLOCK_GPIO17_OUT);
DNS_setup();
server.on("/", handleRoot); // Main page
server.onNotFound(handleNotFound); // Function done when hangle is not found
server.on("/readData", handleSendData);
server.begin();
Serial.println("HTTP server started");
}
void loop()
{
if (eth_connected)
{
server.handleClient();
}
delay(2); // allow the cpu to switch to other tasks
}

File diff suppressed because one or more lines are too long