#include #include #include #include #include #include #include // MSP AIRPORT ACTIVE RUNWAY PANEL // // VER 1.0 // WebServer Server; AutoConnect Portal(Server); AutoConnectConfig config("MSP_AIRPORT", "12345678"); const char* wifi = "no"; const char* force = "no"; #define NEOPIX 19 // Neopixel Pin #define NUM_PIXELS 160 // The number of LEDs (pixels) on WS2812B LED strip #define ONBOARD_LED 2 // The BLUE LED signifies WiFi Connection #define READDATA 5 // Force Read Data and Update LED Button #define SLEEPSWITCH 21 // The sleep switch const int lightPin = 34; int lightValue = 0; int brightNess = 0; int brightNess2 = 0; int red[160]; int green[160]; int blue[160]; int strobe = 0; int readings[10]; int total = 0; int Push_button1_state = 1; int buttonflag = 0; int checking = 0; // Runway definitions for MSP int R4A=0; int R4D=0; int R22A=0; int R22D=0; int R12RA=0; int R12LA=0; int R12RD=0; int R12LD=0; int R17A=0; int R17D=0; int R35A=0; int R35D=0; int R30LA=0; int R30RA=0; int R30LD=0; int R30RD=0; int runstat=4; // status light (pixel number 4) // the following variables are unsigned longs because the time, measured in // milliseconds, will quickly become a bigger number than can be stored in an int. unsigned long lastTime = 0; // Timer set to 10 minutes (600000) unsigned long timerDelay = (300000); // 5 minutes NeoPixelBus strip(NUM_PIXELS, NEOPIX); HTTPClient http; void rootPage() { // If at any time, a browser on the same LAN accesses the IP for the ESP32, // it will run this function and display HTML served from this ESP32. char content[] = "You can now close your browser and return to your normal WiFi SSID."; Server.send(200, "text/plain", content); } void loop() { Portal.handleClient(); if(wifi == "yes"){ digitalWrite(ONBOARD_LED, LOW); // normally HIGH but don't want it on. } else{ digitalWrite(ONBOARD_LED, LOW); } //Send an HTTP request every 5 minutes if ((millis() - lastTime) > timerDelay) { //Check WiFi connection status if(wifi == "yes") { GetData(); } else { Serial.println("Did not GET"); } lastTime = millis(); } Push_button1_state = digitalRead(READDATA); if (Push_button1_state == LOW) { buttonflag = 1; // Runway definitions all active for testing all LEDs R4A=11; //R4A=0; R4D=0; //R4D=37; //R22A=0; R22A=42; //R22D=16; R22D=0; R17A=133; //R17A=0; R17D=0; //R17D=152; R35A=158; //R35A=0; //R35D=138; R35D=0; R12RA=125; //R12RA=0; //R12RD=100; R12RD=0; R12LD=0; //R12LD=79; R12LA=60; //R12LA=0; R30LA=95; //R30LA=0; //R30LD=120; R30LD=0; //R30RD=65; R30RD=0; R30RA=84; //R30RA=0; // if(wifi == "yes") { // GetData(); // } } for (int i = 0; i < 10; i++) { readings[i] = analogRead(lightPin); // Read analog value delay(10); // Optional small delay between readings total += readings[i]; } lightValue = total / 100; total = 0; // Loop through runways // ================================================= if(lightValue > 255){ lightValue = 255; } brightNess = 0; brightNess2 = 0; brightNess2 = (1 + lightValue) * 2.5; if(lightValue < 1){ brightNess2 = 1; } if(digitalRead(SLEEPSWITCH) == HIGH){ brightNess2 = 0; } memset (red, 0, sizeof(red)); memset (green, 0, sizeof(green)); memset (blue, 0, sizeof(blue)); if(R4A > 0){ red[R4A] = 0; green[R4A] = 0; blue[R4A] = brightNess; red[R4A + 1] = 0; green[R4A + 1] = 0; blue[R4A + 1] = brightNess; red[R4A + 2] = 0; green[R4A + 2] = 0; blue[R4A + 2] = brightNess; red[R4A + 3] = 0; green[R4A + 3] = 0; blue[R4A + 3] = brightNess; red[R4A + 4] = 0; green[R4A + 4] = 0; blue[R4A + 4] = brightNess; red[R4A + 5] = 0; green[R4A + 5] = 0; blue[R4A + 5] = brightNess; red[R4A + strobe] = 0; green[R4A + strobe] = 0; blue[R4A + strobe] = brightNess2; } if(R4D > 0){ red[R4D] = brightNess; green[R4D] = 0; blue[R4D] = brightNess; red[R4D + 1] = brightNess; green[R4D + 1] = 0; blue[R4D + 1] = brightNess; red[R4D + 2] = brightNess; green[R4D + 2] = 0; blue[R4D + 2] = brightNess; red[R4D + 3] = brightNess; green[R4D + 3] = 0; blue[R4D + 3] = brightNess; red[R4D + 4] = brightNess; green[R4D + 4] = 0; blue[R4D + 4] = brightNess; red[R4D + 5] = brightNess; green[R4D + 5] = 0; blue[R4D + 5] = brightNess; red[R4D + strobe] = brightNess2; green[R4D + strobe] = 0; blue[R4D + strobe] = brightNess2; } if(R17A > 0){ red[R17A] = 0; green[R17A] = 0; blue[R17A] = brightNess; red[R17A + 1] = 0; green[R17A + 1] = 0; blue[R17A + 1] = brightNess; red[R17A + 2] = 0; green[R17A + 2] = 0; blue[R17A + 2] = brightNess; red[R17A + 3] = 0; green[R17A + 3] = 0; blue[R17A + 3] = brightNess; red[R17A + 4] = 0; green[R17A + 4] = 0; blue[R17A + 4] = brightNess; red[R17A + 5] = 0; green[R17A + 5] = 0; blue[R17A + 5] = brightNess; red[R17A + strobe] = 0; green[R17A + strobe] = 0; blue[R17A + strobe] = brightNess2; } if(R17D > 0){ red[R17D] = brightNess; green[R17D] = 0; blue[R17D] = brightNess; red[R17D + 1] = brightNess; green[R17D + 1] = 0; blue[R17D + 1] = brightNess; red[R17D + 2] = brightNess; green[R17D + 2] = 0; blue[R17D + 2] = brightNess; red[R17D + 3] = brightNess; green[R17D + 3] = 0; blue[R17D + 3] = brightNess; red[R17D + 4] = brightNess; green[R17D + 4] = 0; blue[R17D + 4] = brightNess; red[R17D + 5] = brightNess; green[R17D + 5] = 0; blue[R17D + 5] = brightNess; red[R17D + strobe] = brightNess2; green[R17D + strobe] = 0; blue[R17D + strobe] = brightNess2; } if(R22A > 0){ red[R22A] = 0; green[R22A] = 0; blue[R22A] = brightNess; red[R22A - 1] = 0; green[R22A - 1] = 0; blue[R22A - 1] = brightNess; red[R22A - 2] = 0; green[R22A - 2] = 0; blue[R22A - 2] = brightNess; red[R22A - 3] = 0; green[R22A - 3] = 0; blue[R22A - 3] = brightNess; red[R22A - 4] = 0; green[R22A - 4] = 0; blue[R22A - 4] = brightNess; red[R22A - 5] = 0; green[R22A - 5] = 0; blue[R22A - 5] = brightNess; red[R22A - strobe] = 0; green[R22A - strobe] = 0; blue[R22A - strobe] = brightNess2; } if(R22D > 0){ red[R22D] = brightNess; green[R22D] = 0; blue[R22D] = brightNess; red[R22D - 1] = brightNess; green[R22D - 1] = 0; blue[R22D - 1] = brightNess; red[R22D - 2] = brightNess; green[R22D - 2] = 0; blue[R22D - 2] = brightNess; red[R22D - 3] = brightNess; green[R22D - 3] = 0; blue[R22D - 3] = brightNess; red[R22D - 4] = brightNess; green[R22D - 4] = 0; blue[R22D - 4] = brightNess; red[R22D - 5] = brightNess; green[R22D - 5] = 0; blue[R22D - 5] = brightNess; red[R22D - strobe] = brightNess2; green[R22D - strobe] = 0; blue[R22D - strobe] = brightNess2; } if(R35A > 0){ red[R35A] = 0; green[R35A] = 0; blue[R35A] = brightNess; red[R35A - 1] = 0; green[R35A - 1] = 0; blue[R35A - 1] = brightNess; red[R35A - 2] = 0; green[R35A - 2] = 0; blue[R35A - 2] = brightNess; red[R35A - 3] = 0; green[R35A - 3] = 0; blue[R35A - 3] = brightNess; red[R35A - 4] = 0; green[R35A - 4] = 0; blue[R35A - 4] = brightNess; red[R35A - 5] = 0; green[R35A - 5] = 0; blue[R35A - 5] = brightNess; red[R35A - strobe] = 0; green[R35A - strobe] = 0; blue[R35A - strobe] = brightNess2; } if(R35D > 0){ red[R35D] = brightNess; green[R35D] = 0; blue[R35D] = brightNess; red[R35D - 1] = brightNess; green[R35D - 1] = 0; blue[R35D - 1] = brightNess; red[R35D - 2] = brightNess; green[R35D - 2] = 0; blue[R35D - 2] = brightNess; red[R35D - 3] = brightNess; green[R35D - 3] = 0; blue[R35D - 3] = brightNess; red[R35D - 4] = brightNess; green[R35D - 4] = 0; blue[R35D - 4] = brightNess; red[R35D - 5] = brightNess; green[R35D - 5] = 0; blue[R35D - 5] = brightNess; red[R35D - strobe] = brightNess2; green[R35D - strobe] = 0; blue[R35D - strobe] = brightNess2; } if(R12RA > 0){ red[R12RA] = 0; green[R12RA] = 0; blue[R12RA] = brightNess; red[R12RA - 1] = 0; green[R12RA - 1] = 0; blue[R12RA - 1] = brightNess; red[R12RA - 2] = 0; green[R12RA - 2] = 0; blue[R12RA - 2] = brightNess; red[R12RA - 3] = 0; green[R12RA - 3] = 0; blue[R12RA - 3] = brightNess; red[R12RA - 4] = 0; green[R12RA - 4] = 0; blue[R12RA - 4] = brightNess; red[R12RA - 5] = 0; green[R12RA - 5] = 0; blue[R12RA - 5] = brightNess; red[R12RA - strobe] = 0; green[R12RA - strobe] = 0; blue[R12RA - strobe] = brightNess2; } if(R12RD > 0){ red[R12RD] = brightNess; green[R12RD] = 0; blue[R12RD] = brightNess; red[R12RD - 1] = brightNess; green[R12RD - 1] = 0; blue[R12RD - 1] = brightNess; red[R12RD - 2] = brightNess; green[R12RD - 2] = 0; blue[R12RD - 2] = brightNess; red[R12RD - 3] = brightNess; green[R12RD - 3] = 0; blue[R12RD - 3] = brightNess; red[R12RD - 4] = brightNess; green[R12RD - 4] = 0; blue[R12RD - 4] = brightNess; red[R12RD - 5] = brightNess; green[R12RD - 5] = 0; blue[R12RD - 5] = brightNess; red[R12RD - strobe] = brightNess2; green[R12RD - strobe] = 0; blue[R12RD - strobe] = brightNess2; } if(R12LA > 0){ red[R12LA] = 0; green[R12LA] = 0; blue[R12LA] = brightNess; red[R12LA + 1] = 0; green[R12LA + 1] = 0; blue[R12LA + 1] = brightNess; red[R12LA + 2] = 0; green[R12LA + 2] = 0; blue[R12LA + 2] = brightNess; red[R12LA + 3] = 0; green[R12LA + 3] = 0; blue[R12LA + 3] = brightNess; red[R12LA + 4] = 0; green[R12LA + 4] = 0; blue[R12LA + 4] = brightNess; red[R12LA + 5] = 0; green[R12LA + 5] = 0; blue[R12LA + 5] = brightNess; red[R12LA + strobe] = 0; green[R12LA + strobe] = 0; blue[R12LA + strobe] = brightNess2; } if(R12LD > 0){ red[R12LD] = brightNess; green[R12LD] = 0; blue[R12LD] = brightNess; red[R12LD + 1] = brightNess; green[R12LD + 1] = 0; blue[R12LD + 1] = brightNess; red[R12LD + 2] = brightNess; green[R12LD + 2] = 0; blue[R12LD + 2] = brightNess; red[R12LD + 3] = brightNess; green[R12LD + 3] = 0; blue[R12LD + 3] = brightNess; red[R12LD + 4] = brightNess; green[R12LD + 4] = 0; blue[R12LD + 4] = brightNess; red[R12LD + 5] = brightNess; green[R12LD + 5] = 0; blue[R12LD + 5] = brightNess; red[R12LD + strobe] = brightNess2; green[R12LD + strobe] = 0; blue[R12LD + strobe] = brightNess2; } if(R30RA > 0){ red[R30RA] = 0; green[R30RA] = 0; blue[R30RA] = brightNess; red[R30RA - 1] = 0; green[R30RA - 1] = 0; blue[R30RA - 1] = brightNess; red[R30RA - 2] = 0; green[R30RA - 2] = 0; blue[R30RA - 2] = brightNess; red[R30RA - 3] = 0; green[R30RA - 3] = 0; blue[R30RA - 3] = brightNess; red[R30RA - 4] = 0; green[R30RA - 4] = 0; blue[R30RA - 4] = brightNess; red[R30RA - 5] = 0; green[R30RA - 5] = 0; blue[R30RA - 5] = brightNess; red[R30RA - strobe] = 0; green[R30RA - strobe] = 0; blue[R30RA - strobe] = brightNess2; } if(R30RD > 0){ red[R30RD] = brightNess; green[R30RD] = 0; blue[R30RD] = brightNess; red[R30RD - 1] = brightNess; green[R30RD - 1] = 0; blue[R30RD - 1] = brightNess; red[R30RD - 2] = brightNess; green[R30RD - 2] = 0; blue[R30RD - 2] = brightNess; red[R30RD - 3] = brightNess; green[R30RD - 3] = 0; blue[R30RD - 3] = brightNess; red[R30RD - 4] = brightNess; green[R30RD - 4] = 0; blue[R30RD - 4] = brightNess; red[R30RD - 5] = brightNess; green[R30RD - 5] = 0; blue[R30RD - 5] = brightNess; red[R30RD - strobe] = brightNess2; green[R30RD - strobe] = 0; blue[R30RD - strobe] = brightNess2; } if(R30LA > 0){ red[R30LA] = 0; green[R30LA] = 0; blue[R30LA] = brightNess; red[R30LA + 1] = 0; green[R30LA + 1] = 0; blue[R30LA + 1] = brightNess; red[R30LA + 2] = 0; green[R30LA + 2] = 0; blue[R30LA + 2] = brightNess; red[R30LA + 3] = 0; green[R30LA + 3] = 0; blue[R30LA + 3] = brightNess; red[R30LA + 4] = 0; green[R30LA + 4] = 0; blue[R30LA + 4] = brightNess; red[R30LA + 5] = 0; green[R30LA + 5] = 0; blue[R30LA + 5] = brightNess; red[R30LA + strobe] = 0; green[R30LA + strobe] = 0; blue[R30LA + strobe] = brightNess2; } if(R30LD > 0){ red[R30LD] = brightNess; green[R30LD] = 0; blue[R30LD] = brightNess; red[R30LD + 1] = brightNess; green[R30LD + 1] = 0; blue[R30LD + 1] = brightNess; red[R30LD + 2] = brightNess; green[R30LD + 2] = 0; blue[R30LD + 2] = brightNess; red[R30LD + 3] = brightNess; green[R30LD + 3] = 0; blue[R30LD + 3] = brightNess; red[R30LD + 4] = brightNess; green[R30LD + 4] = 0; blue[R30LD + 4] = brightNess; red[R30LD + 5] = brightNess; green[R30LD + 5] = 0; blue[R30LD + 5] = brightNess; red[R30LD + strobe] = brightNess2; green[R30LD + strobe] = 0; blue[R30LD + strobe] = brightNess2; } red[runstat] = brightNess2; green[runstat] = 0; blue[runstat] = 0; if(checking > 0){ red[runstat] = 0; green[runstat] = brightNess2; blue[runstat] = 0; } strobe = strobe + 1; if(strobe > 5){ strobe = 0; } // load up the pixels for (int pixel = 0; pixel < NUM_PIXELS; pixel++) { strip.SetPixelColor(pixel, RgbColor(red[pixel], green[pixel], blue[pixel])); } strip.Show(); delay(500); Push_button1_state = digitalRead(READDATA); if (Push_button1_state == HIGH && buttonflag > 0) { buttonflag = 0; if(wifi == "yes") { GetData(); } } } // end of loop() void GetData(){ if(wifi == "yes") { // wake up wifi } String serverPath = "https://datis.clowd.io/api/KMSP"; http.begin(serverPath.c_str()); // Send HTTP GET request int httpResponseCode = http.GET(); if (httpResponseCode>0) { Serial.print("HTTP Response code: "); Serial.println(httpResponseCode); String payload = http.getString(); //Serial.println(payload); // StaticJsonDocument<1500> doc; DynamicJsonDocument doc(2048); // Length (with one extra character for the null terminator) int str_len = payload.length() + 1; // Prepare the character array (the buffer) char json[str_len]; // Copy it over payload.toCharArray(json, str_len); // Deserialize the JSON document DeserializationError error = deserializeJson(doc, json); // Test if parsing succeeds. if (error) { Serial.print(F("deserializeJson() failed: ")); Serial.println(error.f_str()); return; } // Arrival Runway(s) String arrive = doc[0]["datis"]; Serial.println(arrive); // Departure Runway(s) String depart = doc[1]["datis"]; Serial.println(depart); // Runway definitions for MSP R4A=0; R4D=0; R22A=0; R22D=0; R12RA=0; R12LA=0; R12RD=0; R12LD=0; R17A=0; R17D=0; R35A=0; R35D=0; R30LA=0; R30RA=0; R30LD=0; R30RD=0; runstat=4; //R4A=11; //R4D=37; //R22A=42; //R22D=16; //R12RA=125; //R12RD=100; //R12LA=60; //R12LD=79; //R17A=133; //R17D=152; //R35A=158; //R35D=138; //R30LA=95; //R30LD=120; //R30RA=84; //R30RD=65; // ========= DETERMINE DEPARTURE RUNWAYS ======================== int dstart = depart.indexOf("DEPARTING"); int dstop = depart.indexOf(".", dstart); String drunway = depart.substring(dstart, dstop); // Serial.println(drunway); if(drunway.indexOf("4") > 0){ R4D=37; } if(drunway.indexOf("22") > 0){ R22D=16; } if(drunway.indexOf("12R") > 0){ R12RD=100; } if(drunway.indexOf("12L") > 0){ R12LD=79; } if(drunway.indexOf("17") > 0){ R17D=152; } if(drunway.indexOf("35") > 0){ R35D=138; } if(drunway.indexOf("30R") > 0){ R30RD=65; } if(drunway.indexOf("30L") > 0){ R30LD=120; } // ========= DETERMINE ARRIVAL RUNWAYS ======================== int astart = 0; int newLine = 0; String arunway = ""; while(arrive.indexOf("APCH", astart) > 0){ newLine = arrive.indexOf("APCH", astart); astart = newLine + 1; arunway = arrive.substring(newLine - 5, newLine - 1); if(arunway.indexOf("4") > 0){ R4A=11; } if(arunway.indexOf("22") > 0){ R22A=42; } if(arunway.indexOf("12R") > 0){ R12RA=125; } if(arunway.indexOf("12L") > 0){ R12LA=60; } if(arunway.indexOf("17") > 0){ R17A=133; } if(arunway.indexOf("35") > 0){ R35A=158; } if(arunway.indexOf("30R") > 0){ R30RA=84; } if(arunway.indexOf("30L") > 0){ R30LA=95; } } // If all of them are zero, that means it did not read any data. checking = R4A + R4D + R22A + R22A + R12RA + R12LA + R12RD + R12LD + R17A + R17D + R35A + R35D + R30LA + R30RA + R30LD + R30RD; // Display definitions for MSP Serial.print("R4A: "); Serial.println(R4A); Serial.print("R4D: "); Serial.println(R4D); Serial.print("R22A: "); Serial.println(R22A); Serial.print("R22D: "); Serial.println(R22D); Serial.print("R12LA: "); Serial.println(R12LA); Serial.print("R12LD: "); Serial.println(R12LD); Serial.print("R12RA: "); Serial.println(R12RA); Serial.print("R12RD: "); Serial.println(R12RD); Serial.print("R17A: "); Serial.println(R17A); Serial.print("R17D: "); Serial.println(R17D); Serial.print("R35A: "); Serial.println(R35A); Serial.print("R35D: "); Serial.println(R35D); Serial.print("R30RA: "); Serial.println(R30RA); Serial.print("R30RD: "); Serial.println(R30RD); Serial.print("R30LA: "); Serial.println(R30LA); Serial.print("R30LD: "); Serial.println(R30LD); } // End of IF HTTP responded else { Serial.print("Error code: "); Serial.println(httpResponseCode); } // Free resources http.end(); } // End of GetData void setup() { // This resets all the neopixels to an off state strip.Begin(); strip.Show(); delay(500); Serial.begin(9600); Portal.config(config); Serial.println(); Server.on("/", rootPage); if (Portal.begin()) { Serial.println("HTTP server:" + WiFi.localIP().toString()); wifi = "yes"; } pinMode(ONBOARD_LED, OUTPUT); // Set the output for on the onboard LED (if used). pinMode(READDATA, INPUT); // Set the input to trigger function. pinMode(SLEEPSWITCH, INPUT_PULLUP); // sleep pin if(wifi == "yes") { digitalWrite(ONBOARD_LED, LOW); // Normally HIGH but don't want it on GetData(); } } // void setup