//#include <VS1053.h> //https://github.com/baldram/ESP_VS1053_Library
#include <WiFi.h>
#include <HTTPClient.h>
#include <esp_wifi.h>
#include <EEPROM.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define VS1053_CS 32
#define VS1053_DCS 33
#define VS1053_DREQ 35
#define VOLUME 100 // volume level 0-100
#define EEPROM_SIZE 2
long interval = 1000;
int SECONDS_TO_AUTOSAVE = 30;
long seconds = 0;
long previousMillis = 0;
int radioStation = 0;
int previousRadioStation = -1;
const int previousButton = 12;
const int nextButton = 13;
char ssid[] = "Oneplus Nord"; // your network SSID (name)
char pass[] = "viraj1234"; // your network password
// Few Radio Stations
char *host[5] = {"192.144.82.203","198.178.123.17","198.27.83.198", "206.190.133.196", "us2.internet-radio.com"};
char *path[5] = {"/1","/;stream/1","/;stream/1","/","/;stream"};
int port[5] = {8000,11312,5490,7161,8443};
int status = WL_IDLE_STATUS;
WiFiClient client;
uint8_t mp3buff[32]; // vs1053 likes 32 bytes at a time
//VS1053 player(VS1053_CS, VS1053_DCS, VS1053_DREQ);
void IRAM_ATTR previousButtonInterrupt() {
static unsigned long last_interrupt_time = 0;
unsigned long interrupt_time = millis();
if (interrupt_time - last_interrupt_time > 200)
{
if(radioStation>0)
radioStation--;
else
radioStation = 4;
}
last_interrupt_time = interrupt_time;
}
void IRAM_ATTR nextButtonInterrupt() {
static unsigned long last_interrupt_time = 0;
unsigned long interrupt_time = millis();
if (interrupt_time - last_interrupt_time > 200)
{
if(radioStation<5)
radioStation++;
else
radioStation = 0;
}
last_interrupt_time = interrupt_time;
}
void setup () {
Serial.begin(9600);
delay(500);
SPI.begin();
// SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(0, 10);
// Display static text
display.println("Connecting");
display.display();
EEPROM.begin(EEPROM_SIZE);
pinMode(previousButton, INPUT_PULLUP);
pinMode(nextButton, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(previousButton), previousButtonInterrupt, FALLING);
attachInterrupt(digitalPinToInterrupt(nextButton), nextButtonInterrupt, FALLING);
//initMP3Decoder();
connectToWIFI();
//My EEPROM gives a bogus value the first time, so throw it away.
int throwaway = readStationFromEEPROM();
Serial.println("ReadFromEEPROM(): "+String(throwaway));
throwaway = readStationFromEEPROM();
Serial.println("ReadFromEEPROM(): "+String(throwaway));
radioStation = throwaway;
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(0, 0);
// Display static text
display.println(" NET RADIO");
display.setTextSize(1);
display.setTextColor(WHITE, BLACK);
display.setCursor(0, 25);
display.println("Connecting to stream");
display.startscrollleft(0x03, 0x03); //Scroll the bottom line of text
display.display();
}
void loop() {
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval)
{
if(radioStation!=previousRadioStation)
{
station_connect(radioStation);
previousRadioStation = radioStation;
seconds = 0;
}else
{
seconds++;
if(seconds == SECONDS_TO_AUTOSAVE)
{
int readStation = readStationFromEEPROM();
if(readStation!=radioStation)
{
Serial.println("loop(): Saving new station to EEPROM");
writeStationToEEPROM(&radioStation);
}
}
}
previousMillis = currentMillis;
Serial.println("loop(): "+String(seconds) +" "+String(radioStation));
}
//if (client.available() > 0)
//{
//uint8_t bytesread = client.read(mp3buff, 32);
//player.playChunk(mp3buff, bytesread);
//}
}
void station_connect (int station_no ) {
if (client.connect(host[station_no],port[station_no]) ) Serial.println("Connected now");
client.print(String("GET ") + path[station_no] + " HTTP/1.1\r\n" +
"Host: " + host[station_no] + "\r\n" +
"Connection: close\r\n\r\n");
drawRadioStationName(station_no);
}
void connectToWIFI()
{
Serial.print("Connecting to WiFi");
WiFi.begin("Wokwi-GUEST", "", 6);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println(" Connected!");
}
//void initMP3Decoder()
//{
//player.begin();
//player.switchToMp3Mode(); // optional, some boards require this
//player.setVolume(VOLUME);
//}
void drawRadioStationName(int id)
{
String command;
switch (id)
{
case 0: display.setCursor(0, 25); display.println("1940 UK RADIO "); display.display(); break; //1940 UK Radio
case 1: display.setCursor(0, 25); display.println("SWING STREET RADIO "); display.display(); break; //Swing Street
case 2: display.setCursor(0, 25); display.println("WORDRADIO "); display.display(); break; //WordRadio
case 3: display.setCursor(0, 25); display.println("AM600 CONYERS "); display.display(); break; //AM600
case 4: display.setCursor(0, 25); display.println("MEGATON CAFE RADIO "); display.display(); break; //Megaton
}
}
int readStationFromEEPROM()
{
int station;
byte ByteArray[2];
for(int x = 0; x < 2; x++)
{
ByteArray[x] = EEPROM.read(x);
}
memcpy(&station, ByteArray, 2);
Serial.println("readFrequencyFromEEPROM(): "+String(station));
return station;
}
void writeStationToEEPROM(int *freq)
{
byte ByteArray[2];
memcpy(ByteArray, freq, 2);
for(int x = 0; x < 2; x++)
{
EEPROM.write(x, ByteArray[x]);
}
EEPROM.commit();
Serial.println("writeFrequencyFromEEPROM(): "+String(radioStation));
}
void IRAM_ATTR resetModule(){
// ets_printf("reboot\n");
//esp_restart();
}