I2C Kommunikation zwischen 2 megas

Hi Leute! ich mach ein Projekt für die Firma meines Vaters Ist relativ kompliziert das teil. jedenfalls gibt es ca 7 variabel die man über ein Menü einstellen kann. jetzt hab ich 2 Probleme die ich nicht lösen kann.
einmal ist es das einstellen der variabel im lcd Menü, wobei ich ne Idee hab, weiss aber ned warum sie nicht funktioniert.
und zweitens die Übertragung dieser variabeln... gedüst steht... Funktion aber auch nicht ausgeschrieben.

bitte um Hilfe! am besten per Telefon, teamspeak oder skype/facetime

gruss Max

wobei ich ne Idee hab, weiss aber ned warum sie nicht funktioniert.

Schön für dich, ich z.B. hab keine Idee, warum deine nicht funktioniert.

Du machst doch mit einem 4x4 keypad und Jomelos Menu-Library rum.

zweitens die Übertragung dieser variabeln... gedüst steht... Funktion aber auch nicht ausgeschrieben.

Willst du unsere Wahrsage-Kristallkugeln blind machen?

Es gibt mehrere Möglichkeiten:

  • Du machst dein Projekt
  • Du findest raus, wo deine Probleme konkret liegen und zeigst sie (jedes für sich)
  • Du erklärst deinem Vater, dass das so nichts wird

Hier kannst du zwar telefonieren, ob die Gesprächspartner dir aber vermitteln können, dass das so nichts werden kann (und gar warum), weiss ich nicht.

Hallo,

ich hatte den gleichen Gedanken, aber mich nicht getraut zu schreiben ... :slight_smile:
Es kommen immer wieder neue Leute ins Forum, was ja an sich nicht falsch ist, aber die vergessen die Firmware Version ihrer Glaskugel ins Anmeldeforumlar einzugeben, weil noch optional. Inkompatibilitäten sind damit zu unseren alten aber stabilen Versionen vorprogrammiert.

Poste dein Code, dann sehen wir weiter. Schreib welche deiner Ideen nicht funktioniert.
Per Telefon wirds nicht einfacher, sinngemäß zu helfen.

Die Fremdsprachler können dir nicht viel weiter helfen.

reaktionszeit[i] = kpd.getKey();
    int reacttime = int(reaktionszeit);
    //lcd.clear();
    lcd.setCursor(15,2);
    lcd.print(i);

geht des So? i wird mit nem swtisch case bei links oder rechts verringert bzw. erhöht. wenn ich die des array definiere:
int reaktionszeit[5] = {'3','0','0','1'};

kommt auf dem lcd ne Zusatzzahl..
kp warum... Gruss

Kaum verwunderlich.
Du castest den Arraypointer in eine int Variable um und erhälst dadurch den Wert der Adresse des ersten Elements im Array nicht aber dem Eert den du eigentlich willst.

Du musst schon einen Index angeben
wenn du was brauchbares willst.

wenn ich die des array definiere:
int reaktionszeit[5] = {'3','0','0','1'};

kommt auf dem lcd ne Zusatzzahl..

lcd.print(i); // hat nix mit diesem Array zu tun.
Wenn du den Text "3001" sehen willst, brauchst du ein char array.

Versuch mal kleine Testsketche. Und die dann komplett posten.
Das wichtigste sind die Variablen-Definitionen.
Das zweitwichtigste, welche Libraries du genau verwendest.

Erstmal kann man auch den seriellen Monitor nutzen:

void setup() {
  Serial.begin(9600);
  char test1[5] = {'3', '0', '0', '1'};
  Serial.print("test1: "); Serial.println(test1);
  Serial.print("test1[0]: "); Serial.println(test1[0], HEX);
  Serial.print("test1[1]: "); Serial.println(test1[1], HEX);
  Serial.print("test1[2]: "); Serial.println(test1[2], HEX);
  Serial.print("test1[3]: "); Serial.println(test1[3], HEX);
  int test2[5] = {3, 0, 0, 1};
  Serial.print("test2[0]: "); Serial.println(test2[0]);
  Serial.print("test2[1]: "); Serial.println(test2[1]);
  Serial.print("test2[2]: "); Serial.println(test2[2]);
  Serial.print("test2[3]: "); Serial.println(test2[3]);
}
void loop() {}

Finde ich prima zur Fehlersuche :slight_smile:

Auch interessant wird es mit nicotin's

  int test[5] = {'3', '0', '0', '1'};

Kleiner Tip am Rande:

  1. Anforderung beschreiben (was soll mein Code machen)
  2. Problemstelle bzw. unerwartetes/falsches Verhalten benennen
  3. Frage stellen
  4. Ggf. code posten
  5. Ggf. code kommentieren

Du hast einen Schnipsen hingeschmissen ohne dass man weiß, was du von dem Schnipsel eigentlich erwartest. Da kann man alles mögliche reininterpretieren und nachher ist dir am Ende auch nicht geholfen.

Sinnvolle Kommentare zum Code wären z.B. gewesen:

  • was ist reaktionszeit für ein typ? Dass es ein Array ist sehen wir aber sind das chars, ints, bytes?
  • was liefert kpd.getKey() zurück?

Erstmal danke an alle die helfen! Ich weiss dass ich zu wenige Infos gab… dachte auch ehrlichgesagt nicht dass die Resonanz hier so groß ist! nunja… habe mich jetzt nochmal mit arrays an sich auseinander gesetzt und nen halbwegs brauchbaren sauberen Code auf die beine gestellt, in dems ums wesentliche geht:

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>

char reaktionszeit[6] = "12345";
char key;
int i = 0;
int x = 0;
int y = 0;
int xi = 0;

//                    addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address

const byte ROWS = 4;
const byte COLS = 4;
// Define the Keymap
char keys[ROWS][COLS] = {
  {'1','2','3','U'},
  {'4','5','6','D'},
  {'7','8','9','E'},
  {'L','0','R','B'}
};
// Connect keypad      R0 R1 R2 R3
byte colPins[COLS] = { 22, 24, 26, 28 };
// Connect keypad      C0, C1  C2  C3
byte rowPins[ROWS] = { 30, 32, 34, 36 }; 

// Create the Keypad
Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup()  
{
  Serial.begin(9600); 
  lcd.begin(20,4); 
  lcd.backlight(); 
  lcd.clear();
  x = 3;
  y = 2;
  lcd.setCursor(x,y);
  lcd.write(reaktionszeit);
  
}

void loop()   /*----( LOOP: RUNS CONSTANTLY )----*/
{
  key = kpd.getKey();
  if (key == 'L' || key == 'R')
   {
   switch (key)
   {
    case 'L':
    if (i > 0){i = i - 1;}
    break;
    
    case 'R':
    if (i < 4){i = i + 1;}
    
    break;
   }
      
   }
  xi = x + i;
  lcd.setCursor(xi,y);
  lcd.blink();
  
  char value = kpd.getKey();
  if (value == '0' || value == '1' || value == '2' || value == '3' || value == '4' || value == '5' || value == '6' || value == '7' || value == '8' || value == '9'){
  reaktionszeit[i] = value;
  lcd.print(reaktionszeit);
  
  }
  
}

kpd.getKey() gibt mir eines der oben definierten Zeichen zurück also bspw: ‘U’ für Up…

die Reaktionszeit soll später per i2c auf einen zweiten Ardu übertragen werden und von diesem dann als Wert für ein Delay verwendet werden.
Momentan kann ich die erste stelle verändern. bedeutet also: ich kann reaktionszeit[0] verändern.
wenn ich nun aber versuche i mit ‘L’ oder ‘R’ zu verändern geht das nicht. ändere ich aber das letzte Stück Code ab:

...xi = x + i;
  lcd.setCursor(xi,y);
  lcd.blink();
  
  //char value = kpd.getKey();
  //if (value != 'L' || value != 'R' || value != 'U' || value != 'D' || value != 'E' || value != 'B'){
  //reaktionszeit[i] = value;
  
  
  lcd.print(reaktionszeit[i]);

so kann ich den cursor ( also auch i) verändern, nun aber ja nichtmehr den wert von reaktionszeit
was mach ich falsch?

nicotin1602:
… dachte auch ehrlichgesagt nicht dass die Resonanz hier so groß ist! nunja…

Die Resonanz wäre möglicherweise besser gewesen, hättest Du das Thema spezifischer formuliert. Was nicht ist, kannst Du jetzt aber noch nachholen! Erledigt :slight_smile:

nicotin1602:
was mach ich falsch?

key = kpd.getKey();
...
char value = kpd.getKey();

Das darf m. E. nur einmal vorkommen. Wenn Du den Wert von key haben möchtest, kannst Du den berechnen.

Ich habe anstelle lcd Serial genommen:

char reaktionszeit[6] = "12345";
char key;
int i = 0;
int x = 0;
int y = 0;
int xi = 0;

void setup()  {
  Serial.begin(9600);
  Serial.println("Programmstart");
}

void loop() {
  if (Serial.available() > 0) {
    key = Serial.read();
    if (key == 'l') {
      if (i > 0) {
        i = i - 1;
      }
    }
    if (key == 'r') {
      if (i < 4) {
        i = i + 1;
      }
    }
    if (key >= '0' && key <= '9') {
      reaktionszeit[i] = key;
    }
    xi = x + i;
    Serial.print("xi: "); Serial.println(xi);
    Serial.print("reaktionszeit: "); Serial.println(reaktionszeit);
  }
}