GPS-Tacho-Uhr mit 7Segment LED-Anzeige

Hallo zusammen, ich möchte ein neues kleines Projekt von mir vorstellen:

Die vermutlich fünfzigste GPS-Uhr, allerdings zusätzlich mit kmh-Anzeige und das alles auf einer schön altmodischen 7Segment LED-Anzeige. Die kmh-Anzeige dient dazu, durch einen kurzen Blick zum selbstverständlich noch vorhandenen alten mechanischen Tacho die aktuelle Abweichung des mechanischen Tachos zu ermitteln. Bei unter 10 kmh bleibt die kmh-Anzeige dunkel, im Stand sieht das Teil nur aus wie eine selbstgebastelte Digitaluhr auf dem Armaturenbrett.

Der Sketch ist nicht aufgeräumt und zudem noch zusammengeraubt aus blink without delay, einem Code für die 7Segment LED-Anzeige und verschiedenen Sketches zum Thema GPS-Tacho. Aber er funktioniert. Hier im Forum möchte ich einfach Danke sagen an alle, die Sketche veröffentlichen. Vielleicht hilft mein Sketch ja auch irgendwann und irgendwie mal jemanden.

Hier ist mein Bericht:
http://saporoshez-968.de/2021technik/gps_tacho_uhr_sapo.html

Und hier ist der Sketch:

[code]
//gps_tacho_uhr_7-segment-led_sapo
// Nicht D2, soll freibleiben
// Nicht D5, soll freibleiben
//*******************************************************
// Anschlüsse 7Segment mit Max7219
// VCC - rotes Kabel     - rotes Kabel     - Arduino 5V
// GND - schwarzes Kabel - schwarzes Kabel - Arduino GND 
// DIN - weißes Kabel    - weißes Kabel    - Arduino D12
// CS  - gelbes Kabel    - braunes Kabel   - Arduino D10
// CLK - blaues Kabel    - blaues Kabel    - Arduino D11
//*******************************************************
// Anschlüsse GPS6MV2 Modul
// VCC - rotes Kabel     - gelbes Kabel    - Arduino 3,3V
// RX  - schwarzes Kabel - graues Kabel    - Arduino D3
// TX  - weißes Kabel    - grünes Kabel    - Arduino D4
// GND - gelbes Kabel    - schwarzes Kabel - Arduino GND
//*******************************************************
// Schalter für Sommerzeit
//                         weißes Kabel    - Arduino D9
//                         schwarzes Kabel - Arduino GND
//*******************************************************
#include <SoftwareSerial.h>
#include <TinyGPSPlus.h>
#include "LedControl.h"
int vers = 5;
int minutens = 0; // rohe Minuten
int hourasr = 0;  // rohe Stunden eins
int houras = 0;   // rohe Stunden zwei
int kmhgpsr = 0;  // rohe Kilometer pro Stunde 
int kmhgps = 0;   // geglättete Kilometer pro Stunde
char c7 = '3';    // Das Zeichen an der Hunderter-Stelle
char c6 = 'A';    // Das Zeichen an der Zehner-Stelle
char c5 = '3';    // Das Zeichen an der Einer-Stelle
int  z7 = 0  ;    // Die Ziffer an der Hunderter-Stelle
int  z6 = 0  ;    // Die Ziffer an der Zehner-Stelle
int  z5 = 0  ;    // Die Ziffer an der Einer-Stelle
TinyGPSPlus gps;
unsigned long previousMillis = 0; // will store last time LED was updated
const long interval = 800;        // interval at which to blink (milliseconds)
int punktzwei = 0;
SoftwareSerial ss(4, 3);
LedControl lc=LedControl(12,11,10,1);
void setup() {
  pinMode(9,INPUT_PULLUP);
  Serial.begin(9600);
  ss.begin(9600);
    /*
   The MAX72XX is in power-saving mode on startup,
   we have to do a wakeup call
   */
  lc.shutdown(0,false);
  /* Set the brightness to a medium values */
  lc.setIntensity(0,0.1); // 8 ist hell, 0.1 ist abgedunkelt
  /* and clear the display */
  lc.clearDisplay(0);
}

void loop() 
{
  if (digitalRead(9)==LOW) 
    vers = 1 ; // mitteleuropäische Winterzeit MEZ ist UST+1 
  else
    vers = 2 ; //mitteleuropäische Sommerzeit MESZ ist UST+2
   while (ss.available() > 0) {
        gps.encode(ss.read());
    if (gps.time.isUpdated()) {
  int kmhgpsr = gps.speed.kmph();
  // int kmhgpsr = 119;
  if ( kmhgpsr > 9 ) { kmhgps = kmhgpsr ; }
  else { kmhgps = 0 ; }
   int minutens = gps.time.minute();
   int hourasr = gps.time.hour() + vers;
   if ( hourasr < 24 ) { houras = hourasr; }
   else { houras = hourasr - 24; } // Statt 24 Uhr ist es 00 Uhr
   int z7 = kmhgps / 100;
   int z6 = ( kmhgps - ( z7 * 100 )) / 10;
   int z5 = ( kmhgps - ( z7 * 100 ) - ( z6 * 10));
   if ( z7 > 0 ) { c7 = z7 ; }
   else { c7 = ' ' ; }
   if ( (z6+z7) > 0 ) { c6 = z6 ; }
   else { c6 = ' ' ; }
     if ( kmhgps > 0 ) { c5 = z5 ; }
   else { c5 = ' ' ; }
       if (gps.time.hour() < ( 10 + vers)) Serial.print(F("0"));
    Serial.print(gps.time.hour() + vers);
    Serial.print(F(":"));
          if (gps.time.minute() < 10) Serial.print(F("0"));
    Serial.println(gps.time.minute());
        Serial.println(minutens+3);
    lc.setDigit(0,0,(minutens - ((minutens / 10 ) * 10)),false);
    lc.setDigit(0,1,(minutens / 10 ),false);
    lc.setDigit(0,3,(houras / 10 ),false);
    lc.setChar(0,7,c7,false);   
   lc.setChar(0,6,c6,false);
   lc.setChar(0,5,c5,false);
    //Serial.println(F(":"));
    unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {
    // save the last time you blinked the LED
    previousMillis = currentMillis;

    // if the LED is off turn it on and vice-versa:
    if (punktzwei == 0) 
          {
      lc.setDigit(0,2,(houras - ((houras / 10 ) * 10)),false);
      punktzwei = 1;
    } else {
      lc.setDigit(0,2,(houras - ((houras / 10 ) * 10)),true);
      punktzwei = 0;
    }
    }
    }
    }
    }
    
[/code]
1 Like

Das solltest Du ändern.
Du musst Dich durch den ganzen Code quälen, wenn es mal notwendig ist.
Mach das vorher:

const byte wofuerIchBinPin = 9;

Mach das auch für alle anderen - auch wenn Du die nur einmal benötigst. - z.B. fürs SoftwareSerial.

Dann hast Du oben eine Liste - und brauchst Dich nicht durch den ganzen Code quälen, ob Du irgendwas vergessen hast...
Das wird nämlich richtig böse....

das solltest du korrigieren, Helligkeit ist sicher kein float

        /* 
         * Set the brightness of the display.
         * Params:
         * addr		the address of the display to control
         * intensity	the brightness of the display. (0..15)
         */
        void setIntensity(int addr, int intensity);

Hallo, ich hatte mit der Helligkeit herumprobiert. Tatsächlich leuchtet die Anzeige bei einem Wert von 8 sehr hell, bei einem Wert von 1 schwächer und seltsamerweise bei einem Wert von 0.1 noch schwächer. Erklären kann ich mir dieses Verhalten nicht.

Der Unterschied zwischen 1 und 0.1 ist schon klar. Ich könnte mir keinen Unterschied zwischen 0 und 0.1 erklären.

Tatsächlich leuchtet die Anzeige bei einem Wert von 8 sehr hell

Zwischen 9 und 15 wird es vermutlich nicht mehr so sehr viel heller.

Schaue Dir dazu mal diesen Artikel an.

Gruß Tommy