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
Problem Wiederholung eines Case im Switch via Bluetooth
16.09.2015, 20:18
Beitrag #1
Problem Wiederholung eines Case im Switch via Bluetooth
Hi,

nachdem ich jetzt tagelang versucht habe mithilfe von Tutorials etc... mein Problem zu lösen aber es noch nicht geschafft habe, hoffe ich dass ihr mir weiterhelfen könnt.

Ich möchte zwei Motoren via Bluetooth und Button steuern. Durch einen Klick auf den Button oder die Eingabe eine Zahl via Serial soll durch die Muster gewechselt werden die sich so lange wiederholen sollen bis der Button erneut gedrückt wird oder eine neue Eingabe via Serial getätigt wird.

Die Kontrolle über den Button funktioniert soweit schon so wie gewünscht. Bei einem Klick wiederholt er den ersten Loop solange bis er erneut gedrückt wird dann wechselt er durch den switch zu dem nächsten und so weiter.

Das Problem was ich habe ist bei dem Bluetooth void. Wenn ich via Serial eine Eingabe mache spielt er den gewünschten Loop nur für 1 Sekunde ab und wechselt dann wieder zu dem Loop des Buttons zurück der dort zuletzt gewählt wurde.
Was muss ich ändern oder hinzufügen damit er das Muster so lange wiederholt, bis erneut eine Eingabe via Serial oder Button erfolgt?

Hier ist mein Code den ich bisher habe. Ich wäre euch sehr dankbar wenn ihr mir bei der Lösung des Problems helfen könnt Smile.

Code:
#include <Arduino.h>
#include <SPI.h>
#if not defined (_VARIANT_ARDUINO_DUE_X_) && not defined (_VARIANT_ARDUINO_ZERO_)
  #include <SoftwareSerial.h>
#endif

#include "Adafruit_BLE.h"
#include "Adafruit_BluefruitLE_SPI.h"
#include "BluefruitConfig.h"

int nextTime1 = 1000;  // Do this every second or 1000 milliseconds
int nextTime2 = 600;  // Do this every 600 milliseconds
long int goTime1, goTime2;

//Motor Pin Variables
int motorPin1 = 5;//Big Motor
int motorPin2 = 6;//Small Motor
                                                                      
int buttonPin = 11;  // Button pin variable

int val = 0; // variable to read button pin value

int sequence = 1; // variable to hold current sequence


/*=========================================================================
    APPLICATION SETTINGS

    FACTORYRESET_ENABLE     Perform a factory reset when running this sketch
   
                            Enabling this will put your Bluefruit LE module
                            in a 'known good' state and clear any config
                            data set in previous sketches or projects, so
                            running this at least once is a good idea.
   
                            When deploying your project, however, you will
                            want to disable factory reset by setting this
                            value to 0.  If you are making changes to your
                            Bluefruit LE device via AT commands, and those
                            changes aren't persisting across resets, this
                            is the reason why.  Factory reset will erase
                            the non-volatile memory where config data is
                            stored, setting it back to factory default
                            values.
       
                            Some sketches that require you to bond to a
                            central device (HID mouse, keyboard, etc.)
                            won't work at all with this feature enabled
                            since the factory reset will clear all of the
                            bonding data stored on the chip, meaning the
                            central device won't be able to reconnect.
    -----------------------------------------------------------------------*/
    #define FACTORYRESET_ENABLE      1
/*=========================================================================*/


// Create the bluefruit object, either software serial...uncomment these lines
/*
SoftwareSerial bluefruitSS = SoftwareSerial(BLUEFRUIT_SWUART_TXD_PIN, BLUEFRUIT_SWUART_RXD_PIN);

Adafruit_BluefruitLE_UART ble(bluefruitSS, BLUEFRUIT_UART_MODE_PIN,
                      BLUEFRUIT_UART_CTS_PIN, BLUEFRUIT_UART_RTS_PIN);
*/

/* ...or hardware serial, which does not need the RTS/CTS pins. Uncomment this line */
// Adafruit_BluefruitLE_UART ble(BLUEFRUIT_HWSERIAL_NAME, BLUEFRUIT_UART_MODE_PIN);

/* ...hardware SPI, using SCK/MOSI/MISO hardware SPI pins and then user selected CS/IRQ/RST */
Adafruit_BluefruitLE_SPI ble(BLUEFRUIT_SPI_CS, BLUEFRUIT_SPI_IRQ, BLUEFRUIT_SPI_RST);

/* ...software SPI, using SCK/MOSI/MISO user-defined SPI pins and then user selected CS/IRQ/RST */
//Adafruit_BluefruitLE_SPI ble(BLUEFRUIT_SPI_SCK, BLUEFRUIT_SPI_MISO,
//                             BLUEFRUIT_SPI_MOSI, BLUEFRUIT_SPI_CS,
//                             BLUEFRUIT_SPI_IRQ, BLUEFRUIT_SPI_RST);


// A small helper
void error(const __FlashStringHelper*err) {
  Serial.println(err);
  while (1);
}

/**************************************************************************/
/*!
    @brief  Sets up the HW an the BLE module (this function is called
            automatically on startup)
*/
/**************************************************************************/


void setup()
{

  //Set each pin connected to an LED to output mode (pulling high (on) or low (off)
  
      pinMode(motorPin1,OUTPUT);//Set Motor as Output
      pinMode(motorPin2,OUTPUT);//Set Motor as Output
      pinMode(buttonPin, INPUT); // Set button pin to be an input

     goTime1 = millis();
     goTime2 = millis();
}                                
  




void loop()                     // run over and over again
{                          
if(millis() >= goTime1) button();
if(millis() >= goTime2) bluetooth();
}

//Configuration of gotime

void button(){
                            
       // check if button pressed
        val = digitalRead(buttonPin);
        if(val == LOW)
        {
            if(sequence == 3) // if sequence is at 3 already, make it 1 again
            {
               sequence = 1;
            } else
                {
                  sequence++; // otherwise go to the next sequence
                }
        }
                  
         switch(sequence)
                 {
                     case 1:
                     Loop1();
                     Serial.println("Loop1");
                     break;
                     case 2:
                     Loop2();
                     Serial.println("Loop2");
                     break;
                     case 3:
                     Loop3();
                     Serial.println("Loop3");
                     break;
                 }
                      
}  

void bluetooth(){
if (Serial.available() > 0) {
    int inByte = Serial.read();

    switch (inByte) {
      case '1':
        Loop1();
        Serial.println("Modus 1");
        break;
      case '2':
        Loop2();
        Serial.println("Modus 2");
        break;
      case '3':
        Loop3();
        Serial.println("Modus 3");
        break;
    }
  }
  }

  
  
//Configuration of the different Motor Loops

void Loop2(){
  int delayTime = 100;
  digitalWrite(motorPin1, HIGH);  
  delay(delayTime);              
  digitalWrite(motorPin2, HIGH);  
  delay(delayTime);              
  digitalWrite(motorPin2, LOW);  
  delay(delayTime);              
  digitalWrite(motorPin2, LOW);  
  delay(delayTime);                
  digitalWrite(motorPin1, LOW);  
  delay(delayTime);            
  digitalWrite(motorPin2, HIGH);  
  delay(delayTime);              
  digitalWrite(motorPin2, HIGH);  
  delay(delayTime);              
  digitalWrite(motorPin2, LOW);  
  delay(delayTime);              
}

void Loop1(){
int delayTime = 1000;
  digitalWrite(motorPin1, LOW);  
  digitalWrite(motorPin2, LOW);
  delay(delayTime);  

}


void Loop3(){
   int delayTime = 100;
  digitalWrite(motorPin1, HIGH);  
  digitalWrite(motorPin2, HIGH);
  delay(delayTime);              
   digitalWrite(motorPin1, LOW);  
  digitalWrite(motorPin2, LOW);  
  delay(delayTime);              
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.09.2015, 21:36
Beitrag #2
RE: Problem Wiederholung eines Case im Switch via Bluetooth
Ich vermute dein Problem liegt in den Delays die du in den "Loop1-Loop3" einsetzt.
Außerdem sind mir bei den Ausgangspins (digitalWrite) Fehler aufgefallen, da schaltest du mehrfach hinter einander ein, bzw. aus.
Das ist für mich unlogisch.

Du solltest das richtig stellen oder uns erklären. Auch müssen die delays raus, damit das Programm hier nicht hängen bleibt.

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.09.2015, 22:13
Beitrag #3
RE: Problem Wiederholung eines Case im Switch via Bluetooth
Trotz der Delays bleibt das Programm bei mir nicht hängen und funktioniert soweit. Wenn ich mit dem Button durch die programme Schalte funktionieren die wie gewünscht und wiederholen sich auch so lange bis ich den button wieder betätige. Wenn ich jedoch über den seriellen Monitor ne Eingabe mache dann wählt er das Programm nur kurz an und wechselt dann wieder zu dem letzten vom button.

Wenn ich die Delays rausnehme, dann funktioniert der serielle Monitor gar nicht mehr. Und ich brauche auch pausen zwischen den high und lows der jeweiligen Motoren, da sie nicht durchgehend laufen sollen. Sondern mal sollen die Motoren im Wechsel laufen oder in einem anderen Programm parallel und so weiter.

Der Fehler den du mit den High und Lows angesprochen hast, resultierte durch das ganze hin und her ändern des Codes. Das sollte natürlich nicht so sein da hast du recht. Dort wo es doppelt high oder low ist beim selben hab ich es jetzt ausgelöscht.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.09.2015, 22:22 (Dieser Beitrag wurde zuletzt bearbeitet: 16.09.2015 22:22 von hotsystems.)
Beitrag #4
RE: Problem Wiederholung eines Case im Switch via Bluetooth
(16.09.2015 22:13)Ecki1212 schrieb:  Trotz der Delays bleibt das Programm bei mir nicht hängen und funktioniert soweit. Wenn ich mit dem Button durch die programme Schalte funktionieren die wie gewünscht und wiederholen sich auch so lange bis ich den button wieder betätige. Wenn ich jedoch über den seriellen Monitor ne Eingabe mache dann wählt er das Programm nur kurz an und wechselt dann wieder zu dem letzten vom button.

Bei den Tasten fragst du ja auch den vorherigen Zustand ab, das machst du bei der seriellen Eingabe nicht. Daher weiß er ja nicht in welchem Zustand er aktuell ist.
Du musst auch hier den Zustand speichern und danach wieder abfragen.

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.09.2015, 22:40
Beitrag #5
RE: Problem Wiederholung eines Case im Switch via Bluetooth
Daran hatte ich mich zwischenzeitlich auch schon probiert, aber das hat leider auch nicht so geklappt. Bei dem Serial Input kann ich dem ganzen ja nicht wie beim Button einen Pin zuordnen den er nach high oder low auslesen kann als Referenz. Den Status kann ich ja wenn ich es richtig verstehe nicht auf die selbe Art und Weise auslesen wie bei dem Button. Und leider habe ich da durch googeln auch kein Tutorial gefunden welches mir weiterhelfen konnte. Bei der Nutzung des Serial Monitors sollen die Modi ja auch beliebig und nicht nach der Reihenfolge wie beim Button ausgewählt werden.

Hast du da vielleicht einen Tipp wo ich da was finden kann was das Abfragen eines Serial Status näher erläutert oder einen Anhaltspunkt wie ich googeln kann? Dinge wich check serial State oder ähnliches ergeben bei der suche leider nicht so viel.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.09.2015, 22:59
Beitrag #6
RE: Problem Wiederholung eines Case im Switch via Bluetooth
Du musst da den eingegebenen Wert (inByte) zwischenspeichern und solange der gleichbleibt (immer wieder vergleichen), diesen Zustand auch an die entsprechende Loop weiter geben.
Erst wenn der sich ändert auch die Änderung an die Loop weitergeben.

So sollte das funktionieren.
Sorry, ich bin aber jetzt weg. Sleepy

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.09.2015, 23:06
Beitrag #7
RE: Problem Wiederholung eines Case im Switch via Bluetooth
Okay ich versuch das mal hinzukriegen als alter Arduino Anfänger Big Grin.

Ich danke dir und dir dann ne gute Nacht Wink
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Menü über Bluetooth Eingabe abwarten anwo 4 502 18.10.2016 08:59
Letzter Beitrag: Lolliball
  Bluetooth HC 05 Sascha 2 1.231 18.10.2016 08:57
Letzter Beitrag: Lolliball
  Problem mit SD Card Library BennIY 4 186 06.10.2016 18:38
Letzter Beitrag: Bitklopfer
  Unterschiedliche Programme durch Switch/ Case SpeedShifter 26 604 04.10.2016 15:29
Letzter Beitrag: SpeedShifter
  Bluetooth refresh der Seite kaimaik 7 216 01.10.2016 22:05
Letzter Beitrag: kaimaik
Rainbow Bluetooth Arduino - Arduino Bluetooth ChrisBeer222 6 1.283 26.09.2016 21:40
Letzter Beitrag: Bitklopfer
  Frage zur Programmierung eines Ultraschallsensors jalu4601 10 347 21.09.2016 15:06
Letzter Beitrag: Bitklopfer
  Ansteuern eines Schrittmotors Uwe1475 28 1.010 03.09.2016 21:03
Letzter Beitrag: Uwe1475
  Problem mit SD.remove Eichner 6 210 22.08.2016 19:42
Letzter Beitrag: Eichner
  Switch/Case mit chars phischmi 8 329 24.07.2016 21:00
Letzter Beitrag: phischmi

Gehe zu:


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