HC-05 als Sender

Hallo da draussen,
Ich möchte eine BT Fernbedinung bauen mit dem ich einen anderen BT Empfänger steuern kann.
Der Empfänger ist ein UNO mit einem HC05.
Der Sender soll ein Nano mit ebenfalls einem HC05 sein.
Zur Zeit steuere ich den Empfänger mit dem Handy.
Habe mir das senden so vorgestellt:

#include <SoftwareSerial.h>

#define rxPin 0
#define txPin 1


SoftwareSerial btSerial(rxPin, txPin);
String btData;
 
void setup()
{
  btSerial.begin(9600);
  btSerial.println("bluetooth available");
}
 
void loop() 
{
  
  if (btSerial.available())
  {

        btSerial.write('rot');
        delay(1000);
        btSerial.write('gelb');
  }
delay(100);
}

Wo liegt hier mein Denkfehler.

#define rxPin 0
#define txPin 1

Beim Uno sind das die Pins für Serial, was soll da SoftSerial ?

Hast du die Verbindung zwischen den beiden Bluetooth Geräten hergestellt?

Das hat jetzt garnix mit BT zu tun:

Der Sketch sendet permanent, aber erst wenn er erstmals was empfangen hat.
Und dann jede Sekunde “gr” (mit 100 ms Verzögerung zwischen ‘g’ und ‘r’)
Hab ich nicht ausprobiert, nur geraten

Wo liegt hier mein Denkfehler

Vermutlich erwartest du ein anderes Verhalten.

Habe jetz wie folgt angepasst:

#include <SoftwareSerial.h>

#define rxPin 10
#define txPin 11


SoftwareSerial btSerial(rxPin, txPin);
String btData;
 
void setup()
{
  btSerial.begin(9600);
  btSerial.println("bluetooth available");
}
 
void loop() 
{


        btSerial.write('rot');
        delay(1000);
        btSerial.write('gelb');


}

auf deine Frage:
Hast du die Verbindung zwischen den beiden Bluetooth Geräten hergestellt?

Wahrscheinlich nicht. Wie mache ich das?

Habe mich jetzt ein wenig belesen. Werde aber nicht ganz schlau aus den Mengen an Daten.
Muss ich pin 34 vom HC05 noch auf Vcc legen oder reicht es aus den ROLE-WErt auf 1 zu setzen?
Auch mit der konfiguration des Moduls habe ich noch schwierigkeiten. Ich kann hier zB. kein PIN setzen.
Habe jetzt folgende Einstellungen veränder:
SLave:
AT+NAME=HC05_Slave
AT+ROLE=0
Master:
AT+NAME=HC05_Master
AT+ROLE=1
AT+BIND

Habe jetzt soviel gelesen das mir gleich der Kopf platzt.
kennt jemand ein gutes Deutsches Tuturial?

Also verbunden sollte er sein:

Arduino with HC-05 is ready
BTserial started at 38400
at+bind?
+BIND:98d3:31:fc1885
OK

Der Code sieht jetzt wie folgt aus:

#include <SoftwareSerial.h>

#define rxPin 10
#define txPin 11


SoftwareSerial btSerial(rxPin, txPin);
String btData;
int LED_blau; 
void setup()
{
  btSerial.begin(9600);
  pinMode(2,INPUT); 
  pinMode(9,OUTPUT); 
}
 
void loop() 
{
  LED_blau = digitalRead(2);
  if(LED_blau == HIGH)
  {
    digitalWrite(9,HIGH);
  }
  else
  {
    digitalWrite(9,LOW);
  }
  


        btSerial.println("rot");
        delay(100);
       

}

über das Statesignal kann ich nun sagen das die beiden HC05 mit einnander verbunden sein sollten.

Ich gehe davon aus das ich hier lediglich die übertragung des “Schlüsselwortes” falsch mache.

Kann mir jemand sagen was genau ich hier falsch mache?

Also ich noch mal.
Die verbindung funktioniert so weit einwandfrei.
Mit folgendem Scetch lässt sich der Slave über den Seriellen Monitor Streuer:

#include <SoftwareSerial.h>
SoftwareSerial BTserial(10, 11); // RX | TX
// Connect the HC-05 TX to Arduino pin 2 RX. 
// Connect the HC-05 RX to Arduino pin 3 TX through a voltage divider.
 
char c = ' ';
 
void setup() 
{
    // start the serial communication with the host computer
    Serial.begin(9600);
    Serial.println("Arduino with HC-05 is ready");
 
    // start communication with the HC-05 using 9600
    BTserial.begin(9600);  
    Serial.println("BTserial started at 9600");
}
 
void loop()
{
 
     // Keep reading from HC-05 and send to Arduino Serial Monitor
    if (BTserial.available())
    {  
        c = BTserial.read();
        Serial.write(c);
    }
 
    // Keep reading from Arduino Serial Monitor and send to HC-05
    if (Serial.available())
    {
        c =  Serial.read();
        BTserial.write(c);  
    }
 
}

Ich gebe dort den Text rot ein und die rote LED geht an so wie gewünscht.
Jetzt möchte ich aber das sie via Tastendruck angeht wie halt bei einer Fernbedinung.
Meine überlegung war c = Serial.read(); so abzuwandeln das c mit einem "Kommandostring gefüllt wird. Leider versagen hier meine dürftigen Künste.
Irgend welche Vorschläge?

BTserial.print("rot");

Beachte die Unterschiede zwischen print statt write und " statt '
( Hier würde übrigens sogar   .write("rot"); gehen, aber die Unterschiede zwischen write und print solltest du kennen. :wink: )

habe hier schon einiges probiert:
.write("rot")
.write('rot')
.print("rot")
.print('rot')
.println("rot")
.println('rot')
auch habe ich schon mit verschiedenen Variablen herumgetestet.
Im Slavemodul werden die empfangenen Datan so ausgewertet:

if(btData=="rot")
      {
        p1= 1;
        peep1();
        p3 = 3;
         start = 1;
         digitalWrite(rot,1);
         digitalWrite(gelb,0);
         digitalWrite(gruen,0);
      }

Und Nein der Unterschied ist mir nicht wirklich klar aber ich währe dir für eine kurze Erleuterung Dankbar.
Habe schon überlegt den Slavecode an zu passen so das nur ein Zeichen benötigt wird. Glaube aber das es auch so gehen muss.

Du solltest Dich mal mit den Zeichenketten in C beschäftigen. Ich habe dazu mal eine kurze Zusammenfassung geschrieben.

Gruß Tommy

Danke für die Hilfe.
heir der Funktionierende Code:

#include <Keypad.h>
#include <SoftwareSerial.h>

#define rxPin 10
#define txPin 11

const byte Zeile = 4; 
const byte Spalte = 4; 

char c= ' ';
char keys[Zeile][Spalte] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'#','0','*','D'}//S16-S15-S14-S13
};

byte rowPins[Zeile] = { 5,4,3,2 };
byte colPins[Spalte] = { 6,7,8,9}; 

Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, Zeile, Spalte );

SoftwareSerial btSerial(rxPin, txPin);

int LED_blau; 

void setup()
{
    Serial.begin(9600);
    Serial.println("Arduino with HC-05 is ready");
 
    // start communication with the HC-05 using 9600
    btSerial.begin(9600); 
    Serial.println("BTserial started at 9600");
  pinMode(12,INPUT); 
  pinMode(13,OUTPUT); 
}
 
void loop() 
{
  Tastatur();
  
  LED_blau = digitalRead(2);
  if(LED_blau == HIGH)
  {
    digitalWrite(13,HIGH);
  }
  else
  {
    digitalWrite(13,LOW);
  }

    
    if (Serial.available())
    {
        c =  Serial.read();
        btSerial.write(c); 
    }

}

void Tastatur()
{
  char key = kpd.getKey();
  if(key)  
  {
    switch (key)
    {
      case '1':
        Serial.println(key);
        btSerial.write("rot");
        delay(500);
        break;
        
      case '2':
        Serial.println(key);
        btSerial.write("gelb");
        delay(500);
        break;
      
      case '3':
        Serial.println(key);
        btSerial.write("gruen");
        delay(500);
        break;
        
      case 'A':
        Serial.println(key);
        
        break;  
        
      default:
        Serial.println(key);
    } 
 }
}

Zu deinem Slave - Code:

if (btData=="rot")

könnte evtl. etwas naiv sein.

Du hast die Variablendefinition von btData verheimlicht. Dann ist der Rest uninteressant...

ich währe dir für eine kurze Erleuterung Dankbar

Den Unterschied zwischen ' und " findest du in jedem "c für Anfanger" - Text oder auch hier.
https://www.arduino.cc/en/Reference/String

.print / .write hier:
https://www.arduino.cc/en/Serial/Print
https://www.arduino.cc/en/Serial/Write

vielen Dank für die Infos.
kannst du sagen was genau dort naiv ist. würde gerne zukünftige Fehler vermeiden.

Der Vergleich geht so nicht, wenn btData ein char array ist. Aber wie schon gesagt, den Teil des Sketches mit den Variablendefinitionen hast du ja nicht gezeigt.

Und Arduino String Objekte sind nie eine gute Idee. Nur halt einfach am Anfang.