PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Vorstellung und gleich ein Problem



Madwilli
20.03.2014, 12:13
Hallo an alle
mein Name ist Claus und ich habe als kleiner Junge mal RFT gelernt.
Nun im gesetzten alter beschäftige ich mich wieder mit der Elektronik.
Das Arduino System ist da für mich der ideale einstig.
Nur habe ich ab und zu mal ein paar Probleme die ich nicht alleine lösen kann.
Ich hoffe Ihr könnt mir dabei helfen.

Ich habe mir ein Lauflicht von Adafruit ( LED Matrix 16X32 ) gekauft und habe es auch Problemlos
Zum laufen bekommen.

Nun versuche ich über die Serielle Schnittstelle Daten an das Display zu senden.
Das Funktioniert auch, nur kann ich zwar mehr als 10 Zeichen senden, das Display zeigt immer
nur max 10 Zeichen an .

Bsp.

Ich sende „ 123456789012345“
Serial.print der eingehenden Zeichen zeigt alle Zeichen an.
Nur die Variable „Text“ enthält nur 10 Zeichen "1234567890".
Ich komme nicht dahinter warum das so ist.

Ich hoffe jemand kann mir sagen was ich falsch mache.

Danke


// scrolltext demo for Adafruit RGBmatrixPanel library.
// Demonstrates double-buffered animation on our 16x32 RGB LED matrix:
// http://www.adafruit.com/products/420

// Written by Limor Fried/Ladyada & Phil Burgess/PaintYourDragon
// for Adafruit Industries.
// BSD license, all text above must be included in any redistribution.

#include <Adafruit_GFX.h> // Core graphics library
#include <RGBmatrixPanel.h> // Hardware-specific library

// Similar to F(), but for PROGMEM string pointers rather than literals
//#define F2(progmem_ptr) (const __FlashStringHelper *)progmem_ptr

#define CLK 8 // MUST be on PORTB! (Use pin 11 on Mega)
#define LAT A3
#define OE 9
#define A A0
#define B A1
#define C A2
// Last parameter = 'true' enables double-buffering, for flicker-free,
// buttery smooth animation. Note that NOTHING WILL SHOW ON THE DISPLAY
// until the first call to swapBuffers(). This is normal.
RGBmatrixPanel matrix(A, B, C, CLK, LAT, OE, true);
// Double-buffered mode consumes nearly all the RAM available on the
// Arduino Uno -- only a handful of free bytes remain. Even the


String Text; // a string to hold incoming data
boolean stringComplete = false; // whether the string is complete
int textMin;
int l = 0;
int textX = matrix.width();

void setup()
{
Serial.begin(9600);
Text.reserve(200);
matrix.begin();
matrix.setTextWrap(false); // Allow text to run off right edge
matrix.setTextSize(1);
}

void loop() {

if (stringComplete)
{
Serial.println(Text);
Serial.println(l);
textMin = l * -8,
stringComplete = false;
}

matrix.fillScreen(0);
matrix.setTextColor(matrix.Color333(0, 0, 1));
matrix.fillRect(0, 14, 32, 2, matrix.Color333(1, 0, 0));
matrix.fillRect(0, 0, 32, 2, matrix.Color333(1, 0, 0));

if (l >= 7)
{
if((--textX) < textMin) textX = matrix.width();
delay(30);
matrix.setCursor(textX, 4);
matrix.print(Text);
}
else
{
matrix.setCursor(1, 4);
matrix.print(Text);
}

matrix.swapBuffers(false);

}

void serialEvent()
{
Text = "";
l = 0 ;
while (Serial.available())
{
char inChar = (char)Serial.read();
Text += inChar;
delay(3);
Serial.print(inChar);
Serial.println();
l ++;
if (inChar == '\n')
{
stringComplete = true;
}
}
}

Sisor
20.03.2014, 18:28
Das sieht merkwürdig aus:

if (stringComplete)
{
Serial.println(Text);
Serial.println(l);
textMin = l * -8,
stringComplete = false;
}

Wenn du Hilfe möchtest, wäre eine Code-Formatierung hilfreich. So ist das schwer zu lesen.

Madwilli
20.03.2014, 21:42
Die Formatierung ist beim einfügen verloren gegangen.
textMin bestimmt die Anzahl der Zeichen für das durchlaufen der Schrift von links nach rechts.
l ist die Anzahl der Zeichen und die -8 sind die Leerzeichen hinter dem Text bis zum nächsten durchlauf des Textes.

Wie kann ich Code einfügen ohne das die Formatierung verloren geht ?

Mein Problem betrifft eigentlich nur den letzten teil in dem die Zeichen eingelesen werden
Der "Text" String nimmt einfach nur 10 Zeichen auf.

Sisor
20.03.2014, 22:23
Wenn du hier posten willst, erscheinen unten rechts drei Buttons: Antworten, Erweitert, Abbrechen. Auf Erweitert klicken. Dann kannst du das Raute-Symbol anklicken. Alternativ kannst du auch deinen Programmcode mit
... umschließen. Weiteres auch hier (https://www.roboternetz.de/community/misc.php?do=bbcode).

Drei Ideen/Ansätze zu deinem Problem:
1. while (Serial.available() > 0) , da -1 zurückgegeben wird, falls keine Daten vorhanden sind.
2. Du funkst mit Serial.print(inChar); Serial.println(); über die selbe Leitung, wärend du liest.
3. Hast du mal versucht die Bautzahl zu erhöhen?

Madwilli
21.03.2014, 07:18
Danke für die Tips.
Leider alle ohne Erfolg.
Auch ohne Serial.print Anweisungen keine änderung

Auszug aus dem Monitor
123456789123456 // Eingabe über die Serialle
1234567891 // Inhalter der Variable "Text"
16 // Inhalt der Varibale l anzahl der zeichen

oderlachs
21.03.2014, 08:25
Hallo , ich würde mal hier nach Beispielen (https://github.com/adafruit/RGB-matrix-Panel) suchen die gehen, um diese zu modifizieren für eigene Creationen. Schau Dir genau noch mal die zitierte Stelle von Sisor an. Mich wundert das der Compiler da mitgemacht hat.. na ja kann sein das er nicht meckert aber komisch...kann sein das der Code nicht feststellt das die Stringlänge ja : Stringlänge =Textlänge +1 ist. Das waren bei mir so die Anfängerfehler damals oder auch Flüchtigkeitsfehler beim Programmieren... schäm.. ;)

Code kannst Du einfügen, in dem Du Zitat anclickst und dann QUOTE in CODE umschreibst ... so mache ich es immer..

Gerhard

Gerhard

Madwilli
21.03.2014, 09:16
Mein Code basiert auf dem Beispiel aus deinem Link.
Da ist auch diese zeile mit drinn


textMin = sizeof(str) * -12,

und das beispiel Funktioniert ja auch.

oderlachs
21.03.2014, 10:46
mit dem Kommata am Ende ???

da stehts in einer int deklaration :



int textX = matrix.width(),
textMin = sizeof(str) * -12,
hue = 0;


und nicht mitten im Code , wo man mit einem " ;" abschliessen sollte...

Sisor
21.03.2014, 14:35
Das hier geht bei mir:

String inText = "";
int l = 0;
void setup()
{
Serial.begin(9600);
}

void loop()
{
if (inText !="")
{
Serial.print("Text: ");
Serial.println(inText);
Serial.print("Laenge: ");
Serial.println(l);
inText = "";
}
}

void serialEvent()
{
l = 0;
while (Serial.available() > 0)
{
char inChar = Serial.read();
inText += inChar;
delay(3);
l++;
}
}

Eingabe:
12345678901234567890

Ausgabe:
Text: 12345678901234567890
Laenge: 20

verwendet: Uno + Arduino IDE Serieller Monitor

oderlachs
21.03.2014, 15:33
Bestens ...klappt bei mir auch, allerdings erst ab Arduino Version >= 1.0 auch Ardu-Uno usw...

Sisor
21.03.2014, 16:12
Oder in kurz:):

String inText = "";

void setup()
{
Serial.begin(9600);
}

void loop()
{
if (inText !="")
{
Serial.print("Text: ");
Serial.println(inText);
Serial.print("Laenge: ");
Serial.println(inText.length());
inText = "";
}
}

void serialEvent()
{
while (Serial.available() > 0)
{
inText += (char) Serial.read();
delay(3);
}
}

Madwilli
24.03.2014, 13:05
Vielen dank für eure Hilfe.
Das Problem tritt nur auf wenn folgende Zeile im Code vorhanden ist.

RGBmatrixPanel matrix(A, B, C, CLK, LAT, OE, true);

nehme ich diese Zeile raus nimmt der Text String auch alle zeichen an.
Das nutzt nur nichts da das RGB Display dann nicht mehr Funktioniert.

Habi ihr vieleicht noch eine Idee wie ich folgende Variabele mit den Seriellen Daten füttern kann ?

char str[] PROGMEM = "";

Im Beispiel ist diese Zeile im definitionsbereich.

char str[] PROGMEM += inChar;

Prodoziert eine Fehlermeldung.

expected initializer before '+=' token


Danke und Gruß
Claus

Sisor
24.03.2014, 15:52
Habi ihr vieleicht noch eine Idee wie ich folgende Variabele mit den Seriellen Daten füttern kann ?

char str[] PROGMEM = "";

Im Beispiel ist diese Zeile im definitionsbereich.

char str[] PROGMEM += inChar;

Prodoziert eine Fehlermeldung.

expected initializer before '+=' token

1. PROGMEM (http://arduino.cc/de/Reference/PROGMEM) lässt die Variable im Flash speichern, statt im SRAM. Hab noch nicht genau verstanden, warum das hier gebraucht wird...

2. char str[] liefert ein Array aus Chars alias C-String. Dies ist kein String-Objekt, kann daher auch nicht 'mal eben' erweitert werden. Daher funktioniert auch '+=' nicht.

3. Die Variable wurde mit char str[] PROGMEM = ""; schon initialisiert. Eine zweite Initialisierung macht daher keinen Sinn.

'Füttern':


char str[5];
str[0] = 'd';
str[1] = 'o';
str[2] = 'o';
str[3] = 'f';
str[4] = '\0';

Madwilli
24.03.2014, 22:24
So
Problem gelöst.
Ich habe den UNO gegen einen MEGA getauscht und schon gehen locker 50 Zeichen.
Also falls jemand mal dieses Display nutzen möchte nehmt gleich nen MEGA.
Der UNO hat zu wenig Speicher.

In der IDE hat man noch jeweils ca 80% Speicher frei was aber nicht stimmt.
Die Libery frisst wohl richtig Speicher.

Danke für eure Hilfe.

Claus

Sisor
24.03.2014, 23:12
Aha, klar macht Sinn...
Die IDE gibt übrigens die richtige Programmgröße an. Zur Laufzeit braucht das Programm allein um die LED-Bitmap zu speichern (theoretisch) 32*16*3 Byte (Länge*Höhe*Farben) = 1536 Byte. Der Arduino Uno hat aber nur 2048 Byte (2kB). Da bleibt nicht mehr viel übrig.

Daher auch das Ausweichen auf den PROGMEM.