Skocz do zawartości

Problem z zadeklarowaniem zmiennej w wyświetlaczu 7 segmentowym


Pomocna odpowiedź

Napisano

Witam

Zaznaczę, że dopiero zaczynam swoją przygodę z arduino i to jeszcze na potrzeby modelu który drukuję w 3d.

Przejrzałem już masę tutoriali i bez problemu jestem w stanie obsłużyć 7 segmentowy wyświetlacz LED.

Problem w tym że wszędzie kody takie są dość długie lub korzystają z gotowych bibliotek czego na początku nauki chcę uniknąć.

Chciałbym jak najprościej zdefiniować zmienną "jeden", która zapala blok B i C, potem dwa itd.

Oczywiście mogę to robić dla każdej cyfry po kolei (jak na tutorialu forbot). Ale chciałbym się dowiedzieć jak na początku zdefiniować wszystkie cyfry od 0 d 9 i później wywoływać je poleceniem

digitalWrite(jeden); itd.

Chodzi mi o jak najprostszy sposób gdyż uczę się po kolei. Udało mi się co prawda znaleźć taki skrypt wykorzystujący tabelę ale na początek jest to troszkę trudnę.

Będę wdzięczny za pomoc i wyrozumiałość

Pozdrawiam

Arkadiusz Pawlak

@chester7vip witam na forum 🙂 Jeśli nie chcesz korzystać z gotowych bibliotek to możesz: albo stworzyć własną funkcję z switch-case, w której wysterujesz odpowiednie wyprowadzenia lub możesz te informacje trzymać w tablicy. Na początek, najłatwiej będzie pewnie zrobić Ci to właśnie za pomocą instrukcji sterującej switch 🙂 

Dnia 22.07.2025 o 09:46, chester7vip napisał:

digitalWrite(jeden)

Tak tego nie zrobisz, ponieważ digitalWrite() ustawia stan tylko na jednym gpio. Pozostaje  wywołać w pętli digitalWrite() wiele razy dla różnych gpio albo wpisać w kod na sztywno. Jest jeszcze "rejestr portów", dzięki któremu możesz ustawić stan kilku gpio naraz (chyba najszybszy sposób), ale to już podstawy nie są.

Oczywiście mogę skorzystać z biblioteki ale jestem jedną z tych osób, która będzie siedziała tydzień czasu i próbowała to zrobić. No i w końcu się udało. Wystarczyło stworzyć nową funkcję dla każdej cyfry, którą teraz mogę wywołać wpisując jeden, dwa itp

 

#define A 0
#define B 1
#define C 2
#define D 3
#define E 4
#define F 5
#define G 6
void setup() {
  //Konfiguracja pinow jako wyjscia
  pinMode(A, OUTPUT);
  pinMode(B, OUTPUT);
  pinMode(C, OUTPUT);
  pinMode(D, OUTPUT);
  pinMode(E, OUTPUT);
  pinMode(F, OUTPUT);
  pinMode(G, OUTPUT);
  //Test segmentow
  digitalWrite(A, HIGH);
  delay(800);
  digitalWrite(B, HIGH);
  delay(800);
  digitalWrite(C, HIGH);
  delay(800);
  digitalWrite(D, HIGH);
  delay(800);
  digitalWrite(E, HIGH);
  delay(800);
  digitalWrite(F, HIGH);
  delay(800);
  digitalWrite(G, HIGH);
  delay(800);
  
 digitalWrite(A, LOW);//czyszczczenie
 digitalWrite(B, LOW);
 digitalWrite(C, LOW);
 digitalWrite(D, LOW);
 digitalWrite(E, LOW);
 digitalWrite(F, LOW);
 digitalWrite(G, LOW);
  
 
}
void loop() {
  
jeden();
  dwa ();
     
}

 
  void jeden (){
  
  digitalWrite(B, HIGH);
  digitalWrite(C, HIGH);
  delay(800);
  }
    

Bardzo dziękuje za pomoc. Wiem, że to amatorskie rozwiązanie ale osiągnąłem co chciałem. Na pewno jeszcze nie raz zgłoszę się z problemem ponieważ projekt który tworze musi obsługiwać moduł mp3, głośniki i jeszcze kilka. 

@chester7vip kolega dobrze gada. Poza tym funkcję czyszczenia możesz wywołać przed wyświetleniem cyfry a nie po.

Rozumiem że to początki i fajnie jest zrobić coś od zera nie korzystając z bibliotek czy przykładów... ale słuchaj starszych. Oszczędzi to późniejszych rozczarowań.

1 godzinę temu, chester7vip napisał:

Oczywiście mogę skorzystać z biblioteki 

I tak powinieneś zrobić...oczywiście ucz się całej składni języka na tip top, ale korzystaj również z gotowych bibliotek bo to bardzo przyspiesza pracę, nie musisz wtedy od nowa tworzyć koła i czytać miesiąc dokumentację do wyświetlacza którego być może użyjesz raz, lub dwa razy w roku... 

 

(edytowany)

@farmaceuta w tym konkretnym przypadku raczej bym się nie zgodził. Sterowanie 7seg to świetny przykład nauki programowania - od takich funkcji jak "wyświetl jeden", poprzez tablice aż do izolacji funkcji (separacja poziomów abstrakcji).

W necie jest mnóstwo przykładów na "wyświetlacz biegów w motocyklu". Wszystkie działają, ale warto spojrzeć jak zrobione jest wyświetlanie.

Edytowano przez ethanak
  • Lubię! 1
(edytowany)

@chester7vip, a tak ogólnie, czemu nie chcesz używać gotowej funkcji z kursu, tj. "void wyswietlacz(int cyfra)"? Kopiujesz do swojego projektu, dajesz cyfrę jako argument i cacy. A jak działa - sam widzisz - gasi tylko nieużywane segmenty dla danej cyfry, a nie wszystkie, "oszczędza" wywołania digitalWrite().

Wyobraź sobie, że w pętli masz wyświetlić losowe cyfry. Wywołanie funkcji "wyswietlacz(losowa_cyfra)" sprawdzi się bez problemu, a np. jeden(), dwa(), itd., nie bardzo (i tak będziesz musiał sprawdzić warunek). Programując, zawsze próbuj znaleźć element wspólny dla danego działania, który opakujesz sobie w uniwersalną funkcję. Piszę ci to jako amator, nie żaden znawca, ale sprawdza się.

Edytowano przez orb777
  • Lubię! 1

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