// Screen libraries etc. #include #include #include #include #include #include #include #include "bitmaps.h" #include "wifi_credentials.h" // Screen stuff #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels #define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin) #define SCREEN_ADDRESS 0x3C // Button stuff #define BUTTON_PIN D6 #define FRAME_DELAY 80 // Peripherals Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); // App state enum { CONNECTING, SHOWING_DEPARTURES } state = CONNECTING; int frame = 0; int buttonPushed = false; void ICACHE_RAM_ATTR onButtonFalling() { buttonPushed = true; } void setup() { Serial.begin(9600); // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) { Serial.println("SSD1306 allocation failed"); for(;;); // Don't proceed, loop forever } Serial.println("SSD1306 initialized"); display.clearDisplay(); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); pinMode(BUTTON_PIN, INPUT_PULLUP); attachInterrupt(BUTTON_PIN, onButtonFalling, FALLING); display.setTextColor(SSD1306_WHITE); display.setTextSize(1); display.setCursor(0, 0); display.printf("Connecting to\n%s\n", WIFI_SSID); display.display(); /* display.print(" 5 Mannheim sofort\n" "26 Kirchheim 9 min\n" " 5 Weinheim 20:13"); */ } void drawSpinner (int frame) { display.fillRect(120, 56, spinny_dims[0], spinny_dims[1], SSD1306_BLACK); display.drawBitmap(120, 56, spinny[frame % spinny_dims[2]], spinny_dims[0], spinny_dims[1], SSD1306_WHITE); } void loop() { switch (state) { case CONNECTING: { if (WiFi.status() != WL_CONNECTED) { drawSpinner(frame++); display.display(); delay(FRAME_DELAY); return; } display.clearDisplay(); display.setCursor(0, 0); display.print("Connected!\nRequesting departures"); display.display(); std::unique_ptr https(new BearSSL::WiFiClientSecure); https->setInsecure(); HTTPClient client; if (!client.begin(*https, "vrnp.beany.club", 443, "/departures?stop_id=de:08221:1225&platform=A")) { display.clearDisplay(); display.setCursor(0, 0); display.print("begin failed"); display.display(); for (;;); return; } client.addHeader("Authorization", AUTH_TOKEN); int statusCode = client.GET(); if (statusCode != 200) { display.clearDisplay(); display.setCursor(0, 0); display.printf("http non-ok: %d\n", statusCode); display.display(); for (;;); return; } display.clearDisplay(); display.setCursor(0, 0); display.print(client.getString()); display.display(); state = SHOWING_DEPARTURES; delay(FRAME_DELAY); return; } case SHOWING_DEPARTURES: if (WiFi.status() != WL_CONNECTED) { state = CONNECTING; return; } if (buttonPushed) { buttonPushed = false; delay(FRAME_DELAY); return; } delay(FRAME_DELAY); return; } }