Skocz do zawartości

Kurs Arduino II - #6 - wyświetlacze 7-segmentowe


Pomocna odpowiedź

Witam, mam kolejne pytanie. Czy przy podłączeniu kilku wyświetlaczy 7-segmentowych przez ekspandery PCF8574, da się nimi sterować przy użyciu biblioteki SevSeg lub innej? Podłączyłem wyświetlacze 3-cyfrowe FJ5361BH w ten sposób, że diody są podłączone do wyprowadzeń ekspanderów, a anody są sterowane z pinów w Arduino. Nie wiem, czy takie podłączenie jest zgodne ze sztuką, ale nigdzie nie znalazłem przykładów pokazujących, jak to zrobić. Ręcznie sterować się tym da, ale są pewne dziwne zachowania takiego układu, których nie rozumiem. Kiedy pierwsza cyfra coś wyświetla, to pozostałe cyfry świecą dużo słabiej, kiedy pierwsza jest wyłączona pozostałe dwie świecą normalnie.

 

Link to post
Share on other sites

@szeryf w takim przypadku musisz wykorzystać bibliotekę do wyświetlaczy 7-segmentowych, która potrafi współpracować z wyświetlaczami podłączonymi przez ekspander. Nie każda biblioteka do wyświetlaczy będzie miała taką możliwość 🙂

  • Lubię! 1
Link to post
Share on other sites

Moje rozwiązanie zadania 6.3

#define SEG_C 2
#define SEG_E 3
#define SEG_D 4
#define SEG_B 5
#define SEG_G 6
#define SEG_A 7
#define SEG_F 8
#define W1 9
#define W2 10

void setup() {
  //Konfiguracja pinow jako wyjscia
  pinMode(SEG_A, OUTPUT);
  pinMode(SEG_B, OUTPUT);
  pinMode(SEG_C, OUTPUT);
  pinMode(SEG_D, OUTPUT);
  pinMode(SEG_E, OUTPUT);
  pinMode(SEG_F, OUTPUT);
  pinMode(SEG_G, OUTPUT);

  pinMode (W1, OUTPUT);
  pinMode (W2, OUTPUT);
}

void loop() {
  int i = 0;
  int j;
  int y = 0;
  for (i = 0; i < 100; i++) {
    y = 0;
    do {
      digitalWrite(W1, HIGH); //Włącz pierwszy wyświetlacz
      digitalWrite(W2, LOW); //Wyłącz drugi
      wyswietlacz(i / 10); //Wyswietl wartosc na wyswietlaczu
      delay(10);
      digitalWrite(W1, LOW); //Wyłącz pierwszy wyświetlacz
      digitalWrite(W2, HIGH); //Włącz drugi
      j = i - (i / 10) * 10;
      wyswietlacz(j); //Wyswietl wartosc na wyswietlaczu
      delay(10);
      y++;
    } while (y < 20);
  }
}

void wyswietlacz(int cyfra) {
  //Instrukcja switch ustawia odpowiednie stany na wyjsciach
  //w zaleznosci od podanej cyfry
  switch (cyfra) {
    case 0:
      digitalWrite(SEG_A, HIGH);
      digitalWrite(SEG_B, HIGH);
      digitalWrite(SEG_C, HIGH);
      digitalWrite(SEG_D, HIGH);
      digitalWrite(SEG_E, HIGH);
      digitalWrite(SEG_F, HIGH);
      digitalWrite(SEG_G, LOW);
      break;

    case 1:
      digitalWrite(SEG_A, LOW);
      digitalWrite(SEG_B, HIGH);
      digitalWrite(SEG_C, HIGH);
      digitalWrite(SEG_D, LOW);
      digitalWrite(SEG_E, LOW);
      digitalWrite(SEG_F, LOW);
      digitalWrite(SEG_G, LOW);
      break;

    case 2:
      digitalWrite(SEG_A, HIGH);
      digitalWrite(SEG_B, HIGH);
      digitalWrite(SEG_C, LOW);
      digitalWrite(SEG_D, HIGH);
      digitalWrite(SEG_E, HIGH);
      digitalWrite(SEG_F, LOW);
      digitalWrite(SEG_G, HIGH);
      break;

    case 3:
      digitalWrite(SEG_A, HIGH);
      digitalWrite(SEG_B, HIGH);
      digitalWrite(SEG_C, HIGH);
      digitalWrite(SEG_D, HIGH);
      digitalWrite(SEG_E, LOW);
      digitalWrite(SEG_F, LOW);
      digitalWrite(SEG_G, HIGH);
      break;

    case 4:
      digitalWrite(SEG_A, LOW);
      digitalWrite(SEG_B, HIGH);
      digitalWrite(SEG_C, HIGH);
      digitalWrite(SEG_D, LOW);
      digitalWrite(SEG_E, LOW);
      digitalWrite(SEG_F, HIGH);
      digitalWrite(SEG_G, HIGH);
      break;

    case 5:
      digitalWrite(SEG_A, HIGH);
      digitalWrite(SEG_B, LOW);
      digitalWrite(SEG_C, HIGH);
      digitalWrite(SEG_D, HIGH);
      digitalWrite(SEG_E, LOW);
      digitalWrite(SEG_F, HIGH);
      digitalWrite(SEG_G, HIGH);
      break;

    case 6:
      digitalWrite(SEG_A, HIGH);
      digitalWrite(SEG_B, LOW);
      digitalWrite(SEG_C, HIGH);
      digitalWrite(SEG_D, HIGH);
      digitalWrite(SEG_E, HIGH);
      digitalWrite(SEG_F, HIGH);
      digitalWrite(SEG_G, HIGH);
      break;

    case 7:
      digitalWrite(SEG_A, HIGH);
      digitalWrite(SEG_B, HIGH);
      digitalWrite(SEG_C, HIGH);
      digitalWrite(SEG_D, LOW);
      digitalWrite(SEG_E, LOW);
      digitalWrite(SEG_F, LOW);
      digitalWrite(SEG_G, LOW);
      break;

    case 8:
      digitalWrite(SEG_A, HIGH);
      digitalWrite(SEG_B, HIGH);
      digitalWrite(SEG_C, HIGH);
      digitalWrite(SEG_D, HIGH);
      digitalWrite(SEG_E, HIGH);
      digitalWrite(SEG_F, HIGH);
      digitalWrite(SEG_G, HIGH);
      break;

    case 9:
      digitalWrite(SEG_A, HIGH);
      digitalWrite(SEG_B, HIGH);
      digitalWrite(SEG_C, HIGH);
      digitalWrite(SEG_D, HIGH);
      digitalWrite(SEG_E, LOW);
      digitalWrite(SEG_F, HIGH);
      digitalWrite(SEG_G, HIGH);
      break;

    default:
      digitalWrite(SEG_A, HIGH);
      digitalWrite(SEG_B, LOW);
      digitalWrite(SEG_C, LOW);
      digitalWrite(SEG_D, HIGH);
      digitalWrite(SEG_E, LOW);
      digitalWrite(SEG_F, LOW);
      digitalWrite(SEG_G, HIGH);

      break;
  }
}

 

Sugestie mile widziane.

  • Lubię! 1
Link to post
Share on other sites

@galism Ciekawy sposób rozwiązania zadania 🙂 a mógłbyś w ramach zadania z gwiazdką 🌟spróbować pozbyć się tego opóźnienia i pętli o 20 iteracjach ze zmienną y? Z tego co rozumiem służy ona zapewnieniu opóźnienia bez zacinania programu i tu zgodzę się dobra idea! 🙂 Ale jakby tak zrobić, że program odświeża wyświetlacz z zadaną częstotliwością? Coś jak FPS w grach. Spróbuj 😉 

Link to post
Share on other sites
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Ja mam pytanie trochę z innej beczki, techniczne. Jak dobrze rozumiem podstawy elektroniki, a nie twierdzę, że dobrze rozumiem 🙂 to nie ma różnicy w którym miejscu w obwodzie podłączymy rezystor (w sensie oczywiście czy do np. anody czy katody diody). Poprawcie mnie jeśli się mylę, ale nie zrobi to jej (diodzie) różnicy.

Czy w przypadku takiego wyświetlacza 7-segmentowego, jeżeli mam 1 wspólną katodę, to czy nie mogę podłączyć tylko 1 rezystora do niej zamiast 7 rezystorów do anod?

Link to post
Share on other sites
1 godzinę temu, Shary napisał:

Czy w przypadku takiego wyświetlacza 7-segmentowego, jeżeli mam 1 wspólną katodę, to czy nie mogę podłączyć tylko 1 rezystora do niej zamiast 7 rezystorów do anod?

Hej! Zadałem niedawno dokładnie takie samo pytanie 🙂 Możesz rzucić okiem:

 

  • Lubię! 2
Link to post
Share on other sites
(edytowany)

Dzięki, dokładnie o to mi chodziło - a nie mogłem znaleźć potwierdzenia mojej teorii. Muszę sobie sam poeksperymentować z takimi wyświetlaczami bo nie mam doświadczenia z tym. Czyli tak jak myślałem, można bo to logiczne, ale im więcej segmentów zaświecisz tym większy problem. Co będzie skutkować nierównym podświetleniem.

Edytowano przez Shary
Link to post
Share on other sites
Dnia 31.08.2017 o 15:52, Radosław napisał:

Moje rozwiązanie zadania 6.3 :


#define seg_a 7    //Opis
#define seg_b 5    //segmentów
#define seg_c 2    // i
#define seg_d 4    // ich
#define seg_e 3    //pinów
#define seg_f 6
#define seg_g 8
#define wys_jed 9       // piny do
#define wys_dwa 10    // wyświetlaczy
void setup() {

  pinMode(seg_a,OUTPUT);
  pinMode(seg_b,OUTPUT);
  pinMode(seg_c,OUTPUT);
  pinMode(seg_d,OUTPUT);
  pinMode(seg_e,OUTPUT);
  pinMode(seg_f,OUTPUT);
  pinMode(seg_g,OUTPUT);
  pinMode(wys_jed,OUTPUT);
  pinMode(wys_dwa,OUTPUT);
}

void loop() {

 for(int j=0;j<10;j++)  //Pętla do zmiany pierwszej cyfry
 {
 for ( int i=0;i<10;i++){  //Pętla do zmiany drugiej cyfry
  for(int k=0; k<30; k++){  //Pętla do ustawiania szybkości licznika
 digitalWrite(wys_jed,HIGH);  //Włączamy 1. wyświetlacz
 digitalWrite(wys_dwa,LOW);  //Włączamy 2. wyświetlacz
 showTheNumber(j);            //Funkcja dobierająca odopwiednią cyfrę ( kod poniżej )
 delay(5);
 digitalWrite(wys_dwa,HIGH);  //Włączamy 2. wyświetlacz
 digitalWrite(wys_jed,LOW);  //Wyłączamy 1. wyświetlacz
 showTheNumber(i); 
 delay(5);
  }
 }
 }
}
void showTheNumber(byte number){
switch(number){
  case 0:
  digitalWrite(seg_a,HIGH);
  digitalWrite(seg_b,HIGH);
  digitalWrite(seg_c,HIGH);
  digitalWrite(seg_d,HIGH);
  digitalWrite(seg_e,HIGH);
  digitalWrite(seg_f,HIGH);
  digitalWrite(seg_g,LOW);
  break;
 case 1: 
  digitalWrite(seg_a,LOW);
  digitalWrite(seg_b,HIGH);
  digitalWrite(seg_c,HIGH);
  digitalWrite(seg_d,LOW);
  digitalWrite(seg_e,LOW);
  digitalWrite(seg_f,LOW);
  digitalWrite(seg_g,LOW);
 break;

 case 2:
  digitalWrite(seg_a,HIGH);
  digitalWrite(seg_b,HIGH);
  digitalWrite(seg_c,LOW);
  digitalWrite(seg_d,HIGH);
  digitalWrite(seg_e,HIGH);
  digitalWrite(seg_f,LOW);
  digitalWrite(seg_g,HIGH);
  break;

 case 3:
  digitalWrite(seg_a,HIGH);
  digitalWrite(seg_b,HIGH);
  digitalWrite(seg_c,HIGH);
  digitalWrite(seg_d,HIGH);
  digitalWrite(seg_e,LOW);
  digitalWrite(seg_f,LOW);
  digitalWrite(seg_g,HIGH);
  break;

 case 4:
  digitalWrite(seg_a,LOW);
  digitalWrite(seg_b,HIGH);
  digitalWrite(seg_c,HIGH);
  digitalWrite(seg_d,LOW);
  digitalWrite(seg_e,LOW);
  digitalWrite(seg_f,HIGH);
  digitalWrite(seg_g,HIGH);
  break;
 case 5:
  digitalWrite(seg_a,HIGH);
  digitalWrite(seg_b,LOW);
  digitalWrite(seg_c,HIGH);
  digitalWrite(seg_d,HIGH);
  digitalWrite(seg_e,LOW);
  digitalWrite(seg_f,HIGH);
  digitalWrite(seg_g,HIGH);
  break;

 case 6:
  digitalWrite(seg_a,HIGH);
  digitalWrite(seg_b,LOW);
  digitalWrite(seg_c,HIGH);
  digitalWrite(seg_d,HIGH);
  digitalWrite(seg_e,HIGH);
  digitalWrite(seg_f,HIGH);
  digitalWrite(seg_g,HIGH);
  break;

 case 7:
  digitalWrite(seg_a,HIGH);
  digitalWrite(seg_b,HIGH);
  digitalWrite(seg_c,HIGH);
  digitalWrite(seg_d,LOW);
  digitalWrite(seg_e,LOW);
  digitalWrite(seg_f,LOW);
  digitalWrite(seg_g,LOW);
  break;

  case 8:
  digitalWrite(seg_a,HIGH);
  digitalWrite(seg_b,HIGH);
  digitalWrite(seg_c,HIGH);
  digitalWrite(seg_d,HIGH);
  digitalWrite(seg_e,HIGH);
  digitalWrite(seg_f,HIGH);
  digitalWrite(seg_g,HIGH);
  break;
  case 9:
  digitalWrite(seg_a,HIGH);
  digitalWrite(seg_b,HIGH);
  digitalWrite(seg_c,HIGH);
  digitalWrite(seg_d,HIGH);
  digitalWrite(seg_e,LOW);
  digitalWrite(seg_f,HIGH);
  digitalWrite(seg_g,HIGH);
  break;
  default:
  digitalWrite(seg_a,HIGH);
  digitalWrite(seg_b,LOW);
  digitalWrite(seg_c,LOW);
  digitalWrite(seg_d,HIGH);
  digitalWrite(seg_e,LOW);
  digitalWrite(seg_f,LOW);
  digitalWrite(seg_g,HIGH);
  break;
}
}
 

Witam, czy ktoś mógłby wytłumaczyć tak po chłopsku dlaczego i jak działa 'kaskada' 3 pętli for w powyższym kodzie? Nie mogę rozgryźć jak to się dzieje, że cyfra dziesiątek zmienia się dopiero kiedy jedności doliczą do 9. Proszę o wyjaśnienie w 'zwolnionym tempie' 😉 w swoim układzie zastosowałem wyświetlacz 4 cyfrowy i rozbudowałem ową 'kaskadę' o 2 kolejne stopnie. Licznik działa pięknie i odlicza do 9999 ale chciałbym wiedzieć na jakiej zasadzie. Pozdrawiam.

Link to post
Share on other sites

@Vuko najlepiej wyobraź sobie jak zmienia się zmienna służąca do iteracji w każdej z pętli. Np j zmienia się najrzadziej bo musi poczekać aż i się doliczy do końca i k doliczy do końca czyli czeka aż 300 kolejek. Więc jeżeli i jest związane z jednościami a j (ta zewnętrzna pętla) z dziesiątkami to ta zewnętrzna (dziesiątki) czeka aż ta wewnętrzna (jedności) doliczy od 0 do 9.

Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.