Skocz do zawartości
Komentator

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.

Udostępnij ten post


Link to post
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 ?

Udostępnij ten post


Link to post
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

Udostępnij ten post


Link to post
Share on other sites

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.

Udostępnij ten post


Link to post
Share on other sites

O tablicach jest bardzo ładny rozdział tutaj. Zapoznaj się najlepiej z całym kursem - przyda się.

Udostępnij ten post


Link to post
Share on other sites

Przepraszam Treker, pomyliłem się, oczywiście tekstowe znam, chodziło mi o graficzne 😳

Udostępnij ten post


Link to post
Share on other sites

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 🙂

Udostępnij ten post


Link to post
Share on other sites

Jakieś linki do info o graficznych w arduino?😉

Udostępnij ten post


Link to post
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 🙂

Udostępnij ten post


Link to post
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.

Udostępnij ten post


Link to post
Share on other sites

Dzięki chłopaki.

Udostępnij ten post


Link to post
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?

Udostępnij ten post


Link to post
Share on other sites

georgewroc, _kursSprzet

Udostępnij ten post


Link to post
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;
   }
 }
}

Udostępnij ten post


Link to post
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ę »

×