GPS to LED display

Wiring, C++, C, Java, ...
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Odpovědět
licantrop
Příspěvky: 1
Registrován: 08 zář 2017, 08:12
Reputation: 0

GPS to LED display

Příspěvek od licantrop » 08 zář 2017, 08:16

Dobrý den.
Mám postavenou GPS, vše funguje jak má, ale ted řeším věc jak dostat vzdálenost - tj. číselnou hodnotu na 7segmentový LED display. Může mi někdo poradit?

franta
Příspěvky: 1
Registrován: 14 zář 2017, 12:55
Reputation: 0

Re: GPS to LED display

Příspěvek od franta » 14 zář 2017, 13:34

Jelikož jsem s arduinem na samotném začátku, pojal jsem Tvoji otázku jako sebe vzdělávací úkol (ačkoliv si tedy myslím, že zde objevujeme nový světadíl ... Ameriku nebo tak nějak ... že stačí jen vhodně použít google).
Napadlo mě tedy jen hodnotu GPS vzdálenosti "rozsekat" na jednotlivé řády pomocí modulo a tyto znaky uložené do pole pak zobrazit.
Takto to funguje, ale samotného by mě zajímalo nejjednodušší řešení. S těmi konverzemi číslo <-> text, spojování, načítání, ... se dost peru. Přijde mi také, že něco musím dělat zásadně špatně, protože jen takováhle blbost mi po kompilaci zabírá 22%. Ale to je jiné téma ...

Kód: Vybrat vše

#include "LedControl.h"
LedControl lc=LedControl(10,12,11,1);
char delka_txt[4];

void setup() {  
    lc.shutdown(0,false);
    lc.setIntensity(0,8);
    lc.clearDisplay(0);
} //end setup

void loop() {
  int delka = random(10000); //simulace načítání vzdálenosti z GPS, max 9999
  //rozsekání čísla na jednotlivé řády
  delka_txt[3] = delka%10;
  delka_txt[2] = (delka%100-delka%10)/10;
  delka_txt[1] = (delka%1000-delka%100)/100;
  delka_txt[0] = (delka%10000-delka%1000)/1000;
  // zobrazení na 7-segment
  for (byte i=0; i<4; i++) 
    lc.setChar(0,i,delka_txt[i],false); 
  delay(2000);
  lc.clearDisplay(0);
} // end loop

Uživatelský avatar
SkullKeep
Příspěvky: 291
Registrován: 23 srp 2017, 18:51
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: GPS to LED display

Příspěvek od SkullKeep » 10 říj 2017, 19:26

Mam tu pro tebe program na o stejne, ale bez externi knihovny (opsano z internetu ta cast na konci programu) a upraveno pro muj ucel. Zobrazuje 4 ruzne cisla najednou na 4 segmentu pro digi hodiny. Program zabira 4% mista a 4% pameti. Snad ti to pomuze.

Kód: Vybrat vše

//zapojeni 4segmetni LED cislic se spolecnou Katodou
int cislo; 
byte digit4[11][7] = { //segmenty D2=E,D3=D,D4=C,D5=G,D6=F,D7=B,D8=A
  {1, 1, 1, 0, 1, 1, 1}, //0
  {0, 0, 1, 0, 0, 1, 0}, //1
  {1, 1, 0, 1, 0, 1, 1}, //2
  {0, 1, 1, 1, 0, 1, 1}, //3
  {0, 0, 1, 1, 1, 1, 0}, //4
  {0, 1, 1, 1, 1, 0, 1}, //5
  {1, 1, 1, 1, 1, 0, 1}, //6
  {0, 0, 1, 0, 0, 1, 1}, //7
  {1, 1, 1, 1, 1, 1, 1}, //8
  {0, 1, 1, 1, 1, 1, 1}, //9
  {0, 0, 0, 0, 0, 0, 0} //10
};
//*******************************************
void setup()
{
  for (byte pins = 2; pins < 13; pins++) {// D9-D12 cisla 1-4
    pinMode(pins, OUTPUT);
  }
  digiLowSeg(); //nulovani segmentu
  digiLowABCD(); //nulovani cislic
}
//********************************************
void loop() {
  cislo = 5667;
    four_digit(cislo);
  delay(5);
}
//**********************************************************
void Segment(int digi) { //zobraz segmenty
  for (byte pin = 0 ; pin < 7 ; pin++) {
    if (digit4[digi][pin] == 1) {
      digitalWrite(pin + 2, HIGH);
    } else {
      digitalWrite(pin + 2, LOW);
    }
  }
}
//**********************************************************
void digiLowSeg() { //vynuluj jednotlive segmenty
  for (byte pins = 2; pins < 13; pins++) {
    digitalWrite(pins, LOW);
  }
}
//**********************************************************
void digiLowABCD() { //vynulus vstupy 4 digit
  for (byte pins = 9; pins < 13; pins++) {
    digitalWrite(pins, HIGH);
  }
}
//**********************************************************
void four_digit(int digits) { //zobraz cislo
#define bright 500
  long zacni = millis();
  for (int loap = 4; loap > 0 ; loap--) {
    switch (loap) {
      case 4: digitalWrite(9, LOW);
        break;
      case 3: digitalWrite(10, LOW);
        break;
      case 2: digitalWrite(11, LOW);
        break;
      case 1: digitalWrite(12, LOW);
        break;
    }
    Segment(digits % 10);
    digits /= 10;
    delayMicroseconds(bright);
    Segment(10);
    digiLowABCD();
  }
  while ((millis() - zacni) < 10); //cyklus na zobrazemi segmentu
}
:twisted: :?: :arrow: :geek: P. Q. M.

Uživatelský avatar
SkullKeep
Příspěvky: 291
Registrován: 23 srp 2017, 18:51
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: GPS to LED display

Příspěvek od SkullKeep » 15 říj 2017, 15:37

Mam tu novejsi verzi prevodu samostane zabira 4% mista a 1% pameti.

Kód: Vybrat vše

//zapojeni 4segmetni LED cislic se spolecnou Katodou
int cislo_cele;//segmenty D2=A,D3=B,D4=C,D5=D,D6=E,D7=F,D8=G
byte digit4[] = {B0111111,B0000110,B1011011,B1001111,B1100110,B1101101,B1111101,B0000111,B1111111,B1101111};
//*******************************************
void setup()
{
  for (byte pins = 2; pins < 13; pins++) {// D9-D12 cisla 1-4
    pinMode(pins, OUTPUT);
  }
  digiLowSeg(); //nulovani segmentu
  digiLowABCD(); //nulovani cislic
}
//********************************************
void loop() {
  cislo_cele = 4768;
  four_digit(cislo_cele);
  delay(5);
}
//**********************************************************
void Segment(int digi) { //zobraz segmenty
  for (byte pin = 0 ; pin < 7 ; pin++) {
          digitalWrite(pin + 2,(((digit4[digi]) >> (pin)) & 0x01));
  }
}
//**********************************************************
void digiLowSeg() { //vynuluj jednotlive segmenty
  for (byte pins = 2; pins < 13; pins++) {
    digitalWrite(pins, LOW);
  }
}
//**********************************************************
void digiLowABCD() { //vynulus vstupy 4 digit
  for (byte pins = 9; pins < 13; pins++) {
    digitalWrite(pins, HIGH);
  }
}
//**********************************************************
void four_digit(int digits) { //zobraz cislo
#define bright 300
  long zacni = millis();
  for (int loap = 4; loap > 0 ; loap--) {
    switch (loap) {
      case 4: digitalWrite(9, LOW);
        break;
      case 3: digitalWrite(10, LOW);
        break;
      case 2: digitalWrite(11, LOW);
        break;
      case 1: digitalWrite(12, LOW);
        break;
    }
    Segment(digits % 10);
    digits /= 10;
    delayMicroseconds(bright);
    digiLowSeg();
    digiLowABCD();
  }
  while ((millis() - zacni) < 10); //cyklus na zobrazemi segmentu
}
:twisted: :?: :arrow: :geek: P. Q. M.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 49 hostů