7 segmentowy wyświetlacz

Masz problem z Arduino? Tutaj możesz szukać pomocy.
ODPOWIEDZ
Awatar użytkownika
pokulan
Młodszy majsterkowicz
Posty: 30
Rejestracja: 29 maja 2013, 14:45
Lokalizacja: Gdańsk

7 segmentowy wyświetlacz

Post autor: pokulan » 12 sty 2014, 20:26

Mam pytanie. Czy da się wyświetlić 2-3 cyfrową liczbę na jednym 7 segmentowym wyświetlaczu która jest obliczana w trakcie kodu? Chodzi mi o to, że w kodzie wyliczana jest jakaś liczba 2-3 cyfrowa i czy dało by się najpierw wyświetlić pierwszą cyfrę liczby ( ew. 0 jeśli 2 cyfry ), potem druga i trzecia ( coś ala scrollowany tekst )?

PS. Tworzę metronom z dysku twardego i chce wyświetlić prędkość na jednym segmencie :)

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


Malen
Młodszy majsterkowicz
Posty: 27
Rejestracja: 2 sty 2014, 22:47

Re: 7 segmentowy wyświetlacz

Post autor: Malen » 12 sty 2014, 21:29

Hmm nie wiem czy to Ci sie spodoba czy nie. Ale wymyśliłem coś takiego:

Kod: Zaznacz cały

#include <iostream>

int Liczba = 589;
int Liczba1;
int Liczba2;
int Liczba3;
int main()
{
    std::cout << Liczba << std::endl;
    Liczba1 = Liczba / 100;
    std::cout << Liczba1 << std::endl;
    Liczba2 = (Liczba / 10) - (Liczba1*10);
    std::cout << Liczba2 << std::endl;
    Liczba3 = Liczba - Liczba1*100 - Liczba2*10;
    std::cout << Liczba3 << std::endl;
    return 0;
    
}
Jest to napisane w C++.

Działanie jest nast:

w zmiennej Liczba masz zapisana jakas liczbe od 1 do 3 cyfrową.

w zmiennych Liczba1 / Liczba2/ Liczba3 masz poszczególne elementy składowe tej liczby ( częsci setne / dziesiętne / jedności ). Jak bedziesz miał 2 cyfrową liczbę np. 89 to wyświetli Ci to tak:

Kod: Zaznacz cały

0
8
9
Minus to oczywiscie sporo zmiennych. Na pewno da się to zrobić inaczej ;d ale to by trzeba zmienić mechanike uzyskiwania liczby w Twoim programie, aby każdą część zapisywać w tablicy.
Awatar użytkownika
cube
Złota rączka
Posty: 834
Rejestracja: 2 gru 2012, 17:02

Re: 7 segmentowy wyświetlacz

Post autor: cube » 12 sty 2014, 21:33

Nie ma żadnych przeszkód, wyświetlacz zachowa się tak, jak napiszesz program. Jak poczytasz o obsłudze wyświetlaczy to okaże się że niemalże zawsze są one multipleksowane, czyli w konkretnej chwili włączony jest tylko jeden wyświetlacz z kilku. Pamiętaj tylko aby zrobić dłuższą pauzę po wyświetleniu ostatniej cyfry.

Do rozbicia liczby na cyfry przyda Ci się funkcja modulo.
Awatar użytkownika
pokulan
Młodszy majsterkowicz
Posty: 30
Rejestracja: 29 maja 2013, 14:45
Lokalizacja: Gdańsk

Re: 7 segmentowy wyświetlacz

Post autor: pokulan » 12 sty 2014, 21:44

Dzięki Malen za banalny sposób rozbijania liczby. I w jaki sposób wypisać float bez wartości po przecinku ew. zamienić na int?

PS. Atmega8a się nada do metronomu? Obsłuży potencjometr?
Malen
Młodszy majsterkowicz
Posty: 27
Rejestracja: 2 sty 2014, 22:47

Re: 7 segmentowy wyświetlacz

Post autor: Malen » 12 sty 2014, 21:52

Rzutawanie:

Kod: Zaznacz cały

  float Liczba = 124.1;
  Liczba = (int)Liczba;
Teraz w zmiennej Liczba masz wartość 124. ( to co po przecinku pominięte )
Awatar użytkownika
pokulan
Młodszy majsterkowicz
Posty: 30
Rejestracja: 29 maja 2013, 14:45
Lokalizacja: Gdańsk

Re: 7 segmentowy wyświetlacz

Post autor: pokulan » 12 sty 2014, 21:56

A AtMega8a obsłuży potencjometr? Dopiero zaczynam zabawę z elektroniką i nie za bardzo rozpoznaje oznaczenia w "shicie", jakie oznaczenie ma pin analogowy?
Malen
Młodszy majsterkowicz
Posty: 27
Rejestracja: 2 sty 2014, 22:47

Re: 7 segmentowy wyświetlacz

Post autor: Malen » 12 sty 2014, 22:10

PC0 - PC5 są to wejscia / wyjscia analogowe do którego możesz wpiąć potencjometr. Przyda Ci się jeszcze funkcja map ( Zakres1.1, Zakres1.2, Zakres2.1, Zakres2.2 ); Generalnie ona zmienia zakres . Poczytaj o niej sobie troche.
Awatar użytkownika
pokulan
Młodszy majsterkowicz
Posty: 30
Rejestracja: 29 maja 2013, 14:45
Lokalizacja: Gdańsk

Re: 7 segmentowy wyświetlacz

Post autor: pokulan » 12 sty 2014, 22:12

Funkcje map znam :P Dzięki za info o wejściach.
Awatar użytkownika
pokulan
Młodszy majsterkowicz
Posty: 30
Rejestracja: 29 maja 2013, 14:45
Lokalizacja: Gdańsk

Re: 7 segmentowy wyświetlacz

Post autor: pokulan » 14 sty 2014, 17:47

Jeszcze jedna sprawa. Gdzie znajdują się potrzebne piny w Arduino Uno R3 by podłączyć rejestr przesuwany?
Arturr300
Starszy majsterkowicz
Posty: 307
Rejestracja: 16 paź 2013, 17:24

Re: 7 segmentowy wyświetlacz

Post autor: Arturr300 » 15 sty 2014, 17:27

Awatar użytkownika
pokulan
Młodszy majsterkowicz
Posty: 30
Rejestracja: 29 maja 2013, 14:45
Lokalizacja: Gdańsk

Re: 7 segmentowy wyświetlacz

Post autor: pokulan » 16 sty 2014, 15:50

Ok już mam tera będę przenosił na atmega8 i po problemie :P
Awatar użytkownika
pokulan
Młodszy majsterkowicz
Posty: 30
Rejestracja: 29 maja 2013, 14:45
Lokalizacja: Gdańsk

Re: 7 segmentowy wyświetlacz

Post autor: pokulan » 16 sty 2014, 17:03

Ypalając Bootloader na Armega8a wyskakuje mi taki błąd:
avrdude: stk500_program_enable(): protocol error, expect=0x14, resp=0x50
avrdude: initialization failed, rc=-1
Double check connections and try again, or use -F to override
this check.

avrdude: stk500_disable(): protocol error, expect=0x14, resp=0x51
Arturr300
Starszy majsterkowicz
Posty: 307
Rejestracja: 16 paź 2013, 17:24

Re: 7 segmentowy wyświetlacz

Post autor: Arturr300 » 17 sty 2014, 08:18

1. Co wybrałeś w boards?
2. Jaki programator wybrałeś?
3. Na pewno dobrze podłączyłeś?
4. Jak masz kwarc 8 lub 16MHz to go podłącz do nóżek 9 i 10 (mi to ostatnio pomogło, to samo było)
Awatar użytkownika
pokulan
Młodszy majsterkowicz
Posty: 30
Rejestracja: 29 maja 2013, 14:45
Lokalizacja: Gdańsk

Re: 7 segmentowy wyświetlacz

Post autor: pokulan » 17 sty 2014, 19:06

Dobra zaprogramowałem tylko wyświetlacz mi nie działa....
Arturr300
Starszy majsterkowicz
Posty: 307
Rejestracja: 16 paź 2013, 17:24

Re: 7 segmentowy wyświetlacz

Post autor: Arturr300 » 18 sty 2014, 10:46

Wrzuć kod, zdjęcie podłączenia, schemat...
Awatar użytkownika
pokulan
Młodszy majsterkowicz
Posty: 30
Rejestracja: 29 maja 2013, 14:45
Lokalizacja: Gdańsk

Re: 7 segmentowy wyświetlacz

Post autor: pokulan » 18 sty 2014, 17:51

Kod: Zaznacz cały

    int HDD = 9; 
    int potPin = 2;     
    int pot, przerwa, BPM, segment;
    int dioda = 10;
    float BPS;
    const int latchPin = 1; 
    const int dataPin  = 2; 
    const int clockPin = 3; 
    int dp = 11;
    byte data = 0;

    void setup() {
      pinMode(HDD, OUTPUT);
      pinMode(dioda, OUTPUT);
      pinMode(dp, OUTPUT);
      digitalWrite(dp, HIGH);
      pinMode(latchPin, OUTPUT);
      pinMode(clockPin, OUTPUT);
      pinMode(dataPin, OUTPUT);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b0000000);
    }

    void loop() {
     pot = analogRead(potPin);     
      przerwa = map(pot, 0, 1023, 45, 165);
      BPS  = przerwa / 116.0;
      BPM = 60.0/BPS;

      if(BPM >= 100) digitalWrite(dp, LOW);
      else digitalWrite(dp, HIGH);
      HDDtik();
      dziesiatka();
    }

    void HDDtik(){
      digitalWrite(HDD, HIGH);
      digitalWrite(dioda, HIGH);
      delay(przerwa);
      digitalWrite(HDD, LOW);
      digitalWrite(dioda, LOW);
      delay(przerwa);
       digitalWrite(dioda, HIGH);
      delay(przerwa);
      digitalWrite(dioda, LOW);
      delay(przerwa);
       digitalWrite(dioda, HIGH);
      delay(przerwa);
      digitalWrite(dioda, LOW);
      delay(przerwa);
       digitalWrite(dioda, HIGH);
      delay(przerwa);
      digitalWrite(dioda, LOW);
      delay(przerwa);
    }

    void dziesiatka(){
     if(cyfra() == 1) digitalWrite(latchPin, LOW), shiftOut(dataPin, clockPin, MSBFIRST, 0b1011101), digitalWrite(latchPin, HIGH);
     if(cyfra() == 2) digitalWrite(latchPin, LOW), shiftOut(dataPin, clockPin, MSBFIRST, 0b0000011), digitalWrite(latchPin, HIGH);
     if(cyfra() == 3) digitalWrite(latchPin, LOW), shiftOut(dataPin, clockPin, MSBFIRST, 0b0010001), digitalWrite(latchPin, HIGH);
     if(cyfra() == 4) digitalWrite(latchPin, LOW), shiftOut(dataPin, clockPin, MSBFIRST, 0b1011000), digitalWrite(latchPin, HIGH);
     if(cyfra() == 5) digitalWrite(latchPin, LOW), shiftOut(dataPin, clockPin, MSBFIRST, 0b0110000), digitalWrite(latchPin, HIGH);
     if(cyfra() == 6) digitalWrite(latchPin, LOW), shiftOut(dataPin, clockPin, MSBFIRST, 0b0100000), digitalWrite(latchPin, HIGH);
     if(cyfra() == 7) digitalWrite(latchPin, LOW), shiftOut(dataPin, clockPin, MSBFIRST, 0b0011100), digitalWrite(latchPin, HIGH);
     if(cyfra() == 8) digitalWrite(latchPin, LOW), shiftOut(dataPin, clockPin, MSBFIRST, 0b0000000), digitalWrite(latchPin, HIGH);
     if(cyfra() == 9) digitalWrite(latchPin, LOW), shiftOut(dataPin, clockPin, MSBFIRST, 0b0010000), digitalWrite(latchPin, HIGH);
     if(cyfra() == 0) digitalWrite(latchPin, LOW), shiftOut(dataPin, clockPin, MSBFIRST, 0b0000100), digitalWrite(latchPin, HIGH);
     
    }

    int cyfra(){
     if(BPM < 100) segment = BPM / 10;
     else if(BPM >= 100) segment = (BPM / 10) - 10;
      return segment;
    }
      
Schemat jest tu: http://www.sweeting.org/mark/blog/2011/ ... ed-display

Na arduino wyświetla ładnie a na atmedzie albo wyświetla "8" albo byle co.
Arturr300
Starszy majsterkowicz
Posty: 307
Rejestracja: 16 paź 2013, 17:24

Re: 7 segmentowy wyświetlacz

Post autor: Arturr300 » 19 sty 2014, 09:17

Dałeś kwarc?
jakubste
Młodszy majsterkowicz
Posty: 22
Rejestracja: 14 gru 2013, 00:35

Re: 7 segmentowy wyświetlacz

Post autor: jakubste » 28 sty 2014, 20:45

cube pisze:Do rozbicia liczby na cyfry przyda Ci się funkcja modulo. http://szablony.freeware.info.pl/skrypty.html
Operator :)
Ostatnio zmieniony 29 lut 2016, 14:07 przez jakubste, łącznie zmieniany 1 raz.
Awatar użytkownika
pokulan
Młodszy majsterkowicz
Posty: 30
Rejestracja: 29 maja 2013, 14:45
Lokalizacja: Gdańsk

Re: 7 segmentowy wyświetlacz

Post autor: pokulan » 20 lut 2014, 19:42

Arturr300 pisze:Dałeś kwarc?
Odkopuję, nie kwarcu nie dałem.
Arturr300
Starszy majsterkowicz
Posty: 307
Rejestracja: 16 paź 2013, 17:24

Re: 7 segmentowy wyświetlacz

Post autor: Arturr300 » 27 lut 2014, 21:14

No to go daj
ODPOWIEDZ

Strony partnerskie: