INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Kommunikation zwischen 2 Arduinos per APC-220
17.08.2014, 21:05
Beitrag #1
Kommunikation zwischen 2 Arduinos per APC-220
Hey Leute Wink

Ich habe ein neues Problem.


Ich bin momentan dabei eine Art Haussteuerung zu bauen.

jeweils Arduino + APC-220 (433Mhz) Funkmodul, und teilweise Sensorik wie Temperatur, Licht, Regen usw.

Ich muss irgendwie die Zustände der einzelnen Arduinos speichern und bei bedarf an die andren senden zur Auswertung oder Steuerung.

Ich habe jetzt versucht die Zustände mit Hilfe (siehe Beispiel) zu speichern und über das Funkmodul zu senden / empfangen.


Code:
boolean unterprogrammtemperatur = false;


Mein Problem ist jetzt folgendes:

Meine Basisstation 1 hat Unterprogramme die ich über die Serielle Schnittstelle aktiv / reaktiv schalten kann. (funktioniert).

Mein Handgehäuse mit 3,2 Touch und Mega hat die Funktion bei bedarf (wenn ich es einschalte) einen Befehl ("Status") über das Funkmodul an die Basisstation 1 zu senden und soll dann eine Nachricht zurückbekommen wie folgt : 0000 oder 1000 oder 1100 oder 1110 oder 1111, die jeweils 1 steht für unterprogramm aktiv und 0 für inaktiv (mir is leider nichts besseres eingefallen Big Grin ). Das wird im Programmcode auf dem Mega+Touch ausgewertet und setzt wieder true oder false siehe unten:

Code:
boolean unterprogrammtemperatur = false;

Dann wenn ich auf dem Touchmenü auf "Status" dann auf Unterprogramme klicke wird ein unterprogramm namens "Status()" aufgerufen das die anfrage über apc-220 an die basisstation schickt und mit der "Zahlenkombination" antwortet die dann ausgewertet wird und dann im unterprogramm namens: "Anzeige_Status()" auf einer neuen Seite des Touch displays (die erzeugt wird ) ein Rechteck je nach Status des Merkurs für die Unterprogramme grün (aktiv) oder rot (inaktiv) anzeigen soll. Aber irgendwie funktioniert da etwas nicht (ich hab das Gefühl irgendwas an meiner abfrage der seriellen Schnittstelle funktioniert nicht).

Würde mich über Tipps oder Hilfe freuen.

Ps. Ich habe zum Test "Serial" anstatt der "Serial1" (APC-220) verwendet um mit dem Terminal erst einmal zu testen (nur das ihr nicht denkt das sei der Fehler ) Wink

Hier mein kleiner code Big Grin

Code:
// Homecontrol Handsteuerung Touch 1

// Version 1.8
//

// ACHTUNG: Befehle ohne Zeilenende (Serial.print(""); verwenden und nicht Serial.println(""); ! Auch auf die Richtige Serielle Schnittstelle achten! (zb. Serial = DEBUG oder Serial1 = APC-220).




// #define imagedatatype  unsigned int                                                           // Funktion noch unbekannt?!


// ################################################################################​################################################################################​#############################################################
// ################################################################################​##                     MERKER                          ###########################################################################​##########################

boolean unterprogrammalarm = false;        // Merker Unterprogramm "alarmanlage" aktiv / deaktiv.    
boolean outarm   = false;                  // Merker Status "outarm".
boolean disarm   = false;                  // Merker Status "disarm".
boolean homearm  = false;                  // Merker Status "homearm".
boolean alarm    = false;                  // Merker Status "alarm".
boolean unterprogrammlicht = false;        // Merker Unterprogramm "Licht" aktiv / deaktiv.    
boolean unterprogrammregen = false;        // Merker Unterprogramm "Regen" aktiv / deaktiv.    
boolean unterprogrammtemperatur = false;   // Merker Unterprogramm "Temperatur" aktiv / deaktiv.


// ################################################################################​################################################################################​#############################################################

char zbuffer;                       // Eingabe Zeichenpuffer  ( Buchstaben oder Wörter oder Zahlen ), Serielle1 Funkverbindung APC-220.
String command = "";                // GesamtString von Serial1 read.

// ################################################################################​################################################################################​#############################################################







#include <UTFT.h>
#include <UTouch.h>
#include <UTFT_Buttons.h>

extern uint8_t BigFont[];                                                                        // Schriftgröße.
extern uint8_t SmallFont[];                                                                      // Schriftgröße.


UTFT          myGLCD(ITDB32S,38,39,40,41);                                                       // Pin Belegung LCD.
UTouch        myTouch(6,5,4,3,2);                                                                // Pin Belegung TOUCH.

UTFT_Buttons  myButtons(&myGLCD, &myTouch);

byte l_1_menu=' ';                                                                               // Byte

unsigned int main_but1, main_but2,main_but3,main_but4,main_but5,main_but6,main_but7;             // Mögliche Buttons (Auswahl-Liste).

int m_press,l_press;                                                                             // ???

void setup() {
  
  Serial.begin(9600);                                                                            // Serielle Schnittstelle PC / DEBUG.
  Serial1.begin(9600);                                                                           // Serielle Schnittstelle APC 220 Funkverbindung.
  

  myGLCD.InitLCD();                                                                              // LCD instalisieren.
  myGLCD.clrScr();                                                                               // Bildschirm löschen.
  myGLCD.setFont(BigFont);                                                                       // Größe einstellen.
  
  myGLCD.setColor(VGA_BLACK);                                                              
  myGLCD.setBackColor(VGA_WHITE);
  
  myTouch.InitTouch();                                                                           // Touch instalisieren.
  myTouch.setPrecision(PREC_LOW);                                                                // Touch Empfindlichkeit festlegen.
  
  myButtons.setTextFont(BigFont);                                                                // Schriftgröße einstellen.
  myButtons.setButtonColors(VGA_BLACK,VGA_GRAY,VGA_WHITE,VGA_RED,VGA_GRAY);                      // Auswählbare Farben für Buttons.
  Serial.println("                ");
  Serial.println("Homecontrol 1.0");                                                             // Startmessage. DEBUG PC.
  
  
  
  
  
}


void Status() {                                                                                 // Unterprogramm zur Statusabfrage der Basisstation 1.


     Serial.println("Status");                                                                   // ACHTUNG: (DEBUG oder APC) Richtige Schnittstelle! Statusabfrage an Basisstation 1 über APC-220 Funkmodul.
    
     delay(100);
  
  
     command = "";
    
    while (Serial.available() > 0) {
      
      
    zbuffer = Serial.read();
    
    delay(10);                                                                                   // Ohne delay werden nur einzelne Zeichen gelesen.
    
    command.concat(zbuffer);
    
}
  
    if(command != "") {                                                                          // wenn Zeichen im String dann auswerten.
  
    
    
   if(command != "1000" && command != "1100" && command != "1110" && command != "1111" ) {      // Statusmessage (0000) für : Temp off, Regen off, Alarm off, Licht off.

        Serial.println("alle aus");                                                               // DEBUG MESSAGE
                
                                  
                unterprogrammtemperatur = false;  
                unterprogrammregen      = false;
                unterprogrammalarm      = false;
                unterprogrammlicht      = false;  
        
    }
    
    
    if(command == "1000" && command != "1100" && command != "1110" && command != "1111" ) {      // Statusmessage (1000) für : Temp on, Regen off, Alarm off, Licht off.

        Serial.println("Temp on");                                                               // DEBUG MESSAGE
                
                                  
                unterprogrammtemperatur = true;  
                unterprogrammregen      = false;
                unterprogrammalarm      = false;
                unterprogrammlicht      = false;  
        
    }
    
    if(command != "1000" && command == "1100" && command != "1110" && command != "1111" ) {      // Statusmessage (1100) für : Temp on, Regen on, Alarm off, Licht off.

        Serial.println("Temp & Regen on");                                                       // DEBUG MESSAGE
        
                unterprogrammtemperatur = true;  
                unterprogrammregen      = true;
                unterprogrammalarm      = false;
                unterprogrammlicht      = false;
    }
    
    if(command != "1000" && command != "1100" && command == "1110" && command != "1111" ) {      // Statusmessage (1110) für : Temp on, Regen on, Alarm on, Licht off.

        Serial.println("Temp & Regen & Alarm on");                                               // DEBUG MESSAGE
        
                unterprogrammtemperatur = true;  
                unterprogrammregen      = true;
                unterprogrammalarm      = true;
                unterprogrammlicht      = false;
    }
    
    if(command != "1000" && command != "1100" && command != "1110" && command == "1111" ) {      // Statusmessage (1111) für : Temp on, Regen on, Alarm on, Licht on.

        Serial.println("Temp & Regen & Alarm & Licht on");                                                               // DEBUG MESSAGE
        
                unterprogrammtemperatur = true;  
                unterprogrammregen      = true;
                unterprogrammalarm      = true;
                unterprogrammlicht      = true;
    }
    
    else {
      
      Status();                                                                                  // Rücksprung um Daten abzufragen.
    }
    
      Anzeige_Status();                                                                          // Springe ins Unterprogramm -> Anzeige_Status();

  }                                                              
}
  
          
  


void loop() {                                                                                    // loop

  start:                                                                                        

  Serial.println("Hauptmenu");                                                                   // DEBUG Message.
  main_but1 = myButtons.addButton (10,50,300,30,"Status");
  main_but2 = myButtons.addButton (10,80,300,30,"Steuern");
  main_but3 = myButtons.addButton (10,110,300,30,"Einstellungen");

  myButtons.drawButtons();                                                                       // Zeichne Buttons.
  text();
  while(1)
  {
    if (myTouch.dataAvailable() == true)                                                         // Sobald am Touch Daten anliegen (Touch gedrückt).
    {
      m_press = myButtons.checkButtons();                                                        // überprüfe welcher Button gedrückt wurde.
      
      if (m_press==main_but1) l_1_menu='A';                                                      // Wenn Button gedrückt dann springe in Untermenü....
      if (m_press==main_but2) l_1_menu='B';                                                      // Wenn Button gedrückt dann springe in Untermenü....
      if (m_press==main_but3) l_1_menu='C';                                                      // Wenn Button gedrückt dann springe in Untermenü....
      
      l_1_screen(l_1_menu);
      goto start;

    }
  }
}


void l_1_screen(byte l_1_menu)
{
  myButtons.deleteAllButtons();
start2:
  switch (l_1_menu)
  {
  case 'A':
    Serial.println("Untermenu 1");                                             // DEBUG Message.
    main_but1=myButtons.addButton(10,50,300,30,"Sensoren");                    // Untermenü 1  
    main_but2=myButtons.addButton(10,80,300,30,"Wetter");                      //
    main_but3=myButtons.addButton(10,110,300,30,"Unterprogramme");                       //
    break;
    
  case 'B':
    Serial.println("Untermenu 2");                                             // DEBUG Message.
    main_but1=myButtons.addButton(10,50,300,30,"Programme");                   // Untermenü 2
    main_but2=myButtons.addButton(10,80,300,30,"Funksteckdosen");              //
    main_but3=myButtons.addButton(10,110,300,30,"Frei_1");                     //
    break;
    
  case 'C':
    Serial.println("Untermenu 3");                                             // DEBUG Message.
    main_but1=myButtons.addButton(10,50,300,30, "Frei_2");                     // Untermenü 3
    main_but2=myButtons.addButton(10,80,300,30, "Frei_3");                     //
    main_but3=myButtons.addButton(10,110,300,30,"Frei_4");                     //
    break;
    
  }
  main_but4 = myButtons.addButton (10,140,300,30,"Zurueck");                   // Zurück zu Hauptmenü
  myButtons.drawButtons();
  text();
  while(1)
  {
    if (myTouch.dataAvailable() == true)
    {
      myButtons.drawButtons();
      l_press = myButtons.checkButtons();
      if (l_1_menu=='A')
      {
        if (l_press==main_but1)
        {
          do_Sensoren();
          goto start2;
        }
        if (l_press==main_but2)
        {
          do_Wetter();
          goto start2;
        }
        if (l_press==main_but3)
        {
          do_Unterprogramme();
          // goto start2;
        }
      }
      if (l_1_menu=='B')
      {
        if (l_press==main_but1)
        {
          do_Programme();
          goto start2;
        }
        if (l_press==main_but2)
        {
          do_Funksteckdosen();
          goto start2;
        }
        if (l_press==main_but3)
        {
          do_Frei_1();
          goto start2;
        }
      }
      if (l_1_menu=='C')
      {
        if (l_press==main_but1)
        {
          do_Frei_2();
          goto start2;
        }
        if (l_press==main_but2)
        {
          do_Frei_3();
          goto start2;
        }
        if (l_press==main_but3)
        {
          do_Frei_4();
          goto start2;
        }
      }
      if (l_press==main_but4) break;
    }
  }
  myButtons.deleteAllButtons();
  myGLCD.clrScr();
  return;
  
  
}
void do_Sensoren(){                                                         // Aufgerufenes Programm nach Tastendruck.
     int Sensoren_press;
     Serial.println("Sensoren");
}
void do_Wetter(){                                                           // Aufgerufenes Programm nach Tastendruck.
     int Wetter_press;
     Serial.println("Wetter");

}
void do_Unterprogramme(){                                                   // Aufgerufenes Programm nach Tastendruck.
     int Unterprogramme_press;
     Serial.println("Unterprogramme");
    
     Status();
    
}

void Anzeige_Status() {
  
   Serial.println("Anzeige_Status");               // DEBUG Message
  
  
  myGLCD.setFont(SmallFont);                       // Textgröße (SmallFont oder BigFont).

  myGLCD.setBackColor(VGA_BLACK);                  // Hintergrundfarbe.
  
  myGLCD.fillScr(VGA_BLACK);                       // Hintergrundfarbe LCD. Füllt den ganzen Bildschirm aus.
  
  if (unterprogrammtemperatur = false) {
  
  myGLCD.setColor(VGA_RED);                        // Farbe des Rechtecks (gefüllte Farbe). Symbol.
  myGLCD.fillRoundRect(100, 22, 110, 32);          // Anfang von links nach rechts gesehen, höhe von oben nach unten anfang, rechts nach links anfang, unten nach oben.
  
  }
  
  if (unterprogrammtemperatur = true) {
    
  myGLCD.setColor(VGA_GREEN);                      // Farbe des Rechtecks (gefüllte Farbe). Symbol.
  myGLCD.fillRoundRect(100, 22, 110, 32);          // Anfang von links nach rechts gesehen, höhe von oben nach unten anfang, rechts nach links anfang, unten nach oben.
    
  }
  
  myGLCD.setColor(VGA_RED);                        // Farbe des Rechtecks (gefüllte Farbe). Symbol.
  myGLCD.fillRoundRect(100, 52, 110, 62);          // Anfang von links nach rechts gesehen, höhe von oben nach unten anfang, rechts nach links anfang, unten nach oben.
  
  
  myGLCD.setColor(VGA_GREEN);                      // Farbe des Rechtecks (gefüllte Farbe). Symbol.
  myGLCD.fillRoundRect(100, 80, 110, 90);          // Anfang von links nach rechts gesehen, höhe von oben nach unten anfang, rechts nach links anfang, unten nach oben.
  
  
  

  
  
  myGLCD.setColor(VGA_WHITE);                      // Farbe des Textes im Rechteck.
  myGLCD.setBackColor(VGA_BLACK);                  // Texthintergrund Farbe "Highlighting.
  
  myGLCD.print(" Temperatur", LEFT , 20);          // Text,  ORT: (LEFT, CENTER, RIGHT), Position 0 ist oben, 228 ist unten.
  myGLCD.print(" Regen",      LEFT , 50);          // Text,  ORT: (LEFT, CENTER, RIGHT), Position 0 ist oben, 228 ist unten.
  myGLCD.print(" Alarmanlage",LEFT , 78);          // Text,  ORT: (LEFT, CENTER, RIGHT), Position 0 ist oben, 228 ist unten.
  
    
    
    
    
    
    
     delay(10000);                                 // Pause zum Anzeigen des Status jedes einzelnen Unterprogrammes.
    
  
     myButtons.deleteAllButtons();                 // Alle Button's löschen.
     myGLCD.clrScr();                              // LCD löschen.
    
     loop();                                       // Zurück zu "void loop()" (Hauptmenü).

    

}



void text()
{
  myGLCD.print("HOMECONTROL", 20, 200);                                                       // Angezeigter Name ("HOMECONTROL").
  myGLCD.setColor(VGA_BLACK);                                                                 // Textfarbe des Anzeigenamens.

}
void do_Programme(){                                                                          // Aufgerufenes Programm nach Tastendruck.
  int bilder_press;
  myButtons.deleteAllButtons();
  main_but1=myButtons.addButton(10,50,150,30,"Alarm");
  main_but2=myButtons.addButton(160,50,150,30,"Licht");
  main_but3=myButtons.addButton(10,80,150,30,"Regen");
  main_but4=myButtons.addButton(160,80,150,30,"Temp");
  main_but5=myButtons.addButton(10,110,150,30,"Frei_1");
  main_but6=myButtons.addButton(160,110,150,30,"Frei_2");
  main_but7=myButtons.addButton(10,140,300,30,"Zurueck");
  myButtons.drawButtons();
  text();
  while(1)
  {
    if (myTouch.dataAvailable() == true)
    {
      myButtons.drawButtons();
      bilder_press = myButtons.checkButtons();
      if (bilder_press==main_but1) delay(1), Serial1.println("Regen");                        // Ausgabe über Serielle1 Schnittstelle an Funkmodul APC-220 für Verbindung zu Basisstation 1 (Unterprogrammsteuerung).

      if (bilder_press==main_but2) delay(1), Serial1.println("Licht");                        // Ausgabe über Serielle1 Schnittstelle an Funkmodul APC-220 für Verbindung zu Basisstation 1 (Unterprogrammsteuerung).
      
      if (bilder_press==main_but3) delay(1), Serial1.print("Temperatur");                     // Ausgabe über Serielle1 Schnittstelle an Funkmodul APC-220 für Verbindung zu Basisstation 1 (Unterprogrammsteuerung).

      if (bilder_press==main_but4) delay(1), Serial1.println("Alarm");                        // Ausgabe über Serielle1 Schnittstelle an Funkmodul APC-220 für Verbindung zu Basisstation 1 (Unterprogrammsteuerung).

      if (bilder_press==main_but5) delay(1), Serial1.println("Pc An");                        // Ausgabe über Serielle1 Schnittstelle an Funkmodul APC-220 für Verbindung zu Basisstation 1 (Unterprogrammsteuerung).

      if (bilder_press==main_but6) delay(1), Serial1.println("Pc Aus");                       // Ausgabe über Serielle1 Schnittstelle an Funkmodul APC-220 für Verbindung zu Basisstation 1 (Unterprogrammsteuerung).

      if (bilder_press==main_but7) break;
    }
  }
  myButtons.deleteAllButtons();
  myGLCD.clrScr();
  return;  
}
void do_Funksteckdosen(){                                                                     // Aufgerufenes Programm nach Tastendruck.
  int Funksteckdosen_press;
  myButtons.deleteAllButtons();
  main_but1=myButtons.addButton(10,50,150,30,"Button");                            
  main_but2=myButtons.addButton(160,50,150,30,"Button");
  main_but3=myButtons.addButton(10,80,150,30,"Button");
  main_but4=myButtons.addButton(160,80,150,30,"Button");
  main_but5=myButtons.addButton(10,110,150,30,"Button");
  main_but6=myButtons.addButton(160,110,150,30,"Button");
  main_but7=myButtons.addButton(10,140,300,30,"Zurueck");
  myButtons.drawButtons();
  text();
  while(1)
  {
    if (myTouch.dataAvailable() == true)
    {
      myButtons.drawButtons();
      Funksteckdosen_press = myButtons.checkButtons();
      if (Funksteckdosen_press==main_but1) delay(10);
      if (Funksteckdosen_press==main_but2) delay(10);
      if (Funksteckdosen_press==main_but3) delay(10);
      if (Funksteckdosen_press==main_but4) delay(10);
      if (Funksteckdosen_press==main_but5) delay(10);
      if (Funksteckdosen_press==main_but6) delay(10);
      if (Funksteckdosen_press==main_but7) break;
    }
  }
  myButtons.deleteAllButtons();
  myGLCD.clrScr();
  return;  
}
void do_Frei_1(){                                                                             // Aufgerufenes Programm nach Tastendruck.
  int Frei_1_press;
  myButtons.deleteAllButtons();
  main_but1=myButtons.addButton(10,50,150,30,"Button");
  main_but2=myButtons.addButton(160,50,150,30,"Button");
  main_but3=myButtons.addButton(10,80,150,30,"Button");
  main_but4=myButtons.addButton(160,80,150,30,"Button");
  main_but5=myButtons.addButton(10,110,150,30,"Button");
  main_but6=myButtons.addButton(160,110,150,30,"Button");
  main_but7=myButtons.addButton(10,140,300,30,"Zurueck");
  myButtons.drawButtons();
  text();
  while(1)
  {
    if (myTouch.dataAvailable() == true)
    {
      myButtons.drawButtons();
      Frei_1_press = myButtons.checkButtons();
      if (Frei_1_press==main_but1) delay(10);
      if (Frei_1_press==main_but2) delay(10);
      if (Frei_1_press==main_but3) delay(10);
      if (Frei_1_press==main_but4) delay(10);
      if (Frei_1_press==main_but5) delay(10);
      if (Frei_1_press==main_but6) delay(10);
      if (Frei_1_press==main_but7) break;
    }
  }
  myButtons.deleteAllButtons();
  myGLCD.clrScr();
  return;  
}

void do_Frei_2() {                                                      // Aufgerufenes Programm nach Tastendruck.
  
}

void do_Frei_3() {                                                      // Aufgerufenes Programm nach Tastendruck.
  
}

void do_Frei_4() {                                                      // Aufgerufenes Programm nach Tastendruck.
  
}


Gruß Marc

Shy
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.08.2014, 21:16 (Dieser Beitrag wurde zuletzt bearbeitet: 17.08.2014 21:21 von Thorsten Pferdekämper.)
Beitrag #2
RE: Kommunikation zwischen 2 Arduinos per APC-220
Hi,
ich habe mir nicht alles angesehen, aber zwei seltsame Dinge sind mir aufgefallen:
1. Du rufst irgendwo loop() explizit auf. Ich nehme an, dass das aus einer Funktion erfolgt, die im Endeffekt selbst aus loop() aufgerufen wird. Das erzeugt eine endlose Rekursion. Damit ist irgendwann der Stack voll bzw. überschreibt den Heap. Was dann kommt kann man nicht vorhersagen, aber wahrscheinlich stürzt alles komplett ab.
2. In loop() springst Du per goto an den Anfang der Funktion, das anscheinend immer. Das ist auch nicht wirklich geschickt. loop() wird sowieso automatisch immer wieder aufgerufen. Womöglich macht die Arduino-Umgebung zwischen den loop()-Aufrufen irgendwas wichtiges.
Gruß,
Thorsten

Hi,
noch was: Ich glaube Status() ruft sich auch immer wieder selbst auf. Außerdem wird command glaube ich nie zurückgesetzt und wird dadurch immer länger. Dadurch ist auch irgendwann der Speicher am Ende und der Arduino gibt auf.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.08.2014, 01:08 (Dieser Beitrag wurde zuletzt bearbeitet: 18.08.2014 07:58 von rkuehle.)
Beitrag #3
RE: Kommunikation zwischen 2 Arduinos per APC-220
Hallo Marc, Hallo Thorsten,

Punkt 2 im Post von Thorsten: Das "goto start" macht schon Sinn, da es aus der while(1) Schleife kommt, die man sonst, nach Rückkehr aus l_l_screen(), nicht verlassen würde. Somit wäre keine Abfrage der Buttons mehr möglich.
Throrstens Bemerkung zu Status() ist jedoch berechtigt. Besser am Anfang von Status() ebenfalls eine Sprungmarke setzen und im else-Zweig ein goto zur Sprungmarke machen.
Naja, und der separate loop() - Aufruf ist "aboslute forbidden".
Ich erlaube mir mal die Bemerkung, dass man dazu verleitet wird wenn im Code die (Haupt)-Funktionen nicht in der Reihenfolge ihres Aufrufs geschrieben werden. Daher kann ich das auch aktuell nicht interpretieren. Vielleicht kann Marc mal an einem einzelnen Beispiel aufschreiben in welcher Reihefolge welche Funktion welche aufruft.
Grüße RK

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.08.2014, 11:04
Beitrag #4
RE: Kommunikation zwischen 2 Arduinos per APC-220
Danke euch beiden für die Antworten,

Also das mit dem loop im loop Big Grin ist wohl wirklich schwachsinn war zu lange vor der IDE gesessen Tongue

Zum Ablauf des Programmes:

Erst soll der Startbildschirm mit den 3 Menüs angezeigt werden also:
Status , Steuern , Einstellungen.

Wenn ich dann auf "Status" gehen öffnet sich das nächste Untermenü soweit passt ja alles.

Nun dachte ich mir wie stelle ich sicher das ich aktuelle Daten von der Basisstation visualisiere?! Ich kahm dann auf folgenden Programmablauf:

Wenn ich im Untermenü auf : Button - Unterprogramme

Drücke dann springt es in Status(), dort holt es sich aktuelle Daten der Basisstation setzt im Mega+Touch die entsprechenden Merker. Danach geht es in Anzeige_Status(), dort soll je nach Merker Status das kleine Rechteck hinter dem jeweiligen Text zb. Temperatur (für Temperaturunterprogramm in der Basistation) grün für aktiv oder rot für inaktiv angezeigt werden.

Das Problem: irgentwie stimmt etwas mit der (while Serial...) abfrage für die Zahlenkombies bsp. 1100 usw. Nicht ich glaube er wartet nicht er arbeitet irgentwie weiter nur wenn ich im richtigen moment eine zahl übers terminal schicke dann geht es aber die farbe bleibt hinter temperatur immer grün egal ob der merker true oder false ist.

Danke euch beiden! Smile

Gruß Marc

Shy
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.08.2014, 11:30
Beitrag #5
RE: Kommunikation zwischen 2 Arduinos per APC-220
Hi,
schmeiss mal den Aufruf von Status() innerhalb von Status() raus. Das ist IMHO auch Blödsinn.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.08.2014, 11:34
Beitrag #6
RE: Kommunikation zwischen 2 Arduinos per APC-220
Nachtrag:

1.)

Ich habe vorerst nur Temperatur mit den Merkern und den zwei Farb Modis Verknüpft! Nur dass ich mich auch richtig ausgedrückt habe Wink nicht das ihr denkt ich wundere mich warum zb. Bei regen oder alarm keine änderung passiert Smile (hab ich noch nicht verknüpft).

2.)

Falls ihr eine Bessere Idee habt wie ich das etwas eleganter lösen kann lasst es mich wissen Wink bin ja Anfänger von daher denke ich wohl öfters etwas umständlich da ich noch nicht alle Funktionen kenne, und nicht so fit bin Wink

Gruß Marc

Shy
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.08.2014, 12:06
Beitrag #7
RE: Kommunikation zwischen 2 Arduinos per APC-220
Hi,
vielleicht ein paar allgemeine Tipps: Verbiete Dir selbst die Verwendung von goto und delay. Das, was man statt dessen tun muss, kommt einem am Anfang schwierig vor, aber insgesamt wird's dadurch praktisch immer besser.
Außerdem: Schmeiss so lange Zeugs aus Deinem Program raus, bis der Rest so funktioniert, wie Du es erwartest. Dann nach und nach kleine Stückchen wieder einfügen. (...und auch ausprobieren.)
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.08.2014, 14:49
Beitrag #8
RE: Kommunikation zwischen 2 Arduinos per APC-220
Hey Leute,

@ all:

So ich habe jetzt mal das UNSINNIGE zweite loop(); rausgeschmissen und den Status() Aufruf auch.

Mir is noch etwas "doofes" aufgefallen:

Ich bestätige den "Button" -> 'Unterprogramme' dann schicke ich über die Serielle eine (1000) für die Auswahl:

Code:
unterprogrammtemperatur  = true;    
                unterprogrammregen         = false;
                unterprogrammalarm         = false;
                unterprogrammlicht           = false;

aber ich muss nachdem ich die (1000) gesendet habe nocheinmal auf den "Button" 'Unterprogramme' drücken, dass sich der Anzeige_Status() -> Bildschirm öffnet.

Ich dachte eigentlich, dass das ganze so ablaufen würde:

Ich gehe auf 'Unterprogramme'.
Im Hintergrund spring das Programm in Status(), macht eine Ausgabe über die Serielle (also sendet) "Status", dann wartet das Programm bis eine Zahl empfangen wurde also zb. die (1000) nun wird verglichen was zutrifft dementsprechend die Merker der einzelnen Unterprogramme entweder (true oder false) gesetzt.

Jetzt geht es ins Anzeige_Status() Programm, das nun den Bildschirm schwarz färbt und die 3 Texte: Temperatur, Regen, Alarmanlage aufs LCD schreibt, und dahinter bei "Temperatur" die Farbe entweder rot (für Merker Temperatur = false) oder grün ( für Merker Temperatur = true) einfärbt.
Komischer Weise bleibt die Farbe immer grün Huh
und wird nicht anhand des Merker's angepasst, die Auswahl über die Serielle Schnittstelle also das was die Merker setzt oder löscht, dass funktioniert aber. Das habe ich getestet mit meinen "DEBUG" Meldungen .


Jetzt wird natürlich auch nachdem ich im Anzeige_Status() bin. Nach (10 Sekunden) der LCD schwarz, weil das Programm nicht mehr zurück zum Hauptbildschirm springt also das Menü mit Status, Steuern, Einstellungen.... :/


@ Thorsten

ohne das "goto" kann ich die Buttons doch nicht abfragen ?

oder gibt es eine elegantere Möglichkeit für Menüs mit Untermenü Smile ?

//

Das mit dem Delay ersetzten durch? Meinst du millis ?

//

Das Programm habe ich ja Stückchenweise Aufgebaut also erst LCD mit Touch.
Dann die Unterprogramme.
Dann die Kommunikation.
Jetzt die Verknüpfungen und genau "hier" scheitert es momentan Sad


Vielen Dank @ all

Gruß Marc

Shy
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Kommunikation über das WiFi-Shield Flap 3 234 07.11.2016 20:20
Letzter Beitrag: hotsystems
  Kommunikation Serial Monitor --> Arduino BennIY 7 357 24.05.2016 07:48
Letzter Beitrag: hotsystems
  USB-Kommunikation ADK hr3 0 280 12.04.2016 16:43
Letzter Beitrag: hr3
  I²C Kommunikation bricht ab chhec 1 347 19.01.2016 11:10
Letzter Beitrag: ardu_arne
  Zahlenformat bei Kommunikation mit zwei Arduinos Matthias_Arduino 5 634 07.01.2016 22:40
Letzter Beitrag: Bitklopfer
  Grundlagen zur UART Kommunikation gesucht... torsten_156 10 888 16.12.2015 22:26
Letzter Beitrag: Bitklopfer
  TWI Kommunikation überprüfen chhec 8 755 29.11.2015 18:09
Letzter Beitrag: rkuehle
  Datenübergabe zwischen Arduino Uno und ESP8266 bastelmichi 0 685 25.11.2015 16:46
Letzter Beitrag: bastelmichi
  Pause zwischen SPI.transfer's Zogrob 0 420 20.10.2015 08:51
Letzter Beitrag: Zogrob
  Float über I2C zwischen 2 Arduinos UNO Marduino_UNO 9 1.624 19.10.2015 09:09
Letzter Beitrag: Retian

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste