BLE Datenübertragung Problem

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!

Die Serielle Ausgabe mit posten. Auch in CodeTags.

eine endlosschleife im loop ist immer schlecht

Das dürfte falsch sein.

Serielle Ausgabe UNO:

16:21:29.037 -> Poti-Wert: 954
16:21:29.037 -> Bereich: 13
16:21:29.222 -> Poti-Wert: 953
16:21:29.222 -> Bereich: 13
16:21:29.406 -> Poti-Wert: 954
16:21:29.406 -> Bereich: 13
16:21:29.622 -> Poti-Wert: 955
16:21:29.622 -> Bereich: 13
16:21:29.809 -> Poti-Wert: 952
16:21:29.809 -> Bereich: 13
16:21:29.967 -> Poti-Wert: 952
16:21:29.967 -> Bereich: 13
16:21:30.172 -> Poti-Wert: 954
16:21:30.172 -> Bereich: 13
16:21:30.320 -> Poti-Wert: 956
16:21:30.320 -> Bereich: 13
16:21:30.518 -> Poti-Wert: 956
16:21:30.518 -> Bereich: 13
16:21:30.694 -> Poti-Wert: 956
16:21:30.694 -> Bereich: 13
16:21:30.913 -> Poti-Wert: 958
16:21:30.913 -> Bereich: 13
16:21:31.101 -> * Zentrales Gerät getrennt!
16:21:31.133 -> - Suche nach Arduino im Lenkrad...
16:21:31.705 -> - Suche nach Arduino im Lenkrad...

Serielle Ausgabe Nano:

16:21:19.620 -> - Suche nach Arduino im Handschuhfach...
16:21:20.201 -> * Peripheriegerät gefunden!
16:21:20.233 -> * Geräte MAC-Adresse: f0:f5:bd:50:f0:05
16:21:20.233 -> * Geräte Name: 
16:21:20.233 -> * Angezeiger Dienst UUID: a594068b-87f5-4572-98c6-7c224b369b6a
16:21:20.233 ->  
16:21:20.233 -> - Verbinde zu Peripheriegerät...
16:21:20.376 -> Erfolgreich verbunden!
16:21:20.376 -> Gültige Charakteristik gefunden!
16:21:20.376 -> Empfangener Wert vorm Werteabgleich: 0
16:21:20.376 -> Empfangener Wert: 0
16:21:21.536 -> Empfangener Wert vorm Werteabgleich: 0
16:21:22.569 -> Empfangener Wert vorm Werteabgleich: 0
16:21:23.541 -> Empfangener Wert vorm Werteabgleich: 0
16:21:24.571 -> Empfangener Wert vorm Werteabgleich: 0
16:21:25.555 -> Empfangener Wert vorm Werteabgleich: 0
16:21:26.548 -> Empfangener Wert vorm Werteabgleich: 0
16:21:27.569 -> Empfangener Wert vorm Werteabgleich: 0
16:21:28.570 -> Empfangener Wert vorm Werteabgleich: 0

Eher true :wink:

Gruß Tommy

Wo Du recht hast....
:sweat_smile:

Kann mir einer von euch beiden bitte dieses Wortspiel erklären? :sweat_smile:

...ich denk es ist eine Anspielung darauf, dass dieses if ("deviceServiceCharacteristic") { ein True zurück gibt und dann die Anweisung ausführt?
Aber was ist daran falsch für mein Code? :thinking:

Das ist ein konstanter Text im Speicher und da er nun mal da ist, ist das immer true, das ist wohl nicht das, was Du willst, denn das if ist dann sinnlos.

Gruß Tommy

ändern in

if (deviceServiceCharacteristic.written()) {
          deviceServiceCharacteristic.readvalue(wert, 2);
        }

ändern in

PotiWerteCharacteristic.writeValue(Bereich);

Die Anführungszeichen.
Du möchtest die Variable abfragen, die da drüber beschrieben wurde.

Das:

readvalue

ist wohl ein Tippfehler?! Habe daraus:

readValue

gemacht.

Jetzt bekomme ich für diese Zeile einen Fehler:

C:\Users\*\OneDrive - *\Facharbeit\Codes\Nano_BLE_Poti_3._Versuch\Nano_BLE_Poti_3._Versuch.ino: In function 'void controlPeripheral(BLEDevice)':
C:\Users\*\OneDrive - *\Facharbeit\Codes\Nano_BLE_Poti_3._Versuch\Nano_BLE_Poti_3._Versuch.ino:69:60: error: no matching function for call to 'readValue(int&, int)'
               deviceServiceCharacteristic.readValue(wert, 2);
                                                            ^
In file included from c:\Users\*\Documents\Arduino\libraries\ArduinoBLE\src/BLEService.h:23:0,
                 from c:\Users\*\Documents\Arduino\libraries\ArduinoBLE\src/BLEDevice.h:25,
                 from c:\Users\*\Documents\Arduino\libraries\ArduinoBLE\src/local/BLELocalDevice.h:23,
                 from c:\Users\*\Documents\Arduino\libraries\ArduinoBLE\src/ArduinoBLE.h:23,
                 from C:\Users\*\OneDrive - *\Facharbeit\Codes\Nano_BLE_Poti_3._Versuch\Nano_BLE_Poti_3._Versuch.ino:3:
c:\Users\*\Documents\Arduino\libraries\ArduinoBLE\src/BLECharacteristic.h:62:7: note: candidate: int BLECharacteristic::readValue(uint8_t*, int) <near match>
   int readValue(uint8_t value[], int length);
       ^~~~~~~~~
c:\Users\*\Documents\Arduino\libraries\ArduinoBLE\src/BLECharacteristic.h:62:7: note:   conversion of argument 1 would be ill-formed:
C:\Users\*\OneDrive - *\Facharbeit\Codes\Nano_BLE_Poti_3._Versuch\Nano_BLE_Poti_3._Versuch.ino:69:60: error: invalid conversion from 'int' to 'uint8_t* {aka unsigned char*}' [-fpermissive]
               deviceServiceCharacteristic.readValue(wert, 2);
                                                            ^
In file included from c:\Users\*\Documents\Arduino\libraries\ArduinoBLE\src/BLEService.h:23:0,
                 from c:\Users\*\Documents\Arduino\libraries\ArduinoBLE\src/BLEDevice.h:25,
                 from c:\Users\*\Documents\Arduino\libraries\ArduinoBLE\src/local/BLELocalDevice.h:23,
                 from c:\Users\*\Documents\Arduino\libraries\ArduinoBLE\src/ArduinoBLE.h:23,
                 from C:\Users\*\OneDrive - *\Facharbeit\Codes\Nano_BLE_Poti_3._Versuch\Nano_BLE_Poti_3._Versuch.ino:3:
c:\Users\*\Documents\Arduino\libraries\ArduinoBLE\src/BLECharacteristic.h:63:7: note: candidate: int BLECharacteristic::readValue(void*, int) <near match>
   int readValue(void* value, int length);
       ^~~~~~~~~
c:\Users\*\Documents\Arduino\libraries\ArduinoBLE\src/BLECharacteristic.h:63:7: note:   conversion of argument 1 would be ill-formed:
C:\Users\*\OneDrive - *\Facharbeit\Codes\Nano_BLE_Poti_3._Versuch\Nano_BLE_Poti_3._Versuch.ino:69:60: error: invalid conversion from 'int' to 'void*' [-fpermissive]
               deviceServiceCharacteristic.readValue(wert, 2);
                                                            ^

exit status 1

Compilation error: no matching function for call to 'readValue(int&, int)'

Hast du noch eine Idee?

Steht hinten rechts. Da wird wohl ein Parameter zuviel drin sein.
Später dann passt vermutlich der Variablentyp nicht. So zumindest lautet die Fehlermeldung.

Mal in die Beispiele zum Board geschaut?
Und hast Du das mit dem Text verstanden und geändert?

Versuch es einmal wegen diesem Beispiel mit Byte ArduinoBLE - bleCharacteristic.readValue() - Arduino Reference und ohne zweiten Parameter

@my_xy_projekt
Ja, das mit den Text habe ich verstanden. Wenn ich die Anführungszeichen wegnehme kommt im Seriellen Monitor:

21:25:33.249 -> - Suche nach Arduino im Handschuhfach...
21:25:33.789 -> * Peripheriegerät gefunden!
21:25:33.789 -> * Geräte MAC-Adresse: f0:f5:bd:50:f0:05
21:25:33.789 -> * Geräte Name: 
21:25:33.789 -> * Angezeiger Dienst UUID: a594068b-87f5-4572-98c6-7c224b369b6a
21:25:33.789 ->  
21:25:33.836 -> - Verbinde zu Peripheriegerät...
21:25:34.208 -> Erfolgreich verbunden!
21:25:34.208 -> Fehler: Charakteristik nicht gefunden!
21:25:34.208 -> - Suche nach Arduino im Handschuhfach...

ABER, wenn ich die Anführungszeichen drin lasse und die Änderung von @wwerner beachte, also:

byte wert = 0;

deviceServiceCharacteristic.readValue(wert);

hat der Sketch keine Fehler. Jedoch ist mein:

21:16:55.987 -> Empfangener Wert vorm Werteabgleich: 0

weiterhin 0...

Die Anführungszeichen müssen weg!
Ist doch klar, dass da 0 raus kommt!

Die Variable hat keinen Inhalt.
Mir Deinem "Trick" übergehst Du die Prüfung, ob in der Variablen was drin ist.
Nix drin - > Ausgabe 0

Charakteristik nicht gefunden heisst, ja irgendwas.

Ich hab mal kurz reingeschaut.
Es gibt ein Beispiel PeripherialExplorer.

Was passiert, wenn Du das ausführst?

Ja, ist mir jetzt klar, dass das nur ein "Trick" war von mir mit den Anführungszeichen! :sweat_smile:

Wenn ich PeripherialExplorer ausführe, findet dieser auch den anderen Arduino.

21:48:42.080 -> Found f0:f5:bd:50:f0:05 '' a594068b-87f5-4572-98c6-7c224b369b6a
21:48:42.330 -> Found 6d:16:3b:6e:67:72 '' 
21:48:42.369 -> Found 68:72:c3:a2:2d:51 '' 
21:48:42.409 -> Found 0d:85:a6:33:44:42 '' 
21:48:42.409 -> Found f0:f5:bd:50:f0:05 '' a594068b-87f5-4572-98c6-7c224b369b6a

Es ist logischerweise die richtige MAC Adresse und die ServiceUUID stimmt auch.

Das was mich auch wundert ist, warum der Nano nicht den Geräte Namen erkennt. MAC Adresse und Angezeigter Dienst UUID, werden gefunden!

:sweat_smile:

Irgendwann fällt der Groschen...

So, zumindest ist das Ding da.
Ich muss mir etwas Zeit nehmen, da ich weder eines von den Teilen habe, noch dass ich irgendwann mal was damit gemacht habe. Schwierigkeitsgrad ist der kleine Netbook....
Aber mal sehen, was mir einfällt.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.