Skocz do zawartości

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


Pomocna odpowiedź

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

  • Lubię! 1

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:

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 😉

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.

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 🙂

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

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 🙂

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

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.

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.

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.

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.

  • 2 tygodnie później...

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 ?

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 🙂

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

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

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

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