Skocz do zawartości

Wyświetlacz Grove 14-segmentowy nie dziala I2C


dudekvegas

Pomocna odpowiedź

Witam, 

podlaczylem wyswietlacz prawidlowo i zastosowalem kod ponizej, jednak wyswietlacz kompletnie nie reaguje. Ma ktos pomysl w czym lezy problem?

#include <grove_alphanumeric_display.h>
#include <HT16K33_driver.h>


// piny przyciski
const byte p1 = 9; //change!
const byte p2 = 10;
const byte p3 = 11;
const byte p4 = 12;

// piny urzadzenia
const byte u1 = 6;
const byte u2 = 7;
const byte u3 = 8;


// musi byc 2 lub 3
const byte wrzutnik = 2;

// najmniejszy nominal
const float minKwota = 0.5;


volatile float kwota = 0;


const long jednostkaCzasu = 15000; //15 sekund - minuta / 2zl

// czas od ostatniej jednostki czasu
long previousMillis = 0;

// czy czas juz jest odliczany
bool start = false;

// czy impulsy należą do jednego przekazu
bool transmisja = false;

long poprzedniImpuls = 0;
byte iloscImpulsow = 0;

long pozostaleSekundy = 0;
long poprzedniCzas = 0;

Seeed_Digital_Tube tube;

void setup() {
  //Serial.begin(9600);
  
  pinMode(p1, INPUT_PULLUP);
  pinMode(p2, INPUT_PULLUP);
  pinMode(p3, INPUT_PULLUP);
  pinMode(p4, INPUT_PULLUP);

  pinMode(u1, OUTPUT);
  pinMode(u2, OUTPUT);
  pinMode(u3, OUTPUT);

  pinMode(wrzutnik, INPUT_PULLUP);

  attachInterrupt(digitalPinToInterrupt(wrzutnik), wrzut, RISING);

//  // wyswietlacz
    tube.setTubeType(TYPE_4, TYPE_4_DEFAULT_I2C_ADDR);

    // 0-15
    tube.setBrightness(15);
    tube.setBlinkRate(BLINK_OFF);

  // zapobiega przypadkowemu interruptowi przy pierwszym odpaleniu
  kwota = 0.0;
  iloscImpulsow = 0;
  previousMillis = 1000000;
}

void loop() {
    if(abs(millis() - previousMillis) > jednostkaCzasu && start){
        if(kwota <= 0){
            wylaczWszystko();
            start = false;
        } else {
        previousMillis = millis();
        kwota -= minKwota;
        }
    }

    if(millis() - poprzedniCzas > 1000 && pozostaleSekundy > 0){
        poprzedniCzas = millis();
        pozostaleSekundy--;
        int num = (int)(pozostaleSekundy / 60) * 100 + pozostaleSekundy % 60;
        //Serial.println(num);
        tube.clear();
        tube.displayNum(num);
    }
    

    if(start){
        przycisk1Nowy();
        przycisk2();
        przycisk3();
        przycisk4();
    } else {
        przycisk1();
    }

    if(transmisja){
        poprzedniImpuls = millis();
        transmisja = false;
        }

    if(millis() - poprzedniImpuls > 100){
        float dodatek = 0;
        switch(iloscImpulsow){
            case 1: dodatek = 1; break; //50 gr
            case 2: dodatek = 2; break; //1 zl
            case 3: dodatek = 4; break; //2 zl
            case 4: dodatek = 10; break; //5zl
            default: dodatek = 0; break;
    }
    kwota += dodatek * minKwota;
    pozostaleSekundy += jednostkaCzasu / 1000 * dodatek;
    iloscImpulsow = 0;
    }
}

// gdy wrzutnik da impuls
void wrzut(){
    //kwota += minKwota;
    iloscImpulsow++;
    transmisja = true;

}

void przycisk1(){
    if(digitalRead(p1) == LOW && !start && kwota > 0) {
        digitalWrite(u1, HIGH);
        start = true;
    }
}

void przycisk1Nowy(){
      if(digitalRead(p1) == LOW) {
        digitalWrite(u1, HIGH);
        digitalWrite(u3, LOW);
    }
}

void przycisk2(){
    if(digitalRead(p2) == LOW){
        digitalWrite(u2, HIGH);
    }
}

void przycisk3(){
    if(digitalRead(p3) == LOW){
        digitalWrite(u2, LOW);
    }
}

void przycisk4(){
    if(digitalRead(p4) == LOW){
        digitalWrite(u1, LOW);
        digitalWrite(u3, HIGH);
    }
}

void wylaczWszystko(){
    digitalWrite(u1, LOW);
    digitalWrite(u2, LOW);
    digitalWrite(u3, LOW);
}

 

Edytowano przez Gieneq
Zachęcam do używania bloku kodu
Link do komentarza
Share on other sites

Zauważyłeś w edytorze przycisk "Wstaw kod"? Jak myślisz, do czego on służy? Weź to popraw.

Jeśli chcesz testować wyświetlacz, napisz program dla wyświetlacza a nie na całe urządzenie. Zrób inicjalizację i wypisanie jednej rzeczy - w maksymalnie kilku linijkach kodu. I co znaczy "podłączyłem prawidłowo"? Może jakiś schemat? Bo jeśli wszystko byłoby prawidłowo, to by działało a jeśli tak nie jest, to skąd wiesz gdzie zrobiłeś błąd (i że jest on w programie)?

 

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

40 minut temu, dudekvegas napisał:

W taki sposob podlaczylem

Ok, to wygląda dobrze. Czy jesteś pewien, że te dwa skrajne piny to I2C? Nie  wszystkie UNO chyba tak miały. Zacznij od prostych rzeczy: puszczałeś skaner I2C? I co, wykrył jakieś urządzenie? Jeśli tak, to teraz prosty program. Tylko setup() a w nim inicjalizacja wyświetlacza, ustawienie jasności i krótki, max. 4-znakowy displayString(). Dopiero jeśli taki test nie zadziała, trzeba będzie wniknąć głębiej. A jeśli zadziała, masz spory kod do uruchomienia. Nikt tego za Ciebie nie zrobi i nie wiem czy znajdziesz kogoś kto będzie wnikał w cały program. Poza tym uruchamianie własnych programów to fajna zabawa. Zaczynasz od czegoś prostego i działającego, potem dodajesz kolejne funkcje, sprawdzasz je, testujesz, rozbudowujesz i tak powoli, stopniowo w kółko aż wszystko będzie OK i tylko wtedy gdy poprzedni krok się udał. Żaden duży kod nie działa od razu a na tym co pokazałeś możesz świetnie nauczyć się jak ogarniać co większe projekty. No chyba, że to nie Twoje i niewiele z tego rozumiesz, ale o to Cię nie podejrzewam.

Upewnij się, że adres ustawiany zworkami jest poprawny. Skaner I2C powinien wykryć moduł i wypisać aktualny adres .

  • Lubię! 1
Link do komentarza
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ę »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.