Ta strona używa ciasteczek (plików cookies), dzięki którym może działać lepiej. Dowiedz się więcejRozumiem i akceptuję

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

Autor Wiadomość
Komentator 




Posty: 865
Otrzymał 17 piw(a)
Wysłany: 01-02-2017, 23:56   Kurs Arduino II - #6 - wyświetlacze 7-segmentowe

ArdIkoKurs2_6
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 darmowym blogu Forbota.

Kliknij, aby przeczytać całość!


Poniżej znajdują się komentarze naszych użytkowników powiązane z tym artykułem.


Przeczytałeś artykuł? Dodaj komentarz!
Postaw piwo autorowi tego posta
 
 
leepa79 




Posty: 42
Otrzymał 5 piw(a)
Wysłany: 04-02-2017, 13:38   

Moja interpretacja zadania 6.1
Kod programu: Zaznacz cały

#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
Kod programu: Zaznacz cały

//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:

Ostatnio zmieniony przez leepa79 04-02-2017, 20:52, w całości zmieniany 2 razy  
Postaw piwo autorowi tego posta
 
 
Treker 




Posty: 7897
Pomógł: 117 razy
Otrzymał 506 piw(a)
Skąd: Gdynia
Programuję w:
C, Arduino
Moje roboty:
Spectrum, Fuzzy

Wysłany: 04-02-2017, 22:20   

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


Zachęcam do korzystania z forum - nie pomagam indywidualnie przez PW/maila.
Sprawdź » Kurs ARDUINOKurs podstaw elektronikiZbuduj swojego robota - kurs!
Postaw piwo autorowi tego posta
 
 
leepa79 




Posty: 42
Otrzymał 5 piw(a)
Wysłany: 05-02-2017, 09:49   

Treker, Na początku miałem takie rozwiązanie:
Kod programu: Zaznacz cały
//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.
Cytat:
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.

Postaw piwo autorowi tego posta
 
 
Treker 




Posty: 7897
Pomógł: 117 razy
Otrzymał 506 piw(a)
Skąd: Gdynia
Programuję w:
C, Arduino
Moje roboty:
Spectrum, Fuzzy

Wysłany: 06-02-2017, 21:05   

leepa79 napisał/a:
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:
Kod programu: Zaznacz cały
 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 :)

leepa79 napisał/a:
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 :)


Zachęcam do korzystania z forum - nie pomagam indywidualnie przez PW/maila.
Sprawdź » Kurs ARDUINOKurs podstaw elektronikiZbuduj swojego robota - kurs!
Postaw piwo autorowi tego posta
 
 
leepa79 




Posty: 42
Otrzymał 5 piw(a)
Wysłany: 07-02-2017, 22:50   

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

Postaw piwo autorowi tego posta
 
 
Treker 




Posty: 7897
Pomógł: 117 razy
Otrzymał 506 piw(a)
Skąd: Gdynia
Programuję w:
C, Arduino
Moje roboty:
Spectrum, Fuzzy

Wysłany: 08-02-2017, 23:11   

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 :)


Zachęcam do korzystania z forum - nie pomagam indywidualnie przez PW/maila.
Sprawdź » Kurs ARDUINOKurs podstaw elektronikiZbuduj swojego robota - kurs!
Postaw piwo autorowi tego posta
 
 
Loght 



Posty: 2
Skąd: Nowy Targ
Wysłany: 12-06-2017, 10:30   

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
Kod programu: Zaznacz cały
 { i=i-1; delay (1000);}
w funkcji loop.
Prosiłbym o pomoc.

Postaw piwo autorowi tego posta
 
 
Treker 




Posty: 7897
Pomógł: 117 razy
Otrzymał 506 piw(a)
Skąd: Gdynia
Programuję w:
C, Arduino
Moje roboty:
Spectrum, Fuzzy

Wysłany: 12-06-2017, 11:35   

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.


Zachęcam do korzystania z forum - nie pomagam indywidualnie przez PW/maila.
Sprawdź » Kurs ARDUINOKurs podstaw elektronikiZbuduj swojego robota - kurs!
Postaw piwo autorowi tego posta
 
 
Loght 



Posty: 2
Skąd: Nowy Targ
Wysłany: 15-06-2017, 09:05   

Oto cały kod jaki próbowałem pisać.
Kod programu: Zaznacz cały

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

Postaw piwo autorowi tego posta
 
 
Treker 




Posty: 7897
Pomógł: 117 razy
Otrzymał 506 piw(a)
Skąd: Gdynia
Programuję w:
C, Arduino
Moje roboty:
Spectrum, Fuzzy

Wysłany: 16-06-2017, 11:02   

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.


Zachęcam do korzystania z forum - nie pomagam indywidualnie przez PW/maila.
Sprawdź » Kurs ARDUINOKurs podstaw elektronikiZbuduj swojego robota - kurs!
Postaw piwo autorowi tego posta
 
 
ponyyou 



Posty: 2
Wysłany: 25-06-2017, 00:40   

Witam zadanie domowe wykonałem (dokładniej kod) w taki sposób :
Kod programu: Zaznacz cały
#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 ?

Ostatnio zmieniony przez ponyyou 26-06-2017, 20:03, w całości zmieniany 1 raz  
Postaw piwo autorowi tego posta
 
 
Treker 




Posty: 7897
Pomógł: 117 razy
Otrzymał 506 piw(a)
Skąd: Gdynia
Programuję w:
C, Arduino
Moje roboty:
Spectrum, Fuzzy

Wysłany: 26-06-2017, 11:18   

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 :)


Zachęcam do korzystania z forum - nie pomagam indywidualnie przez PW/maila.
Sprawdź » Kurs ARDUINOKurs podstaw elektronikiZbuduj swojego robota - kurs!
Postaw piwo autorowi tego posta
 
 
Radosław 



Posty: 4
Wysłany: 31-08-2017, 14:52   Zadanie 6.3

Moje rozwiązanie zadania 6.3 :
Kod programu: Zaznacz cały

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

Postaw piwo autorowi tego posta
 
 
marek1707 



Posty: 4306
Pomógł: 464 razy
Otrzymał 606 piw(a)
Skąd: WAW
Programuję w:
C, asm
Wysłany: 31-08-2017, 17:17   

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.

Postaw piwo autorowi tego posta
 
 
Więcej szczegółów
Wystawiono 1 piw(a):
Radosław
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Wersja do druku

Skocz do:  

Nie rozwiązałeś swojego problemu? Zobacz podobne tematy: Kurs Arduino - #9 - ... Kurs STM32 - #4 - St... Kurs STM32 - #5 - Ko... Kurs STM32 - #3 - Pł...
lub przeszukaj forum po wybranych tagach: elektronika, komentarze, majsterkowanie, robotyka


Powered by phpBB modified by Przemo © 2003 phpBB Group
Popularne kursy: Arduinopodstawy elektroniki