GEOGPS - Projektvorstellung

Hallo,

so langsam nähere ich mich einem echtem Projekt namens GEOGPS. Es wird ein GPS Gerät werden, welches auf das Geocaching zugeschnitten ist. Es wird ein Positionslogger mit SD Card haben, Cachepositionen von SD Card lesen können etc.

Leider musste ich wieder etwas zurückrudern: der SD Card Adapter verlor einige Beine beim beim Löten :slight_smile: Passiert nun mal, auch wenn es dahingehend ärgerlich ist, da es schonmal lief :slight_smile:

Hier ein erstes Demovideo, wo das Gerät noch nicht im Gehäuse ist:

Links die ATmega328 Platte, rechts der 1100mAh Akku. Oben das Nokia 3310 Shield.

Hier mit angeschlossenem EM 406 A:

Hier im Gehäuse - man sieht schön den Blütenstaub :slight_smile: :

Habe nochmal eine neue Funktion eingebaut: Cacheradar. Ist noch mit fixen Werten, weil ich den ATmega328 immer zwischen Arduino Uno und DIY Platine hin-und-herstecke und am Arduino Uno kein GPS angeschlossen habe.

Einige Menüs sind momentan noch ohne Funktion. Werden es aber bald sein :slight_smile:

BTW: Wenn jemand von Euch Nokia 3310 Display Eigentümern eine Idee hat wie ich einen 3x5 Font auf das Nokia 3310 Shield bekomme wäre ich sehr dankbar! Ich benötige das für die GPX Beschreibung der Caches von geocaching.com.

Sieht sehr gut aus. Kannst du sagen was das Gelbe da auf dem Joystick vom Shield ist?

Hi gloob,

danke Dir. Ja, das Gelbe ist ein Platiskteil, welches ich aus einem Gehäuse abgeschnitten habe. Das sind die "Gnubbel", in die man die Platinen mit Schrauben schraubt. Ich habe keine Ahnung, wie die "Dinger" heißen. Das habe ich dann mit Kleber auf den Stick geklebt.

Aber ACHTUNG: den Kleber nur sehr vorsichtig benutzen, sonst läuft er in den Stick und nichts geht mehr!

DE8MSH:
Wenn jemand von Euch Nokia 3310 Display Eigentümern eine Idee hat wie ich einen 3x5 Font auf das Nokia 3310 Shield bekomme wäre ich sehr dankbar!

Also ich machs ohne Library, da ist es kein Problem. Mit Library weiß ichs nicht...

Joghurt:

DE8MSH:
Wenn jemand von Euch Nokia 3310 Display Eigentümern eine Idee hat wie ich einen 3x5 Font auf das Nokia 3310 Shield bekomme wäre ich sehr dankbar!

Also ich machs ohne Library, da ist es kein Problem. Mit Library weiß ichs nicht...

Meine Idee wäre eine Bitmap, die alle Zeichen x 4px Breit /6px hoch ist. Dann in .h umwandeln. Momentan weiß ich nicht, die ich die Routine bastel. Die LIB ist kompliziert gemacht, finde ich.

Du kannst Dir gerne hier die aktuellste Version meines aktuellen Projekts ansehen, die das 3310 direkt anspricht.

Und zur korrekten vertikalen Positionierung würde ich einfach das entsprechende Bitmap-Byte shiften.

Hi Joghurt,

ich versuche mal mein Glück. Danke Dir.

Hallo,

ich habe doch die original Library hingehackt. Nun kann ich einen 3x5 Font aus der Sammlung von Benedikt K. (µC-Forum / font.zip aus LCD Schriftarten ( Fonts in veschiedenen Größen ) - Mikrocontroller.net) anzeigen:

Aber es fehlt noch der Umbau auf acht Zeilen; oder wolltest Du nur den kleineren Font...?

Das stimmt. Da habe ich jetzt gar keinen Plan wie ich das mache... Macht das Display nicht immer nur sechs Zeilen wg. der Bänke?

Ich weiß jetzt nicht wie die Library das macht. :frowning:

Ich würde bei mir (ich habe ein Array mit 504 Bytes (welches das Display repräsentiert, quasi ein FrameBuffer) welche nacheinander die sechs einzelnen Zeile füllen) das entsprechende vertikale Byte des Buchstaben und die gewünschte Y-Koordinate nehmen, das Byte in zwei Variablen packen, passend shiften und aufs Display ODERn.

Ungefähr so:

Also die "obere" Variable um sechs Positionen nach unten shiften und die "untere" um die restlichen zwei (muss insgesamt 8 ergeben) nach oben.

Ok, verstanden. Aber wie umsetzen? Die LIB hat diese (angepasste) Funktion:

void Nokia_3310_lcd::writeMiniChar(unsigned char ch, char mode) {
unsigned char j;

if (cursor_col > LCDCOLMAX - 4) cursor_col = LCDCOLMAX - 4; // ensure space is available for the character
if (cursor_row > LCDROWMAX - 1) cursor_row = LCDROWMAX - 1; // ensure space is available for the character
lcd_buffer[cursor_row][cursor_col] = 0x00;
for(j=0; j<4; j++) {
lcd_buffer[cursor_row][cursor_col + j] = pgm_read_byte(&(miniFont [(ch-32)*4 + j] ));
}
lcd_buffer[cursor_row][cursor_col + 4] = 0x00;
for(j=0; j< 4; j++) {
if( mode == MENU_NORMAL )
writeData(lcd_buffer[cursor_row][cursor_col++]);
else
writeData(lcd_buffer[cursor_row][cursor_col++] ^ 0xff);
if (cursor_col >= LCDCOLMAX)
{
cursor_col=0;
cursor_row++;
if (cursor_row >= LCDROWMAX) cursor_row=0;
}
}

Naja, den Code

	for(j=0; j<4; j++) {
		lcd_buffer[cursor_row][cursor_col + j] =  pgm_read_byte(&(miniFont [(ch-32)*4 + j] ));
	}

könntest Du für die zweite Zeile z.B. so abändern:

	for(j=0; j<4; j++) {
		lcd_buffer[cursor_row][cursor_col + j] |=  pgm_read_byte(&(miniFont [(ch-32)*4 + j] )) << 6;
		lcd_buffer[cursor_row +1][cursor_col + j] |=  pgm_read_byte(&(miniFont [(ch-32)*4 + j] )) >> 2;
        }

(Bei der Richtung der ">>" bin ich mir jetzt nicht sicher.)

Das "|=" ist wichtig, weil Du sonst mit der nächsten Zeile die aktuelle überschreibst.
Da musst Du dann allerdings ganz zu Anfang einen "Reinigungslauf" machen, also alles auf "0x00" setzen.

So oder so ähnlich... :wink:

Und wenn Du das maximale an Buichstaben bei der Anzeige rausholen willst könntest Du den Font "proportional" anlegen, indem Du die Breiten von Zeichen wie "i", "l", "1", "." oder "!" berücksichtigst und nicht immer fest 3 Pixeln annimmst.
Das sieht dann auch in der Ausgabe besser aus, kostet aber etwas Aufwand. :wink:

So ähnlich :D, denn:

C:\Program Files\Arduino\libraries\nokia_3310_lcd\nokia_3310_lcd.cpp: In member function 'void Nokia_3310_lcd::writeMiniChar(unsigned char, char)':
C:\Program Files\Arduino\libraries\nokia_3310_lcd\nokia_3310_lcd.cpp:434: error: invalid operands of types 'const unsigned char*' and 'int' to binary 'operator>>'

Kann sein dass da noch ein cast fehlt. :wink:
Kanns hier in der Firma nicht testen. :frowning:

Das müsstest Du generell noch etwas aufbohren, da in der ersten Zeile ja garkein Shift nötig ist, und in der dritten jeweils 4 Bits weit geshiftet werden muss (vorausgesetzt ich hab das jetzt im Kopf nicht falsch überschlagen) und so weiter...

Müsste eigentlich shift= 0, 6, 4, 2, 0, ... sein, bei der anderen Variable "8-shift" in die andere Richtung. :wink:

Du sollst ja auch arbeiten, nicht coden. Außer Du codest auf der Arbeit :slight_smile:

Jo, tu ich. Aber eben nicht fürn Arduino... :wink:

Nee, für'n Kunden. :grin: So soll es ja auch sein. Hobby ist Hobby, Schnaps ist Schnaps... Oder so.