Moin,
Für meine Facharbeit baue ich gerade eine Bluetooth-Verbindung zwischen einem Arduino Nano 33 BLE und einem Arduino Uno R4 WiFi auf. Beide haben ja die Bluetooth Low Energy Module bereits eingebaut.
Diese möchte ich auch mit Hilfe der <ArduinoBLE.h> Bibliothek verwenden.
Ein Poti wird an den Uno angeschlossen, die Werte des Potentiometers werden mittels map() umgewandelt und in der Charakteristik gespeichert.
Der Nano soll diesen erhaltenen Wert auslesen und dann damit verschiedene LEDs ansteuern.
Die Bluetooth-Verbindung hat auch schon funktioniert. Laut Serial Monitor sendet dieser auch die richtigen Werte.
Nun zu meinem Problem: Der Nano gibt immer den Wert 72 aus. Der Bereich von Map() ist aber 1-14. Mit kurzer Unterstützung meines Lehrers wurde dieser Wert auf 0 geändert. (Im Code unten ist die Ausgabe auch 0).
Ich vermute die Zeile mit dem Kommentar //! im Nano als das Problem.
Code Uno:
//Für den Arduino UNO R4 WiFi
#include <ArduinoBLE.h>
const char* deviceServiceUuid = "a594068b-87f5-4572-98c6-7c224b369b6a"; //Gleich wie bei beim Central!
const char* deviceServiceCharacteristicUuid = "b2d7a34c-8e1f-4e9a-9a9c-2d1a2a4a67f2"; //Gleich wie bei beim Central!
int altwert = -1;
BLEService WertSenden(deviceServiceUuid); //eventuell UUIDs übernehmen?
BLEIntCharacteristic PotiWerteCharacteristic(deviceServiceCharacteristicUuid, BLERead | BLENotify);
void setup() {
Serial.begin(9600);
while (!Serial)
;
if (!BLE.begin()) { //Starten vom Bluetooth Modul
Serial.print("- Starten von Bluetooth® Low Energy fehlgeschlagen!");
while (1)
;
} //Blockade
BLE.setLocalName("Arduino UNO R4 WiFi Handschuhfach"); //Namen setzen
BLE.setAdvertisedService(WertSenden); //Service mit Namen() zum Advertisen hinzufügen
WertSenden.addCharacteristic(PotiWerteCharacteristic); //Charakteristic erzeugen mit Namen () und dem Service hinzufügen
BLE.addService(WertSenden); //Service erzeugen mit Namen()
BLE.advertise(); //Werbung/Advertise starten
Serial.println("BLE Anzeige gestartet!");
Serial.println(" ");
}
void loop() {
BLEDevice central = BLE.central(); //Suche starten
Serial.println("- Suche nach Arduino im Lenkrad...");
delay(500);
if (central) { //Wenn Erfolgreich dann:
Serial.println("* Verbindung erfolgreich zum Arduino im Lenkrad!");
Serial.print("* Geräte MAC-Adresse: ");
Serial.println(central.address());
Serial.println(" ");
while (central.connected()) { //Während der Verbindung dies tun:
int Wert = analogRead(A0); //Poti Wert auslesen und als Wert speichern
int Bereich = map(Wert, 0, 1023, 1, 14); //Wert umwandeln in 1-14 und abspeichern als Bereich
PotiWerteCharacteristic.writeValue((byte)Bereich); // Wert in die Charakteristik schreiben
Serial.print("Poti-Wert: ");
Serial.println(Wert);
Serial.print("Bereich: ");
Serial.println(Bereich);
delay(150);
}
Serial.println("* Zentrales Gerät getrennt!");
}
}
Code Nano:
//Für den Arduino Nano 33 BLE
#include <ArduinoBLE.h>
#include <Adafruit_NeoPixel.h>
#define PIN 8 //Pin für DataIn des LEDs
#define NUMPIXELS 7 //Anzahl der vorhandenen LEDs
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
int wert = 0;
int altwert = -1;
const char* deviceServiceUuid = "a594068b-87f5-4572-98c6-7c224b369b6a"; // Eindeutige UUID für Service
const char* deviceServiceCharacteristicUuid = "b2d7a34c-8e1f-4e9a-9a9c-2d1a2a4a67f2"; // Eindeutige UUIDs für Charakteristik
void setup() {
pixels.begin(); //Starten der LEDs
Serial.begin(9600);
while (!Serial); //Blockade
if (!BLE.begin()) { //Starten vom Bluetooth Modul
Serial.println("BLE Start fehlgeschlagen!");
while (1); //Blockade
}
BLE.setLocalName("Arduino Nano im Lenkrad"); //Namen setzen des Geräts
BLE.advertise(); //Werbung/Advertise starten
}
void loop() {
connectToPeripheral();
}
void connectToPeripheral() {
BLEDevice peripheral; //Suche starten
Serial.println("- Suche nach Arduino im Handschuhfach...");
do {
BLE.scanForUuid(deviceServiceUuid); //Nach der Service UUID suchen
peripheral = BLE.available();
} while (!peripheral);
if (peripheral) {
Serial.println("* Peripheriegerät gefunden!");
Serial.print("* Geräte MAC-Adresse: ");
Serial.println(peripheral.address());
Serial.print("* Geräte Name: ");
Serial.println(peripheral.localName());
Serial.print("* Angezeiger Dienst UUID: "); //richtige Übersetzung Advertised service UUID?
Serial.println(peripheral.advertisedServiceUuid());
Serial.println(" ");
BLE.stopScan();
controlPeripheral(peripheral);
}
}
void controlPeripheral(BLEDevice peripheral) {
Serial.println("- Verbinde zu Peripheriegerät...");
if (peripheral.connect()) { //Wenn ein Gerät verbunden ist dann:
Serial.println("Erfolgreich verbunden!");
BLECharacteristic deviceServiceCharacteristic = peripheral.characteristic(deviceServiceCharacteristicUuid); // Suche nach der Charakteristik im verbundenen Gerät
if ("deviceServiceCharacteristic") {
Serial.println("Gültige Charakteristik gefunden!");
while (peripheral.connected()) {
if (deviceServiceCharacteristic.written()) {
wert = int(deviceServiceCharacteristic.value()); //!
}
Serial.print("Empfangener Wert vorm Werteabgleich: "); //Debugg Zeile
Serial.println(wert);
if (altwert != wert) { //Wert wird verglichen mit neuem Wert
altwert = wert;
Serial.print("Empfangener Wert: ");
Serial.println(wert);
pixels.clear(); // LED-Ansteuerung
int numLeds = map(wert, 1, 14, 1, NUMPIXELS);
for (int i = 0; i < numLeds; i++) {
pixels.setPixelColor(i, pixels.Color(8, 25, 2));
}
pixels.show();
delay(150);
}
delay(1000); //Verzögerung
}
Serial.println("Verbindung unterbrochen!");
peripheral.disconnect();
} else {
Serial.println("Fehler: Charakteristik nicht gefunden!");
peripheral.disconnect();
}
} else {
Serial.println("Verbindung fehlgeschlagen!");
}
}
...wenn ich das Problem richtig verstanden habe, sendet die Bluetooth Verbindung keinen Wert, sondern nur 0 & 1. Diese werden vom Nano empfangen und von 0 & 1 wieder in den eigentlichen Wert umgewandelt.
Ich würde sagen, dass meine C++/Arduino-Kenntnisse knapp über den Grundkenntnissen liegen!
P.S.: Dies ist mein erster Beitrag, wenn es Tipps gibt, wie ich diesen Beitrag besser darstellen kann, bitte her damit!