Skocz do zawartości
Komentator

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

Pomocna odpowiedź

@ethanak Dzięki raz jeszcze i przepraszam za małe zamieszanie, miło że chciało Ci się to wytłumaczyć. Idę dalej z materiałem 😉

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Cześć, postanowiłem zmodyfikować trochę kod, w którym zastosowaliśmy multipleksowanie wyświetlacza tak, że:

  • używając potencjometru podłączonego w roli konwertera ADC regulujemy częstotliwość odświeżania wyświetlacza (co pozwala łatwiej zaobserwować bezwładność naszego wzroku)
  • wyświetla on liczby z zakresu 1-99, a w przypadku podania nieodpowiedniej liczby / ciągu znaków program prosi nas o podanie prawidłowej wartości

Podłączenia takie same, jak w kursie. Dołączam również kod programu:

#define potentiometer A5 // Defines pin used to control the frequency

#define firstDisp 10 // Defines pins used for multiplexing method
#define secondDisp 9

#define rightDown 2 // Defines all pins (according to pinout and segments)
#define leftDown 3
#define Down 4
#define rightUp 5
#define Middle 8
#define Up 7
#define leftUp 6

int delayTime = 0; // Variable used for ADC converter measurement

byte firstNumber = 0; // Variables used to store currently displayed numbers
byte secondNumber = 0;

String receivedString = ""; // Variables used to "decode" and show number sent by user
int receivedInt = 0;
byte nextNumber = 0;

void setup() {
  Serial.begin(9600); // Initializes UART communication
  
  pinMode(firstDisp, OUTPUT); // Initializes both displays
  pinMode(secondDisp, OUTPUT);
  
  pinMode(Up, OUTPUT); // Initializes particular segments of the displays
  pinMode(leftUp, OUTPUT);
  pinMode(rightUp, OUTPUT);
  pinMode(Middle, OUTPUT);
  pinMode(Down, OUTPUT);
  pinMode(leftDown, OUTPUT);
  pinMode(rightDown, OUTPUT);

  // Initial animation
  
  digitalWrite(firstDisp, HIGH); // Turns both displays on
  digitalWrite(secondDisp, HIGH);
  
  digitalWrite(Up, HIGH); // Checks if every diode works correctly
  delay(200);
  digitalWrite(leftUp, HIGH);
  delay(200);
  digitalWrite(rightUp, HIGH);
  delay(200);
  digitalWrite(Middle, HIGH);
  delay(200);
  digitalWrite(Down, HIGH);
  delay(200);
  digitalWrite(leftDown, HIGH);
  delay(200);
  digitalWrite(rightDown, HIGH);

  delay(200);

  clearAll();
  digitalWrite(firstDisp, LOW);
  digitalWrite(secondDisp, LOW);

  Serial.println("Give any number in range 0-99 and I'll show it on the display. For 0, type zero.");
}

void loop() {
  delayTime = analogRead(potentiometer); // Reads the value from potentiometer
  delayTime = map(delayTime, 0, 1023, 5, 1000); // Converts the measurement into time in miliseconds

  if (Serial.available() > 0) { // If data has been received
    receivedString = Serial.readStringUntil("\n"); // Reads incoming data as String
      receivedInt = receivedString.toInt(); // Converts incoming data into integer
      if ((receivedInt > 0) and (receivedInt < 100)) { // If converted data is in given 10-99 range:
        Serial.println(receivedInt); // Shows given number on Serial Monitor
        secondNumber = (receivedInt % 10); // Reads the second number
        receivedInt = (receivedInt / 10); // Moves the whole number one decimal place right
        firstNumber = (receivedInt % 10); // Reads the first number
      } else {
        Serial.println("Invalid number, please, try again.");
    }
  }
  digitalWrite(firstDisp, HIGH); // First display is on
  digitalWrite(secondDisp, LOW); // Second is off
  showNumber(firstNumber); // This number is shown on first display
  delay(delayTime); // Waits for some time
  digitalWrite(firstDisp, LOW); // First display is off
  digitalWrite(secondDisp, HIGH); // Second is on
  showNumber(secondNumber); // This number is shown on second display
  delay(delayTime); // Waits for some time
}

void clearAll() { // Function that clears the display
        digitalWrite(Up, LOW);
        digitalWrite(leftUp, LOW);
        digitalWrite(rightUp, LOW);
        digitalWrite(Middle, LOW);
        digitalWrite(Down, LOW);
        digitalWrite(leftDown, LOW);
        digitalWrite(rightDown, LOW);
}

void showNumber(byte number) { // Function that displays given single number on the display
  switch (number) {
    case 0:
        digitalWrite(Up, HIGH);
        digitalWrite(leftUp, HIGH);
        digitalWrite(rightUp, HIGH);
        digitalWrite(Middle, LOW);
        digitalWrite(Down, HIGH);
        digitalWrite(leftDown, HIGH);
        digitalWrite(rightDown, HIGH);
    break; 
    
    case 1:
        digitalWrite(Up, LOW);
        digitalWrite(leftUp, LOW);
        digitalWrite(rightUp, HIGH);
        digitalWrite(Middle, LOW);
        digitalWrite(Down, LOW);
        digitalWrite(leftDown, LOW);
        digitalWrite(rightDown, HIGH);
    break; 
    
    case 2:
        digitalWrite(Up, HIGH);
        digitalWrite(leftUp, LOW);
        digitalWrite(rightUp, HIGH);
        digitalWrite(Middle, HIGH);
        digitalWrite(Down, HIGH);
        digitalWrite(leftDown, HIGH);
        digitalWrite(rightDown, LOW);
    break; 
    
    case 3:
        digitalWrite(Up, HIGH);
        digitalWrite(leftUp, LOW);
        digitalWrite(rightUp, HIGH);
        digitalWrite(Middle, HIGH);
        digitalWrite(Down, HIGH);
        digitalWrite(leftDown, LOW);
        digitalWrite(rightDown, HIGH);
    break; 
    
    case 4:
        digitalWrite(Up, LOW);
        digitalWrite(leftUp, HIGH);
        digitalWrite(rightUp, HIGH);
        digitalWrite(Middle, HIGH);
        digitalWrite(Down, LOW);
        digitalWrite(leftDown, LOW);
        digitalWrite(rightDown, HIGH);
    break; 
    
    case 5:
        digitalWrite(Up, HIGH);
        digitalWrite(leftUp, HIGH);
        digitalWrite(rightUp, LOW);
        digitalWrite(Middle, HIGH);
        digitalWrite(Down, HIGH);
        digitalWrite(leftDown, LOW);
        digitalWrite(rightDown, HIGH);
    break; 
    
    case 6:
        digitalWrite(Up, HIGH);
        digitalWrite(leftUp, HIGH);
        digitalWrite(rightUp, LOW);
        digitalWrite(Middle, HIGH);
        digitalWrite(Down, HIGH);
        digitalWrite(leftDown, HIGH);
        digitalWrite(rightDown, HIGH);
    break;
   
    case 7:
        digitalWrite(Up, HIGH);
        digitalWrite(leftUp, LOW);
        digitalWrite(rightUp, HIGH);
        digitalWrite(Middle, LOW);
        digitalWrite(Down, LOW);
        digitalWrite(leftDown, LOW);
        digitalWrite(rightDown, HIGH);
    break;
    
    case 8:
        digitalWrite(Up, HIGH);
        digitalWrite(leftUp, HIGH);
        digitalWrite(rightUp, HIGH);
        digitalWrite(Middle, HIGH);
        digitalWrite(Down, HIGH);
        digitalWrite(leftDown, HIGH);
        digitalWrite(rightDown, HIGH);
    break;
    
    case 9:
        digitalWrite(Up, HIGH);
        digitalWrite(leftUp, HIGH);
        digitalWrite(rightUp, HIGH);
        digitalWrite(Middle, HIGH);
        digitalWrite(Down, HIGH);
        digitalWrite(leftDown, LOW);
        digitalWrite(rightDown, HIGH);
    break;

    default:
        digitalWrite(Up, HIGH);
        digitalWrite(leftUp, LOW);
        digitalWrite(rightUp, LOW);
        digitalWrite(Middle, HIGH);
        digitalWrite(Down, HIGH);
        digitalWrite(leftDown, LOW);
        digitalWrite(rightDown, LOW);
    break;
  }
}

 

Edytowano przez bujo2001
Problem wyjaśniony - brak pytania na końcu

Udostępnij ten post


Link to post
Share on other sites

Ech... czytanie dokumentacji to strata czasu... a przecież pisze jak wół w https://www.arduino.cc/reference/en/language/variables/data-types/string/functions/toint/

Cytat

If no valid conversion could be performed because the String doesn’t start with a integer number, a zero is returned.

Tutaj masz całą wielgaśną dyskusję na ten temat.

Udostępnij ten post


Link to post
Share on other sites
3 godziny temu, ethanak napisał:

Ech... czytanie dokumentacji to strata czasu... a przecież pisze jak wół w https://www.arduino.cc/reference/en/language/variables/data-types/string/functions/toint/

Tutaj masz całą wielgaśną dyskusję na ten temat.

Przecież napisałem, że usiądę do tego jak wrócę, a jeżeli ktoś może odpowiedzieć od ręki to proszę o wypowiedzenie się. Doszedłbym do tego po sprawdzeniu, co zwraca .toInt() po podaniu mu znaków innych niż liczby, a w miarę potrzeby szukał odpowiedzi w necie lub dokumentacji. Wolałem zapytać, gdyby ktoś mógł podać odpowiedź od ręki. Po co zaraz się denerwować 😉 

Udostępnij ten post


Link to post
Share on other sites
2 minuty temu, bujo2001 napisał:

Doszedłbym do tego po sprawdzeniu, co zwraca .toInt() po podaniu mu znaków innych niż liczby, a w miarę potrzeby szukał odpowiedzi w necie lub dokumentacji

Chciałeś odpowiedzi na szybko to dostałeś. Następnym razem rób odwrotnie: najpierw dokumentacja, a potem eksperymenty. Bo tak jak chcesz to robić - po prostu będziesz tracić czas na sprawdzenie czegoś, co jest bardzo ładnie opisane (przy czym jest duża szansa, że jednak działa to inaczej). Po co zaraz się denerwować 😉

Zajrzałeś tam na forum Arduino? Bo po przeczytaniu powinieneś mieć gotowe rozwiązanie.

Udostępnij ten post


Link to post
Share on other sites
(edytowany)
2 godziny temu, ethanak napisał:

Chciałeś odpowiedzi na szybko to dostałeś. Następnym razem rób odwrotnie: najpierw dokumentacja, a potem eksperymenty. Bo tak jak chcesz to robić - po prostu będziesz tracić czas na sprawdzenie czegoś, co jest bardzo ładnie opisane (przy czym jest duża szansa, że jednak działa to inaczej). Po co zaraz się denerwować 😉

Zajrzałeś tam na forum Arduino? Bo po przeczytaniu powinieneś mieć gotowe rozwiązanie.

Tak, tak też zrobię następnymi razami. Teraz byłem w pośpiechu, a bardzo chciałem załatwić przynajmniej to jeszcze dzisiaj.

Na pewne rozwiązanie wpadłem już po tym, jak wspomniałeś, że .toInt() w przypadku wystąpienia znaku, który nie jest cyfrą, domyślnie zwraca 0. Przetestuję je i dam znać w tym wpisie.

Niezależnie od skuteczności poczytam w forach z linków. Jeszcze raz dzięki za pomoc 🙂 

Edit: Mi udało się to obejść, dodając warunek sprawdzający zero osobno, pamiętając o tym, że w odczycie poza zerem pojawia się znak \n
Poczytam jeszcze dokładniej podesłane tematy, jednak to rozwiązanie jest już skuteczne.

Edytowano przez bujo2001
Rozwiązanie problemu

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...