Show Posts
Pages: [1] 2
1  International / Deutsch / Re: LCD 20x4 funktioniert nicht mit Breadboard Arduino on: June 10, 2014, 01:54:50 pm
Danke für die Hinweise. Ich habe die ganze Schaltung zerlegt und nochmal neu aufgebaut. Jetzt klappt es.

Bei meiner aufwendigen Schaltung muss ich wohl noch ein wenig weitersuchen. Man wird ja leider mit fortschreitender Zeit immer blinder. Ich mach jetzt erst mal Pause und verschiebe die Suche auf morgen.

Sorry für den Fehlalarm.
2  International / Deutsch / LCD 20x4 funktioniert nicht mit Breadboard Arduino on: June 10, 2014, 12:07:43 pm
Ich versuche schon seit mehreren Stunden ein 4zeiliges LCD Display zum Laufen zu bringen. Ich verzweifle bald, denn es funktioniert einwandfrei mit meinem Arduino Uno, mit meinem Breadboard-Arduino geht es nicht. Ich erhalte nach Programmstart ein leeres Display mit weißen Blöcken in Zeile 1 und 3.

Ausgangspunkt war der Aufbau einer etwas umfangreicheren Schaltung, mit einem Arduino Uno und einem LCD Display vom Chinesen (auf der Rückseite steht C2004A). Es handelt sich um ein blaues Display mit weißer Schrift und 16 Anschluss-PINs. Um alle Seiteneffekte auszuschließen, habe ich die Schaltung auf den Anschluss des LCD Displays reduziert. Das Problem ist stets das Gleiche.

Zum Testen verwende ich folgenden Sketch:

Code:
/*
  LiquidCrystal Library
 
 For a 20x4 LCD display. 
 
  The circuit:
 * LCD RS pin to digital pin 12
 * LCD RW pin to digital pin 11
 * LCD  E pin to digital pin 10
 * LCD D4 pin to digital pin 7
 * LCD D5 pin to digital pin 6
 * LCD D6 pin to digital pin 5
 * LCD D7 pin to digital pin 4
 * LCD VSS to Ground
 * LCD VDD to +5V
 * LCD V0 to middel Pin of Potentiometer
 * LCD A (Anode) to +5V
 * LCD K (Kathode) to Ground
 
*/

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 10, 7, 6, 5, 4);

void setup() {
  lcd.begin(20, 4);
  lcd.setCursor(0, 0);
  lcd.print("Hello world! How RU?");
}

void loop() {
  lcd.setCursor(0, 1);
  lcd.print(millis()/1000);
  lcd.setCursor(0, 2);
  lcd.print("Line 3");
  lcd.setCursor(0, 3);
  lcd.print("Line 4");
}

Wenn ich das Display direkt an meinen Arduino Uno anschließe, funktioniert alles wunderbar. Sobald ich das Display an meinen Arduino auf dem Breadboard (mit ATMEGA 328P-PU) verbinde, zeigt das Display nur die beiden Zeilen mit den Blöcken. Der Breadboard-Arduino wurde zum Testen sowohl über ein 12V Netzteil (Spannungsreduzierung über einen Spannungswandler 7805) als auch über ein FTDI-Breakout mit Mini-USB-Anschluss versorgt.

Ich habe bereits mehrere Schaltungen mit mit ATMEGA's ohne Arduino Board gebaut (der Platzbedarf ist nicht so groß), bis jetzt aber noch keine mit einem 2004er LCD Display.

Weiß jemand Rat? Kann man überhaupt 2004er Displays an Breadboard-Arduinos anschließen? Was mache ich falsch?

3  International / Deutsch / Re: Drehencoder ungenau on: June 07, 2014, 05:15:09 am
Quote
Was ist bei Dir "knopf"? Eine vorher ausgelesene Variable? Oder ein Funktionsname?

knopf ist eine Variable, die bei jedem Tastendruck des Drehgebers um einen hochzählt (1,2,3,4,1,2,3..), damit kann ich die Zeile bzw. den Wert (wert1, wert2, etc.) festlegen, bei dem der Drehgeber aktuell gerade den Wert ändert.

Quote
Das funktioniert bei mir irgendwie nicht ganz so gut. Ich kann zwar zwischen Fein- und Grobeinstellung wechseln, aber nur mit einem kurzen Tastendruck. Das Umschalten zwischen den verschiedenen Einstellwerten klappt nicht, auch nicht wenn ich die Taste deutlich länger als eine Sekunde drücke. Ich habe den Code allerdings an meinem Arduino-Uno mit angeschlossenem 20x4 LCD-Display und anderen Sachen laufen lassen. Zusätzlich habe ich für den Schalter PIN 8 (#define ENCODER_C 8 ) genutzt, da mein LCD Display schon den PIN 4 nutzt.

Ich habe Deinen Code aus Reply #13 ohne Änderungen und Anpassungen meinerseits getestet. Dir Geschichte mit der Variable knopf war zu diesem Zeitpunkt nicht integriert..

Quote
Und wenn Du eine regelmäßig ablaufende Timer-Interruptfunktion hast, wertest Du den Drehgeber dann in der Interrupt-Behandlungsroutine aus, ...

Ich denke, dass ich schon was zum Thema Timerinterrupts gefunden habe: http://playground.arduino.cc/Deutsch/HalloWeltMitInterruptUndTimerlibrary

Reicht es aus die Funktion updateImpulsAnzeige() in der Interruptroutine aufzurufen oder muss der gesamte Auswertungscode in die Interruptroutine "verschoben" werden?

@Schachmann
Danke für den Hinweis. Das schaue ich mir mal genauer an, scheint ohne Library zu funktionieren.
4  International / Deutsch / Re: Drehencoder ungenau on: June 06, 2014, 06:13:05 pm
Hallo jurs,

Quote
Das macht keine große Arbeit, denn ich habe dazu hier schon etwas gepostet und verlinke jetzt mal nur:
http://forum.arduino.cc/index.php?topic=189578.msg1404643#msg1404643

Danke für den Link.

Quote
Man kann mit einem einzigen Drehgeber verschiedene Werte einstellen, umschaltbar per Taster, und zwar:
- Werte für Umdrehungen pro Minute
- Voltwerte
- Milliampere-Werte

Ebenfalls mit demselben Taster einstellbar gibt es eine "Feineinstellung" und eine "Grobeinstellung". Vorgabe ist die Feineinstellung.

Zum Umschalten zwischen den verschiedenen Einstellwerten dient ein KURZER Tastendruck (<1 sec).
Zum Umschalten zwischen Feineinstellung und Grobeinstellung (Faktor 100) dient ein LANGER Tastendruck (>1 sec)

Das funktioniert bei mir irgendwie nicht ganz so gut. Ich kann zwar zwischen Fein- und Grobeinstellung wechseln, aber nur mit einem kurzen Tastendruck. Das Umschalten zwischen den verschiedenen Einstellwerten klappt nicht, auch nicht wenn ich die Taste deutlich länger als eine Sekunde drücke. Ich habe den Code allerdings an meinem Arduino-Uno mit angeschlossenem 20x4 LCD-Display und anderen Sachen laufen lassen. Zusätzlich habe ich für den Schalter PIN 8 (#define ENCODER_C 8 ) genutzt, da mein LCD Display schon den PIN 4 nutzt. Grundsätzlich finde ich die Idee mit der Doppelnutzung des Tasters eine feine Sache.

Ich habe auch ein wenig programmiert und mein 20x4 LCD Display eingebunden. Leider ist die Werteingabe über den Drehgeber sehr zäh geworden. Ich bilde mir ein, dass es mal schneller und mal langsamer geht, insgesamt jedoch träge.

Ich habe mal den Codeausschnitt vom Schreiben des LCD Displays angehangen. Das Ganze läuft in der loop. Ich habe zuerst immer alle 4 Zeilen des Displays geschrieben und dann die unnötigen Aktualisierungen des Displays herauskommentiert und gehofft, dass es dann etwas flüssiger läuft. Leider ohne größeren Erfolg. Vor der aktuellen LCD-Zeile, die gerade mit dem Drehgeber verändert werden kann, befindet sich ein Markierungsstern *. Mit dem Taster des Drehgebers kann man zwischen den Zeilen umschalten (1,2,3,4,1,2,3..). Ich habe auch - wie von Dir empfohlen - die Funktion updateImpulsAnzeige() regelmäßig aufgerufen, aber das Problem ist wohl das langsame Schreiben auf das LCD-Display, oder?

Code:
switch (knopf) {
    case 1: lcd.setCursor(0, 0);
            lcd.print("*Wert 1: ");
            lcd.print(wert1);
            lcd.print("ms     ");
            updateImpulsAnzeige();          //Regelmäßiges Update der Impulsmessung des Drehgebers.
            /*   
            lcd.setCursor(0, 1);
            lcd.print(" Wert 2: ");
            //updateImpulsAnzeige();          //Regelmäßiges Update der Impulsmessung des Drehgebers.
            lcd.setCursor(0, 2);
            lcd.print(" Wert 3: ");
            //updateImpulsAnzeige();          //Regelmäßiges Update der Impulsmessung des Drehgebers.
            */
            lcd.setCursor(0, 3);
            lcd.print(" Wert 4: ");
            updateImpulsAnzeige();          //Regelmäßiges Update der Impulsmessung des Drehgebers.
            break;
    //Schreiben der 2. Zeile mit veränderbaren Werten. Hierbei wird der Markierungsstern * immer in die korrekte Zeile gesetzt.
    case 2: lcd.setCursor(0, 0);
            lcd.print(" Wert 1: ");
            updateImpulsAnzeige();          //Regelmäßiges Update der Impulsmessung des Drehgebers.
            lcd.setCursor(0, 1);
            lcd.print("*Wert 2: ");
            lcd.print(wert2);
            lcd.print("ms     ");
            updateImpulsAnzeige();          //Regelmäßiges Update der Impulsmessung des Drehgebers.
            /*
            lcd.setCursor(0, 2);
            lcd.print(" Wert 3: ");
            //updateImpulsAnzeige();          //Regelmäßiges Update der Impulsmessung des Drehgebers.
            lcd.setCursor(0, 3);
            lcd.print(" Wert 4: ");
            */
            //updateImpulsAnzeige();          //Regelmäßiges Update der Impulsmessung des Drehgebers.
            break;
    //Schreiben der 3. Zeile mit veränderbaren Werten. Hierbei wird der Markierungsstern * immer in die korrekte Zeile gesetzt.
    case 3: /*
            lcd.setCursor(0, 0);
            lcd.print(" Wert 1: ");
            //updateImpulsAnzeige();          //Regelmäßiges Update der Impulsmessung des Drehgebers.
            */
            lcd.setCursor(0, 1);
            lcd.print(" Wert 2: ");
            updateImpulsAnzeige();          //Regelmäßiges Update der Impulsmessung des Drehgebers.
            lcd.setCursor(0, 2);
            lcd.print("*Wert 3: ");
            lcd.print(wert3);
            lcd.print("ms     ");
            updateImpulsAnzeige();          //Regelmäßiges Update der Impulsmessung des Drehgebers.
            /*
            lcd.setCursor(0, 3);
            lcd.print(" Wert 4: ");
            updateImpulsAnzeige();          //Regelmäßiges Update der Impulsmessung des Drehgebers.
            */
            break;
   //Schreiben der 4. Zeile mit veränderbaren Werten. Hierbei wird der Markierungsstern * immer in die korrekte Zeile gesetzt.
    case 4: /*
            lcd.setCursor(0, 0);
            lcd.print(" Wert 1: ");
            //updateImpulsAnzeige();          //Regelmäßiges Update der Impulsmessung des Drehgebers.
            lcd.setCursor(0, 1);
            lcd.print(" Wert 2: ");
            updateImpulsAnzeige();          //Regelmäßiges Update der Impulsmessung des Drehgebers.
            */
            lcd.setCursor(0, 2);
            lcd.print(" Wert 3: ");
            updateImpulsAnzeige();          //Regelmäßiges Update der Impulsmessung des Drehgebers.
            lcd.setCursor(0, 3);
            lcd.print("*Wert 4: ");
            lcd.print(wert4);
            lcd.print("ms     ");
            updateImpulsAnzeige();          //Regelmäßiges Update der Impulsmessung des Drehgebers.
            break;
     //default: 
    }


Quote
Wenn es Dir zu hakelig wird, müßte man eventuell doch auf die Auswertung der Drehgeberimpulse per Timerinterrupt wechseln.

Das denke bzw. fürchte ich auch.

Ich wäre Dir sehr dankbar für einen Hinweis, wie die Auswertung der Drehgeberimpulse per Timerinterrupt funktionieren könnte. Idealerweise für den Code aus Reply #10, den habe ich nämlich für meine Bedürfnisse ergänzt.

Wenn es weiterhilft, kann ich mal meine gesamten Spaghetti-Code-Ergänzungen komplett posten. Ich weiß allerdings nicht ob das Posten längerer Codes hier so gerne gesehen wird.

Vielen Dank nochmals für Deine Mühe. Ich hoffe ich gehe Dir nicht zu sehr auf die Nerven damit. Ich bin jedenfalls immer wieder angetan vom Umgang der Leute hier im Forum. Ich kenne Plattformen, bei denen schon das geringste outen als Nichtexperte für Hohn und Spott sorgen.

Viele Grüße
Frank
5  International / Deutsch / Re: Drehencoder ungenau on: June 06, 2014, 08:15:47 am
Hallo jurs,

ich habe den Code (Loopfunktion) um eine Funktion erweitert. Ein Druck auf den Taster des Drehgebers erhöht den Wert eines Zählers, um im weiteren Verlauf des Programms entweder die Eingabe von mehreren Werten (in diesem Fall 3) zu ermöglichen oder die Erhöhung der Schrittweite für die Werte zu realisieren. In der Funktion updateImpulsAnzeige() gebe ich den Wert aus (serialPrintln).

Code:

#define ENCODER_C 4
byte knopf=1;

void loop() {
  //updateImpulsAnzeige();
  int button=digitalRead(ENCODER_C);
  if (button==HIGH) {knopf++;}
  if (knopf>3) knopf=1;
  for (int i = 0; i < 150; i++) {
    delay(1);
    updateImpulsAnzeige();
  }
}

Die for-Schleife ist ein delay für eine realistische Auswertung des Knopfdrucks, bei dem der Code noch schnell genug läuft, damit der Drehregler ausreichend oft ausgelesen wird. Was denkst Du darüber? Das geht bestimmt noch eleganter, oder?

Quote
Da die Auswertung in der loop erfolgt, müßtest Du darauf achten, dass Dein Code schnell genug läuft, wenn der Drehgeber ausgewertet werden soll. Insbesondere wenn Du ein 4-zeiliges LCD komplett neu beschreiben möchtest, z.B. 4 Zeilen a 20 Zeichen, während der Drehgeber ausgewertet wird, müßtest Du den Schreibvorgang so aufteilen, dass höchstens 2 Millisekunden zwischen zwei Aufrufen von "impulsAuswertung()" vergehen.

Ich bin gespannt was passiert, wenn das LCD Display noch dazu kommt.

Deinen Vorschlag zur komfortablen Werteänderung mittels Zählen der bereits erfolgten Umdrehungen klingt ebenfalls sehr interessant. Vielleicht kann man den ja mit der Auswertung des Tastendrucks kombinieren, um sowohl mehrere Werte eingeben zu können als auch eine komfortable Werteeingabe zu erhalten.

Wenn es Dir nicht zu viel Arbeit macht, würde ich mich über eine detailliertere Erklärung Deines Sketches sehr freuen. Ich kann den Code zwar einsetzen, verstehe ihn aber noch nicht komplett. Speziell die Auswertung über die Variable state mit Binärarithmetik interessiert mich.

Viele Grüße
Frank
6  International / Deutsch / Re: Drehencoder ungenau on: June 05, 2014, 10:56:18 am
Ich habe den Code ausprobiert und muss sagen: GENIAL !!!

Das ist der erste Code, der mit meinen Billigdrehgebern ohne prellen, überspringen, falsch zählen etc. korrekt funktioniert. Bis dahin schon mal absolute spitze.

Ich werde das Ganze mal in meinen Code integrieren und dann versuchen zu verstehen, was Du da eigentlich genau programmiert hast. Bis dahin schon mal vielen Dank für die tolle Hilfe.

Ich melde mich wieder. Das ist eine Drohung  smiley-wink
7  International / Deutsch / Re: Drehencoder ungenau on: June 04, 2014, 02:22:59 pm
Hallo jurs,

vielen Dank für die rasche Antwort. Ich habe gedacht, dass ich eine Nachricht (E-Mail) erhalte, wenn jemand auf meine Frage antwortet, aber das ist wahrscheinlich nur bei Threads, die ich selber erstellt habe. Aus diesem Grund antworte ich erst jetzt.

Ich möchte den Drehgeber für die Werteeingabe in meinem Code verwenden. Die eingestellten Werte sollen tatsächlich auf einem "langsamen" vierzeiligen LCD Display angezeigt werden. Mein Ziel ist es eine Schaltung zu bauen, die es ermöglicht ein Ventil zur Tropfenfotografie zu steuern. Das Ventil soll in einstellbaren Zeitintervallen Tropfen erzeugen, die dann über ein Relais/Auslösekabel (ebenfalls Bestandteil der Schaltung) fotografiert werden.

Der Drehgeber soll also zur "einfachen" Werteeingabe dienen und zwar so, dass die Werte normalerweise in Einerschritten je Impuls verändert werden. Nach Druck auf den Drehgeberknopf, soll dann auch die Veränderung in Zehner-, Hunderter und Tausenderschritten möglich sein. Zusätzlich möchte ich noch die Eingabe von mehreren Werten ermöglichen (das Display hat ja vier Zeilen smiley-grin).

Auch in späteren Projekten möchte ich diese Drehgeber zur Eingabe von Werten benutzen. ich habe mir jede Menge davon für kleines Geld beim Chinesen gekauft und musste nun feststellen, dass es doch nicht so einfach ist wie ich zunächst vermutet oder vielmehr gehofft habe. Bis jetzt habe ich für die Werteeingabe immer Potentiometer verwendet, die sind aber sehr ungenau und ich musste die Werte sampeln (auch ein Tipp aus diesem Forum) und habe teilweise nur mit viel Geduld einen festen Wert einstellen können. Dann erhielt ich den Hinweis es mit Drehgebern zu probieren.

Ich fürchte, dass ich wohl bei meinem kleinen Projekt und auch in Zukunft nicht um den Einsatz der von Dir genannten Timer-Interrupts herumkomme. Ich habe schon mal ein wenig recherchiert und fürchte, das wird wohl noch ein steiniger Weg für mich werden. Grundsätzlich habe ich schon den Anspruch an mich, die Dinge selber zu entwickeln. Bei diesen Drehgebern stoße ich jedoch an meine Grenzen.

Quote
Meine Vermutung geht dahin: Du möchtest eine Ausgabe nach jedem einzelnen Impuls, egal wie wenig Zeit zwischen den Impulsen vergangen ist, und es soll nicht ausgegeben werden, um wieviel nach links oder nach rechts gedreht wurde, sondern Du möchtest nicht die Gesamtzahl, sondern die Anzahl der Quadrupelimpulse geteilt durch 4. Dabei soll aber ggf. das Kontaktprellen bei der Ausgabe unterdrückt werden, so dass eine Abfolge von Gesamtzahlen wie  1-2-3-4-5-4-5-4-5-4-5-6-7 unterdrückt werden, so dass nur 1-2-3-4-5-6-7 angezeigt wird. So ungefähr?

Ja, genau so stelle ich mir das vor.

Dein Angebot mir ein Bespiel zu erstellen, nehme ich sehr gerne an.

Vielen Dank für Deine Hilfe
Frank
8  International / Deutsch / Re: Drehencoder ungenau on: June 03, 2014, 07:24:33 am
Ich hoffe, ich darf mich an diesen Beitrag mal dran hängen und bitte gleichzeitig um ein mildes Urteil, da ich von Hause aus kein Programmierer bin.

Auch ich habe Probleme beim Auslesen von billigen Rotary-Encodern. Wenn ich im Code nur den Encoder auslese, funktionieren die meisten Methoden/Code-Schnippsel, die ich im Internet gefunden habe mehr oder weniger gut. Bei loop-Funktionen mit anderem Code und delays habe ich - wie "jurs" das beschrieben hat - immer Probleme bekommen.

Der Code von "jurs" funktioniert bei mir in soweit sehr gut, dass ich bei jedem Drehimpuls eine Antwort erhalte, was bei einigen anderen Codes nicht funktionierte, hier wurden Impulse verschluckt und teilweise falsch interpretiert.

Ich habe versucht einen Zähler in den Code zu integrieren (s. Code-Fenster weiter unten) und die vierfache Anzeige des Ausgangs zu korrigieren. Leider funktioniert das bei mir nicht, da ich bei Rotation um eine Raste (rechts wie links) manchmal 2 Werte (1 und 3) und manchmal nur einen Wert (4) zurückerhalte. Der Zähler wird aber fast immer korrekt um 4 erhöht. Hier die beispielhafte Anzeige im Serial Monitor:

1.) Impuls mit zwei Werten:
R: 1
Zaehler: 1
R: 3
Zaehler: 4

2.) Impuls mit einem Wert:
R: 4
Zaehler: 8

Und hier der ergänzte Code (zugegeben keine Meisterleistung):
Code:
case 1: impulseRechts++;
            zaehler++;
            break; 
case -1:impulseLinks++;
            zaehler--;
            break; 

Um die vierfache Erhöhung des Zählers zu umgehen, habe ich versucht nur bei jedem vierten Durchlauf der Funktion impulsAuswertung() den Zähler um eins zu erhöhen/verringern. Das hat jedoch leider nicht funktioniert, da ich ja unterschiedliche Antworten auf die Drehbewegung erhalte.

Vielleicht kann mir "jurs" oder jemand anderes aus diesem Forum einen Hinweis geben, wie ich die Logik anpassen kann, dass ich den Zähler je Impuls tatsächlich nur einmal berücksichtige.

Viele Grüße
Frank
9  International / Deutsch / Re: XBee serielle Kommunikation (Problem bei der Verareitung ...) on: June 05, 2013, 06:34:14 pm
Vielleicht noch ein interessanter Nachtrag für alle die, die genau wie ich, noch auf der Suche nach Basisinformationen zur seriellen Kommunikation sind.

Es gibt zur Zeit ein kostenloses Kapitel des Buches "Arduino Kochbuch" zum Download beim O'Reilly Verlag: http://www.oreilly.de/catalog/arduinockbkger/chapter/ch04.pdf

Zufällig behandelt dieses Kapitel die "Serielle Kommunikation".
10  International / Deutsch / Re: XBee serielle Kommunikation (Problem bei der Verarbeitung ...) on: June 05, 2013, 10:27:34 am
Dank Deiner ausführlichen Erklärung, habe ich das verstanden.

Ich werde mal versuchen die Messwerte mit Trennzeichen zu senden und die ankommenden Werte entsprechend auszuwerten.

Nochmals tausend Dank für Deine Hilfe.

Frank_
11  International / Deutsch / Re: XBee serielle Kommunikation (Problem bei der Verabareitung der übertragen Daten) on: June 05, 2013, 09:19:39 am
@ jurs

Es funktioniert! Vielen Dank für den Code und Deine ausführlichen Erklärungen. Dieses Forum ist echt klasse. Ein Lösung in weniger als 2 Stunden, toll.

Zwei Fragen hätte noch:

1.) Ich habe den Code etwas angepasst, sodass das Relais nur einen Impuls von delay(500); auslöst. Deine Funktion habe ich eingebaut (eigentlich nur reinkopiert). Warum erhalte ich bei einem großen Wert für delay(2000); am Ende des Hauptprogramms fünfstellige Messwerte? Lasse ich den delay weg, wird alles korrekt angezeigt.

Code:
void loop() {
  lcd.setCursor(0, 1);   
  lcd.write("                ");
  lcd.setCursor(0, 1);   
  int messWert = receiveMesswert();
  if (messWert >= 0) lcd.print(messWert);
  if (messWert > 1000) {
    digitalWrite(relais, HIGH);
    delay(500);
    digitalWrite(relais, LOW);
  }
  else {
    digitalWrite(relais, LOW);
    delay(100);
  }
  delay (2000);
}

2.) Kennst Du eine Arduino-bezogene Anleitung/Doku im Internet für die serielle Kommunikation, die nicht nur code-Examples beinhaltet sondern auch Hintergrundinformationen liefert. Sozusagen "Arduino serial for Dummies".

Nochmals vielen Dank für Deine Hilfe!

Liebe Grüße
Frank_
12  International / Deutsch / Re: XBee serielle Kommunikation (Problem bei der Verabareitung der übertragen Daten) on: June 05, 2013, 08:21:54 am
@ legotechnicus

Danke für die Hinweise.

1.) int value = 0;  hilft leider auch nicht
2.) lcd.clear(); löscht mir das ganze Display, ich möchte aber nur die Zweite Zeile löschen (mit Leerzeichen überschreiben) und den Statustext der 1. Zeile behalten
3.) delay(1000); am Ende des Sketches löst die besagten Störungen im LCD Display aus. Die empfangenen Werte werden dann 10-14stellig angezeigt.


@ jurs

Danke auch Dir für die Hinweise.

Code:
while (Serial.available() > 0) {
      value = Serial.read();

Ich dachte, dass diese While-Schleife den kompletten Messwert "abwartet". Komischerweise werden die gesendeten Messwerte ja korrekt am Empfänger-LCD angezeigt. Lediglich die Weiterverarbeitung funktioniert nicht. Über Empfängercode wäre ich natürlich sehr dankbar, da ich mich bisher mit serieller Datenübertragung nicht gut auskenne, aber das habt Ihr ja bereits gemerkt.
13  International / Deutsch / Re: XBee serielle Kommunikation (Problem bei der Verabareitung der übertragen Daten) on: June 05, 2013, 07:55:17 am
Sorry, ich habe den Code wohl nicht korrekt geposted. Die Code-Tags habe ich zu spät gesehen.
14  International / Deutsch / XBee serielle Kommunikation (Problem bei der Verabareitung der übertragen Daten) on: June 05, 2013, 07:34:06 am
Hallo zusammen,

ich möchte gerne über eine Funkverbindung Daten von einem Sensor (LDR, Ultraschall, IR Distanz etc.) am "Sender-Uno" übertragen und im "Empfägner-Uno" auswerten. Hierzu habe ich 2 Arduino UNO R3 Boards (1x SainSmart Uno R3 und einmal Arduino Uno R3) mit jeweils einem XBee Schield mit einem XBee Series 1 verwendet. Zusätzlich habe ich an jedem Uno ein LCD Display 1602 zur Anzeige der Daten angeschlossen.

Beide Xbee Module sind auf 57600 Baud eingestellt und können miteinander kommunizieren. Ich lese auf dem "Sender-Uno" einen LDR 07 am Analogport A0 aus und sende die empfangenen Werte über serial/XBee an den Empfänger. Auf dem LCD Display des "Sender-Uno" werden die Werte angezeigt (bei eingeschaltetem Licht schwanken die Werte des LDR in einem Bereich von ca. 900-950). Der "Empfänger-Uno" empfängt die Werte und stellt sie auch korrekt im LCD dar (natürlich ebenfalls in einem Bereich von ca. 900-950).

Soweit so gut...

Ich habe es jedoch noch nicht geschafft die empfangenen Werte zur Weiterverarbeitung zu nutzen, Ich möchte gerne ein Relais auslösen, wenn der empfangene Wert ("value = Serial.read();") des LDR vom "Sender-Uno" größer als 1000 ist. Das passiert z. B. wenn ich den LDR mit einer Taschenlampe anleuchte. Das Relais reagiert leider nicht auf Werte über 1000 und schaltet nicht ein. Wenn ich die Variable relais im Sketch des "Empänger-Uno" um Testen auf 1001 setze, löst das Relais aus, es scheint also korrekt angesteuert zu werden.

Als Nebenkriegsschauplatz spinnt mein LCD-Display, wenn ich die delay-Werte im Sketch des "Empfänger-Uno" über 400 ms einstelle. Aber das nur nebenbei.

Hier noch der Code der beiden Uno's:

"Sender-Uno":

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 10, 7, 6, 5, 4);

int outgoing;
int analogPin = 0;
int ldr=0;

void setup() {
  Serial.begin(57600);
  lcd.begin(16, 2);
  lcd.clear();
  lcd.print("XBee Sender LDR");
  lcd.setCursor(0, 1);
}

void loop() {
  lcd.write("          ");
  lcd.setCursor(0, 1);
  ldr = analogRead(analogPin);
  lcd.print(ldr);
  Serial.print(ldr);
  delay(300);
}



"Empfänger-Uno":

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 10, 7, 6, 5, 4);

int relais = 9;
int value = 999;

void setup() {
  pinMode(relais, OUTPUT);
  Serial.begin(57600);
  lcd.begin(16, 2);
  lcd.clear();
  lcd.print("XBee Rec LDR");
  lcd.setCursor(0, 1);
}

void loop() {
  if (Serial.available()) {
    lcd.setCursor(0, 1);   
    lcd.write("                ");
    lcd.setCursor(0, 1);   
    while (Serial.available() > 0) {
      value = Serial.read();
      lcd.write(value);
    }
  }
  if (value > 1000) {
    digitalWrite(relais, HIGH);
    delay(200);
  }
  else {
    digitalWrite(relais, LOW);
    delay(200);
  }
}



Hat von Euch einer eine Idee, wo der Fehler liegen könnte. Ich verzweifle, da ich seit mehreren Stunden des testens keine lösung finden kann.

Viele Grüße
Frank_
15  International / Deutsch / Re: erneutes brennen des Bootloader? on: January 25, 2013, 06:28:43 am
Ich habe auch ein Problem mit dem Brennen eines Bootloaders auf einen ATMEL 328P-PU (s. http://arduino.cc/forum/index.php/topic,144690.0.html). In diesem Thread sind einige Möglichkeiten beschrieben.
Pages: [1] 2