Arduino I2C und soundmodul msm 3

Hallo

Also habe ein problem mit der kommunikatio eines i2c gerätes.

sketch

#include <Wire.h>

const int I_Ok=9;
int Lock;
int Ok;

void setup() {
  pinMode(I_Ok, INPUT);
  Wire.begin();
}

void loop() {
  Ok = digitalRead(I_Ok);
  if(Ok == HIGH && Lock == 0){
    Wire.beginTransmission(byte(0x18));
    Wire.write(0x46);
    Wire.write(0x00);
    Wire.write(0x01);
    Wire.endTransmission();
    Lock = 1;
  }
  if(Ok == LOW){
    Lock = 0;
  }
}

also wenn ich das erste mal den knopf drücke läuft alles wie e soll. aber wenn ich ihn ein 2. mal drücke geht garnichts mehr.

erst wenn ich den arduino resete geht es wider genau ein mal.

die frage ist habe ich irgendetwas vergessen? oder muss ich weiter datenblatt wälzen und den hersteller fragen?

EDIT

Habe herausgefunden dass der arduino sich nach dem befehl aufhängt

Ich vermute, der Fehler liegt an einem fehlenden Pulldown-Widerstand am Eingang zum Arduino.
Und auch die Pullups am I2C nicht vergessen.

Ist der Taster entprellt? Das Prellen bedeutet mehrere Tastendrücke in wenigen Millisekunden, was das Modul irritieren könnte.
Du könntest z.B. Delay(50) am Ende deines If-Abfrage einfügen.

Widerstände sind alle da. das soundmodul hat die pullups für den i2c bus mit drinnen.

selbst wenn ich den befehl sende ohne button. also nach z.b. 10 sek. stürzt der arduino uno ab und reagiert auf nichts mehr außer dem reset knopf.

habe das mit dem delay grade ausprobirt leider ohne erfolg.
wenn ich serial befehle verwende und die mit dem button sende macht ehr auch den anschein gut entprellt zu sein. (sendet also nur einmal)

Stell mal den kompletten Schaltplan ein. Wie versorgst du die Schaltung mit Strom?

Xasir:
Widerstände sind alle da. das soundmodul hat die pullups für den i2c bus mit drinnen.

selbst wenn ich den befehl sende ohne button. also nach z.b. 10 sek. stürzt der arduino uno ab und reagiert auf nichts mehr außer dem reset knopf.

habe das mit dem delay grade ausprobirt leider ohne erfolg.
wenn ich serial befehle verwende und die mit dem button sende macht ehr auch den anschein gut entprellt zu sein. (sendet also nur einmal)

Hast du dir die Threads bei ELV dazu mal angesehen?
Da gibt es auch Sketch-Beispiele.

Ja habe genau das beispiel genommen...

zum schaltplan.

Versorgung
-das soundmodul mit 12V 2A netzteil
-den arduino über den usb port

-Den i2c bus entsprechend verbunden (SDA -SDA und SCL -SCL)
-GND verbunden

-auf dem soundmodul lassen sich per jumper 2 pullup widerstände zuschalten (erledigt)

außerdem hat das soundmodul genau wie der arduino einen 5v ausgang den ich nach dem es nicht richtig funktionirt auch mal verbunden habe.

würde einfach mal ne alternative i2c libary verwenden. könnt ihr da eine empfeheln

habe das hier noch gefunden

However, notice that the Wire library has blocking I/O. That means, it goes into a busy loop and waits for the I2C communications to complete.

habe das gefühl das er genau da fest hängt.

Mir ist keine alternative I2C-Library bekannt, ausser die für den Teensy, da bin ich aber nicht sicher, ob die funktioniert.

habe meinen code mal umgestellt um die fehlerquelle zu minimiren.

#include <Wire.h>

void setup() {
  Wire.begin();
  Serial.begin(9600);
}

void loop() {
  Serial.println("Start");
  delay(5000);
  Serial.println("START-Wire.beginTransmission(byte(0x18));");
  delay(1000);
  Wire.beginTransmission(byte(0x18));
  delay(1000);
  Serial.println("END-Wire.beginTransmission(byte(0x18));");
  delay(1000);
  Serial.println("START-Wire.write(0x46);");
  delay(1000);
  Wire.write(0x46);
  delay(1000);
  Serial.println("END-Wire.write(0x46);");
  delay(1000);
  Serial.println("START-Wire.write(0x00);");
  delay(1000);
  Wire.write(0x00);
  delay(1000);
  Serial.println("END-Wire.write(0x00);");
  delay(1000);
  Serial.println("START-Wire.write(0x01);");
  delay(1000);
  Wire.write(0x01);
  delay(1000);
  Serial.println("END-Wire.write(0x01);");
  delay(1000);
  Serial.println("START-Wire.endTransmission();");
  delay(1000);
  Wire.endTransmission();
  delay(1000);
  Serial.println("END-Wire.endTransmission();");
}

auszug vom serial monitor

Start
START-Wire.beginTransmission(byte(0x18));
END-Wire.beginTransmission(byte(0x18));
START-Wire.write(0x46);
END-Wire.write(0x46);
START-Wire.write(0x00);
END-Wire.write(0x00);
START-Wire.write(0x01);
END-Wire.write(0x01);
START-Wire.endTransmission();