Skocz do zawartości

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


Pomocna odpowiedź

marek1707, ja tylko dodam dla "usprawiedliwienia", że właściwie w kursie Arduino nigdzie tablice się nie pojawiły... Wiem mój błąd 😉 Nadrobię to za jakiś czas przy odświeżaniu kursu Arduino (poziom I) dodam tam informację o tablicach w praktyce.

Link do komentarza
Share on other sites

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

}
int k=0;                                                       //Z mienna potrzeba do poruszania się po kolumnach tablicy "stany"
byte segmenty[7]={seg_a,seg_b,seg_c,seg_d,seg_e,seg_f,seg_g};  // Tablica przechowująca piny Arduino od poszczególnych segmentów
int stany[10][7]={{HIGH,HIGH,HIGH,HIGH,HIGH,HIGH,LOW},        
                 {LOW,HIGH,HIGH,LOW,LOW,LOW,LOW},             // Tablica dwuwymiarowa, która
                 {HIGH,HIGH,LOW,HIGH,HIGH,LOW,HIGH},          // przechowuje stany segmentów
                 {HIGH,HIGH,HIGH,HIGH,LOW,LOW,HIGH},          // dla kolejnych cyfr
                 {LOW,HIGH,HIGH,LOW,LOW,HIGH,HIGH},
                 {HIGH,LOW,HIGH,HIGH,LOW,HIGH,HIGH},
                 {HIGH,LOW,HIGH,HIGH,HIGH,HIGH,HIGH},
                 {HIGH,HIGH,HIGH,LOW,LOW,LOW,LOW},
                 {HIGH,HIGH,HIGH,HIGH,HIGH,HIGH,HIGH},
                 {HIGH,HIGH,HIGH,HIGH,LOW,HIGH,HIGH}};

void loop() {

 for(int i=0;i<10;i++){                  // Pętla do zmiany cyfry dziesiątek
   for ( int j=0;j<10;j++){              // Pętla do zmiany cyfry jedności
     for( int k=0;k<10;k++){            // Pętla do zmiany czasu trwania odliczania
 digitalWrite(wys_jed,HIGH);            // Włączenie wyświetlacza numer 1
 digitalWrite(wys_dwa,LOW);              // Wyłączenie wyświetlacza numer 2
 showTheNumber(i);                     // Funkcja do wybierania odpowiedniej cyfry
 delay(5);
 digitalWrite(wys_jed,LOW);            
 digitalWrite(wys_dwa,HIGH);
 showTheNumber(j);
 delay(5);
     }
   }
}
}

void showTheNumber(byte number){                    
 for ( int i=0; i<7; i++){                      // Pętla do poruszania się po kolejnych segmentach
 digitalWrite(segmenty[i],stany[number][k]);    // Załączanie segmentów w zależności od cyfry, która ma być wyświetlona  
 k++;
 if(k==7) k=0;                                  // Jeżeli cyfra została wyświetlona to idziemy do następnej
 }
}

Hej marek 1707, dzięki za komentarz. Czy chodziło Ci o coś takiego ?

Link do komentarza
Share on other sites

Witam,

Mój kod do zadania 6.2

#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 PRZYCISK1 9
#define PRZYCISK2 10
#define PRZYCISK3 11

int i = 0;

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(PRZYCISK1, INPUT_PULLUP);
 pinMode(PRZYCISK2, INPUT_PULLUP);
 pinMode(PRZYCISK3, INPUT_PULLUP);
}

void loop() {

 wyswietlacz(i); //Wyswietl wartosc na wyswietlaczu

 if (digitalRead(PRZYCISK1) == LOW){ //przycisk + 
   i++;
   wyswietlacz(i); //Wyswietl wartosc na wyswietlaczu
   delay(500);
   }
 if(digitalRead(PRZYCISK2) == LOW) { //przycisk - 
   i--;
   wyswietlacz(i); //Wyswietl wartosc na wyswietlaczu
   delay(500);
 }
 if(digitalRead(PRZYCISK3) == LOW) { //reset 
   i = 0;
   wyswietlacz(i);
   delay(500);
 }
}

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;

   case 10: //wyswietl blad gdy wartosc przekroczy 10
       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;      
 }
}
  • Lubię! 1
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

SOYER, na ten moment nie ma jak poruszyć tego tematu, bo zestawu do kursów Arduino nie zawierają wyświetlaczy graficznych. Pracujemy jednak nad nowymi modułami np. do robota. Tam pojawi się wyświetlacz graficzny, więc będziemy przy okazji zajmować się również tym tematem 🙂

Link do komentarza
Share on other sites

SOYER, wszystko zależy od sterownika wbudowanego w konkretny wyświetlacz. Najlepiej będzie jak znajdziesz wyświetlacz, który Cie interesuje i później poszukasz bibliotek pod konkretny sterownik 🙂

Link do komentarza
Share on other sites

@Treker: bez przesady - biblioteki do konkretnych sterowników nie są pisane od zera, tylko bazują na jakiejś ogólnej klasie graficznej, dodając tylko konkretne implementacje prymitywów. I warto zapoznać się z taką klasą choćby po to, aby później nie mylić biblioteki grafiki z taką właśnie implementacją.

@SOYER: Zerknij na https://learn.adafruit.com/adafruit-gfx-graphics-library.

Link do komentarza
Share on other sites

Prośba o podpowiedź:

Mały projekt termometru cyfrowego (Arduino Leonardo- 3x wyświetlacz 7-segmentowy, multiplexowanie.

Chciałbym aby na trzecim polu migała kropka by było widać, że termometr żyje (program np nie zawiesił się).

W tej chwili dział mi tak, że temperatura pobierana jest (DS18B20) co 1sek. Multiplexowanie wyświetlania poprzez przerwanie Timer1 (biblioteka TimerOne) co 5ms.

Kropka miga co 1sek w takcie pobierania i odświeżania danych z czujnika temperatury.

Jak zrobić by np. dane z czujnika pobierać co 5sek a miganie kropką co 1sek?

Link do komentarza
Share on other sites

Zadanie 6.3

nie dodałem funkcji cyfry(); w komentarzu bo to jest switch case odpowiedzialny za liczby i zajmuje dużo miejsca, chciałem tą funkcje zrobić w postaci tablicy niestety nie potrafię

byte liczba = 0;
byte a = 0;
byte b = 0;

unsigned long czasReal = 0;
unsigned long czasPobrany = 0;
unsigned long czasDelay = 0;



#define wyswietlacz1 4
#define wyswietlacz2 5

void setup() {
 pinMode(6, OUTPUT);
 pinMode(7, OUTPUT);
 pinMode(8, OUTPUT);
 pinMode(9, OUTPUT);
 pinMode(10, OUTPUT);
 pinMode(11, OUTPUT);
 pinMode(12, OUTPUT);

 pinMode(wyswietlacz1, OUTPUT);
 pinMode(wyswietlacz2, OUTPUT);

}

void loop() {

 czasReal = millis();
 czasDelay = millis();

 if (czasReal - czasPobrany > 300) { //zmiana wartości na wyswietlaczu nr 2
   a++;
   czasPobrany = czasReal;
 }

 digitalWrite(wyswietlacz1, HIGH);
 digitalWrite(wyswietlacz2, LOW);

 cyfry(a);

 while (czasDelay - czasReal  < 5UL) { //zatrzymanie w While na 5ms jako delay
   czasDelay = millis();
 }


 czasReal = millis();
 digitalWrite(wyswietlacz1, LOW);
 digitalWrite(wyswietlacz2, HIGH);

 cyfry(b);

 while (czasDelay - czasReal   < 5UL) { //zatrzymanie w While na 5ms jako delay
   czasDelay = millis();
 }


 if (a > 9) {      //zmiana warosci na wyswietlaczu 2

   b++;              //dodanie wartosci na wyswietlaczu 1
   a = 0;            //wyzerowanie wyswietlacza nr 2 po wartsci 9
   if (b == 9) {     //wyzerowanie wyswietlacza nr 1 po wartsci 9
     b = 0;
   }
 }
}
Link do komentarza
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.