diff --git a/WD5ACP_KPA500_srv2.17.ino b/WD5ACP_KPA500_srv2.17.ino deleted file mode 100644 index 054a94a..0000000 --- a/WD5ACP_KPA500_srv2.17.ino +++ /dev/null @@ -1,655 +0,0 @@ -String CodeVersion = "2.17"; - -// Web server interface for Elecraft KPA500 amateur radio amplifier. Communicates to "PC" serial port on amplifer -//Version 2.2 - Stable release -//Version 2.3 - Tweak colors -// Version 2.4 - -// Version 2.5 Added peak hold -// Version 2.6 - Built for ESP8266 WeMos D1R1 board. Use file preferences > Additional boards > http://arduino.esp8266.com/stable/package_esp8266com_index.json to add to IDE -// Version 2.7 - tweaked power on and amp mode colors -// Version 2.9 - trying to keep webpage client connected -// Version 2.10 Added input watts / peak input watts / Efficiency -// Version 2.11 Fixed display for Efficiency calc. Teaked font/colors on display. Added Firmware and serial number to display -// Version 2.12 Finally fixed HTML code to auto-update web page every 5 seconds. -// Version 2.13 Fixed bug in retaining Peak Input Watts. Added Peak Clear button -// Version 2.14 tweak to web page layout. Tweaked delays in serial code (hope to reduce serial drop outs). -// Version 2.15 Fixed mhz to MHZ on display. Tweaked LCD color -// Version 2.16 Added Clear Last Command button. Added WiFi SSID and signal strength to web page -// Version 2.17 Changed timing on serial port - still sometimes loose connection - moved serial rec to right after tx. Commented out extra serial messages - -// Load Wi-Fi library -#include -#include // Allows a 2nd serial port on the UNO style Arduino - this port is for the KPA500 RS232 -SoftwareSerial mySerial(13, 15); // RX, TX - Requires a TTL<>232 converter. Do NOT connect TTL level to your amp directly. -#include // Allows over-the-air OTA programming of Arduino via WiFi (once it is loaded with the correct files - see the internet for details - -// Replace with your network credentials - maybe one day I'll make this via the serial port. -const char* ssid = "zhome"; -const char* password = ""; - -// Set web server port number to 80 -WiFiServer server(80); - -// Variable to store the HTTP request -String header; - - -// Current time -unsigned long currentTime = millis(); -// Previous time -unsigned long previousTime = 0; -// Define timeout time in milliseconds (example: 2000ms = 2s) -const long timeoutTime = 60000; - -// Variables needed for KPA500 code----------------------------------------------------------------------------------------------------- -boolean commStatus = false; - -const byte numChars = 32; -char receivedChars[numChars]; // an array to store the received data - -boolean newData = false; -String inString = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; -String BootMode = "null"; -String AmpConnect = "null"; -String OnMode = "null"; -String OpMode = "null"; -String BandCode = "null"; -String FaultCode = "null"; -String PaTemp = "null"; -int TempC = 0; -int TempF = 0; -String FanMin = "null"; -float PaVolts = 0; -float PaAmps = 0; -float PoWatts = 0; -float PoSwr = 0; -float PeakWatts = 0; -float PeakSwr = 0; -float InputWatts = 0; -float PeakInputWatts = 0; -float RevNumber = 0.0; -float SerialNumber = 0.0; - -void setup() { - delay(200); - Serial.begin(115200); - // set the data rate for the SoftwareSerial port - delay(200); - mySerial.begin(38400); - delay(200); - - // Connect to Wi-Fi network with SSID and password - Serial.print("Connecting to "); - Serial.println(ssid); - WiFi.begin(ssid, password); - while (WiFi.status() != WL_CONNECTED) { - delay(500); - Serial.print("."); - } - // Print local IP address and start web server - Serial.println(""); - Serial.println("WiFi connected."); - Serial.println("IP address: "); - Serial.println(WiFi.localIP()); - server.begin(); - - delay (100); - - ArduinoOTA.onStart([]() { - Serial.println("Start"); - }); - ArduinoOTA.onEnd([]() { - Serial.println("\nEnd"); - }); - ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { - Serial.printf("Progress: %u%%\r", (progress / (total / 100))); - }); - ArduinoOTA.onError([](ota_error_t error) { - Serial.printf("Error[%u]: ", error); - if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed"); - else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed"); - else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed"); - else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed"); - else if (error == OTA_END_ERROR) Serial.println("End Failed"); - }); - ArduinoOTA.begin(); - -} // End of setup---------------------------------------------------------------------------------------------------------------- - - - -void loop() { //--------------------------------------------- Main Loop ----------------------------------------------------------- - - ArduinoOTA.handle(); - - // ------ This is where we talk to the KPA500 - - // See if the amp is talking via the serial port... - - // Query Mains on/ff Status of Amp - mySerial.print("^ON;"); - recvWithEndMarker(); - if (inString == "^ON1") { - OnMode = "KPA500 Power is ON"; - } - else { - OnMode = "null"; - } - - - AmpConnect = "Serial Communication OK"; // Here we assume the amp is ON and communicating... - if (OnMode == "null") { // Here there's no response from the amp on the serial port... - AmpConnect = "Serial Communication NOT updating. Power amp ON?"; - OnMode = "null"; - OpMode = "null"; - BandCode = "null"; - FaultCode = "null"; - PaTemp = "null"; - TempC = 0; - TempF = 0; - FanMin = "null"; - PaVolts = 0; - PaAmps = 0; - PoWatts = 0; - PoSwr = 0; - InputWatts = 0; - } - - // Query Firmware revision number - mySerial.print("^RVM;"); - recvWithEndMarker(); - if (inString.startsWith("^RVM")) { - RevNumber = (inString.substring(4, 9).toFloat()); - } - - // Query Firmware revision number - mySerial.print("^SN;"); - recvWithEndMarker(); - if (inString.startsWith("^SN")) { - SerialNumber = (inString.substring(3, 8).toFloat()); - } - - // Query Mains on/ff Status of Amp - mySerial.print("^ON;"); - recvWithEndMarker(); - if (inString == "^ON1") { - OnMode = "Power is ON"; - } - else { - OnMode = "null"; - } - - // Query Opertional Mode of Amp - mySerial.print("^OS;"); - recvWithEndMarker(); - if (inString == "^OS0") { - OpMode = "STBY"; - } - if (inString == "^OS1") { - OpMode = "OPER"; - } - - - // Query operating band of Amp - mySerial.print("^BN;"); - recvWithEndMarker(); - BandCode = "null"; - if (inString == "^BN00") { - BandCode = "1.8 MHZ * 160 meters"; - } - if (inString == "^BN01") { - BandCode = " 3.5 MHZ * 80 meters "; - } - if (inString == "^BN02") { - BandCode = " 5.3 MHZ * 60 meters "; - } - if (inString == "^BN03") { - BandCode = " 7.0 MHZ * 40 meters "; - } - if (inString == "^BN04") { - BandCode = " 10.1 MHZ * 30 meters "; - } - if (inString == "^BN05") { - BandCode = " 14.0 MHZ * 20 meters "; - } - if (inString == "^BN06") { - BandCode = " 18.1 MHZ * 17 meters "; - } - if (inString == "^BN07") { - BandCode = " 21.0 MHZ * 15 meters "; - } - if (inString == "^BN08") { - BandCode = " 24.9 MHZ * 12 meters "; - } - if (inString == "^BN09") { - BandCode = " 28.0 MHZ * 10 meters "; - } - if (inString == "^BN10") { - BandCode = " 50.0 MHZ * 6 meters "; - } - - // Query Watts and SWR of PA - mySerial.print("^WS;"); - recvWithEndMarker(); - PoWatts = 0; - PoSwr = 0; - if (inString.startsWith("^WS")) { - PoWatts = (inString.substring(3, 6).toFloat()); - PoWatts = PoWatts / 1; - PoSwr = (inString.substring(7, 9).toFloat()); - PoSwr = PoSwr / 10; - } - if (PoWatts > PeakWatts) { - PeakWatts = PoWatts; - } - if (PoSwr > PeakSwr) { - PeakSwr = PoSwr; - } - - // Query Temperature of Amp - mySerial.print("^TM;"); - recvWithEndMarker(); - PaTemp = "No Temp"; - - if (inString.startsWith("^TM")) { - PaTemp = inString.substring(3); - TempC = (inString.substring(3).toInt()); - TempF = (TempC * 1.8) + 32; - } - - // Query Minimum Fan Speed - mySerial.print("^FC;"); - recvWithEndMarker(); - FanMin = "Off"; - - if (inString.startsWith("^FC")) { - FanMin = inString.substring(3); - } - - // Query Volts and Amps of PA - mySerial.print("^VI;"); - recvWithEndMarker(); - PaAmps = 0; - - if (inString.startsWith("^VI")) { - PaVolts = (inString.substring(3, 6).toFloat()); - PaVolts = PaVolts / 10; - PaAmps = (inString.substring(7, 10).toFloat()); - PaAmps = PaAmps / 10; - InputWatts = PaVolts * PaAmps; - if (InputWatts > PeakInputWatts) { - PeakInputWatts = InputWatts; - } - } - - - // Query Fault of Amp - mySerial.print("^FL;"); - recvWithEndMarker(); - if (inString == "^FL00") { - FaultCode = "00 = No Faults"; - } - if (inString == "^FL02") { - FaultCode = "02 = Excessive power amplifier current"; - } - if (inString == "^FL04") { - FaultCode = "04 = Power amplifier temperature over limit"; - } - if (inString == "^FL06") { - FaultCode = "06 = Excessive driving power"; - } - if (inString == "^FL08") { - FaultCode = "08 = 60 volt supply over limit"; - } - if (inString == "^FL09") { - FaultCode = "09 = Excessive reflected power (high SWR)"; - } - if (inString == "^FL11") { - FaultCode = "Power amplifiers are dissipating excessive power"; - } - if (inString == "^FL12") { - FaultCode = "12 = Excessive power output"; - } - if (inString == "^FL13") { - FaultCode = "13 = 60 volt supply failure"; - } - if (inString == "^FL14") { - FaultCode = "14 = 270 volt supply failure"; - } - if (inString == "^FL15") { - FaultCode = "15 = Excessive overall amplifier gain"; - } - - // Here we check the WiFi connection for activity.................. - - WiFiClient client = server.available(); // Listen for incoming clients - - if (client) { // If a new client connects, - Serial.println("New Client."); // print a message out in the serial port - String currentLine = ""; // make a String to hold incoming data from the client - currentTime = millis(); - previousTime = currentTime; - while (client.connected() && currentTime - previousTime <= timeoutTime) { // loop while the client's connected - currentTime = millis(); - if (client.available()) { // if there's bytes to read from the client, - char c = client.read(); // read a byte, then - Serial.write(c); // print it out the serial monitor - header += c; - if (c == '\n') { // if the byte is a newline character - // if the current line is blank, you got two newline characters in a row. - // that's the end of the client HTTP request, so send a response: - if (currentLine.length() == 0) { - // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK) - // and a content-type so the client knows what's coming, then a blank line: - client.println("HTTP/1.1 200 OK"); - client.println("Content-type:text/html"); - client.println("Connection: close"); - client.println(); - - // Issue commands to KPA500 - ------------------------------------------------------------------------------ - if (header.indexOf("GET /Power/on") >= 0) { - mySerial.print("P"); - recvWithEndMarker(); - // Serial.println("Power UP command Issued"); - } - if (header.indexOf("GET /Power/off") >= 0) { - mySerial.print("^ON0;"); - recvWithEndMarker(); - // Serial.println("Power DOWN command Issued"); - } - - // Issue commands to KPA500 - Operate mode - if (header.indexOf("GET /OpMode/Operate") >= 0) { - mySerial.print("^OS1;"); - recvWithEndMarker(); - // Serial.println("Operate command Issued"); - } - - // Issue commands to KPA500 - Standby Mode - if (header.indexOf("GET /OpMode/Standby") >= 0) { - mySerial.print("^OS0;"); - recvWithEndMarker(); - // Serial.println("Standby command Issued"); - } - - // Issue commands to KPA500 - Fan Minimum - if (header.indexOf("GET /FanMin/FanMin00") >= 0) { - mySerial.print("^FC0;"); - recvWithEndMarker(); - // Serial.println("FanMin 00 Command Issued"); - } - - // Issue commands to KPA500 - Fan Minimum - if (header.indexOf("GET /FanMin/FanMin00") >= 0) { - mySerial.print("^FC0;"); - recvWithEndMarker(); - // Serial.println("FanMin 00 Command Issued"); - } - - // Issue commands to KPA500 - Fan Minimum - if (header.indexOf("GET /FanMin/FanMin01") >= 0) { - mySerial.print("^FC1;"); - recvWithEndMarker(); - // Serial.println("FanMin 01 Command Issued"); - } - - // Issue commands to KPA500 - Fan Minimum - if (header.indexOf("GET /FanMin/FanMin02") >= 0) { - mySerial.print("^FC2;"); - recvWithEndMarker(); - // Serial.println("FanMin 02 Command Issued"); - } - - // Issue commands to KPA500 - Fan Minimum - if (header.indexOf("GET /FanMin/FanMin03") >= 0) { - mySerial.print("^FC3;"); - recvWithEndMarker(); - // Serial.println("FanMin 03 Command Issued"); - } - - // Issue commands to KPA500 - Fan Minimum - if (header.indexOf("GET /FanMin/FanMin04") >= 0) { - mySerial.print("^FC4;"); - recvWithEndMarker(); - // Serial.println("FanMin 04 Command Issued"); - } - - // Issue commands to KPA500 - Fan Minimum - if (header.indexOf("GET /FanMin/FanMin05") >= 0) { - mySerial.print("^FC5;"); - recvWithEndMarker(); - // Serial.println("FanMin 05 Command Issued"); - } - - // Issue commands to KPA500 - Fan Minimum - if (header.indexOf("GET /FanMin/FanMin06") >= 0) { - mySerial.print("^FC6;"); - recvWithEndMarker(); - // Serial.println("FanMin 06 Command Issued"); - } - - // Issue commands to KPA500 - Fault clear - if (header.indexOf("GET /FaultCode/FaultClear") >= 0) { - mySerial.print("^FLC;"); - recvWithEndMarker(); - // Serial.println("Fault CLEAR Command Issued"); - } - - // Clear Peaks - if (header.indexOf("GET /PeakClear/ClearPeak") >= 0) { - // ---------------------------------- Peak Values are zeroed out. - PeakWatts = 0; - PeakSwr = 0; - PeakInputWatts = 0; - } - - // ------------------------------------------------------------------------------------------------------------------- Display the HTML web page - client.println(""); - client.println(""); - client.println(""); - - client.print(" " ); - - // CSS to style the on/off buttons - // Feel free to change the background-color and font-size attributes to fit your preferences - client.println(""); //#7787A - - // Web Page Heading - client.println("

WD5ACP Elecraft KPA500 <> WebServer Ver " + CodeVersion + "

"); // Here's the version number ........................................ - - if (AmpConnect.indexOf("NOT") > 0) { - client.print(""); - } - client.println("Connection Status: " + AmpConnect + "

"); - - if (OnMode.indexOf("ON") > 0) { - client.print(" " ); //LCD orange was #FF9900 font-size:24px - } - else { - client.print(" " ); - } - client.println(OnMode); - client.print (" // Amplifier Firmware Version: "); - client.print (RevNumber); - client.print (" // Amplifier Serial Number: "); - client.print (SerialNumber); - client.print ( "

"); - - client.print("

"); - client.println("

"); - - if (OpMode.startsWith("OPER")) { - client.print(""); - client.print("OPERATE"); - client.print(""); - client.print(""); - client.print("-----"); - client.print(""); - client.print(""); - client.print("STANDBY"); - client.print(""); - } - else { - client.print(""); - client.print("OPERATE"); - client.print(""); - client.print(""); - client.print("-----"); - client.print(""); - client.print(""); // - client.print("STANDBY"); - client.print(""); - } - - client.println("

"); - - client.print("

"); - client.println("

"); - - client.print("

" ); //LCD orange was #FF9900 - client.println(BandCode + "

"); - client.print("

"); - client.print(" " ); - if ((PeakWatts > 550) || (PeakSwr > 1.5)) { - client.print(" " ); - } - if ((PeakWatts > 599) || (PeakSwr > 1.99)) { - client.print(" " ); - } - client.print(PoWatts); - client.print("W // "); - client.print(PeakWatts); - client.print("W Peak Watts OUT at "); - client.print(PoSwr); - client.print(" SWR // "); - client.print(PeakSwr); - client.print(" Peak SWR"); - client.println("

"); - - client.print("Minimum Fan Speed: " + FanMin + "

"); - client.print(""); - client.print(""); - client.print(""); - client.print(""); - client.print(""); - client.print(""); - client.print("

" ); - - client.println("

PA Temperature: " + PaTemp + "C / " + TempF + "F

"); - client.print("

PA Volts: " ); - client.print(PaVolts); - client.print("V * PA Amps: "); - client.print(PaAmps); - client.print("A "); - client.print(" = "); - client.print(InputWatts); - client.print("W Input Watts // "); - client.print(PeakInputWatts); - client.print("W Peak Input Watts

"); - client.println("

Efficiency (best measured with steady tune) = "); - client.print(PeakWatts); - client.print("W Peak Watts OUT / "); - client.print(PeakInputWatts); - client.print("W Peak Input Watts "); - client.print(" = "); - client.print((PeakWatts / PeakInputWatts) * 100.0); - client.println(" %

"); - - if (FaultCode.startsWith("00")) { - client.print(" " ); - } - else { - client.print(" " ); - } - client.println("FaultCode = " + FaultCode + "

"); - client.print("" ); - client.print("" ); - client.print("

" ); - - - - - client.println("

WebServer updates every 5 seconds. Connected to network: "); - client.println(ssid); - long rssiLong = WiFi.RSSI(); - String WiFiSig = "signal strength"; - - if (rssiLong < 0) { - WiFiSig = "Excellent WiFi Signal Strength"; - } - if (rssiLong < -60) { - WiFiSig = "Very Good WiFi Signal Strength"; - } - if (rssiLong < -70) { - WiFiSig = "Good WiFi Signal Strength"; - } - if (rssiLong < -80) { - WiFiSig = "Low WiFi Signal Strength"; - } - if (rssiLong < -90) { - WiFiSig = "Very Low WiFi Signal Strength"; - } - if (rssiLong < -99) { - ; - WiFiSig = "Extremely Low Signal Strength"; - } - - client.println(rssiLong); - client.println("dBm = " + WiFiSig); - client.println("

"); - - // The HTTP response ends with another blank line - client.println(); - - client.println(""); - // Break out of the while loop - break; - } else { // if you got a newline, then clear currentLine - currentLine = ""; - } - } else if (c != '\r') { // if you got anything else but a carriage return character, - currentLine += c; // add it to the end of the currentLine - } - } - } - // Clear the header variable - header = ""; - // Close the connection - client.stop(); - Serial.println("Client disconnected."); - Serial.println(""); - } -}// ------------------------------------------------------------------------- End of main loop -------------------------------- - - -void recvWithEndMarker() { // ----------------------- receive data ----------------------------------- - static byte ndx = 0; - char endMarker = ';'; - char rc; - delay(15); //was 50 - - while (mySerial.available() > 0 && newData == false) { - rc = mySerial.read(); - - if (rc != endMarker) { - receivedChars[ndx] = rc; - ndx++; - if (ndx >= numChars) { - ndx = numChars - 1; - } - } - else { - receivedChars[ndx] = '\0'; // terminate the string - ndx = 0; - newData = true; - } - // delay(10); // was 10 - inString = String(receivedChars); - } - newData = false; - -}