Frage zu digitaler Anzeige

Hallo zusammen,
hab gestern die TonUINO-Box und das Forum hier entdeckt und bin echt begeistert.

Da noch nicht alle Bauteile da sind, ich aber zu Hause noch einen Arduino Uno rumfliegen hatte mit diversen Teilen dazu, hab ich mich direkt an eine kleine Erweiterung gemacht.

Mit Hilfe einer 8x8 LED-Matrix… (so sieht die aus:)

…habe ich ein kleines Programm geschrieben, dass bei den verschiedenen Lautstärkestufen in Form einer größer werdenden Pyramide die Lautstärke anzeigt.
Das Programm funktioniert auch gut, leider bin ich nicht versiert genug, um zu entscheiden, an welcher Stelle ich das in die 1800 Zeilen Code einfügen muss.
Vielleicht könnte mir hier jemand weiterhelfen.
(Die Variable volume habe ich in meinem Programm nur testhalber festgelegt, der Wert wird dann natürlich übernommen)

Hier mein kleines Programm, das man sicher gesehen haben muss, um die Frage zu beantworten. Gerne auch zum weiterbenutzen!

#include "LedControl.h"


  int volume = 10;
/*
 
 pin 12 is connected to the DataIn 
 pin 11 is connected to LOAD(CS)
 pin 10 is connected to the CLK 
 We have only a single MAX72XX.
 */
LedControl lc=LedControl(12,10,11,1);

/* we always wait a bit between updates of the display */
unsigned long delaytime1=1000;
unsigned long delaytime2=50;
void setup() {
  /*
   The MAX72XX is in power-saving mode on startup,
   we have to do a wakeup call
   */
  lc.shutdown(0,false);
  /* Set the brightness to a medium values */
  lc.setIntensity(0,8);
  /* and clear the display */
  lc.clearDisplay(0);
}

void volumeIsOne()  {
  
  byte a[8]={B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000001};
   
  lc.setRow(0,0,a[0]);
  lc.setRow(0,1,a[1]);
  lc.setRow(0,2,a[2]);
  lc.setRow(0,3,a[3]);
  lc.setRow(0,4,a[4]);
  lc.setRow(0,5,a[5]);
  lc.setRow(0,6,a[6]);
  lc.setRow(0,7,a[7]);
}

void volumeIsTwo()  {
  
  byte a[8]={B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000011,B00000001};
   
  lc.setRow(0,0,a[0]);
  lc.setRow(0,1,a[1]);
  lc.setRow(0,2,a[2]);
  lc.setRow(0,3,a[3]);
  lc.setRow(0,4,a[4]);
  lc.setRow(0,5,a[5]);
  lc.setRow(0,6,a[6]);
  lc.setRow(0,7,a[7]);
}

void volumeIsThree()  {
  
  byte a[8]={B00000000,B00000000,B00000000,B00000000,B00000000,B00000111,B00000011,B00000001};
   
  lc.setRow(0,0,a[0]);
  lc.setRow(0,1,a[1]);
  lc.setRow(0,2,a[2]);
  lc.setRow(0,3,a[3]);
  lc.setRow(0,4,a[4]);
  lc.setRow(0,5,a[5]);
  lc.setRow(0,6,a[6]);
  lc.setRow(0,7,a[7]);
}

void volumeIsFour()  {
  
  byte a[8]={B00000000,B00000000,B00000000,B00000000,B00001111,B00000111,B00000011,B00000001};
   
  lc.setRow(0,0,a[0]);
  lc.setRow(0,1,a[1]);
  lc.setRow(0,2,a[2]);
  lc.setRow(0,3,a[3]);
  lc.setRow(0,4,a[4]);
  lc.setRow(0,5,a[5]);
  lc.setRow(0,6,a[6]);
  lc.setRow(0,7,a[7]);
}

void volumeIsFive()  {
  
  byte a[8]={B00000000,B00000000,B00000000,B00011111,B00001111,B00000111,B00000011,B00000001};
   
  lc.setRow(0,0,a[0]);
  lc.setRow(0,1,a[1]);
  lc.setRow(0,2,a[2]);
  lc.setRow(0,3,a[3]);
  lc.setRow(0,4,a[4]);
  lc.setRow(0,5,a[5]);
  lc.setRow(0,6,a[6]);
  lc.setRow(0,7,a[7]);
}

void volumeIsSix()  {
  
  byte a[8]={B00000000,B00000000,B00111111,B00011111,B00001111,B00000111,B00000011,B00000001};
   
  lc.setRow(0,0,a[0]);
  lc.setRow(0,1,a[1]);
  lc.setRow(0,2,a[2]);
  lc.setRow(0,3,a[3]);
  lc.setRow(0,4,a[4]);
  lc.setRow(0,5,a[5]);
  lc.setRow(0,6,a[6]);
  lc.setRow(0,7,a[7]);
}

void volumeIsSeven()  {
  
  byte a[8]={B00000000,B01111111,B00111111,B00011111,B00001111,B00000111,B00000011,B00000001};
   
  lc.setRow(0,0,a[0]);
  lc.setRow(0,1,a[1]);
  lc.setRow(0,2,a[2]);
  lc.setRow(0,3,a[3]);
  lc.setRow(0,4,a[4]);
  lc.setRow(0,5,a[5]);
  lc.setRow(0,6,a[6]);
  lc.setRow(0,7,a[7]);
}

void volumeIsEight()  {
  
  byte a[8]={B11111111,B01111111,B00111111,B00011111,B00001111,B00000111,B00000011,B00000001};
   
  lc.setRow(0,0,a[0]);
  lc.setRow(0,1,a[1]);
  lc.setRow(0,2,a[2]);
  lc.setRow(0,3,a[3]);
  lc.setRow(0,4,a[4]);
  lc.setRow(0,5,a[5]);
  lc.setRow(0,6,a[6]);
  lc.setRow(0,7,a[7]);
}

void loop() { 
  if (volume >=25)  {
    volumeIsEight();
  }
  else if (volume >=22)  {
    volumeIsSeven();
  }
  else if (volume >=19)  {
    volumeIsSix();
  }
  else if (volume >=16)  {
    volumeIsFive();
  }
  else if (volume >=13)  {
    volumeIsFour();
  }
  else if (volume >=10)  {
    volumeIsThree();
  }
  else if (volume >=7)  {
    volumeIsTwo();
  }
  else {
    volumeIsOne();
  }
  
  
}

Vielen Dank schonmal im Vorraus :slight_smile:

Ich hatte sowas in meiner FW auch mal drin. Musste dann aus Platzgründen wichtigeren Funktionen weichen.

Ist das mit i2c angebunden? Da als Tip: Programmiere das so, daß es nicht ständig neu aktualisiert wird sondern nur wenn sich die Lautstärke ändert. Ich hatte bei mir massive Probleme mit Störgeräuschen.

Voll cool. Muss mir so eine Matrix mal bestellen.
Ich experimeniere gerade mit einem SSD1306 128x32 Display.
Da zeigts halt den Track und die Lautstärke als Zahl an.
Da find ich deins aber besser und sinnvoller (für die kleinen)

Versuche das bei Gelegenheit mal einzubauen. Danke für den Code.

Hi.
Bin neu hier und gerade über diesen Beitrag bei der Suche nach einer visuellen Darstellung der Lautstärke (LEDs) gestolpert. Wollte deshalb mal fragen, ob es wie es mit euren Erfahrungen aussieht.

Ich mache das (in meinem Fork-Projekt) mit einem Neopixel, also im Kreis angeordnete LEDs. Und ich muss sagen: Es ist mit das Geilste am ganzen Projekt. Ich visualisiere damit die Lautstärke (bei 50% Lautstärke leuchten z.B. die Hälfte der LEDs in einem Farbgradient von grün nach rot), den Trackfortschritt, Playlistfortschritt, zeige an, wenn der Tonuino „fertig“ ist, quittiere Aktionen (ok => grün; Fehler => rot)… lauter so Sachen. Kurz gesagt: Ich nutze das immer zum Anzeigen von Informationen und nie einfach nur als Selbstzweck.

Halte das Konzept, speziell für Kinder, die noch nicht lesen können, für total eingängig und würde keinen Tonuino ohne Neopixel bauen.

Aber du machst es ja mit einem ESP und keinem Arduino, oder?

Fürs den ESP wirds genauso mit dem Arduino-Framework entwickelt und es gibt hier auch im Originalprojekt Leute, die mit dem einem Neopixel arbeiten. Ergo: Das ist nix, was nur deswegen geht, weil’s ein ESP ist.

Schon klar, aber dein Fork kann nicht 1:1 verwendet werden :wink:

Das stimmt, aber für mich sieht die Frage eher konzeptionell aus.

Stimmt auch wieder :see_no_evil:

Nicht nur deswegen, aber es geht deswegen deutlich einfacher. Weil der ESP mehr Hub hat. Der Arduino kommt doch recht schnell an seine Grenzen und das deaktivieren der Interrupts (was z.B. FastLED und viele andere Libraries auch machen um das 800khz Timing einzuhalten) sorgt, wenn man nicht aufpasst, schnell dafür das z.B. die SoftwareSerial Daten verpasst, interne Counter (z.B. für millis()) driften usw. usw.
Was schon geht sind buttons Staus abhängig zu beleuchten usw. aber mit aufwendigen Animationen die oft refresht werden müssen handelt man sich oft Probleme ein. Das nur zur Info. Nicht falsch verstehen ich mag LEDs total, mein Fork hats ja auch drin, aber man muss schon aufpassen.

Also es ist tatsächlich auch auf dem ESP so, dass aufwändige Animationen Probleme bereiten. Der hat natürlich wesentlich mehr „von allem“ als ein Nano, allerdings mache ich die Dekodierung der Musik ja auch direkt im ESP und das ist sehr zeitkritisch. Praktisch ist auf einem ESP halt, dass man mit Tasks arbeiten kann und sich um das Scheduling unterschiedlicher Dinge nicht so sehr kümmern muss. Aber ja, ich gebe zu, dass ich das auf einem Nano nie gemacht habe. Ich kann nur sagen, dass es auf einem ESP auch kein Selbstläufer ist :slight_smile:

Ich hatte ursprünglich gar nicht vor, einen Neopixel zu verwenden (Faulheit). Habe dann irgendwann die Marabox hier gesehen und dachte mir: Ach das ist ja doch ganz schick. Bin dann auf die Festled-Lib gestossen und habe mal mit den Beispielen (aufwändige Animationen) rumgespielt. Dabei habe ich gemerkt, dass das vorne und hinten nicht passt (Musik knackte). Also bin ich dann zu den Statusanzeigen übergegangen (wie oben beschrieben) und da halten sich die Aktualisierungen ja echt in Grenzen. Bin auch super zufrieden damit.

Wie auch immer, um wieder zur Kernfrage zurückzukehren: Man kann mit Neopixel & Co wirklich schöne Sachen machen. Aber als Programmierer ist das auf jeden Fall mit reichlich Tests verbunden :slight_smile: