Ergebnis von Wire.Read kommt nicht im loop an

Hallo
Ich bin gerade mit Arduino angefangen bzw. mit der programmierung.
Ich habe zwei arduinos verbunden (mega + mega)
Das erste Projekt läuft auch schon recht gut bis auf den oben erwähnten punkt.
Wenn ich mit dem serial monitor im receiveEvent abfrage was meine variable enthält, bekomme ich die richtige auswertung.
Wenn ich die variable im Loop abfrage ist die variable aber leer !!!
Muss ich die variable vom receiveEvent zum loop noch irgendwie weiter geben ???

Mein zweiter versuch war ein eigener void sex_on_the_beach().
Dort steht dann mein komplettes programm drin das abgearbeitet werden soll.
Also habe ich im receiveEvent eine if abfrage gemacht ob die variable die ich empfange richtig ist .
Wenn das der fall ist springt er zu meinem void sex_on_the_beach() und sollte es dann abarbeiten.
Er macht das nicht ordentlich. Er beachtet dort keine delay() angaben und bewegt auch keinen motor.
Er rauscht am delay vorbei und steckt in der ersten for schleife wohl fest.
Ich begreif das nicht. Ich hänge mal das slave programm an. Das Master programm vom ersten arduino hat damit ja wohl nicht wirklich viel zu tun oder ???

//--------------------------------------------->>   // Verbindung mit master zum Datensenden
void receiveEvent(int howMany)
{
  String drink = "";

  while (Wire.available())
  {
    drink += char(Wire.read());
  }
  //Serial.println(drink);

  if (drink == "A1")
  {
    String drink = "";
    sex_on_the_beach();
  }
}
void sex_on_the_beach()//------------------>>  // Start des Programms (A1) Sex On The Beach
{
  lcd.clear();                                 // Anzeige auf dem Display löschen
  lcd.print("Sie wollen einen");               // Anzeige im Display erste Zeile
  lcd.setCursor(0, 1);                         // Setzt den Cursor in die zweite reihe
  lcd.print("Sex On The Beach");               // Anzeige im Display in der zweiten Reihe
  delay(2000);                                 // Wartezeit 3 sekunden
  lcd.clear();                                 // Anzeige auf dem Display löschen
  lcd.print(" Dein Drink ist ");               // Anzeige im Display erste Zeile
  lcd.setCursor(0, 1);                         // Setzt den Cursor in die zweite reihe
  lcd.print("   In Arbeit!   ");               // Anzeige im Display in der zweiten Reihe
  digitalWrite(ledrot_Pin, LOW);               // die Rote LED wird ausgeschaltet
  digitalWrite(ledgruen_Pin, HIGH);            // die Grüne LED wird eingeschaltet

  //--------------------------------------->>  // Hier wird der Servo in die erste Position gefahren

  for (int Umin = 3; Umin < 255; Umin += 1)    // Umdrehungen pro minute weniger als 254 um 1 erhöhen
  {
    stepper.setSpeed(Umin);                    // Umdrehungen aus der variablen Umin
    stepper.step(1);                           // schritte pro schleifen durchlauf
  }
  stepper.step(3610);                          // schritte die gefahren werden sollen

  for (int Umin = 254; Umin > 0; Umin -= 1)    // Umdrehungen pro minute mehr 254 um 1 verringern
  {
    stepper.setSpeed(Umin);
    stepper.step(1);                           // schritte pro schleifen durchlauf
  }

  //---------------------------------------->> // Servo ist in 0 stellung
  delay(1000);                                 // Wartezeit 1 sekunde

  for (int pos = 0; pos < 90; pos += 1)        // Servo von 0 nach 90 grad drehen in 1 grad schritten
  {
    myservo.write(pos);                        // Die variable 'pos' ausführen und auf 90 Grad drehen
  }
  delay(1000);                                 // Bleibt 1 sekunde bei 90 grad stehen

  for (int pos = 90; pos > 0; pos -= 1)        // Servo von 90 nach 0 zurück drehen in 1 grad schritten
  {
    myservo.write(pos);                        // Die variable 'pos' ausführen und auf 0 Grad drehen
  }
  //---------------------------------------->> // Zweite mal servo ausführen
  delay(1000);

  for (int pos = 0; pos < 90; pos += 1)        // Servo von 0 nach 90 grad drehen in 1 grad schritten
  {
    myservo.write(pos);                        // Die variable 'pos' ausführen und auf 90 Grad drehen
  }
  delay(1000);                                 // Bleibt 1 sekunde bei 90 grad stehen

  for (int pos = 90; pos > 0; pos -= 1)        // Servo von 180 nach 0 zurück drehen in 1 grad schritten
  {
    myservo.write(pos);                        // Die variable 'pos' ausführen und auf 0 Grad drehen
  }
  delay(500);                                  // Bleibt 1 sekunde bei 0 grad stehen

  //---------------------------------------->> // Nächste flasche anfahren
  for (int Umin = 3; Umin < 255; Umin += 1)    // Umdrehungen pro minute weniger als 254 um 1 erhöhen
  {
    stepper.setSpeed(Umin);
    stepper.step(-1);                          // schritte pro schleifen durchlauf
  }
  stepper.step(-690);                          // schritte die gefahren werden sollen rechts rum

  for (int Umin = 254; Umin > 0; Umin -= 1)    // Umdrehungen pro minute 254 um 1 verringen
  {
    stepper.setSpeed(Umin);
    stepper.step(-1);                          // schritte pro schleifen durchlauf
  }
  delay(500);                                  // Wartezeit 1 sekunde
  //---------------------------------------->> // Servo erstes mal anschalten

  for (int pos = 0; pos < 90; pos += 1)        // Servo von 0 nach 90 grad drehen in 1 grad schritten
  {
    myservo.write(pos);                        // Die variable 'pos' ausführen und auf 90 Grad drehen
  }
  delay(1000);                                 // Bleibt 1 sekunde bei 90 grad stehen
  for (int pos = 90; pos > 0; pos -= 1)        // Servo von 90 nach 0 zurück drehen in 1 grad schritten
  {
    myservo.write(pos);                        // Die variable 'pos' ausführen und auf 0 Grad drehen
  }
  delay(500);                                  // Bleibt 1 sekunde bei 0 grad stehen
  //--------------------------------------->>  // Hier wird die cola Position angefahren

  for (int Umin = 3; Umin < 70; Umin += 1)     // Umdrehungen pro minute weniger als 254 um 1 erhöhen
  {
    stepper.setSpeed(Umin);                    // Umdrehungen aus der variablen Umin
    stepper.step(1);                           // schritte pro schleifen durchlauf
  }
  stepper.step(170);                           // schritte die gefahren werden sollen

  for (int Umin = 69; Umin > 0; Umin -= 1)     // Umdrehungen pro minute mehr 254 um 1 verringern
  {
    stepper.setSpeed(Umin);
    stepper.step(1);                           // schritte pro schleifen durchlauf
  }
  //---------------------------------------->> // Einsatz einer getränkepumpe für cola
  digitalWrite(cola_Pin, LOW);                 // cola pumpe mit LOW einschalten
  delay(2000);                                 // 2 sekunden abfüllen
  digitalWrite(cola_Pin, HIGH);                // cola pumpe mit HIGH wieder abschalten
  delay(1000);                                 // warten bevor er weiter fährt
  //---------------------------------------->> // Grundstellung anfahren
  for (int Umin = 3; Umin < 255; Umin += 1)    // Umdrehungen pro minute weniger als 254 um 1 erhöhen
  {
    stepper.setSpeed(Umin);
    stepper.step(-1);                          // schritte pro schleifen durchlauf
  }
  stepper.step(-2720);                         // schritte die gefahren werden sollen

  for (int Umin = 254; Umin > 0; Umin -= 1)    // Umdrehungen pro minute 254 um 1 verringern
  {
    stepper.setSpeed(Umin);
    stepper.step(-1);                          // schritte pro schleifen durchlauf
  }
  delay(2000);

  if (digitalRead(grundstellung_Pin) == HIGH)  // grundstellung am programm ende überprüfen
  {
    fehlerfrei == 1;
  }
  else
  {
    fehlerfrei == 0;
  }
}
//-------------------------------------------->> // Ende des programms (A1) Sex On The Beach

Wo liegt dort mein fehler, ich blick echt nicht durch. Habe ich angaben beim void vergessen ?

hi,

Du hast die variable drink in der funktion receiveEvent "lokal" definiert. also kannst Du sie auch nur in dieser funktion sehen.

entweder die variable "global" definieren, also am anfang des sketches, oder als rückgabewert der funktion receiveEvent.

gruß stefan

Hallo Eisbaer
Das leuchtet ein !

ich kann ihn aber global nur als "char drink = 0;"
setzen sonst meckert er immer rum.
Und was kann es sein das ich im receive event auf meinen eigenen void verweise und der wird ohne beachtung von delays und dann auch nur bis zum anfang der for schleife ausgeführt.

receive event

Das ist eine ISR und unterliegt damit einigen Einschränkungen.

  1. Keine Delays in ISR
  2. Keine seriellen Ausgaben
  3. Überhaupt, alles was selber Interrupts nutzt, wird in einer ISR versagen
  4. Lang laufende ISRs blockieren andere Interrupts

auf meinen eigenen void

Es gibt keine eigenen Voids.
Du meinst "meine eigene Funktion"!

Ja das meinte ich ....eine eigene funktion :slight_smile:
Das würde bedeuten ich muss jeden drink da kommen noch einige) in den loop schreiben. Dann wird der aber ganz schön lang.!!!
Egal dann muss das ebend so. Wie kann ich denn wenigstens die variable drink aus dem receiveEvent an den loop übergeben. Das er auch dort gelesen werden kann. mit return(drink); hatte ich keinen erfolg.
Wird wohl auch grotten falsch sein.

Ja, ISRs haben keinen Returnwert.
An wen sollten sie auch was zurückgeben...?

Verwende eine globale Variable.
Anders wirds wohl erstmal nicht gehen.

Achte aber darauf die Variable volatile zu deklarieren und den Zugriff darauf atomar zu machen.
Auf neudeutsch: Mache dich über Interrupts kundig.

Du kannst in loop() abfragen ob der String ungleich "" ist um zu sehen ob was eingelesen wurde. Oder du nimmst eine zusätzliche Variable vom Typ bool dafür.

drink habe ich als char drink = 0; deklariert. (global)
Das funktionier ja auch, weil ich so im receiveEvent die korrekte wiedergabe bekomme.
Wenn ich also im master A1 ins keypad tippe und dann im slave die variable drink im receiveEvent überprüfe steht dort auch A1 drin. Kann ich drink mehrere variablen geben (global)

char drink = 0;
bool drink;
int drink = 0;

Hallo
Der tip mit dem Global Deklarieren hat mit weiter geholfen :-)))
Jetzt habe ich die auswertung auch im loop zur verfügung.
Vielen dank für eure hilfe !