alles verkabelt, den Sketch geladen bei getrenntem HC-05 Modul, Verbindung aufgebaut mit der App "Arduino Bluetooth Controller". Verbindung steht, Schalter sind wie im Sketch mit 1 und 2 für On und off belegt. Alles sieht schick aus, Das Modul blinkt alle 2 s, wies sein soll. Nix passiert. Was mache ich falsch???,
hier noch mal der Sketch
#define ledPin 9
char zeichen; // In diese Variable wird die Eingabe gespeichert
void setup() {
Serial.begin(38400); // Standardgeschwindigkeit vom HC05
Serial.println("bluetooth verfügbar");
pinMode(ledPin, OUTPUT);
}
void loop() {
if (Serial.available()) { //Wenn Kommunikationspartner vorhanden...
zeichen = Serial.read(); // Lese Eingabe ein
if (zeichen == '1') { // Wenn Eingabe = 1 mach LED an...
digitalWrite(ledPin, 1);
Serial.println("LED an Pin 13 ist an");
}
if (zeichen == '2') { // Wenn Eingabe = 2 mach LED aus
digitalWrite(ledPin, 0);
Serial.println("LED an Pin 13 ist aus");
}
}
delay(1000);
}
Wenn ich den seriellen Monitor zuschalte, kriege ich nur kryptische Zeichen
Seid lieb, es ist Ostern, legt mir ein erkenntnisreiches Ei
Dieser Link sollte funktionieren.
Und der kranke Code steht da tatsächlich so.
@Schorsch: Die kryptischen Zeichen würdest Du vielleicht wegbekommen, wenn Du Deinen seriellen Monitor auch auf 38400bps stellst (rechts unten).
Aber das ist nicht die korrekte Lösung, denn alle Serial.print() gehen nicht nur auf den Monitor, sondern auch an das HC05-Modul. Die Frage ist, ob Du auf der Gegenseite mit dem Text "bluetooth verfügbar" was anfangen kannst.
Du brauchst eine zweite serielle Schnittstelle. Am Mega gibt es die in Hardware, an Uno/Nano nimmst Du z.B. SoftwareSerial. In jedem Fall zwei andere Pins, z.B. 10 und 11 (am Uno) verwenden.
Ich habe Deinen Sketch angepasst hier liegen - kompiliert, aber nicht getestet.
Aber ich hoffe, Du willst es erst selbst probieren.
Hallo Walter,
danke für die Linkkorrektur. Habe es jetzt mit SoftwareSerial probiert. Verbinden klappt, aber ich mache wohl einen Fehler beim Lesen der App-Eingaben, habe mich da "verfranzt". Der hat zwar ohne Fehler kompiliert und hochgeladen, aber- nix da.
#include <SoftwareSerial.h>
const int BTRX = 11; // für den RX
const int BTTX = 10; //für den TX am BT-Modul
const int ledPin = 12;
char zeichen; // In diese Variable wird die Eingabe gespeichert
SoftwareSerial SerialBT (BTRX, BTTX); // [color=#ff0000]hier bin ich mir auch nicht sicher[/color]
void setup() {
SerialBT.begin(38400); // Standardgeschwindigkeit vom HC05
Serial.println("bluetooth verfügbar");
pinMode(ledPin, OUTPUT);
}
void loop() {
if (Serial.available()) { //Wenn Kommunikationspartner vorhanden...
zeichen = SerialBT.read(); // Lese Eingabe ein ,[color=#ff0000]OB das so richtig ist??[/color]
if (zeichen == '1') { // Wenn Eingabe = 1 mach LED an...
digitalWrite(ledPin, 1);
// Serial.println("LED an Pin 12 ist an");
}
if (zeichen == '2') { // Wenn Eingabe = 2 mach LED aus
digitalWrite(ledPin, 0);
// Serial.println("LED an Pin 13 ist aus");
}
}
delay(1000);
}
Na, das erste Problem ist noch ein einfaches:
Du wartest auf der "Debug" (Hardware-) Schnittstelle Serial, ob ein Byte eingelaufen ist (Serial.available()). Eigentlich willst Du aber vom Bluetooth-Modul lesen, die Schnittstelle heißt aber anders: SerialBT.available().
Sowas passiert schon mal und beim eigenen Code lesen ist man schnell mal blind.
Der Kommentar dahinter ist übrigens nicht ganz richtig: Der Partner ist immer vorhanden; die Funktion liefert die Anzahl bereits empfangener Bytes.
Bei Rx/Tx musst Du über Kreuz arbeiten: Tx vom Arduino geht an Rx vom HC05 und Rx vom Arduino an Tx vom Modul.
Sonst sieht es gut aus - solange nicht innerhalb einer Sekunde mehr Bytes einlaufen als der interne Puffer von SoftwareSerial aufnehmen kann. Das delay() am Ende kannst Du entfernen: Wenn kein Byte da, dann passiert auch nix.
Hallo Walter,
ich habe mal korrigiert. Das mit über Kreuz verstehe ich jetzt nicht ganz, das müsste doch über die
const int BTRX = 11;
const int BTTX = 10; definiert sein. Ich schicke mal den Fritzing-Plan mit. Und du hast sowas von Recht mit dem "blind". Habe ich schon als Dozent früher gemerkt, wenn du zu lange auf eine fehlerhafte Formel guggst, siehst du den Fehler nie mehr.
schorsch55:
Hallo Walter,
ich habe mal korrigiert. Das mit über Kreuz verstehe ich jetzt nicht ganz, das müsste doch über die
const int BTRX = 11;
const int BTTX = 10; definiert sein. Ich schicke mal den Fritzing-Plan mit. Und du hast sowas von Recht mit dem "blind". Habe ich schon als Dozent früher gemerkt, wenn du zu lange auf eine fehlerhafte Formel guggst, siehst du den Fehler nie mehr.
Über kreuz heißt RX BT-Modul an TX Arduino, TX BT-Modul an RX Arduino.
Vermute ich auch: Wahrscheinlich das Bild zu groß.
Du hast Rx auf Pin 11 definiert, Tx auf 10.
Dann sollte beiliegendes FZZ (Eweiterung .txt bitte entfernen) das korrekt illustrieren.
Da haben wir es doch: Pin 11 ist im Sketch Rx und der ist an Rx vom Modul verbunden.
An nur(!!!) einem Ende grün und gelb vertauschen - und glücklich werden
Hallo Dieter,
verstehe deine letzte Frage nicht, wenn ich sie nicht lesen würde...
Hallo Walter,
habe getauscht, kompiliert- fehlerfrei, hochgeladen- fehlerfrei, mit App verbunden -connected, Schalter in app, der mit 1 definiert ist - led bleibt aus. LED noch mal schnell mit einem Blinkdings getestet, geht. Mir fällt nix mehr ein, ist BT wirklich so kompliziert?
Hallo Dieter,
Menschen machen Fehler, d.h. nicht, dass ich deinen Post nicht gelesen hätte, ich hab ihn nur nicht richtig verstanden.
Hallo Walter,
ich habe schon nur an einem Ende getauscht, sonst wäre ja das gleich Problem geblieben. Die serielle Ausgabe wieder aktiviert - keine Meldung. Nehme ich in
SerialBT.begin(38400); // Standardgeschwindigkeit vom HC05
Serial.println("bluetooth verfügbar"); das BT raus, also Serial.begin(38400), dann kommt die Ausgabe "bluetooth verfügbar". Die 1 bzw. 2 werden nicht angezeigt
Ich hoffe, das Foto vom Aufbau ist deutbar
Rx/Tx sind okay.
Die LED scheint tatsächlich an Pin 12 zu hängen - da war also Dein Fritzing falsch. Der Vorwiderstand fehlt leider immer noch.
Ist das "bluetooth verfügbar" vorher auf Deiner App angekommen?
Ich habe mal Deinen Sketch aus #3 um zwei Zeilen ergänzt:
Einmal im setup() die Initialisierung der Schnittstelle zum Monitor (115200) und direkt nach Einlesen des 'zeichen' die Ausgabe des Bytes das da reingekommen ist als HEX-Wert (damit die Steuerzeichen nix kaputt machen).
Außerdem habe ich den delay stillgelegt, den braucht man nicht.
#include <SoftwareSerial.h>
const byte BTRX = 11; // für den RX
const byte BTTX = 10; //für den TX am BT-Modul
const byte ledPin = 12;
char zeichen; // In diese Variable wird die Eingabe gespeichert
SoftwareSerial SerialBT (BTRX, BTTX); //
void setup() {
Serial.begin(115200); // hier darf es gerne schnell sein, damit der HC05 uns nicht überholt
SerialBT.begin(38400); // Standardgeschwindigkeit vom HC05
Serial.println("bluetooth verfügbar");
pinMode(ledPin, OUTPUT);
}
void loop() {
if (SerialBT.available()) { //Wenn Kommunikationspartner vorhanden...
zeichen = SerialBT.read(); // Lese Eingabe ein
Serial.println(zeichen, HEX);
if (zeichen == '1') { // Wenn Eingabe = 1 mach LED an...
digitalWrite(ledPin, 1);
Serial.println("LED an Pin 12 ist an");
}
if (zeichen == '2') { // Wenn Eingabe = 2 mach LED aus
digitalWrite(ledPin, 0);
Serial.println("LED an Pin 13 ist aus");
}
}
//delay(1000);
}
Damit sollte sichtbar werden, ob überhaupt was von der App ankommt und wenn ja, was genau.
Bitte ausprobieren und die Ausgabe vom seriellen Monitor in code-Tags bereitstellen.