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
  • 3 miesiące później...

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
  • 4 miesiące później...

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ć)

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.

  • 1 miesiąc później...
  • 4 tygodnie później...
  • 1 miesiąc później...

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

 

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().

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
(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

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.

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...