Ich würde gerne Parameter meines uC Programms über eine Android App steuern. Welche Verbinung bietet sich da an? WLAN sehe ich momentan nicht so weil, ich nicht will, dass man das Programm jeweils auf das gegebene Netzwerk anpassen muss (Logindaten), oder gibt es da zB mit dem ESP8266 die Möglichkeit, dass das Device sein eigenes WLAN erstellt? Ist für eine "einfache" End-zu-End Kommunikation Bluetooth besser geeignet? Hat schonmal jemand so etwas implementiert?
Ich denke wenn du direkt und über kurze Distanz mit dem µC kommunizieren willst ist Bluetooth das beste. Es geht hier ja letzendlich um eine einfache Peer2Peer Verbindung zwischen 2 Geräten. Daher würde ich von komplizierten WLAN Lösungen absehen.
HC-06 Modul. Arbeitet ganz hervorragend mit Android zusammen. Hab ich schon einige Anwendungen mit gemacht. Nur, hast du schon Erfahrung mit App Erstellung? So einfach mal schnell ist das auch nicht gemacht.
Nur ist Bluetooth auch nicht gerade komfortabler zu bedienen, weil man da die Geräte pairen muss. Das nervt vor allem, wenn du mehrere Android Geräte wechselweise benutzt.
Stefan U. schrieb: > Nur ist Bluetooth auch nicht gerade komfortabler zu bedienen, weil man > da die Geräte pairen muss. Das nervt vor allem, wenn du mehrere Android > Geräte wechselweise benutzt. Aber einmal pairen reicht. Das Gerät verbindet sich ab dann automatisch sobald es Strom hat und das Handys in der Nähe ist.
Cyblord -. schrieb: > HC-06 Modul. Arbeitet ganz hervorragend mit Android zusammen. > > Hab ich schon einige Anwendungen mit gemacht. > > Nur, hast du schon Erfahrung mit App Erstellung? So einfach mal schnell > ist das auch nicht gemacht. Das Modul schau ich mir mal an, danke! Erfahrung mit Apps selbst nicht, hab mich mal etwas mit dem Android Studio befasst und ich sag mal solide Java Kenntnisse - das sollte meiner Meinung nach einer überwindebare Hürde sein. Zudem wollte ich schon immer mal eine App schreiben. Zur WLAN Lösung, um Platform unabhängig zu sein könnte man theoretisch mit dem ESP8266 eine Website einrichten und das Ganze dann über den Browser steuern? Oder funktioniert das Modul nur als AP in einem bereits bestehenden WLAN?
KingJulian schrieb: > Cyblord -. schrieb: >> HC-06 Modul. Arbeitet ganz hervorragend mit Android zusammen. >> >> Hab ich schon einige Anwendungen mit gemacht. >> >> Nur, hast du schon Erfahrung mit App Erstellung? So einfach mal schnell >> ist das auch nicht gemacht. > > Das Modul schau ich mir mal an, danke! > > Erfahrung mit Apps selbst nicht, hab mich mal etwas mit dem Android > Studio befasst und ich sag mal solide Java Kenntnisse - das sollte > meiner Meinung nach einer überwindebare Hürde sein. Zudem wollte ich > schon immer mal eine App schreiben. Ja dann sollte das kein Problem sein. Hier gibt's den Einstieg zum Android und Bluetooth: https://developer.android.com/guide/topics/connectivity/bluetooth.html Auf der HW-Seite muss man so gut wie nichts machen. Das HC-06 ist ein Slave-Only Modul.
:
Bearbeitet durch User
> Aber einmal pairen reicht. Nur, wenn du dich auf EIN Android Gerät beschränkst. Ansonsten musst du bei jedem Wechsel neu pairen. > Zur WLAN Lösung, um Platform unabhängig zu sein könnte man theoretisch > ... eine Website einrichten und das Ganze dann über den Browser steuern? Ja, kann man machen. Hier kannst du Dir Anregungen holen: Mit Webserver: http://stefanfrings.de/net_io/index.html Nur Bluetooth: http://stefanfrings.de/serial_io/index.html Mit ESP8266: http://stefanfrings.de/wlan_io/index.html
Super, vielen Dank für die Links... lese mich da mal durch!
> Nur ist Bluetooth auch nicht gerade komfortabler zu bedienen, weil man > da die Geräte pairen muss. Nur bei altem Bluetooth. Bei BLE geht es auch so. Das ist ja gerade fuer so Steuerungssachen erfunden worden. Olaf
Ich habe nun hier so ein HC-06 Modul bestellt und das mal angeschlossen. Nun habe ich aber das Problem, dass ich per UART nur 1 Zeichen(das Erste das ich sende) empfangen kann - steh aber grad auf dem Schlauch warum das so sein sollte. Meine Idee wäre, jeweils zu prüfen ob das RXNE Flag gesetzt ist und wenn ja zu lesen.
1 | extern int uart2_read(void){ |
2 | uint8_t ch; |
3 | |
4 | /* Check if receive data register is empty */
|
5 | if(USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == SET){ |
6 | ch = (uint8_t) USART_ReceiveData(USART2); |
7 | return ch; |
8 | }
|
9 | return -1; |
10 | }
|
Hat das Ganze irgendwo einen Haken den ich übersehen habe? Am BT Modul liegt es nicht, wenn ich es direkt(via USB - serial Adapter) auslese kommt alles an.
Ich weiss nicht, was du da für einen µC verwendest. Aber bei einigen muss man das received-Flag "zu Fuß" löschen, wenn man ohne receive-Interrupt arbeitet.
KingJulian schrieb: > gibt es da zB mit dem ESP8266 die Möglichkeit, dass das Device sein > eigenes WLAN erstellt? ...ja, geht: der Modus nennt sich z.B. in nodemcu wifi.softap bzw. in Kombination (Station/AP) wifi.stationap.
Stefan U. schrieb: > Ich weiss nicht, was du da für einen µC verwendest. Aber bei > einigen > muss man das received-Flag "zu Fuß" löschen, wenn man ohne > receive-Interrupt arbeitet. Es ist ein STM32F051, im Reference Manual steht "In single buffer mode, clearing the RXNE bit is performed by a software read to the USART_RDR register" - das wäre nach meinem Verständnis das was
1 | USART_ReceiveData(USART2) |
macht. Aber sonst versuch ich es mal mit manuellem clearen.
Oder wär es besser einen UART interrupt zu benutzten anstatt das Flag periodisch zu überprüfen? Zur Ergänzung, dies ist die Config des USART2:
1 | USART_InitStructure.USART_BaudRate = 9600; |
2 | USART_InitStructure.USART_WordLength = USART_WordLength_8b; |
3 | USART_InitStructure.USART_StopBits = USART_StopBits_1; |
4 | USART_InitStructure.USART_Parity = USART_Parity_No; |
5 | USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; |
6 | USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; |
7 | USART_Init(USART2, &USART_InitStructure); |
> das wäre nach meinem Verständnis das was USART_ReceiveData(USART2) macht.
Ja, so verstehe ich den Satz auch.
Stefan U. schrieb: >> das wäre nach meinem Verständnis das was > USART_ReceiveData(USART2) macht. > > Ja, so verstehe ich den Satz auch. Ich denke aber auch, dass er das macht - das Problem ist eher, dass es nicht mehr gesetzt wird. Nach dem ersten empfangen Zeichen gibt
1 | extern int uart2_read(void){ |
2 | uint8_t ch; |
3 | |
4 | /* Check if receive data register is empty */
|
5 | if(USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == SET){ |
6 | ch = (uint8_t) USART_ReceiveData(USART2); |
7 | return ch; |
8 | }
|
9 | return -1; |
10 | }
|
nämlich nur noch -1 als Rückgabewert.
Scheint, dass es mit UART Interrupt klappt, verstehe zwar noch nicht warum das andere Konzept nicht funktioniert aber okay :)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.