Skocz do zawartości
Komentator

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

Pomocna odpowiedź

html_mig_img
Najczęściej w projektach bazujących na Arduino używane są wyświetlacze tekstowe, stosunkowo rzadko pojawiają się LCD graficzne.Zaskakująco dużo osób zapomina o trzeciej opcji, czyli o wyświetlaczach 7-segmentowych. Za ich pomocą możliwe jest prezentowanie stosunkowo prostych informacji. Na pewno każdy kojarzy je z zegarów cyfrowych lub multimetrów.

UWAGA, to tylko wstęp! Dalsza część artykułu dostępna jest na blogu.

Przeczytaj całość »

Poniżej znajdują się komentarze powiązane z tym wpisem.

Udostępnij ten post


Link to post
Share on other sites

Moja interpretacja zadania 6.1

#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

String odebraneDane = ""; //Pusty ciąg odebranych danych
boolean start = true; //Poczatek wpisu
String wpis = ""; //Wpisana liczba ile
int ile = 0; //Jakas zmienna na potrzeby wyswietlacza ;)


void setup() {

 Serial.begin(9600); //Serial ruszyl z zawrotna predkoscia

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

void loop() {
while (start == true) //Kiedy podano cyferki lub inne liczbusie
 {
   Serial.println("Podaj cyfre z zakresu 0-9"); //Tekst jakis
   while(Serial.available() == 0)  //Poczekaj na wpisanie cyfry
   {}
   if(Serial.available() > 0)  //Jeśli cyfra zostanie wpisana
   {
     wpis = Serial.readStringUntil('\n');  //Odczytaj cyfre
     ile = wpis.toInt(); //Zmien String na int
     wyswietlacz(ile); //Wrzuc to co odczytales na wyswietlacz

     Serial.print("Podana cyfra: "); //Pokaz na porcie co wpisales
     Serial.println(ile);

     delay(1000); //Delay to przeklenstwo kazdego prgramu...
   }
 }    
}

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;

 }
 //Jesli liczba inna niz z zakresu 0-9 wyswietl blad
   if (cyfra > 9 || cyfra < 0){
   error();
   Serial.println("Bledna cyfra - podaj cyfre z zakresu 0-9");
   delay(1000);
  }
}

//Symbol bledu na wyswietlaczu
void error(){
       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);
}

I fotka

Teraz mała kawa i biorę się za dodawanie przycisków i zadanie 6.2 - mam nadzieję, że nie zapomnę o PULLUPach 😉

PS mała płytka stykowa powędrowała na robota (z kursu) podczas odklejania płytki z tej podstawki z kursu zobaczyłem jak wygląda płytka od środka - bardzo ciekawe doświadczenie 😉

ED:

Zadanie 6.2 jednak nie udało mi się na bazie poprzedniego kodu (zbyt mała wiedza)

Ale 'naskrobałem' coś takiego

//Wyswietlacz
#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

//Przyciski 
#define przDod 9
#define przUja 10
#define przRes 11
#define przLicz 12

int i = 0;

void setup() {

 Serial.begin(9600); //Serial ruszyl z zawrotna predkoscia

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

 //Konfiguracja dla przyciskow
 pinMode(przDod, INPUT_PULLUP);
 pinMode(przUja, INPUT_PULLUP);
 pinMode(przRes, INPUT_PULLUP);
 pinMode(przLicz, INPUT_PULLUP);
}

void loop() {

   wyswietlacz(i); //Wyswietl wartosc na wyswietlaczu

   if(digitalRead(przDod) == LOW){//Jesli przDod wcisniety
     i++; //Dodaj 1 do wartosci
     wyswietlacz(i); //Wrzuc na wyswietlacz
     Serial.println(i); //Wrzuc na port
     delay(500); //Delay dla poprawnego działania przycisku 
   }

   if(digitalRead(przUja) == LOW){//Jesli przDod wcisniety
     i--; //Wartosc w dol
     wyswietlacz(i); //Wrzuc na wyswietlacz
     Serial.println(i); //I serial
     delay(500); //Delay dla poprawnego działania przycisku

   }
  if(digitalRead(przRes) == LOW){//Jesli przRes wcisniety
     i=0; //Wyzeruj
     wyswietlacz(i); //I wrzuc na wyswietlacz
     Serial.println("Reczny restet"); //Plus komentarz na serialu
     Serial.println(i);
     delay(500); //Delay dla poprawnego działania przycisku
   }

   if(digitalRead(przLicz) == LOW){//Jesli przLicz wcisniety
      for (i ; i > 0; i--) { //Petla odliczania do zera
      wyswietlacz(i); //Wyswietl wartosc na wyswietlaczu
      delay(1000); //Poczekaj 1000 ms (że niby sekunda ;) )
   } 
  }
}


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;

 }
 //Jesli liczba inna niz z zakresu 0-9 wyswietl blad
   if (cyfra > 9 || cyfra < 0){
   error();
   //Smieszny tekst zamrazajacy program na kilka sekund
   Serial.println("Bledna cyfra - podaj cyfre z zakresu 0-9");
   delay(500);
   Serial.print("Nastapi");
   delay(1000);
   Serial.print(" automatyczny");
   delay(1000);
   Serial.println(" reset licznika");
   delay(500);
   i=0; //Wyzerowanie licznika
   wyswietlacz(i);
   delay(500);
  }
}

//Symbol bledu na wyswietlaczu
void error(){
       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);
}

Jeszcze film i lecę dalej.

ED2:

Udostępnij ten post


Link to post
Share on other sites

leepa79, zastanów się, czy nie dasz rady zrobić rozpoznawania wartości "poza zakresem" również switch'em. Poczytaj jaka jest składnia całej instrukcji, może coś Ci się nasunie 😉 A jeśli chodzi o sklejki/płytki stykowe/roboty, to niedługo będą pierwsze prototypy nowych rozszerzeń, więc będzie sporo nowych możliwości w tych tematach 😉

Udostępnij ten post


Link to post
Share on other sites

Treker, Na początku miałem takie rozwiązanie:

//Wyswietlacz
#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

//Przyciski 
#define przDod 9
#define przUja 10
#define przRes 11
#define przLicz 12

int i = 0;

void setup() {

 Serial.begin(9600); //Serial ruszyl z zawrotna predkoscia

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

 //Konfiguracja dla przyciskow
 pinMode(przDod, INPUT_PULLUP);
 pinMode(przUja, INPUT_PULLUP);
 pinMode(przRes, INPUT_PULLUP);
 pinMode(przLicz, INPUT_PULLUP);
}

void loop() {

   wyswietlacz(i); //Wyswietl wartosc na wyswietlaczu

   if(digitalRead(przDod) == LOW){//Jesli przDod wcisniety
     i++; //Dodaj 1 do wartosci
     wyswietlacz(i); //Wrzuc na wyswietlacz
     Serial.println(i); //Wrzuc na port
     delay(500); //Delay dla poprawnego działania przycisku 
   }

   if(digitalRead(przUja) == LOW){//Jesli przDod wcisniety
     i--; //Wartosc w dol
     wyswietlacz(i); //Wrzuc na wyswietlacz
     Serial.println(i); //I serial
     delay(500); //Delay dla poprawnego działania przycisku

   }
  if(digitalRead(przRes) == LOW){//Jesli przRes wcisniety
     i=0; //Wyzeruj
     wyswietlacz(i); //I wrzuc na wyswietlacz
     Serial.println("Reczny restet"); //Plus komentarz na serialu
     Serial.println(i);
     delay(500); //Delay dla poprawnego działania przycisku
   }

   if(digitalRead(przLicz) == LOW){//Jesli przLicz wcisniety
      for (i ; i > 0; i--) { //Petla odliczania do zera
      wyswietlacz(i); //Wyswietl wartosc na wyswietlaczu
      Serial.println(i);
      delay(1000); //Poczekaj 1000 ms (że niby sekunda ;) )
   } 
  }
}


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:
       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);
       delay(1000);
       i=0;
       wyswietlacz(i);
       delay(500);
   break;

 }
}

Czyli case 10 🙂 Ale nie wiedziałem jak zrobić błąd dla wartości poniżej zera.

A jeśli chodzi o sklejki/płytki stykowe/roboty, to niedługo będą pierwsze prototypy nowych rozszerzeń

To jest wspaniała wiadomość. Ostatnio częściej zaglądam na forum i zastanawiam się jak to wszystko ogarniasz? 🙂 Robicie naprawdę świetną robotę, więc z tej okazji wielkie dzięki - nie pierwsze i nie ostatnie.

Udostępnij ten post


Link to post
Share on other sites
Czyli case 10 Ale nie wiedziałem jak zrobić błąd dla wartości poniżej zera.

Nie do końca 🙂 Można jeszcze dodać coś takiego:

 switch (wyrażenie) {
  case wartość1: /* instrukcje, jeśli wyrażenie == wartość1 */
    break;
  case wartość2: /* instrukcje, jeśli wyrażenie == wartość2 */
    break;
  /* ... */
  default: /* instrukcje, jeśli żaden z wcześniejszych warunków nie został spełniony */
    break;
}

Fragment zaczerpnięty z: https://pl.wikibooks.org/wiki/C/Instrukcje_steruj%C4%85ce#switch 🙂

To jest wspaniała wiadomość. Ostatnio częściej zaglądam na forum i zastanawiam się jak to wszystko ogarniasz? Robicie naprawdę świetną robotę, więc z tej okazji wielkie dzięki - nie pierwsze i nie ostatnie.

Dzięki za miłe słowa, zawsze motywują do dalszej pracy 🙂

Udostępnij ten post


Link to post
Share on other sites

A więc "default:" 🙂 dzięki za radę. Teraz już wszystko wygląda ładnie. Jedziemy dalej. Następne zadanie robię na bazie tego poprzedniego. Mam już szkic i dwa problemy. Pierwszy - jak pogodzić ten delay (pińcet) który pomaga mi w kontrolowaniu zakłóceń w przycisku z tym szybkim delayem na dwóch wyświetlaczach? Drugi - przycisk odliczający od 99 do zera, ale tu jakoś dojdę do sedna 🙂 (mam nadzieję) trochę się oderwałem od lekcji bo światłolub czekał 😉 Oglądałem też te przykłady z SevSeg i tu z przykładami jakoś to poszło, ale nie idę dalej póki nie rozwiąże poprzednich zadań.

Udostępnij ten post


Link to post
Share on other sites

leepa79, w kursie staram się opisywać podstawy, a i tak czasami muszę długo przynudzać, więc niektóre rzeczy od pewnego poziomu warto jeszcze trenować we własnym zakresie.

Przy okazji aktualizacja: w związku z tym, że część o gotowej bibliotece zajęła więcej miejsca od tego, które pierwotnie założyłem, to dodałem jednak te informacje do opublikowanej już #6 części kursu. W kolejnej zajmiemy się już tylko termometrami. W związku z tym zainteresowanych wyświetlaczami zachęcam do lektury nowego kawałka artykułu: Kurs Arduino II – #6 – wyświetlacze 7-segmentowe. Publikację kolejnej części przesuwam o jeden dzień, aby nie pojawiło się zbyt dużo rzeczy jednocześnie 🙂

Udostępnij ten post


Link to post
Share on other sites

Witam.

Próbuję wykonać stoper odliczający 60 sekund w duł. Jednak metodę jaką wykorzystałem podczas robienia takowego na wyświetlaczy LCD zawodzi. To jest

 { i=i-1; delay (1000);} 

w funkcji loop.

Prosiłbym o pomoc.

Udostępnij ten post


Link to post
Share on other sites

Loght, witam na forum 🙂

Z podanego fragmentu ciężko wywnioskować co dokładnie jest źle. Wklej cały kod, najlepiej z komentarzami - bez tego nie damy rady Ci pomóc.

Udostępnij ten post


Link to post
Share on other sites

Oto cały kod jaki próbowałem pisać.

#include "SevSeg.h"
SevSeg sevseg; //Instantiate a seven segment controller object
int i; 
void setup() {
 byte numDigits = 2;   
 byte digitPins[] = {10, 9};
 byte segmentPins[] = {7, 5, 2, 4, 3, 8, 6};
 bool resistorsOnSegments = true; // Use 'true' if on digit pins
 byte hardwareConfig = N_TRANSISTORS; // See README.md for options
 sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments);
i = 60;
}

void loop() {
 sevseg.setNumber(i, 2); //Wyswietl liczbę 34, korzystając z dwóch wyswietlaczy
 sevseg.refreshDisplay();

 {
   i=i-1;
   delay (1000);
 }
}

próbowałem również innych metod ta wydaje mi się najłatwiejsza ale nie działa.

Udostępnij ten post


Link to post
Share on other sites

Loght, niestety tak jak pisałem w artykule (oraz w poprzednich komentarzach) nie można korzystać z opóźnień (wykonywanych przez funkcję delay), ponieważ zatrzymują cały problem i blokują możliwość multipleksowania wyświetlacza. Jeśli koniecznie chcesz stworzyć taki program, to zainteresuj się funkcją milis(), której wykorzystanie zostało opisane np. tutaj: https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay Za jej pomocą można odliczać czas bez zatrzymywania całego programu.

Udostępnij ten post


Link to post
Share on other sites

Witam zadanie domowe wykonałem (dokładniej kod) w taki sposób :

#define C 3
#define E 5
#define D 6
#define B 11
#define G 2
#define A 7
#define F 10
#define button_0 8
#define button_plus 9
#define button_minus 4

void setup() {
 pinMode(C, OUTPUT);
 pinMode(E, OUTPUT);
 pinMode(D, OUTPUT);
 pinMode(B, OUTPUT);
 pinMode(G, OUTPUT);
 pinMode(A, OUTPUT);
 pinMode(F, OUTPUT);
 pinMode(button_0, INPUT_PULLUP);
 pinMode(button_plus, INPUT_PULLUP);
 pinMode(button_minus, INPUT_PULLUP);

}
int i = 0;
void loop() {
if(digitalRead(button_0) == LOW) {
 i = 0;
 wysw(i);
 }
if(digitalRead(button_plus) == LOW && i < 11){
   i = i+1;
   wysw(i);
   while(digitalRead(button_plus) == LOW) {
     delay(20);
     }
}
if(digitalRead(button_minus) == LOW){
 i = i-1;
 wysw(i);
 while(digitalRead(button_minus) == LOW) {
   delay(20);
   }
}
}

void wysw(int cyfra){
 switch (cyfra){
   case 0:
   digitalWrite(A, HIGH);
   digitalWrite(B, HIGH);
   digitalWrite(C, HIGH);
   digitalWrite(D, HIGH);
   digitalWrite(E, HIGH);
   digitalWrite(F, HIGH);
   digitalWrite(G, LOW);
   break;
   case 1:
   digitalWrite(A, LOW);
   digitalWrite(B, HIGH);
   digitalWrite(C, HIGH);
   digitalWrite(D, LOW);
   digitalWrite(E, LOW);
   digitalWrite(F, LOW);
   digitalWrite(G, LOW);
   break;
   case 2:
   digitalWrite(A, HIGH);
   digitalWrite(B, HIGH);
   digitalWrite(C, LOW);
   digitalWrite(D, HIGH);
   digitalWrite(E, HIGH);
   digitalWrite(F, LOW);
   digitalWrite(G, HIGH);
   break;
   case 3:
   digitalWrite(A, HIGH);
   digitalWrite(B, HIGH);
   digitalWrite(C, HIGH);
   digitalWrite(D, HIGH);
   digitalWrite(E, LOW);
   digitalWrite(F, LOW);
   digitalWrite(G, HIGH);
   break;
   case 4:
   digitalWrite(A, LOW);
   digitalWrite(B, HIGH);
   digitalWrite(C, HIGH);
   digitalWrite(D, LOW);
   digitalWrite(E, LOW);
   digitalWrite(F, HIGH);
   digitalWrite(G, HIGH);
   break;
   case 5:
   digitalWrite(A, HIGH);
   digitalWrite(B, LOW);
   digitalWrite(C, HIGH);
   digitalWrite(D, HIGH);
   digitalWrite(E, LOW);
   digitalWrite(F, HIGH);
   digitalWrite(G, HIGH);
   break;
   case 6:
   digitalWrite(A, HIGH);
   digitalWrite(B, LOW);
   digitalWrite(C, HIGH);
   digitalWrite(D, HIGH);
   digitalWrite(E, HIGH);
   digitalWrite(F, HIGH);
   digitalWrite(G, HIGH);
   break;
   case 7:
   digitalWrite(A, HIGH);
   digitalWrite(B, HIGH);
   digitalWrite(C, HIGH);
   digitalWrite(D, LOW);
   digitalWrite(E, LOW);
   digitalWrite(F, LOW);
   digitalWrite(G, LOW);
   break;
   case 8:
   digitalWrite(A, HIGH);
   digitalWrite(B, HIGH);
   digitalWrite(C, HIGH);
   digitalWrite(D, HIGH);
   digitalWrite(E, HIGH);
   digitalWrite(F, HIGH);
   digitalWrite(G, HIGH);
   break;
   case 9:
   digitalWrite(A, HIGH);
   digitalWrite(B, HIGH);
   digitalWrite(C, HIGH);
   digitalWrite(D, HIGH);
   digitalWrite(E, LOW);
   digitalWrite(F, HIGH);
   digitalWrite(G, HIGH);
   break;
   case 10:
   digitalWrite(A, HIGH);
   digitalWrite(B, LOW);
   digitalWrite(C, LOW);
   digitalWrite(D, HIGH);
   digitalWrite(E, LOW);
   digitalWrite(F, LOW);
   digitalWrite(G, HIGH);
   break;
   default:
   digitalWrite(A, HIGH);
   digitalWrite(B, HIGH);
   digitalWrite(C, HIGH);
   digitalWrite(D, HIGH);
   digitalWrite(E, HIGH);
   digitalWrite(F, HIGH);
   digitalWrite(G, LOW);
   i = 0;
   break;
 }
}

Można w jakiś zastąpić while ale nie samym delay bo wtedy przycisk działa z opóźnieniem ?

Udostępnij ten post


Link to post
Share on other sites

ponyyou, pamiętaj o dodawaniu komentarzy do kodu. Dzięki nim postronnym osobom będzie łatwiej analizować kod, a Tobie również będzie łatwiej, gdy będziesz chciał wrócić do swoich kodów w przyszłości 🙂

Udostępnij ten post


Link to post
Share on other sites

Moje rozwiązanie zadania 6.3 :

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

void loop() {

 for(int j=0;j<10;j++)  //Pętla do zmiany pierwszej cyfry
 {
 for ( int i=0;i<10;i++){  //Pętla do zmiany drugiej cyfry
  for(int k=0; k<30; k++){  //Pętla do ustawiania szybkości licznika
 digitalWrite(wys_jed,HIGH);  //Włączamy 1. wyświetlacz
 digitalWrite(wys_dwa,LOW);  //Włączamy 2. wyświetlacz
 showTheNumber(j);            //Funkcja dobierająca odopwiednią cyfrę ( kod poniżej )
 delay(5);
 digitalWrite(wys_dwa,HIGH);  //Włączamy 2. wyświetlacz
 digitalWrite(wys_jed,LOW);  //Wyłączamy 1. wyświetlacz
 showTheNumber(i); 
 delay(5);
  }
 }
 }
}
void showTheNumber(byte number){
switch(number){
  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);
  break;
}
}

Udostępnij ten post


Link to post
Share on other sites

To teraz spróbuj napisać funkcję showTheNumber() tak, by zajęła kilka linijek kodu. To co zrobiłeś pewnie zadziała, ale tak się tego nie robi. To kurs dla początkujących, wiem i dlatego wysil się bardziej. Nie zawsze pierwszy pomysł jest najlepszy. Zastanów się jak zapalanie segmentów zrobić bardziej ogólnym, żeby nie ciągnęło się przez trzy ekrany.

Wskazówka: poczytaj o tablicach i przemyśl sprawę przechowywania w czymś takim wyglądu wszystkich cyfr.

  • Lubię! 1

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ę »

×