Ich versuche gerade eine Zimmerbeleuchtung durch ein 5m langes LED-Band umzusetzen.
Diese will ich mit meinem Handy über Bluetooth kontrollieren können.
Das Programm funktioniert eigentlich, zumindest unter geringer Belastung des Arduino Micro. Edit: Nano
Zu Problemen kommt es hauptsächlich, wenn ich den Arduino fast oder vollständig auslaste, z.B. wenn ich eine Schlange so schnell wie möglich das Band entlanglaufen lasse.
Denn dann liest der Empfänger oft falsche (ich sende eine '1', es kommt z.B. ')' beim Arduino an) oder gar keine Werte. Nach einigen Versuchen werden dann aber doch richtige Werte gelesen.
In der loop() wird abgefragt, ob neue Daten über Bluetooth vorhanden sind und geht wenn ja in meine blt() funktion, die weitere Eingaben erwartet und meine Einstellungen verändert. Nach jedem empfangenen Wert wird der Input-Buffer von Bluetooth über rewindBt() geleert.
(btw. gibt es eigentlich eine Funktion wie rewind() bei C?).
Ich weiß, dass ein delay(30) im loop() mein Problem lösen würde, jedoch will ich die angeschalteten LED's so schnell wie möglich über das LED-Band laufen lassen.
Vielen Dank fürs Durchlesen und möglicherweise Eure Hilfe
Mein Quellcode ist im Anhang, da er zu lang zum Einbinden ist (Funktionen zu Bluetooth sind ganz unten)
if(bt.peek()!=-1){
short val = bt.peek();
dataVal=val-48;
if(dataVal>=1 && dataVal<=4) blt();
else rewindBt();
}
?????? Was ist das. Was willst du damit erreichen.
Und die Delay müssen weg. Suche dir einen Weg das anders zu lösen.
Ich habe dir mal meinen Serial-BT-Reciver angehängt der benutzt kein Delay. Nur als Anschaung.
//
// Code by tft-elektronik.com
//
// Reciver, um Daten direkt weiterzuleiten.
// 1 * Hardware Serial / 1 * SoftSerial für BlueTooth
// Mich Echo Funktion
// Konstanten
#define PIN_RECEIVE 11 // dieser Pin muss Interupt fähig sein
#define PIN_SEND 12
#define SPEED_BLUETOOTH 57600 // diese geschwindigkeit muss im BlueThoot Modul eingestellt sein
#define SPEED_SERIAL 57600
#define LED_Pin 13
#include <Wire.h>
#include <SoftwareSerial.h>
unsigned long Mill = millis() ;
unsigned long BlinkTimer = 0 ;
long BlinkInterval = 500 ;
byte BlinkStatus = 0 ;
int i = 0 ;
char thisSerialChar = 0 ;
char thisBlueSerialChar = 0 ;
SoftwareSerial BlueSerial(PIN_RECEIVE, PIN_SEND);
void setup() {
// put your setup code here, to run once:
pinMode(LED_Pin, OUTPUT) ;
Serial.begin(SPEED_SERIAL);
BlueSerial.begin(SPEED_BLUETOOTH);
// Serial gibt nicht den Status der Verbindung wieder, Sondern ob eine
// Schnitstelle von seiten des Arduino bereit ist. Beim Leonardo ist
// dies nach einem Reset nicht sofort da.
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
}
void loop() {
// put your main code here, to run repeatedly:
Mill = millis();
// Damit man sieht ob das Programm läuft
if (BlinkTimer<Mill) {
BlinkTimer = Mill + BlinkInterval ;
if (BlinkStatus == 0) {
BlinkStatus = 1 ;
digitalWrite(LED_Pin,HIGH);
}
else {
BlinkStatus = 0 ;
digitalWrite(LED_Pin,LOW);
}
}
// Daten von der Serialen Hardware Schnitstelle holen und an die BlueTooth Schnitstelle senden
if (Serial.available()) {
i = Serial.available() ;
while (i > 0)
{
thisSerialChar = Serial.read() ;
BlueSerial.write(thisSerialChar);
Serial.write(thisSerialChar); // Echo
i = Serial.available() ;
}
}
// Daten von der BlueTooth Schnitstelle holen und an die Seriale Schnitstelle senden
if (BlueSerial.available()) {
i = BlueSerial.available() ;
while (i > 0)
{
thisBlueSerialChar = BlueSerial.read() ;
Serial.write(thisBlueSerialChar);
BlueSerial.write(thisBlueSerialChar); // Echo
i = BlueSerial.available() ;
}
}
}
Warum benutzt du Softwareserial?
Wenn du Performance Probleme hast, solltest du das evtl. nicht tun.
The Arduino Leonardo board uses Serial1 to communicate via TTL (5V) serial on pins 0 (RX) and 1 (TX). Serial is reserved for USB CDC communication. For more information, refer to the Leonardo getting started page and hardware page.
dataVal ist eine globale Variable die die letzte gesendete Zahl enthält (0 entspricht ja 48).
Danach überprüfe ich, ob die Variable einer brauchbaren Zahl entspricht (Menü geht von Option 1 bis 4), wenn sie brauchbar ist werden weitere Menüs aufgerufen.
Wenn sie nicht brauchbar ist, so wird bt geleert.
Ich verwende im Moment ja auch keine Delays, sondern überprüfe jede loop ob
etwas gezeichnet werden muss
Daten über Bluetooth verfügbar sind
Nur ist es so dass delay mein Problem lösen würde, da der Arduino dann ja nicht mehr voll ausgelastet ist.
Welche Möglichkeiten gibt es noch außer Software Serial?
baechlju:
Welche Möglichkeiten gibt es noch außer Software Serial?
Anscheinend verwendest du einen Arduino Micro:
baechlju:
Das Programm funktioniert eigentlich, zumindest unter geringer Belastung des Arduino Micro.
Dieser hat neben "Serial" auch noch "Serial1", wie combie das in #2 und #4 ja schon angedeutet hat - was für den Arduino Leonardo gilt, gilt auch für den Arduino Micro - das sind dieselben Mikrocontroller, nur die Boards haben andere Abmessungen.
Also: du solltest Serial1 statt SoftwareSerial verwenden.
Voll ausgelastet ist der µC auch beim delay() - nur, daß Er Da im Kreis in einer While-Schleife auf das Ende der Wartezeit ... äh ... wartet.
Ist also nicht so, daß der µC jetzt 'Freizeit' hat und mit Freude die neuen Aufgaben entgegen nimmt - NICHTS kann der µC nicht, dafür müsstest Du Ihn schon schlafen legen - hilft Dir hier aber auch nicht wirklich weiter
Ich habe es jetzt mit (Hardware) Serial ausprobiert und tatsächlich funktioniert es fehlerfrei :D.
Hätte ich auch gleich drauf kommen können xD.
Auf jeden Fall vielen, vielen Dank :))
Edit: Problem war also im Grunde, dass ich mich keine 5min. mit dem Thema Serial Port/Serial auseinander gesetzt habe sonder von Beispielprogrammen übernommen habe.