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.

#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 ?

  • 3 tygodnie później...

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

Witam, może już wiadomo kiedy "aktualizacja kursu arduino" i coś o tablicach?

Czy będzie też coś o wyświetlaczach tekstowych? Albo podajcie jakiś fajny link na ten temat...

Thx.

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 🙂

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 🙂

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

  • 2 miesiące później...

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?

  • 2 tygodnie później...
  • 2 tygodnie później...

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

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