Bluetooth Rollo

Hey Leute,

ich habe momentan ein Projekt am laufen, bei dem ich über ein HC06 Modul und eine Android app ein Rollo Steuern möche. Ich sende quasi Chars ( 1 2 3) per Handy an eine Serielle Schnittstelle, welche vorher mit der SoftwareSerial Library erstellt wurde. Meine Frage ist recht Simpel denke ich aber ich komme nicht drauf.

Ich unterscheide 3 Fälle 1=Rollo fährt Hoch 2= Rollo fährt Runter 3 = automatik Modus über Lichtsensor. Dies wird per Switch Case anweisung gemacht .Das Problem ist beim Prüfen der Sensorwerte kann ich aufgrund der While-schleife die zur Überprüfung läuft nicht mehr in die anderen 2 Fälle mittels Handyapp Springen. Hat da jemand irgend nen Denkanstoß wie man solche Probleme löst?

void loop() {

  if (softSerial.available()) {

    commandoChar = softSerial.read();

    switch (commandoChar)
    {
      case '1':

    Serial.print("Fahre Rollto Hoch");


      break;


      case'2':

    Serial.print("Fahre Rollo Runter");
      break;

      
      case '3':
    
       while(commandoChar=3){
   
        if (myRadio.available()) {

          while (myRadio.available())
          {
            myRadio.read(&receiveSensorData, sizeof(receiveSensorData));
          }
          Serial.print("Data Received Value is :");
          Serial.println(receiveSensorData);
        // Funktion für automatische drehung einfügen
        
            commandoChar = softSerial.read();

        }
       }
    
        break;




        
    }
  }

}

While-Schleifen sind beim AVR weitesgehend bis auf wenige Ausnahmen ein absolutes NoGo!! Dein Programm bedarf einer kompletten Umstrukturierung. Hier bietet sich eigentlich nur das EVA-Prinzip an.

1) Eingabe Hier wird bei jedem Durchlauf überprüpft, ob du ein neues Zeichen erhalten hast. Hier solltest du zusätzlich noch den Zustand Stopp (zB 0) mit einplanen. Damit wäre der Serielle Empfang in deinem Programm auch schon beendet.

2) Verarbeitung Entscheide über ein switch, in welchem Modus du dich befindest. Erreicht der Modus Hoch oder Runter den Endschalter, so sollte dieser auch bewirken, dass der der Modus = 0 wird. Für den Automatik Modus fragst du in jedem Durchlauf ab, in wie weit sich die Rollos dem Licht anpassen müssen. Eine Filterung über x-Werte wäre nicht verkehrt. Ggf sogar nur eine Abfrage allle 5 Minuten (mit millis())

3) Ausgabe Hier werden dann lediglich noch Relais angesteuert und es können ggf. noch ein paar Sicherheitsmechanismen eingebaut werden können. zB wenn Modus Hoch oder Runter länger als 30 Sekunden aktiv, Anlage auf Störung schalten bzw. Motor abschalten -> Gurtriss

Wo ist denn der Lichtsensor angeschlossen ? ich sehe den nicht.

Den kannst du in der Loop immer auslesen und nur wenn die Eckwerte erreicht werden, wird per if-Anweisung dein Automatikmodus aktiviert.

Der Lichtsensor wird an einem anderen Arduino angeschlossen , da dieser vor dem Tv steht und dieser kommuniziert mittels Funksender zum Arduino, welcher den Motor steuert.

Eigentlich versuche ich nur eine Funktion zu schreiben, die bei Case 3 die Werte des Lichtsensor einliest auswertet und den Motor dementsprechend dreht. Mein Problem ist jedoch dass ich nicht genau weiß wie ich aus der Empfangsschleife wieder rauskomme.Bzw wie ich das anders realisieren kann.Interrupts eventuell aber da muss ich nochmal schauen.

Du solltest dann einen Timer verwenden, der z.B. alle 10 Sek. das Signal empfängt und auswertet, aber nicht dauernd. Sieh die mal SimpleTimer.h an, darüber kannst du das steuern. Aber so lange der Empfänger abgefragt wird, geht eben nichts anderes.

Interrupt brauchst du dazu nicht.

Aber warum unbedingt Bluetooth ? ich hätte es mit Funk 433 MHz gelöst, zumindest eine Strecke.

Die Lösung steht in meinem Beitrag oben bereits drin :relaxed:

Das war eher ne allgemeine Herangehensweise als ein konkreter Lösungsvorschlag … trotzdem danke

bananenmilch: Das war eher ne allgemeine Herangehensweise als ein konkreter Lösungsvorschlag ... trotzdem danke

Aber solltest du dir unbedingt mal überlegen, ob dieses nicht besser ist, an dein Problem heran zu gehen.

Naja ich kann selber in ein Schulbuch schauen da EVA Prinzip nachlesen das bringt mir im Konkreten fall auch nichts, ein Forum ist ja dafür da zu fragen und auch konkrete antworten zu bekommen ,beziehungsweise Tipps von Leuten zu erhalten die vllt. schon mal ähnliche Probleme gehabt haben.

Ich habs schon mit Flags probiert und während der Empfangsschleife das Handysignal abzufragen, aber das will nicht funktionieren. Mir gehts darum, wie ich das Signal welches mir die Modi umschaltet während der Empfangsschleife abfragen kann, sodass diese beendet wird. Normal müsste ich doch nur in der While schleife abfragen, was grade am Handy gedrückt ist.

bananenmilch: Naja ich kann selber in ein Schulbuch schauen da EVA Prinzip nachlesen das bringt mir im Konkreten fall auch nichts, ein Forum ist ja dafür da zu fragen und auch konkrete antworten zu bekommen ,beziehungsweise Tipps von Leuten zu erhalten die vllt. schon mal ähnliche Probleme gehabt haben.

Wenn du so weiter machst, wird dir keiner helfen. Das sind Hinweise die zur besseren Programmierung unverzichtbar sind.

In deinem Fall wäre es aber angebracht, den Code zu optimieren.

Ich habs schon mit Flags probiert und während der Empfangsschleife das Handysignal abzufragen, aber das will nicht funktionieren. Mir gehts darum, wie ich das Signal welches mir die Modi umschaltet während der Empfangsschleife abfragen kann, sodass diese beendet wird. Normal müsste ich doch nur in der While schleife abfragen, was grade am Handy gedrückt ist.

Du solltest so vorgehen, dass du den Wert des Sensors nur selten abrufst und dann zwischenspeicherst.

Mein Lösungsvorschlag ist das was du eigentlich brauchst. Das Forum ist nicht dazu da, das wir den Leuten einen fertigen Code liefern. Lernen muss jeder, wir zeigen den Weg!

Habe dir das EVA Prinzip an dein Problem sogar angeleht, weil deine Probleme von der falschen Programmierstrategie kommen.

Ich überprüfe doch per Switch case die eingehenden Zeichen nur weiß ich nicht wie ich dann aus der Switchcase wieder rauskomme.... ich verlange auch keine fertigen Codes aber vielleicht mal ein wenig konkretes Beispiel oder sowas. Nur zu sagen deine Programmierstrategie ist falsch zeugt jetzt auch nicht davon sich mit dem Problem auseinandergesetzt zu haben btw.

So wie es immer noch oben steht. Das Problem ist nicht dein Switch. Darin hängt das Programm nicht, sondern in deiner While Schleife innerhalb des Switch. Ich habe dir bereits die Info gegeben, dass die herangehensweise nicht funktionieren wird. Das EVA Prinzip gibt es nicht aus einer Willkür heraus. Hast du dir den Text überhaupt richtig durchgelesen und ansatzweise versucht anzuwenden? Wenn ja, dürften die Fragen nicht mehr auftauchen. Code Beispiele poste ich nicht, da sowas für den Lerneffekt überhaupt nichts bringt. Du kannst deinen Code nach dem oben genannten Prinzip posten. Wenn es da irgendwo dann hackt, kann man weiterhelfen.

Switch/Case ist nicht das Problem. Du musst dich von "while" trennen.

Rufe die Empfangsroutine durch einen Timer (Beispiel: SimpleTimer oder millis) alle 60 Sek auf und nimm den empfangenen Wert für weitere Aktionen. Hatte ich auch schon so geschrieben. Diesen Wert prüfst du in einer if-Anweisung.

Also ich habe mir mal das Beispiel "Blink without delay" angeschaut das möchte ich nun in der case 3 anwenden um sagen wir mal jede Sekunde nen wert zu bekommen...... Folgendes ist ja nun das Problem ich bin in meiner Loop und drücke am Handy den automatik modus und springe in Case 3 nun habe ich ja keine Schleife mehr um jede Sekunde nen Wert zu generieren der Case steht ja dann quasi ....selbiges Problem ergibt sich ja mit der timer funktion ich weiß einfach nicht wie ich da ne schleife rein bekomme ohne while zu benutzen :(

Trenne dein Programm auf, ggf zur besseren Veranschaulichung auch in Unterprogrammen/Funktionen. Zum testen lässt du deinen LDR am anderen Arduino erst einmal komplett aussenvor. Nehme anstatt des LDRs erst einmal nur einen Poti denn du an einem analogen Pin anschließt.

Aufbau vom Programm innerhalb der Loop

  1. Anhand des Blink Without Delay Beispieles den Potentiometer alle 5 Sekunden auslesen. Vorzugsweise auch nur dann auf die Serielle Konsole schreiben
    static unsigned long lastMillis = 0;
    static unsigned int lastLdr = 0;
    if(millis() - lastMillis >= 5000)
    {
    lastMillis = millis();
    lastLdr = analogRead(POTI);
    Serial.println(lastLdr);
    }
    static byte cmd = 0;
    // Serielle Commands auslesen ohne while!

byte hoch = 0;
byte runter = 1;
// Entscheiden, was gemacht werden muss, Motor hoch oder runte,r oder garnichts. Dazu eine der beiden Variablen setzen (erfolgt in jedem Durchlauf) Aufpassen, hoch und runter dürfen nicht beide aktiv sein. Das muss in der Software sowie auch mit der Hardware verriegelt sein!

// Ausgänge setzen
digitalWrite(motorHoch, hoch);
digitalWrite(motorRunter, runter);

Das ist ja schön und gut, dass das in der normalen loop funktioniert ist mir klar… mein Problem liegt darin dass das nicht mit ner Switch Case Anweisung harmoniert… es wertet nur dann aus wenn ich am Handy den Automatik Button drücke…und ich möchte den button einmal drücken und er soll in der 3ten Anweisung bleiben bis vom handy ein anderes signal kommt. Quasi soll das andere Signal vom Handy die aktuelle Handlung der switch case Anweisung unterbrechen. :frowning: :frowning: :frowning:

Ich habe eine ganz einfache Lösung für dein Problem.

Lerne die Basics, dann verstehst du uns und unsere Vorschläge und kommst evtl. selbst auf die Lösungen, die wir dir hier schon eine Zeit lang erklären.

Bisher hast du all unsere Vorschläge in den Wind geschlagen. Danke.

Es gibt sich noch andere die dir bei deinem Problem helfen möchten, ich bin hier raus.

Welche App nutzst du?