ESP32 Web Radio VS1053 - touch-"buttons" funktionieren nur so halb

Hallo zusammen,

da mir letztens in diesem Forum so toll weitergeholfen wurde, versuche ich es nun noch einmal mit einem anderen Anliegen :slight_smile:

Ich habe aus Teilen, die ich sowieso noch √ľbrig hatte, ein kleines Webradio gebastelt. Und zwar im Prinzip nach dieser Vorlage: http://educ8s.tv/esp32-internet-radio/
Allerdings ohne den Verst√§rker, einem anderen Display (SSD1306) und statt den Kn√∂pfen m√∂chte ich touch-Sensoren der touch-pins des esp32 nutzen. (F√ľr n√§chster Sender - letzter Sender, also vor - zur√ľck)
Das funktioniert auch schon PRINZIPIELL.
Also es gibt da zwei Probleme.
1.) Wenn ich ein am Touch Pin befestigtes Kabel ber√ľhre, wird das offenbar detektiert, das Display spring einen Sender weiter. Aber meist (oder immer?!) muss ich ihn mehrfach ber√ľhren, damit auch der Sender wechselt.
2.) Das Teil st√ľrzt mir regelm√§√üig ab beim Ber√ľhren der Touch Pins. Nicht immer, aber oft. Vielleicht muss das irgendwas softwaretechnisch ‚Äúentprellt‚ÄĚ werden oder so? Ich kenne mich leider nicht so gut aus.

Im Anhang ist die Fehlermeldung beim Absturz und die ino-Datei.

#include <VS1053.h>  //https://github.com/baldram/ESP_VS1053_Library
#include <WiFi.h>
#include <esp_wifi.h>
#include <EEPROM.h>
#include <SPI.h>
#include <Wire.h>
#include <U8g2lib.h>

// pin definitions vs-player

#define VS1053_CS    32 
#define VS1053_DCS   33  
#define VS1053_DREQ  34 

#define VOLUME  85 // 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 = 36;
const int nextButton = 39;

char ssid[] = "meinessid";            //  your network SSID (name) 
char pass[] = "meinpasswort";       // your network password

U8G2_SSD1306_128X64_NONAME_1_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 22, /* data=*/ 21, /* cs=*/ 5, /* dc=*/ 17, /* reset=*/ 16);

// Few Radio Stations


char *stationname[4] = {"UK 1940s Radio","Kosmos Radio","realfm.live24", "secure1.live24"};
char *host[4] = {"149.255.59.162","radiostreaming.ert.gr","realfm.live24.gr", "secure1.live24.gr"};
char *path[4] = {"/1","/ert-kosmos","/realfm","/skai1003"};
int   port[4] = {8062,80,80,80};

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() {

   if(radioStation>0)
    radioStation--;
    else
    radioStation = 3;
}

void IRAM_ATTR nextButtonInterrupt() {

   if(radioStation<4)
    radioStation++;
    else
    radioStation = 0;
}



void setup () {

  Serial.begin(9600);
  delay(1000); // give me time to bring up serial monitor
 // touchAttachInterrupt(T2, gotTouch, threshold);
 // touchAttachInterrupt(T3, gotTouch1, threshold);
   SPI.begin();
     delay(500);
 
  
   EEPROM.begin(EEPROM_SIZE);

   pinMode(previousButton, INPUT_PULLUP);
   pinMode(nextButton, INPUT_PULLUP);

   attachInterrupt(digitalPinToInterrupt(previousButton), previousButtonInterrupt, CHANGE);  //war auf falling
   attachInterrupt(digitalPinToInterrupt(nextButton), nextButtonInterrupt, CHANGE);          //war auf falling
   
  Serial.println("decoder initialisieren");
  initMP3Decoder();
 Serial.println("decoder initialisiert");
  Serial.println("wlan initialisieren");
  connectToWIFI(); 
  Serial.println("wlan initialisiert");

}

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));  
    Serial.print(VOLUME);  
  } 
     
      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 to"); 
    Serial.println (stationname[station_no]);
    client.print(String("GET ") + path[station_no] + " HTTP/1.1\r\n" +
               "Host: " + host[station_no] + "\r\n" + 
               "Connection: close\r\n\r\n");   
    Serial.println("OLED begin");
    u8g2.begin();
  u8g2.setFont(u8g2_font_ncenB10_tr);
  u8g2.firstPage();
  do {
    u8g2.setCursor(0, 10);
    u8g2.print(F("es spielt:"));
    u8g2.setCursor(0, 40);
    u8g2.print(stationname[station_no]);
    u8g2.setCursor(0, 60);
    u8g2.print("Lautstaerke: ");
    u8g2.println(VOLUME);
  } while ( u8g2.nextPage() );

Serial.println("OLED end");
  }

  void connectToWIFI()
  {
    WiFi.begin(ssid, pass);
    delay(1000);
      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
   }
   Serial.println("WiFi connected");
  }

  void initMP3Decoder()
  {
    player.begin();
    player.switchToMp3Mode(); // optional, some boards require this
    player.setVolume(VOLUME);
  }

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();
}

Vielen Dank allen, die sich die Zeit nehmen es auch nur anzuschauen.
Danke!

ESP32_Web_Radio_v3_forum.ino (5.02 KB)

Dann setze deinen Sketch bitte in Code-Tags und nicht in Quote-Tags, dann ist der Punkt auch weg und der Sketch richtig lesbar.

Danke Dieter! :-)

Offensichtlich gibt es Probleme mit den Touchpins. Ich habe bisher auch noch nicht damit gearbeitet. Setze doch erst mal normale Taster ein, um die Grundfunktionen zum Laufen zu bekommen. Touchfunktionen kannst du später doch immer noch einsetzen, notfalls mit richtigen Sensoren.

professionelle Touch-Sensoren treiben so einigen Aufwand um eine sichere Funktion zu gew√§hrleisten. Deswegen kostet alleine der Sensor in Profiausf√ľhrung 50 Euro. Espressif hat die Touchfunktion auf dem Chip mit integriert. Die Touch-Eing√§nge sind extrem hochohmig. Das bedeutet sie sind f√ľr alle elektromagnetischen Wellen sensibel und da den richtigen Mittelweg zwischen empfindlich genug den Touch zu detektieren und m√∂glichst unempfindlich gegen sonstige Einfl√ľsse ist nicht ganz so einfach. Kann man denn den threshold-Wert ver√§ndern? Hast du mal analysiert was da f√ľr Werte von den Pins ankommen?

viele Gr√ľ√üe Stefan

ok. aber das Problem ist ja nicht, dass mein touch nicht detektiert werden w√ľrde. Das Problem ist ja, warum st√ľrzt er manchmal dabei ab und vor allem, warum schaltet er beim ersten touch in jedem Fall mein Display auf den n√§chsten Sender, den Stream wechselt er aber fast nie beim ersten touchen sonder meist beim zweiten Ber√ľhren. Da sollte das Problem doch eher woanders im Code sein?

Hi

Wenn Du nicht Alles, was bei einer Ber√ľhrung durchgef√ľhrt werden soll auch durchf√ľhrst - warum sollte sich Alles √§ndern, wenn Du Das doch gar nicht veranlasst?

Wenn die Ber√ľhrungen zweifelsfrei erkannt werden, hast Du irgend wo anders einen Bock geschossen.

MfG

crazysky:
‚ĶDas Problem ist ja, warum st√ľrzt er manchmal dabei ab‚Ķ

Und warum gehst du nicht erst mal sytematisch vor und probierst, ob es mit normalen Tastern geht ?

Und warum er machmal abst√ľrzt, wurde dir auch schon erkl√§rt.

Da wir deinen Aufbau nicht haben, können wir auch nur vermuten.

Im Nachbarforum wirst du vermutlich ähnliche, wenn nicht sogar die gleichen Antworten bekommen.

postmaster-ino: Wenn die Ber√ľhrungen zweifelsfrei erkannt werden, hast Du irgend wo anders einen Bock geschossen.

Ja genau. Und weil ich zu doof bin, diesen Bock zu finden, schreibe ich hier ja. :-/

HotSystems:
Und warum gehst du nicht erst mal sytematisch vor und probierst, ob es mit normalen Tastern geht ?

Und warum er machmal abst√ľrzt, wurde dir auch schon erkl√§rt.

Da wir deinen Aufbau nicht haben, können wir auch nur vermuten.

Oh, dann habe ich die Absturz Thematik irgendwie √ľberlesen.
Ich habe nun normale Taster mit entsprechenden Widerständen montiert.
Alles bleibt wie bei den Touch Sensoren. Es bringt also keine Besserung.
Somit sollte der Fehler vielleicht einfach im Code sein und vielleicht erkennt ihn ja jemand.

Moko: Im Nachbarforum wirst du vermutlich ähnliche, wenn nicht sogar die gleichen Antworten bekommen.

Vielleicht sollte ich es im englischen Teil Posten?

Wenn du seriellen Output an mehreren Stellen einf√ľgst kannst du im seriellen Monitor mitverfolgen wann der Absturz auftritt.

Serial.println("direkt vor Befehl1 ");
Befehl1;
Serial.println("direkt vnachr Befehl1 ");

einf√ľgen ist einfach nur Flei√üarbeit.

Du hast die Wahl zwischen weiter auf den Code zu starren und zu denken "m√ľsste doch laufen!" oder du f√§ngst an und f√ľgst seriellen Debug-Output hinzu

Die anderen haben deine ganz spezielle Hardware nicht und können es nicht nachbauen. Du solltest wenigstens die Stelle wann der Absturz auftritt durch den seriellen Debug-output eingrenzen können.

Durch den seriellen Debug-output werden dir vermutlich noch weitere Sachen auffallen.

viele Gr√ľ√üe Stefan

Danke Stefan,

Das werde ich versuchen!!! Danke, dass du als einziger hier tats√§chlich bem√ľhte und sinnvolle Antworten schreibst. Vielen Dank!

Hallo Stefan,

mit der von dir beschriebenen Methode ist es mir gelungen, den (einfachen) Fehler f√ľr die Abst√ľrze zu finden.

In dem Teil, in dem ich per Button-Druck einen Sender hochschalte, bis der vierte Sender erreicht ist und dann wieder beim ersten beginnen möchte, stimmte die Anzahl nicht.

 if(radioStation<4){
    radioStation++;

da er ja bei 0 anfängt zu zählen, darf da nicht 4 stehen sondern es muss eine 3 sein.

 if(radioStation<3){
    radioStation++;

Das Problem mit dem ‚ÄúDisplay schaltet‚ÄĚ, Sender nicht, ist irgendwie verschwunden, als ich mal andere PINs am lolin verwendet habe :-/

Damit scheinen zunächst ja einmal alle meine Probleme gelöst! Vielen Dank!

Ich hoffe, die Foren-Polizei ist auch k√ľnftig wieder umsichtig mit mir und gibt mir genauso gute Tipps. Auch wenn sie noch so simpel erscheinen m√∂gen.

mfg