Bluetooth Device Name im Programm auslesen.

Hallo auch.

Evtl kann mir wer von euch helfen.

Kurze Projekbeschreibung (Studium)

Ich versuche ein einfaches Produktionssystem physisch zu simulieren. Anki Cozmo als Transportsystem und Produkte, Arduino Unos als Maschinen.

Ich habe 5 Arduino Uno die per Bluetooth(HC-06) mit meinem Rechner kommunizieren. Soweit so Problemlos. Auf jedem Arduino läuft die exakt gleiche Programmschleife.

Was ich jetzt gerne tun möchte ist die Arduinos identifizieren zu können. Ich habe die HC-06 Module jeweils benannt M1 bis M5 Es wäre schön wenn der Arduino also auf Befehl den Namen seines BT-Moduls zurückgeben würde.

Ist das irgendwie Möglich? Habe ich ausserhalb des Konfigurationsmodus da irgendwie zugriff drauf? ICh hab mit Googeln leider nichts funktionierendes gefunden.

So in etwa:

btData = btSerial.readString();

if (btData == "Identifikation")
{
    String BTName = btSerial.devicename     //

    btSerial.println(BTName);
}

Hallo,

soweit ich weis, geht das im AT Modus des BlueTooth Modul mit AT+NAME da sollte der Momentane Namen zurück geben werden. Leider weis ich auch das dem nicht immer so ist. Oft wird nur einmalig bei änderung ein OKNeuerName zurück geworfen. Dazu darf das Modul aber nicht Verbunden sein. Also keine Peer Verbindung bestehen ( Die LED Blinkt schnell ) Es macht normalerweise auch keinen Sinn den namen auszulesen, da dieser beim Peeren ja ausgewählt werden muss. Also bekannt ist. Und für eine Verbindung auf der Arduino Seite braucht man den Namen ebend normalerweise nicht, da die Verbindung über die ComSchnittstelle benannt ist. Wozu braucht du das ?

AT+VERSION sollte auch OKnameV1.x zurückliefern, aber auch nur ungepairt.

Eine Spezialfunktion, die den BT - Namen, oder was auch immer, im Arduino-EEPROM ablegt ?

Oder der PC sendet einem Arduino die ID zu, welche der sich dann merkt. Entweder fragt der Arduino beim Start den PC, oder er merkt es sich “für immer” im EEPROM.

temucin: Wozu braucht du das ?^

Eigentlich nur zum debuggen. Es macht es lediglich einfacher zu sehen welcher der 5 Arduinos mir grade antwortet.

Ich habe in Python eine Kommunikationsroutine die mit allen 5 Arduinos kommuniziert. Da ich gerne identische Programme auf allen Arduinos laufen hätte wäre es schön wenn sie sich selbst trotzdem noch irgendwie identifizieren könnten wenn man sie drum bittet.

Aber Prinzipiell hast du recht, ich könnte das auch in die Kommunikationsroutine einbauen.

Hi

Bei meinen Spielereien nutze ich derzeit einen DS18B20, um mir daraus eine Seriennummer zu generieren (wobei von 48bit auf irgendwas mit 7bit runter, ohne Kollision - Da wird die Sache schon sportlich.
In einer anderen Version benutze ich den Compiler-String
const char zeitzeichen={TIME}; (ergibt was in Richtung hh:mm:ss)
und berechne die Sekunde des Tages (max 86399) und mappe Diese auf eine vorgegebene Bitbreite.
OwnID=OwnID/86399.0*(pow(2,bitbreiteID)-1);

Sofern Du jeden Arduino separat per IDE bespielst, bekommen Diese so eng beisammen liegende IDs.
Klar, wenn Du auf 4 Bit Breite (0…15) runter rechnest, musst Du auch einen 16.tel Tag warten, bis eine neue ID ‘raus fällt’.

Bei den von mir angestrebten 14bit (2x 14<=29) bekomme ich die Arduinos nicht so schnell per IDE programmiert, wie sich die ID (die Zeit) verändert.

MfG

Hallo,

dann scheint mir, das du vielleicht folgenden Weg in Betracht ziehen solltest , sofern du einen Analogen Eingang übrig hast. Du kannst dort locker 64 verschiedene zustände an einem Eingang detektieren. Du lötest oder steckst einfach einen Widerstand zwischen 5V un A0 (z.B) 10K. Beim nächsten 100K .... und so weiter. Dann kannst du den Sketch unabhängig eine Gerate ID realisieren. Dann must du nur noch eine Rutine implementieren die den Wert ausliest und versendet. Brauchst auch keine EEProm dazu. Must einfach nur daran denken das du keine Festwert vergleichst sondern einen Range verwendest.

Gruss Temucin

postmaster-ino:
irgendwas mit 7bit runter, ohne Kollision

Das ergibt eine Kollision mit ca. 1% Wahrscheinlichkeit, wenn es optimal läuft.
Ganz ohne Kollision ginge nur, wenn du eine Liste der bereits belegten ID hättest.
UUID haben 128 Bit, damit Kollisionen auf 0% Wahrscheinlichkeit kommen.


OwnID/86399.0*(pow(2,bitbreiteID)-1);

Du liebst float Berechnungen zur Bit-Manipulation! Witzig!

Wenn ich deine Formel richtig verstehe, willst du eine von 86400 Zahlen auf eine von
128 \ 256 …\ 16384 mappen. Und zwar so, dass alle x Sekunden die nächste generiert wird.

unsigned long OwnID= 43210UL; // 12:00:10 als Beispiel
unsigned int shortID = (OwnID << 14) / 86400; // 14 bit: 0 .. 16383  (x = 5.3 sec)

Ein ähnliches Ergebnis hätte, erheblich einfacher

unsigned int ShortID = (OwnID >> 2) & 0x3FFF); // 14 bit (x=4 sec)

Aber erheblich sinnvoller ist es für @Phillsen, wenn am PC die Information ausgewertet würde, von welcher seriellen BT-Schnittstelle die Daten kommen.