Bitte um Hilfe: Signale aus Schieberegister 74HC165 nutzen

Disclaimer:
Ich hoffe die Kategorie ist richtig gewählt? Fiel mir nicht leicht eine auszuwählen :slight_smile:
Zudem: Ich bin Anfänger, ich kann nicht programmieren und stelle mir meist Code aus verschiedenen Tutorials zusammen. Hier komme ich aber nicht weiter :frowning:

Ich möchte einen Adventskalender bauen und benötige 24 Buttons die 24 verschiedene mp3's auf dem MP3 TF 16p abspielen, die Musik soll nach Ende des Liedes nicht zum nächsten Lied springen.

Ich habe das Schieberegister 74HC165 gewählt um die Inputs zu erhöhen.
Dieses liest auch brav meine Buttons aus:
(Auszug Serieller Monitor, zZ erst ein Register eingebaut)
Button Position: 0
Button Value: 1
Button Position: 1
Button Value: 1
Button Position: 2
Button Value: 1
Button Position: 3
Button Value: 1
Button Position: 4
Button Value: 1
Button Position: 5
Button Value: 1
Button Position: 6
Button Value: 1
Button Position: 7
Button Value: 0
dataIn DEC: 127
dataIn BIN: 1111111
1111111

Es gelingt mir jedoch nicht, diese Signale in Befehle an das mp3-Modul umzuwandeln.
Am liebsten wäre mir so etwas wie:
if data == 11111111 { mp3_play(1);}
usw.

oder auch
if dataln DEC == 127 {mp3_play(1); }
usw.

Geht das irgendwie? Ich bin für jede Hilfe sehr sehr dankbar!! :slight_smile:
Hier der Code, meine Fehlversuche habe ich gelöscht, die erspare ich euch :wink:

#include <DFMiniMp3.h>
#include <DfMp3Types.h>
#include <Mp3ChipBase.h>
#include <Mp3ChipIncongruousNoAck.h>
#include <Mp3ChipMH2024K16SS.h>
#include <Mp3ChipOriginal.h>

#include <SoftwareSerial.h>
#include <DFPlayer_Mini_Mp3.h>





int ioSelect = 2;
int clockPulse = 3;
int dataOut = 4;
int LED = 5;

int j;
int value;

byte switchVar = 0;




void setup() {

  pinMode(ioSelect, OUTPUT);
  pinMode (clockPulse, OUTPUT);
  pinMode (dataOut, INPUT);
  pinMode (LED, OUTPUT);

  Serial.begin(9600);
  mp3_set_serial(Serial);
  
  



  digitalWrite(LED, HIGH);
  delay(100);
  digitalWrite(LED, LOW);
  delay(100);
  // Nur ein zustätzliches Startsignal...

}

void loop() {

  byte dataIn = 0;
  digitalWrite(ioSelect, 0);
  digitalWrite(clockPulse, 0);
  digitalWrite(clockPulse, 1);
  digitalWrite(ioSelect, 1);


  for (j = 0; j < 8; j++) {

    value = digitalRead(dataOut);
    Serial.print("Button Position: ");
    Serial.println(j);
    Serial.print("Button Value: ");
    Serial.println(value);
    if (value) {
      int a = (1 << j);
      dataIn = dataIn | a;
    }
    digitalWrite(clockPulse, LOW);
    digitalWrite(clockPulse, HIGH);
  }


  if (switchVar != dataIn)
  {
    switchVar = dataIn;
    Serial.print("dataIn DEC: ");
    Serial.print(dataIn, DEC);
    Serial.println();
    Serial.print("dataIn BIN: ");
    Serial.print(dataIn, BIN);
    Serial.println();

  }
  Serial.print(byte(dataIn), BIN);



  delay(5000);

}

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden.
Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.
mfg ein Moderator.

wenn du einen vergleich mit einer binären Darstellung willst, musst du auch dazu schreiben, dass es binär ist.

if (data == 0b11111111) { mp3_play(1);}

:hugs:

Danke danke danke!!! Funktioniert!!!

Ich habe mich gestern bis 3 Uhr morgens gequält :smiley:

bevor du das nun 24 mal hinschreibst wäre ein
Switch Case

oder vieleicht ein Array die bessere Lösung.

übrigens kannst du einen Beitrag in deinem Thread als Lösung markieren.

Dankeschön!Mir brummt schon der Kopf, daher entscheide mich für die
"Whatever works!" Variante, dafür bin ich gerne fleissig und schreibe es 24 Mal :smiley:

Kucke mir das Switch Case aber später nochmal an!

Das wird Dir aber niemand lesen wollen falls Du mal Hilfe brauchst weil der Sketch nicht funtioniert.

Ich gebe zu, das ist natürlich auch ein gutes Argument :thinking:

Jedenfalls nochmal vielen Dank für Eure Hilfe!!

Und einen schönen Sonntag an alle!

Schönen Sonntag

Hallo nochmal,

mit zwei Schieberegistern hat es super geklappt, Button 1 - 16 funktionierten.
Ich hatte die Zeile
byte dataIn = 0;
durch
unint16_t dataIn = 0;
ersetzt.

jetzt habe ich meine 3 Schieberegister verlötet, es klappt bis Button 15.
Wenn ich Button 16 drücke sagt er mir:
dataIn DEC: 4294934528
dataIn BIN: 11111111111111111000000000000000

Und ab Button 17 gar nichts mehr.
Ich habe die Zeile
unint16_t dataIn = 0;
durch
uint32_t data In = 0;
ersetzt.

Ich habe die Befürchtung, dass ich jetzt noch ein ungenutztes Schieberegister hinzulöten muss,
aber auch die Hoffnung, dass es eine elegantere Lösung gibt?
Wie immer bin ich sehr dankbar für eure Hilfe!

int ioSelect = 2;
int clockPulse = 3;
int dataOut = 4;

int j;
int value;

byte switchVar = 0;

void setup() {

  pinMode(ioSelect, OUTPUT);
  pinMode(clockPulse, OUTPUT);
  pinMode(dataOut, INPUT);

  Serial.begin(9600);

}

// Den Code für den mp3 PLayer füge ich später ein, hier ging es mir erstmal um die 24 Signale...

void loop() {
  uint32_t dataIn = 0;
  digitalWrite(ioSelect, 0);
  digitalWrite(clockPulse, 0);
  digitalWrite(clockPulse, 1);
  digitalWrite(ioSelect, 1);
  for (j = 0; j < 32; j++) {

    value = digitalRead(dataOut);
    Serial.print("Button Position: ");
    Serial.println(j);
    Serial.print("Button Value: ");
    Serial.println(value);
    if (value) {
      int a = (1 << j);
      dataIn = dataIn | a;
    }
    digitalWrite(clockPulse, LOW);
    digitalWrite(clockPulse, HIGH);
  }

  if (switchVar != dataIn)
  {
    switchVar = dataIn;
    Serial.print("dataIn DEC: ");
    Serial.print(dataIn, DEC);
    Serial.println();
    Serial.print("dataIn BIN: ");
    Serial.print(dataIn, BIN);
    Serial.println();

  }
  Serial.print(byte(dataIn), BIN);



  delay(3000);

ich denke mal, du wirst das „int a“ in der for Schleife auch in „uint32_t a“ ändern müssen.

Hi! Danke für den Tip, leider hat es nichts geändert. Hochladen war erfolgreich,
aber das Ergebnis ist identisch...

Bist du sicher, dass du mit vorzeichenbehafteten 16bit Werten rechnen willst?

uint32_t a = 1UL << j;
sollte ab j>15 andere Ergebnisse liefern.

Wenn die Logik mit zwei Registern funktioniert, muss sie auch für 24 Bit passen.

Ein „Einbaufehler“ beim dritten IC ausgeschlossen?

ups falsch geantwortet….

Danke, diese Änderung hat zumindestens Button 16 repariert, der antwortet jetzt korrekt.
Ab Button 17 leider aber immer noch kein Input...

int ioSelect = 2;
int clockPulse = 3;
int dataOut = 4;

int j;
int value;

byte switchVar = 0;

void setup() {

  pinMode(ioSelect, OUTPUT);
  pinMode(clockPulse, OUTPUT);
  pinMode(dataOut, INPUT);

  Serial.begin(9600);

}

// Den Code für den mp3 PLayer füge ich später ein, hier ging es mir erstmal um die 24 Signale...

void loop() {
  uint32_t dataIn = 0;
  digitalWrite(ioSelect, 0);
  digitalWrite(clockPulse, 0);
  digitalWrite(clockPulse, 1);
  digitalWrite(ioSelect, 1);
  for (j = 0; j < 32; j++) {

    value = digitalRead(dataOut);
    Serial.print("Button Position: ");
    Serial.println(j);
    Serial.print("Button Value: ");
    Serial.println(value);
    if (value) {
      uint32_t a = 1UL << j; //hier hatte ich auch mit Klammern probiert, also "(1UL << j);", hat aber nichts geändert
      dataIn = dataIn | a;
    }
    digitalWrite(clockPulse, LOW);
    digitalWrite(clockPulse, HIGH);
  }

  if (switchVar != dataIn)
  {
    switchVar = dataIn;
    Serial.print("dataIn DEC: ");
    Serial.print(dataIn, DEC);
    Serial.println();
    Serial.print("dataIn BIN: ");
    Serial.print(dataIn, BIN);
    Serial.println();

  }
  Serial.print(byte(dataIn), BIN);



  delay(3000);

}


@Kai-R sorry, habe deinen Beitrag zu spät gesehen.

Naja, ausgeschlossen ist bei mir eigentlich gar nichts :smiley:

Falls ich mit dem Code nicht weiter komme werde ich das
dritte Register über das Breadboard anschliessen

Du hast da noch ein byte switchVar welches du mit unit32_t dataIn vergleichst. Das passt auch nicht. Was soll der „Cast“ nach byte beim letzten Serial.print Ausdruck?

Zeile 5 (also vor void setup) lautet jetzt:

uint32_t switchVar = 0;

Die vorletzte Zeile des Codes, die du angesprochen hast, habe ich entfernt, die war noch
vom rumtesten übrig geblieben..

ich würde mal sagen, der Code funktioniert:


byte ioSelect {2};
byte clockPulse {3};

byte dataOut {4};  // Pin
uint32_t switchVar {0};

byte simulate[32] {1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1};

void setup() {

  pinMode(ioSelect, OUTPUT);
  pinMode(clockPulse, OUTPUT);
  pinMode(dataOut, INPUT);

  Serial.begin(9600);

}

// Den Code für den mp3 PLayer füge ich später ein, hier ging es mir erstmal um die 24 Signale...

void loop() {
  uint32_t dataIn = 0;

  digitalWrite(ioSelect, 0);
  digitalWrite(clockPulse, 0);
  digitalWrite(clockPulse, 1);
  digitalWrite(ioSelect, 1);
  for (byte j = 0; j < 32; j++) {

    // byte value = digitalRead(dataOut);
    byte value = simulate[j];
    Serial.print("Button Position: ");
    Serial.println(j);
    Serial.print("Button Value: ");
    Serial.println(value);
    if (value) {
      uint32_t a = 1UL << j; //hier hatte ich auch mit Klammern probiert, also "(1UL << j);", hat aber nichts geändert
      dataIn = dataIn | a;
    }
    digitalWrite(clockPulse, LOW);
    digitalWrite(clockPulse, HIGH);
  }

  if (switchVar != dataIn)
  {
    switchVar = dataIn;
    Serial.print("dataIn DEC: ");
    Serial.print(dataIn, DEC);
    Serial.println();
    Serial.print("dataIn BIN: ");
    Serial.print(dataIn, BIN);
    Serial.println();
  }
  delay(3000);
}

Hi Kai,

danke, das ist echt lieb dass du dir so eine Mühe machst!!

Also, die simulierten Werte kommen mit deinem Code an.
Die Buttons funktionieren jetzt gar nicht, das ist sicher normal?
Was ist jetzt der nächste Schritt?