Skocz do zawartości

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


Pomocna odpowiedź

Zadanie 6.3

#define segC 2
#define segE 3
#define segD 4
#define segB 5
#define segG 6
#define segA 7
#define segF 8

#define wys1 10 //wyjścia wyświetlaczy
#define wys2 9

int i = 0; //jedynki
int j = 0; //dziesiatki

void setup() {
  pinMode (segA, OUTPUT);
  pinMode (segB, OUTPUT);
  pinMode (segC, OUTPUT);
  pinMode (segD, OUTPUT);
  pinMode (segE, OUTPUT);
  pinMode (segF, OUTPUT);
  pinMode (segG, OUTPUT);

  pinMode(wys1, OUTPUT);
  pinMode(wys2, OUTPUT);
}

void loop() {
  for (j = 0; j < 10; j++) { //pętla dodająca dziesiątki
    for (i = 0; i < 10; i++) { //pętla dodająca cyfry 
      projekcja(); //funkcja odpowiadająca za multipleksowanie
    }
  }
}

void wyswietlacz(int cyfra) {
  switch (cyfra) {
    case 0:
      digitalWrite(segA, HIGH);
      digitalWrite(segB, HIGH);
      digitalWrite(segC, HIGH);
      digitalWrite(segD, HIGH);
      digitalWrite(segE, HIGH);
      digitalWrite(segF, HIGH);
      digitalWrite(segG, LOW);
    break;     
    case 1:
      digitalWrite(segA, LOW);
      digitalWrite(segB, HIGH);
      digitalWrite(segC, HIGH);
      digitalWrite(segD, LOW);
      digitalWrite(segE, LOW);
      digitalWrite(segF, LOW);
      digitalWrite(segG, LOW);
    break;   
    case 2:
      digitalWrite(segA, HIGH);
      digitalWrite(segB, HIGH);
      digitalWrite(segC, LOW);
      digitalWrite(segD, HIGH);
      digitalWrite(segE, HIGH);
      digitalWrite(segF, LOW);
      digitalWrite(segG, HIGH);
    break;    
    case 3:
      digitalWrite(segA, HIGH);
      digitalWrite(segB, HIGH);
      digitalWrite(segC, HIGH);
      digitalWrite(segD, HIGH);
      digitalWrite(segE, LOW);
      digitalWrite(segF, LOW);
      digitalWrite(segG, HIGH);
    break;  
    case 4:
      digitalWrite(segA, LOW);
      digitalWrite(segB, HIGH);
      digitalWrite(segC, HIGH);
      digitalWrite(segD, LOW);
      digitalWrite(segE, LOW);
      digitalWrite(segF, HIGH);
      digitalWrite(segG, HIGH);
    break;  
    case 5:
      digitalWrite(segA, HIGH);
      digitalWrite(segB, LOW);
      digitalWrite(segC, HIGH);
      digitalWrite(segD, HIGH);
      digitalWrite(segE, LOW);
      digitalWrite(segF, HIGH);
      digitalWrite(segG, HIGH);
    break;  
    case 6:
      digitalWrite(segA, HIGH);
      digitalWrite(segB, LOW);
      digitalWrite(segC, HIGH);
      digitalWrite(segD, HIGH);
      digitalWrite(segE, HIGH);
      digitalWrite(segF, HIGH);
      digitalWrite(segG, HIGH);
    break;  
    case 7:
      digitalWrite(segA, HIGH);
      digitalWrite(segB, HIGH);
      digitalWrite(segC, HIGH);
      digitalWrite(segD, LOW);
      digitalWrite(segE, LOW);
      digitalWrite(segF, LOW);
      digitalWrite(segG, LOW);
    break;  
    case 8:
      digitalWrite(segA, HIGH);
      digitalWrite(segB, HIGH);
      digitalWrite(segC, HIGH);
      digitalWrite(segD, HIGH);
      digitalWrite(segE, HIGH);
      digitalWrite(segF, HIGH);
      digitalWrite(segG, HIGH);
    break;  
    case 9:
      digitalWrite(segA, HIGH);
      digitalWrite(segB, HIGH);
      digitalWrite(segC, HIGH);
      digitalWrite(segD, HIGH);
      digitalWrite(segE, LOW);
      digitalWrite(segF, HIGH);
      digitalWrite(segG, HIGH);
    break;  
  
  }
}

void projekcja() { //funkcja multipleksowania i regulacji czasu
  for (int k = 0; k < 5; k++) {
    digitalWrite(wys1, HIGH);
    digitalWrite(wys2, LOW);
    wyswietlacz(j);
    delay(10);
    digitalWrite(wys1, LOW);
    digitalWrite(wys2, HIGH);
    wyswietlacz(i);
    delay(10); 
  }  
}

 

  • Lubię! 1
Link do komentarza
Share on other sites

Tutaj mam zadanie 6.1 oraz 6.2 w jednym 😛

 

#define SEG_C 2
#define SEG_E 3
#define SEG_D 4
#define SEG_B 5
#define SEG_G 8
#define SEG_A 7
#define SEG_F 6
#define BUTTON_INCREMENT 9
#define BUTTON_DECREMENT 10
#define BUTTON_RESET 11

int passNumber = 0;

void setup() {
  //Konfiguracja pinów jako wyjścia

  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(BUTTON_INCREMENT, INPUT_PULLUP);
  pinMode(BUTTON_DECREMENT, INPUT_PULLUP);
  pinMode(BUTTON_RESET, INPUT_PULLUP);

  // Test segmentów

  digitalWrite(SEG_A, HIGH);
  delay(800);
  digitalWrite(SEG_B, HIGH);
  delay(800);
  digitalWrite(SEG_C, HIGH);
  delay(800);
  digitalWrite(SEG_D, HIGH);
  delay(800);
  digitalWrite(SEG_E, HIGH);
  delay(800);
  digitalWrite(SEG_F, HIGH);
  delay(800);
  digitalWrite(SEG_G, HIGH);
  delay(800);

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


}

void loop() {
  if (digitalRead(BUTTON_INCREMENT) == LOW) {
    passNumber++;
    displayDigit(passNumber);
  } else if(digitalRead(BUTTON_DECREMENT) == LOW) {
    passNumber--;
    displayDigit(passNumber);
  } else if(digitalRead(BUTTON_RESET) == LOW) {
    passNumber = 0;
    displayDigit(passNumber);
  }

delay(200);

}


void displayDigit(int digit){
  switch (digit){

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);
  }
}

Tutaj link. Jakby wygasł to dajcie znać to wrzucę znowu 😛

https://streamable.com/gyvt8b

  • Lubię! 2
Link do komentarza
Share on other sites

Cześć, wprawdzie ja kurs arduino już jakiś czas temu przerobiłem, ale wróciłem przypomnieć sobie (na potrzeby projektu) na czym polegały te wyświetlacze 7-segmentowe. I natrafiłem na to (załącznik): 
image.thumb.png.bad247cc3d210290cd8563ad36b8bdbb.png 
Co autor miał na myśli sugerując iż "katoda" może pobrać więcej jak 20mA i że to jakoś może zaszkodzić arduino. Wspólna katoda zakładając ze każdy pin wyświetlacza 7segmentowego wydaje z arduino max 20mA (przez rezystor ofc) pobiera (7x20) 140mA. No ale to katoda, która idzie do masy GND, więc jakie istnieje ryzyko? Piny arduino ciągną tyle ile mają dozwolone (max 20mA), a masa chyba może przyjąć na siebie 140mA (no chyba, że nie może to proszę mnie poprawić)

Link do komentarza
Share on other sites

Generalnie w swoich rozważaniach masz rację, ale nie bierzesz pod uwagę, że w przypadku wyświetlacza złożonego z kilku cyfr i ich multipleksowanego sterowania, ktoś mógłby mieć ochotę podłączyć bezpośrednio do Arduino katodę, by wysterować daną cyfrę.

A wtedy te zastrzeżenie ma sens.

Link do komentarza
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

Hej.

Zadanie domowe 6.3 .

Jak zrobić by cyfry jednostek dłużej się świeciły? O ile dziesiątki sa ok to jednostki tak szybko sie zmieniają ze nie idzie zobaczyć praktycznie żadnej cyfry.

Czy tu by zadziałało to słynne milis którego nie ma w kursie?  Jest jakiś prosty sposób? np.
więcej powtórzeń pętli for dla wyświetlacza z jednostkami. Próbuje ale to nie działa..

#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 WYSW_1 9
#define WYSW_2 10

int q = 0; // dziesiatki
int r = 0; // jednostki
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(WYSW_1, OUTPUT);
  pinMode(WYSW_2, OUTPUT);  
}

void loop() {

for ( q = 0; q < 10; q++) { //petla dla dziesiatek
for ( r = 0; r < 10; r++ ){ // petla dla jednostek

wyswietlanie(); // funkcja wyswietlajaca cyfry

}
}}
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;
  }
}

void wyswietlanie(){ // funkcja okreslajaca wyswietlanie liczb
  for (int w = 0; w < 3; w++)
  digitalWrite(WYSW_1, HIGH);
    digitalWrite(WYSW_2, LOW);
    wyswietlacz(q);
    delay(10);
    digitalWrite(WYSW_1, LOW);
    digitalWrite(WYSW_2, HIGH);
    wyswietlacz(r);
    delay(10); 
}

 

Link do komentarza
Share on other sites

Nie można spowolnić samych jednostek, a dziesiątek nie, bo wtedy wyświetlacz będzie pokazywał nieprawdę. Trzeba spowolnić cały proces liczenia.

Można to zrobić przy pomocy millis(), ale w tym przypadku najprościej wstawić delay(200); gdzieś w pętli loop().

Link do komentarza
Share on other sites

Musisz więc zróżnicować tempo wyświetlania i zliczania: licznik powinien pracować w miarę wolno, aby było widać zmiany jego zawartości, zaś odświeżanie cyfr szybko by bezwładność oka wytłumiła migotanie.

  • Lubię! 1
Link do komentarza
Share on other sites

(edytowany)

Żeby całkiem nie burzyć Twojej koncepcji - dodaj jeszcze jeden stopień zliczania (jakby następną cyfrę}. Potraktuj nowe dziesiątki jako jednostki, a nowych jednostek nie wyświetlaj. Twój licznik będzie chodził 10 razy wolniej.

Edytowano przez jand
  • Lubię! 1
  • Pomogłeś! 1
Link do komentarza
Share on other sites

Zamiast for można równie prosto użyć if oraz 

Dnia 10.02.2025 o 14:37, PanMajster napisał:

Jak zrobić by cyfry jednostek dłużej się świeciły? O ile dziesiątki sa ok to jednostki tak szybko sie zmieniają ze nie idzie zobaczyć praktycznie żadnej cyfry.

Prędkość wyświetlania liczb jest ustawiana przy pomocy funkcji 

void wyswietlanie(){ // funkcja okreslajaca wyswietlanie liczb
  for (int w = 0; w < 3; w++)
  digitalWrite(WYSW_1, HIGH);
    digitalWrite(WYSW_2, LOW);
    wyswietlacz(q);
    delay(10);
    digitalWrite(WYSW_1, LOW);
    digitalWrite(WYSW_2, HIGH);
    wyswietlacz(r);
    delay(10); 

U ciebie w < 3. Zwiększ wartość w np. w < 10 i będziesz miał wolne zmiany. Jeśli ustawisz w < 100 zmiany będą jeszcze bardziej wolne.

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • 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.