16.08.2017, 11:54
(Dieser Beitrag wurde zuletzt bearbeitet: 16.08.2017, 15:04 von Bernhard45.)
Hallo Bernd,
ich habe jetzt deinen Drehencoder nach Beispiel des Datenblatts in das Testprogramm eingebaut.
Die Verbindung des Encoders ist wie folgt:
Encoder_Pin_A (CLK) auf ESP-Pin 36
Encoder_Pin_B (DT) auf ESP-Pin 39
Encoder_Pin_C (GND) auf ESP-Pin GND (gemeinsamer Massepunkt)
Zusätzlich musst du von ESP-Pin 36 ein Widerstand (10k-20k) auf 3.3V des ESP32 legen. Ebenso ESP-Pin 39 über einen Widerstand auf 3.3V des ESP32, geht am Steckbrett ja leicht. Soll ich es skizzieren oder kannst Du es im Datenblatt erkennen?
Wie immer musst Du noch deine WLAN-Zugangsdaten eingeben und ggf. die Adresse und Auflösung des Displays ändern, aber das kennst Du ja schon (siehe #defines). Damit solltest Du wenigstens ein Internet-Radio "light" haben und kannst die Schaltung in ein Gehäuse einbauen. Wenn Du dir das passende Grundwissen in C/C++/Arduino angelesen hast, kannst Du das Testprogramm dann erweitern (mehr Displaydaten, einen richtigen FIFO-Empfangspuffer -ein paar Kbyte sind okay-, Playlistformate unterstützen, andere Ports als den 80 zulassen,richtige Programmliste im Flash und vielleicht eine Konfiguration und Steuerung über einen Webbrowser...) und zu einer richtigen Firmware umbauen (oder du flasht dann meine Firmware in den Controller).
Viele Bastlergrüße
Bernhard
ich habe jetzt deinen Drehencoder nach Beispiel des Datenblatts in das Testprogramm eingebaut.
Die Verbindung des Encoders ist wie folgt:
Encoder_Pin_A (CLK) auf ESP-Pin 36
Encoder_Pin_B (DT) auf ESP-Pin 39
Encoder_Pin_C (GND) auf ESP-Pin GND (gemeinsamer Massepunkt)
Zusätzlich musst du von ESP-Pin 36 ein Widerstand (10k-20k) auf 3.3V des ESP32 legen. Ebenso ESP-Pin 39 über einen Widerstand auf 3.3V des ESP32, geht am Steckbrett ja leicht. Soll ich es skizzieren oder kannst Du es im Datenblatt erkennen?
Code:
// Bibliotheken einbinden
#include <WiFiClient.h>
#include <WiFi.h>
#include <Adafruit_VS1053.h>
#include <LiquidCrystal_I2C.h>
#include "Programmliste.h"
#include <TaskScheduler.h>
Scheduler ts;
// Deklaration der Funktionen die im Scheduler ablaufen sollen
void Task_Drehencoder();
void Task_Umschaltung();
Task task_Drehencoder(1, TASK_FOREVER, &Task_Drehencoder);
Task task_Programmumschaltung(1000, TASK_FOREVER, &Task_Umschaltung);
// Zugangsdaten zum WLAN
char* ssid = "xxx";
const char* password = "xxx";
// Webstream DLF: http://st01.dlf.de/dlf/01/56/ogg/stream.ogg
char* programmname;
char* hostrechner = "st01.dlf.de";
char* pfad = "/dlf/01/56/ogg/stream.ogg";
int httpPort = 80;
// Anschlussschema des VS1053-DSP
#define VS1053_CS 17 // VS1053 Chip Select Pin
#define VS1053_DCS 16 // VS1053 Data/Command Select Pin
#define VS1053_DREQ 34 // VS1053 Data request
#define VS1053_MOSI 25 // VS1053 MOSI
#define VS1053_MISO 26 // VS1053 MISO
#define VS1053_CLK 32 // VS1053 Clock Pin
#define VS1053_RESET 27 // VS1053 reset pin (-1 unbelegt)
// LCD
#define DISPLAY_SDA_PIN 21
#define DISPLAY_SCL_PIN 22
#define DISPLAY_X 16
#define DISPLAY_Y 2
#define DISPLAY_I2C_ADRESSE 0x27
//#define DISPLAY_I2C_ADRESSE 0x3f
// Dreh-Encoder
#define pinA 36
#define pinB 39
int encoderPosCount = 0;
int pinALast;
int aVal;
// LCD
LiquidCrystal_I2C lcd(DISPLAY_I2C_ADRESSE, DISPLAY_X, DISPLAY_Y);
// Dekoderinstanz erstellen
Adafruit_VS1053 VS1053Dekoder = Adafruit_VS1053(VS1053_MOSI, VS1053_MISO, VS1053_CLK, VS1053_RESET, VS1053_CS, VS1053_DCS, VS1053_DREQ);
// MP3 Datenpuffer
uint8_t mp3buff[32];
// Einen WiFi-Client für HTTP/TCP-Verbindungen erstellen
WiFiClient client;
// Aktuell eingeschaltetes Programm
int iProgrammnummer = 0;
void setup() {
Serial.begin(115200); // Serielle Console für Fehlersuche
lese_Programmliste();
if (stationen[iProgrammnummer] != NULL) {
programmname = stationen[iProgrammnummer]->get_Programmname();
hostrechner = stationen[iProgrammnummer]->get_Host();
pfad = stationen[iProgrammnummer]->get_Pfad();
}
Wire.begin(DISPLAY_SDA_PIN, DISPLAY_SCL_PIN);
lcd.begin(DISPLAY_X, DISPLAY_Y);
lcd.init();
lcd.backlight();
if (! VS1053Dekoder.begin())
{ // initialisiere VS1053-Dekoder
Serial.println(F("Kein VS1053-DSP-Dekoder gefunden"));
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("BOOT: VS1053 FAIL");
while (1) delay(10);
}
Serial.println(F("VS1053-DSP-Dekoder gefunden"));
// Einstellung Standardlaustärke (links, rechts)
VS1053Dekoder.setVolume(7, 7);
// WIFI-Client initialisieren
Serial.print("Verbinde mit Netzwerk-SSID "); Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("BOOT: WLAN...");
}
Serial.print("WIFI-Verbindung hergestellt. ");
Serial.println("IP-Adresse: "); Serial.println(WiFi.localIP());
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("BOOT: WLAN OK");
lcd.setCursor(0, 1);
lcd.print(WiFi.localIP());
delay(3000);
Serial.print("Verbinde zum Audiostream: "); Serial.println(hostrechner);
if (!client.connect(hostrechner, httpPort)) {
Serial.println("Verbindung fehlgeschlagen!");
return;
}
// URI zur Anfrage erzeugen
Serial.print("Verbindung steht, stelle Anfrage-URL: ");
Serial.println(pfad);
client.print(String("GET ") + pfad + " HTTP/1.1\r\n" +
"Host: " + hostrechner + "\r\n" +
"Connection: close\r\n\r\n");
pinMode (pinA, INPUT);
pinMode (pinB, INPUT);
pinALast = digitalRead(pinA);
ts.init(); // der ThreadScheduler wird initialisiert
ts.addTask(task_Drehencoder);
ts.addTask(task_Programmumschaltung);
task_Drehencoder.enable();
task_Programmumschaltung.enable();
UpdateDisplay();
}
void loop() {
ts.execute();
// DSP für weitere Daten bereit?
if (VS1053Dekoder.readyForData()) {
if (client.available() > 0) {
// Datenpuffer füllen
uint8_t bytesread = client.read(mp3buff, 32);
// und zum Dekoder schicken
VS1053Dekoder.playData(mp3buff, bytesread);
}
}
}
void UpdateDisplay() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("P"); lcd.print(iProgrammnummer); lcd.print(" ");
lcd.print(programmname);
}
void Task_Umschaltung() {
if (iProgrammnummer != encoderPosCount) {
if (stationen[encoderPosCount] != NULL) {
iProgrammnummer = encoderPosCount;
programmname = stationen[iProgrammnummer]->get_Programmname();
hostrechner = stationen[iProgrammnummer]->get_Host();
pfad = stationen[iProgrammnummer]->get_Pfad();
Serial.print("Kanalwechsel, neuer Stream:"); Serial.print(hostrechner); Serial.println(pfad);
if (!client.connect(hostrechner, httpPort)) {
Serial.println("Verbindung fehlgeschlagen!");
return;
}
Serial.println("Verbindungswechsel... VS1053-Reset ... ");
VS1053Dekoder.reset(); // für schnellere Neudekodierung
VS1053Dekoder.setVolume(7, 7);
client.print(String("GET ") + pfad + " HTTP/1.1\r\n" +
"Host: " + hostrechner + "\r\n" +
"Connection: close\r\n\r\n");
UpdateDisplay();
}
}
}
void Task_Drehencoder() {
aVal = digitalRead(pinA);
if ((pinALast == LOW) && (aVal == HIGH)) {
if (digitalRead(pinB) == LOW) {
if (encoderPosCount == 0)
encoderPosCount = MAXPROG;
encoderPosCount--;
Serial.print("runterschalten:");
} else {
if (encoderPosCount > MAXPROG - 2)
encoderPosCount = -1;
encoderPosCount++;
Serial.print("hochschalten:");
}
Serial.println(encoderPosCount);
}
pinALast = aVal;
}
Wie immer musst Du noch deine WLAN-Zugangsdaten eingeben und ggf. die Adresse und Auflösung des Displays ändern, aber das kennst Du ja schon (siehe #defines). Damit solltest Du wenigstens ein Internet-Radio "light" haben und kannst die Schaltung in ein Gehäuse einbauen. Wenn Du dir das passende Grundwissen in C/C++/Arduino angelesen hast, kannst Du das Testprogramm dann erweitern (mehr Displaydaten, einen richtigen FIFO-Empfangspuffer -ein paar Kbyte sind okay-, Playlistformate unterstützen, andere Ports als den 80 zulassen,richtige Programmliste im Flash und vielleicht eine Konfiguration und Steuerung über einen Webbrowser...) und zu einer richtigen Firmware umbauen (oder du flasht dann meine Firmware in den Controller).
Viele Bastlergrüße
Bernhard
Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung.
Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")
Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")