#include <SPI.h>
#include <WiFi.h>
#include <Wire.h>
#include <I2S.h>
#include <HTTPClient.h>
#include <U8g2lib.h> // U8g2 library for display
const char* stationURLs[] = {
"https://ice2.somafm.com/groovesalad-128-mp3/stream",
"https://ice6.somafm.com/deepspaceone-128-mp3/stream",
"http://sc3.radiocaroline.net:8030/listen.m3u/stream"
};
const char* stationNames[] = {
"1. Groove Salad",
"2. Deep Space",
"3. Radio Caroline"
};
const int forwardButtonPin = 12;
const int backButtonPin = 13;
#define I2S_DATA_PIN 22
#define I2S_BCLK_PIN 19
#define I2S_LRCLK_PIN 23
int forwardButtonState = HIGH;
int lastForwardButtonState = HIGH;
unsigned long lastForwardButtonDebounceTime = 0;
int backButtonState = HIGH;
int lastBackButtonState = HIGH;
unsigned long lastBackButtonDebounceTime = 0;
int currentStationIndex = 0;
int numStations = sizeof(stationURLs) / sizeof(stationURLs[0]);
const int debounceDelay = 10;
U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
TaskHandle_t buttonTaskHandle;
void buttonTask(void *pvParameters) {
(void) pvParameters; // Unused parameter
pinMode(forwardButtonPin, INPUT);
pinMode(backButtonPin, INPUT);
while (1) {
int forwardButtonReading = digitalRead(forwardButtonPin);
int backButtonReading = digitalRead(backButtonPin);
if (forwardButtonReading != lastForwardButtonState) {
lastForwardButtonDebounceTime = millis();
}
if ((millis() - lastForwardButtonDebounceTime) > debounceDelay) {
if (forwardButtonReading != forwardButtonState) {
forwardButtonState = forwardButtonReading;
if (forwardButtonState == LOW) {
currentStationIndex = (currentStationIndex + 1) % numStations;
updateDisplay();
}
}
}
lastForwardButtonState = forwardButtonReading;
if (backButtonReading != lastBackButtonState) {
lastBackButtonDebounceTime = millis();
}
if ((millis() - lastBackButtonDebounceTime) > debounceDelay) {
if (backButtonReading != backButtonState) {
backButtonState = backButtonReading;
if (backButtonState == LOW) {
currentStationIndex = (currentStationIndex - 1 + numStations) % numStations;
updateDisplay();
}
}
}
lastBackButtonState = backButtonReading;
vTaskDelay(pdMS_TO_TICKS(50)); // Button task delay
}
}
void setup() {
Serial.begin(115200);
I2S.begin(I2S_DATA_PIN, I2S_BCLK_PIN, I2S_LRCLK_PIN);
u8g2.begin();
u8g2.setFont(u8g2_font_6x10_tf);
u8g2.firstPage();
do {
u8g2.drawStr(0, 10, "Internet Radio v1");
} while (u8g2.nextPage());
delay(2000);
WiFi.begin("Wokwi-GUEST", "", 6);
while (WiFi.status() != WL_CONNECTED) {
u8g2.firstPage();
do {
u8g2.drawStr(0, 10, "Connecting to WiFi...");
} while (u8g2.nextPage());
delay(2000);
}
u8g2.firstPage();
do {
u8g2.drawStr(0, 10, "Connected to WiFi!");
} while (u8g2.nextPage());
delay(2000);
u8g2.firstPage(); // Clear the display
xTaskCreate(buttonTask, "Button Task", 10000, NULL, 1, &buttonTaskHandle); // Create button task
}
void loop() {
// Nothing to do here, all tasks are managed by FreeRTOS
}
void updateDisplay() {
u8g2.firstPage();
do {
u8g2.drawStr(0, 10, stationNames[currentStationIndex]);
u8g2.drawStr(0, 30, stationURLs[currentStationIndex]);
} while (u8g2.nextPage());
}