Stránka 1 z 1

GPS to LED display

Napsal: 08 zář 2017, 08:16
od licantrop
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?

Re: GPS to LED display

Napsal: 14 zář 2017, 13:34
od franta
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

Re: GPS to LED display

Napsal: 10 říj 2017, 19:26
od SkullKeep
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
}

Re: GPS to LED display

Napsal: 15 říj 2017, 15:37
od SkullKeep
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
}