Bluetooth und Arduino UNO

Hey Freunde des Wissens,

habe ein Uno an dem ein Hc05 hängt.

Mich würde interessieren, ob es unterschiede von SoftwareSerial zu Rx Tx gibt.

Ist SoftwareSerial langsamer beim Datenaustausch als wie wenn ich direkt Rx und Tx mit dem hc05 Modul verbinde?
Was ist sinnvoller?
Beim Hochladen muss ich Rx und Tx abstecken, sonst gibts ja Probleme.

Weil ich das Problem habe, dass mein Bluetooth relativ "langsam" reagiert.
Hab eine App mit MIT2 App Inventor erstellt die Texte ans Arduino schickt. Dass wiederum schaltet damit Relais. Jedoch passiert es bei schnellerem drücken von den Buttons in der App dass Bluetooth sich aufhängt und meistens dauert es erst 2-3 Sekunden nach drücken eines Buttons dass Arduino mal was schaltet.

Dachte also daran dass SoftwareSerial eventuell langsam ist, daher das Thema.
Weiß jemand wie man diese Probleme umgehen kann?
Andere Geräte können ja auch per Bluetooth Riesen Datenmengen fast in Echtzeit versenden, dass kann der Arduino bestimmt auch oder?

Hier mal der Code

#include <SoftwareSerial.h>


#include <IRremote.h>

#define ArduinoPin 2
#define ArduinoPin 3
#define relaisPin5 4 //bw licht //BW_ON//BW_0FF
#define relaisPin6 5 //heisl licht //Haisl_ON // Haisl_OFF
#define relaisPin7 6 // Barbeleuchtung_ON
#define relaisPin8 7 //tischlicht links // Tilinks_ON // Tilinks_OFF
#define relaisPin9 8 //tischlicht rechts // Tirechts_ON // Tirechts_OFF
#define relaisPin10 9
#define relaisPin11 10 // schwarzlichter //Schwarzli_ON // Schwarzli_OFF
#define relaisPin12 11 // außenstrahler // Strahler_ON// Strahler_OFF
#define rxPin 12 // bluetooth
#define txPin 13 // bluetooth 
#define relaisPin13 A0
#define relaisPin14 A1
#define relaisPin15 A2 // Sternenhimmel // Stern_ON // Stern_OFF
#define relaisPin16 A3 // betriebsminutenzähler
#define relaisPinA4 A4 // audizeichen // Audi_ON // Audi_OFF

int RECV_PIN = 9;

byte Heisl = 0;
byte BW = 0;
byte Strahler = 0;
byte Stern = 0;
byte Audi = 0; 
byte Tischlicht = 0; 
byte Schwarz = 0; 
byte Barbeleuchtung = 0; 

long previousMillis = 0;
unsigned long currentMillis = millis();

boolean restart = false;


SoftwareSerial btSerial(rxPin, txPin);
IRsend irsend;
IRrecv irrecv(RECV_PIN);

decode_results results;



String btData;
int khz = 38;


void setup() {



  btSerial.begin(9600);
  //  btSerial.println("Bluetooth_Verbindung_stabil");
  Serial.begin(9600);
  Serial.print("Bluetooth_Verbindung_stabil");
  irrecv.enableIRIn(); // Start the receiver


  pinMode(relaisPinA4, OUTPUT);
  pinMode(relaisPin5, OUTPUT);
  pinMode(relaisPin6, OUTPUT);
  pinMode(relaisPin7, OUTPUT);
  pinMode(relaisPin8, OUTPUT);
  pinMode(relaisPin9, OUTPUT);
  pinMode(relaisPin10, OUTPUT);
  pinMode(relaisPin11, OUTPUT);
  pinMode(relaisPin12, OUTPUT);
  pinMode(relaisPin13, OUTPUT);
  pinMode(relaisPin14, OUTPUT);
  pinMode(relaisPin15, OUTPUT);
  pinMode(relaisPin16, OUTPUT);

  restart = true;

}



void loop() {

  if (restart ==  true) {
    digitalWrite(relaisPin5, HIGH);
    delay(250); digitalWrite(relaisPin6, HIGH);
    delay(250); digitalWrite(relaisPin7, HIGH); delay(250); digitalWrite(relaisPin8, HIGH); delay(250); digitalWrite(relaisPin9, HIGH);
    delay(250); digitalWrite(relaisPin10, HIGH);
    delay(250); digitalWrite(relaisPin11, HIGH); delay(250); digitalWrite(relaisPin12, HIGH); delay(250); digitalWrite(relaisPin13, HIGH);
    delay(250); digitalWrite(relaisPin14, HIGH);
    delay(250); digitalWrite(relaisPin15, HIGH); delay(250); digitalWrite(relaisPinA4, HIGH); delay(250); restart = false;
  }


  RelaisTakt(60000, 1000);


  // IR_Receive_Signal (); // nur zum programmieren da



  if (btSerial.available()) {
    btData = btSerial.readString();
    //Serial.println(btData);


    if (btData == "Stern_ON") {

      Stern++;

      if ( Stern != 0 ) {
        digitalWrite(relaisPin15, LOW);
      }

      if ( Stern >= 2 ) {
        digitalWrite(relaisPin15, HIGH);
        Stern = 0;
      }
    }

    if (btData == "Strahler_ON") {

      Strahler++;

      if ( Strahler != 0 ) {
        digitalWrite(relaisPin12, LOW);
      }

      if ( Strahler >= 2 ) {
        digitalWrite(relaisPin12, HIGH);
        Strahler = 0;
      }
    }

    if (btData == "BW_ON") {

      BW++;

      if ( BW != 0 ) {
        digitalWrite(relaisPin5, LOW);
      }

      if ( BW >= 2 ) {
        digitalWrite(relaisPin5, HIGH);
        BW = 0;
      }
    }

    if (btData == "Haisl_ON") {

      Heisl++;

      if ( Heisl != 0  ) {
        digitalWrite(relaisPin6, LOW);
      }

      if ( Heisl >= 2 ) {
        digitalWrite(relaisPin6, HIGH);
        Heisl = 0;
      }
    }

    if (btData == "Tilinks_ON") {

      Tischlicht++;

      if ( Tischlicht != 0 ) {
        digitalWrite(relaisPin8, LOW);
        digitalWrite(relaisPin9, LOW);
      }

      if ( Tischlicht >= 2 ) {
        digitalWrite(relaisPin8, HIGH);
        digitalWrite(relaisPin9, HIGH);
        Tischlicht = 0;
      }
    }

    if (btData == "Schwarzli_ON") {

      Schwarz++;

      if ( Schwarz != 0 ) {
        digitalWrite(relaisPin11, LOW);
      }

      if ( Schwarz >= 2 ) {
        digitalWrite(relaisPin11, HIGH);
        Schwarz = 0;
      }
    }

    if (btData == "Audi_ON") {

      Audi++;

      if ( Audi != 0 ) {
        digitalWrite(relaisPinA4, LOW);
      }

      if ( Audi >= 2 ) {
        digitalWrite(relaisPinA4, HIGH);
        Audi = 0;
      }
    }
/*
if (btData == "Barbeleuchtung_ON") {

      Barbeleuchtung++; 
      
      if ( Barbeleuchtung != 0 ) {digitalWrite(relaisPin7, LOW);  }

      if ( Barbeleuchtung >= 2 ) { digitalWrite(relaisPin7, HIGH);   Barbeleuchtung = 0; }
    }
    */
  }
}

// infrarotsignal empfangen, wenn neu //
void IR_Receive_Signal () {

  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    irrecv.resume(); // Receive the next value
  }
  delay(100);

}


// infrarotsignal senden ///
void IR_SendSignalOn() {

  for (int i = 0; i < 3; i++) {
    unsigned int irSignalOn[] = {};      //Ir code eingeben in klammern
    irsend.sendRaw(irSignalOn, sizeof(irSignalOn) / sizeof(irSignalOn[0]), khz);

    delay(200);
  }

  //for (int i = 0; i < 3; i++) {
  //irsend.sendSony(0xa90, 12); // hier hexa code eingeben, den Steckdose erwartet.
  //delay(40);
  //  }
  // delay(5000); //5 second delay between each signal burst

}


void IR_SendSignalOff() {

  for (int i = 0; i < 3; i++) {
    unsigned int irSignalOff[] = {};      //Ir code eingeben in klammern
    irsend.sendRaw(irSignalOff, sizeof(irSignalOff) / sizeof(irSignalOff[0]), khz);

    delay(200);
  }

  //for (int i = 0; i < 3; i++) {
  //irsend.sendSony(0xa90, 12); // hier hexa code eingeben, den Steckdose erwartet.
  //delay(40);
  //  }
  // delay(5000); //5 second delay between each signal burst

}

//   betriebsminutenzähler   //
void RelaisTakt(unsigned long Intervall, unsigned long Dauer) {
  static unsigned long tEin;
  if (millis() - tEin > Intervall) {
    digitalWrite(relaisPin16, LOW);
    tEin = millis();
  }
  if (millis() - tEin > Dauer) {
    digitalWrite(relaisPin16, HIGH);
  }
  // Serial.println(millis()); Serial.print(tEin); Serial.print(Intervall); Serial.print(Dauer);
}

Danke vorab schon mal für Tipps oder Hilfen

Gruss

Ich verstehe nicht, was du mit langsamer meinst.
Die Übertragungsgeschwindigkeit hängt von der eingestellten Baudrate ab, die du ja anpassen kannst.
Diesbezüglich sind mir keine Probleme bekannt.

Hallo Dieter,

habe die Baudrate auf 9600 im Code und im hc05

Du meinst, stelle ich diese Höher, löst das mein Problem?

Ich drücke zum Beispiel auf der App einen Button der eine Lampe einschaltet. Danach dauert es mind 2 oder 3 Sekunden, bis das Relais schaltet.

Kann ich da jede Baudrate nehmen oder muss ich da auf was achten?

Gruss

Hi

Bei 9600Baud dauert ein Zeichen 1ms - Das sidn 1000 Zeichen in einer Sekunde - denke NICHT, daß Da Dein Problem zu finden ist - so kompliziert wird der Befehl der App wohl dann doch nciht sein, daß wir mit über 1000 Zeichen Code rechnen müssen.

Was 'schwätzt' der Empfänger-Arduino?
Vll. diverse delay() drin?

MfG

PS: Das liest sich GRAUSIG - schmeiß die unnötigen Leerzeilen da raus - STRG+T in der IDE helfen außerdem, die Lesbarkeit zu erhöhen.

Franz_grundi:
Kann ich da jede Baudrate nehmen oder muss ich da auf was achten?

Du kannst bei SoftwareSerial bis 57600 Baud gehen, das funktioniert bei mir sehr sicher.
Es funktioniert auch noch mit 115200 Baud, aber ist außerhalb der Spezifikation.

Ich weiß allerdings nicht, was der HC-05 kann.

Hallo,

delays habe ich keine drinnen. Aber habe eventuell den Fehler gefunden.
Hatte eine Lange schleife drinnen, die im Loop jedes mal durchlaufen wird. Eventuell hilft das - hab die ins Setup gepackt.

Andere Frage noch...

Wenn ich einen Pin als Output setze im Setup, ist der dann von Haus aus HIGH oder LOW -- ohne ändern durch digitalWrite ?

Gruss

Deinen Sketch habe ich mir nicht komplett angeschaut, aber mir ist schon am Anfang ein Fehler aufgefallen:

#define ArduinoPin 2
#define ArduinoPin 3

Du definierst für ArduinoPin nacheinander Pin 2 und 3, d.h., der festgelegte Pin 2 wird mit Pin 3 überschrieben.

Franz_grundi:
delays habe ich keine drinnen.

Dann hast du wohl den falschen Sketch hier gepostet, da sehe ich nämlich ne ganze Latte an delays.

Franz_grundi:
Hallo,

delays habe ich keine drinnen. Aber habe eventuell den Fehler gefunden.
Hatte eine Lange schleife drinnen, die im Loop jedes mal durchlaufen wird. Eventuell hilft das - hab die ins Setup gepackt.

Andere Frage noch...

Wenn ich einen Pin als Output setze im Setup, ist der dann von Haus aus HIGH oder LOW -- ohne ändern durch digitalWrite ?

Gruss

Das du delays drin hast, wurde ja schon geschrieben.

Und der Ausgang ist nicht definiert, solltest du also zwingend setzen, wie du ihn brauchst.

Nebenbei benutzt du den Pin 9 doppelt: IR und ein Relais

Hallo,

Ein Pin ist nach pinMode(x, OUTPUT) standardmäßig immer LOW.
Ein Pin ist nach pinMode(x, INPUT) standardmäßig immer floatend.
Ein Pin ist nach pinMode(x, INPUT_PULLUP) HIGH, der interne Pullup ist eingeschalten.

Ein dringender Rat zu deinem Code. Lerne den Umgang mit millis. Deiner ewig laufenden Armbanduhr.

Ein Pin ist nach pinMode(x, OUTPUT) standardmäßig immer LOW.
Ein Pin ist nach pinMode(x, INPUT) standardmäßig immer floatend.

Frage mich, was du unter "standardmäßig immer" verstehst.
Ich würde eher "Nach Reset ohne weitere Ansteuerungen" sagen.

Hi

Was standardmäßig, ohne weiteres Zutun, aber auch immer der Fall ist.
Solange ich den Pin nicht ansteuer, kann der µC monatelang im Kreis laufen, an dem Pin ändert sich Nichts.

Wenn ich den Pin auf INPUT umgeschaltet habe, ändert sich daran auch nicht mehr viel, wenn ICH DIESE ÄNDERUNG nicht veranlasse.

MfG

michael_x:
Frage mich, was du unter "standardmäßig immer" verstehst.
Ich würde eher "Nach Reset ohne weitere Ansteuerungen" sagen.

Hallo,

möchtest du mit mir Wortspiele machen?
Ich meine das genau so wie ich es geschrieben habe.
Nach einem Reset sind alle Pins standardmäßig Eingänge und diese sind floatend.
Darfst dazu auch Default sagen wenn du möchtest.
Entspricht pinMode(x, INPUT), weshalb man das auch weglassen kann.

Wenn man nach einem Reset oben besagtes macht, hat man immer noch klar definierte Zustände wie geschrieben.

Dagegen ist deine Aussage irreführend. Weil es nach einem Reset keine Ausgänge gibt.
Die muss man erst mit pinMode(x, OUTPUT) bewusst setzen.
Und wenn man das gemacht hat ist dieser Pin zu 100% auf LOW Pegel.
Also immer noch standardmäßiges Verhalten.
Erst mit digitalWrite(x, HIGH) ändert sich das.
Ab der Zeile hört mein standardmäßig auf und dein Zustand nach Reset ist schon lange vorbei.