Skocz do zawartości

ttmdear

Użytkownicy
  • Zawartość

    8
  • Rejestracja

  • Ostatnio

Reputacja

1 Neutralna

O ttmdear

  • Ranga
    2/10
  1. @Treker Dzięki Wprowadzę zmiany w schemacie, przetestuje i dam znać. @marek1707 Dzięki Zapoznałem się i spróbuje wprowadzić zmiany.
  2. Cześć, Mam wyświetlacz składający się z 4 znaków 7 segmnetowych. Metodą prób i błędów doszedłem do tego, że segment zapala się przez zwarcie do masy, a cała cyfra przez połączenie z plusem Stworzyłem układ z dwoma rejestrami przesuwanymi 74HC595. Na pierwszym ustawiam które segmenty maja się zapalić. Robię to przez tranzystor. Na drugim rejestrze przesuwanym ustawiam która cyferka ma się zapalić. Napisałem programik na Arduino obsługujący to wszystko. Sam program działa poprawnie, problem jest z wyświetlaniem cyferek. Jedna ostatnia cyferka jest jaśniejsza niż pozostałe. Jak naprawiłem problem i wszystkie cyferki wyświetlają się tak samo, to wszystkie ogólnie wyświetlają się dość słabo. Od razu piszę, że cały czas się uczę i elektronika jest moim hobby Więc proszę o wyrozumiałość. Zastanawiam się również nad tym, czy w dobry sposób połączyłem rejestr przesuwny z wyświetlaczem. Czy jest konieczny tranzystor aby połączyć się z masą. Poniżej wstawiam cały kod. Jest tam wariant (zakomentowany) w pętli wsuwam bity do rejestrów. W takim wariancie zawsze ostatnia cyferka świeci sie jaśniej niż pozostałe. W drugim wariancie staram się wsuwać bity tak aby na każdą cyferkę funkcja display() kończyła na każdej cyfrze. Schemat nie musi być zgodny z programem. # define R_DS 8 // Wejście danych # define R_OUTPUT_ENABLE 9 // Przenosi z na OUTPUT # define R_ST_CP 10 // Przenosi z na OUTPUT # define R_SH_CP 11 // SH_CP Wsuwa bity a R_DS # define R_MR 12 // Resetuje bity # define TEMPERATURE_INPUT A0 class DiodesDisplay { int pinDS; int pinOutputEnable; int pinSTCP; int pinSHCP; int pinMR; int lastMethod = 0; byte segmentsCharMaps[10] = { B11010111, B01010000, B11100110, B11110100, B01110001, B10110101, B10110111, B11010000, B11110111, B11110101, }; public: DiodesDisplay(int pinDS, int pinOutputEnable, int pinSTCP, int pinSHCP, int pinMR) { this->pinDS = pinDS; this->pinOutputEnable = pinOutputEnable; this->pinSTCP = pinSTCP; this->pinSHCP = pinSHCP; this->pinMR = pinMR; } // void setLevel(int level) { // digitalWrite(pinMR, HIGH); // digitalWrite(pinOutputEnable, LOW); // // 00000000 - 0 // // 10000000 - 1 // // 11000000 - 3 // // 11100000 - 7 // // 11110000 - 15 // // 11111000 - 31 // // 11111100 - 63 // // 11111110 - 127 // // 11111111 - 255 // digitalWrite(R_ST_CP, LOW); // Serial.println(level); // if (level <= 0) { // shiftOut(pinDS, pinSHCP, MSBFIRST, 0); // } else if (level <= 5) { // shiftOut(pinDS, pinSHCP, MSBFIRST, 1); // } else if (level <= 10) { // shiftOut(pinDS, pinSHCP, MSBFIRST, 3); // } else if (level <= 15) { // shiftOut(pinDS, pinSHCP, MSBFIRST, 7); // } else if (level <= 20) { // shiftOut(pinDS, pinSHCP, MSBFIRST, 15); // } else if (level <= 25) { // shiftOut(pinDS, pinSHCP, MSBFIRST, 31); // } else if (level <= 30) { // shiftOut(pinDS, pinSHCP, MSBFIRST, 63); // } else if (level <= 35) { // shiftOut(pinDS, pinSHCP, MSBFIRST, 127); // } else if (level > 35) { // shiftOut(pinDS, pinSHCP, MSBFIRST, 255); // } // digitalWrite(R_ST_CP, HIGH); // } byte getBytesSequenceForNumber(int number, bool zeroAsNo = 0, bool dot = 0) { byte data = B00000000; if (number == 0) { if (zeroAsNo) { data = B00000000; } else { data = B11010111; } } else if (number == 1) { data = B01010000; } else if (number == 2) { data = B11100110; } else if (number == 3) { data = B11110100; } else if (number == 4) { data = B01110001; } else if (number == 5) { data = B10110101; } else if (number == 6) { data = B10110111; } else if (number == 7) { data = B11010000; } else if (number == 8) { data = B11110111; } else if (number == 9) { data = B11110101; } if (dot) { data = data | B00001000; } return data; } void display(float value) { Serial.println("display"); byte data; int valueInteger = 100 * value; Serial.println(valueInteger); int a = valueInteger % 10; int b = (valueInteger - a) % 100; int c = (valueInteger - a - b) % 1000; int d = (valueInteger - a - b - d) % 10000; // a = a / 10; b = b / 10; c = c / 100; d = d / 1000; int toSlide[4] = {d, c, b, a}; digitalWrite(pinMR, HIGH); digitalWrite(pinOutputEnable, LOW); int dd = 0; if (lastMethod == 0) { digitalWrite(R_ST_CP, LOW); shiftOut(pinDS, pinSHCP, LSBFIRST, B10000000); shiftOut(pinDS, pinSHCP, LSBFIRST, segmentsCharMaps[d]); digitalWrite(R_ST_CP, HIGH); delay(dd); digitalWrite(R_ST_CP, LOW); shiftOut(pinDS, pinSHCP, LSBFIRST, B01000000); shiftOut(pinDS, pinSHCP, LSBFIRST, segmentsCharMaps[c]); digitalWrite(R_ST_CP, HIGH); delay(dd); digitalWrite(R_ST_CP, LOW); shiftOut(pinDS, pinSHCP, LSBFIRST, B00100000); shiftOut(pinDS, pinSHCP, LSBFIRST, segmentsCharMaps[b]); digitalWrite(R_ST_CP, HIGH); delay(dd); digitalWrite(R_ST_CP, LOW); shiftOut(pinDS, pinSHCP, LSBFIRST, B00010000); shiftOut(pinDS, pinSHCP, LSBFIRST, segmentsCharMaps[a]); digitalWrite(R_ST_CP, HIGH); delay(dd); lastMethod++; } else if (lastMethod == 1) { digitalWrite(R_ST_CP, LOW); shiftOut(pinDS, pinSHCP, LSBFIRST, B01000000); shiftOut(pinDS, pinSHCP, LSBFIRST, segmentsCharMaps[c]); digitalWrite(R_ST_CP, HIGH); delay(dd); digitalWrite(R_ST_CP, LOW); shiftOut(pinDS, pinSHCP, LSBFIRST, B00100000); shiftOut(pinDS, pinSHCP, LSBFIRST, segmentsCharMaps[b]); digitalWrite(R_ST_CP, HIGH); delay(dd); digitalWrite(R_ST_CP, LOW); shiftOut(pinDS, pinSHCP, LSBFIRST, B00010000); shiftOut(pinDS, pinSHCP, LSBFIRST, segmentsCharMaps[a]); digitalWrite(R_ST_CP, HIGH); delay(dd); digitalWrite(R_ST_CP, LOW); shiftOut(pinDS, pinSHCP, LSBFIRST, B10000000); shiftOut(pinDS, pinSHCP, LSBFIRST, segmentsCharMaps[d]); digitalWrite(R_ST_CP, HIGH); delay(dd); lastMethod++; } else if (lastMethod == 2) { digitalWrite(R_ST_CP, LOW); shiftOut(pinDS, pinSHCP, LSBFIRST, B00100000); shiftOut(pinDS, pinSHCP, LSBFIRST, segmentsCharMaps[b]); digitalWrite(R_ST_CP, HIGH); delay(dd); digitalWrite(R_ST_CP, LOW); shiftOut(pinDS, pinSHCP, LSBFIRST, B00010000); shiftOut(pinDS, pinSHCP, LSBFIRST, segmentsCharMaps[a]); digitalWrite(R_ST_CP, HIGH); delay(dd); digitalWrite(R_ST_CP, LOW); shiftOut(pinDS, pinSHCP, LSBFIRST, B10000000); shiftOut(pinDS, pinSHCP, LSBFIRST, segmentsCharMaps[d]); digitalWrite(R_ST_CP, HIGH); delay(dd); digitalWrite(R_ST_CP, LOW); shiftOut(pinDS, pinSHCP, LSBFIRST, B01000000); shiftOut(pinDS, pinSHCP, LSBFIRST, segmentsCharMaps[c]); digitalWrite(R_ST_CP, HIGH); delay(dd); lastMethod++; } else if (lastMethod == 3) { digitalWrite(R_ST_CP, LOW); shiftOut(pinDS, pinSHCP, LSBFIRST, B00010000); shiftOut(pinDS, pinSHCP, LSBFIRST, segmentsCharMaps[a]); digitalWrite(R_ST_CP, HIGH); delay(dd); digitalWrite(R_ST_CP, LOW); shiftOut(pinDS, pinSHCP, LSBFIRST, B01000000); shiftOut(pinDS, pinSHCP, LSBFIRST, segmentsCharMaps[c]); digitalWrite(R_ST_CP, HIGH); delay(dd); digitalWrite(R_ST_CP, LOW); shiftOut(pinDS, pinSHCP, LSBFIRST, B00100000); shiftOut(pinDS, pinSHCP, LSBFIRST, segmentsCharMaps[b]); digitalWrite(R_ST_CP, HIGH); delay(dd); digitalWrite(R_ST_CP, LOW); shiftOut(pinDS, pinSHCP, LSBFIRST, B10000000); shiftOut(pinDS, pinSHCP, LSBFIRST, segmentsCharMaps[d]); digitalWrite(R_ST_CP, HIGH); delay(dd); lastMethod = 0; } // for(int i = 0; i < 4; i++) { // digitalWrite(R_ST_CP, LOW); // if (i == 0) { // shiftOut(pinDS, pinSHCP, LSBFIRST, B10000000); // shiftOut(pinDS, pinSHCP, LSBFIRST, segmentsCharMaps[toSlide[i]]); // // shiftOut(pinDS, pinSHCP, LSBFIRST, getBytesSequenceForNumber(toSlide[i], 1)); // } else if (i == 1) { // shiftOut(pinDS, pinSHCP, LSBFIRST, B01000000); // shiftOut(pinDS, pinSHCP, LSBFIRST, segmentsCharMaps[toSlide[i]]); // // shiftOut(pinDS, pinSHCP, LSBFIRST, getBytesSequenceForNumber(toSlide[i], 0, 1)); // } else if (i == 2) { // shiftOut(pinDS, pinSHCP, LSBFIRST, B00100000); // shiftOut(pinDS, pinSHCP, LSBFIRST, segmentsCharMaps[toSlide[i]]); // // shiftOut(pinDS, pinSHCP, LSBFIRST, getBytesSequenceForNumber(toSlide[i])); // } else if (i == 3) { // shiftOut(pinDS, pinSHCP, LSBFIRST, B00010000); // shiftOut(pinDS, pinSHCP, LSBFIRST, segmentsCharMaps[toSlide[i]]); // // shiftOut(pinDS, pinSHCP, LSBFIRST, getBytesSequenceForNumber(toSlide[i])); // } // digitalWrite(R_ST_CP, HIGH); // // digitalWrite(R_ST_CP, LOW); // // shiftOut(pinDS, pinSHCP, LSBFIRST, B00000000); // // shiftOut(pinDS, pinSHCP, LSBFIRST, B00000000); // // digitalWrite(R_ST_CP, HIGH); // } } }; // void setup() { Serial.begin(9600); pinMode(R_DS, OUTPUT); pinMode(R_SH_CP, OUTPUT); pinMode(R_MR, OUTPUT); pinMode(R_ST_CP, OUTPUT); pinMode(R_OUTPUT_ENABLE, OUTPUT); pinMode(TEMPERATURE_INPUT, INPUT); } DiodesDisplay* diodesDisplay = new DiodesDisplay(R_DS, R_OUTPUT_ENABLE, R_ST_CP, R_SH_CP, R_MR); double lastC = 0; void loop() { Serial.println("loop"); double v = analogRead(TEMPERATURE_INPUT) * 0.0048; double c = v * 100; if (abs(lastC - c) > 0.5) { diodesDisplay->display(c); lastC = c; } else { diodesDisplay->display(lastC); } }
  3. Po zmontowaniu, układ działał, ale pozostawiał wiele do życzenia. Np. przy MR(HIGH), DS(LOW) i przy zwarciu STCP, pierwsza dioda gasła, czasami gasły dwie na raz, albo wszystkie. Rozumiem, że jest to spowodowane tym, że sygnał na STCP może mieć jedno wzgórze (co jest ok), lub kilka co powoduje, że tych przesunięć jest więcej (to jest źle, to trzeba usunąć). Analogiczna sytuacja jest gdy na DS mam HIGH. Wtedy zapalała się jedna dioda lub kilka na raz. Aby zaradzić powyżej sytuacji dodałem dwa tranzystory na STCP i SHCP. Po dodaniu sytuacja się poprawiła, ale nie jest idealna. Nie udało mi się przetestować przypadku gdy wprowadzam zmiany tylko we wewnętrznym rejestrze, a potem za pomocą SHCP i STCP przenosimy je na wyjście. W dokumentacji doczytałem, że aby przenieść z rejestru przesuwnego na rejestr wyjściowy trzeba na SHCP i STCP dać wzgórze. Domyślam się, że to nie zadziałało ponieważ te wzgórza pojawiły się w złym czasie względem siebie (ale to są moje domysły). Drugi problem to przyciski, te typu TACT zamieniłem taką listwę przełączników (na zdjęciach nie jest podpięta, ale działa). Sytuacja jest poprawiła, ale też nie jest idealna. Zastanawiam się, czy przełącznik dźwigniowy np. NINIGI TS-19. Dzięki za info, zapoznam się z tematem Wrzuciłem kilka zdjęć poniżej.
  4. To dobrze, fajnie to usłyszeć Ok, dobrze wiedzieć To jest moje przeoczenie Wyszedłem z błędnego założenia, że po lewej stronie mam wyjścia a po prawej wejścia. Dlatego tego Q0 nie zauważyłem. Taki układ, jak na moje potrzeby na ten moment mnie zadowala. Myślę, że gdzieś następnym krokiem będzie właśnie ulepszenie tych elementów. Myślę, że to pomysł na kolejny projekt. Myślę, że mnie zachęciłeś, im trudniej tym więcej satysfakcji jak się ten rozgryzie Wniosków jest pełno, za to jestem wdzięczny Aktualnie, czekam na "kwant wolnego czasu". Jaki taki zdobędę to zrealizuje układ i wrzucę na forum wyniki.
  5. @marek1707 Szacunek, dzięki że poświęciłeś czasu, aby to tak opis. Przeczytałem, mam nadzieje, że dobrze to zrozumiałem, jeśli nie to wybacz mi
  6. Cześć, poniżej wrzuciłem Jak ten układ zmontowałem w pierwszej wersji to nic nie działało tak jak bym się spodziewał. Nawet zauważyłem, że nie muszę przyciskać przycisków aby jakieś tam napięcie się pojawiało. Nie wiem czy jest to możliwe ale tak to wyglądało. Próbowałem, zwierać bezpośrednio, efekt był taki sam. @marek1707, zgadzam się z tobą, że nie zachowałem się kulturalnie nie odnosząc się do każdej z odpowiedzi. Przeanalizowałem twoje rady i naniosłem zmiany na schemat. Schemat wrzuciłem, jeśli jest OK to przeniosę go na płytkę prototypową. Opornik R11 to 1K. Dzięki @atMegaTona za naniesione poprawki Rozumiem, że Q0 i Q7 po prawej i po lewe stronie sto te same wyjścia ?
  7. Cześć, Dzięki za odpowiedzi. Mam wrażenie, że ten układ mi się spalił. Po podłączeniu diody migały przez chwilę, a teraz palą się wszystkie lub żadna.
  8. Zrobiłem układ z wykorzystaniem rejestru przesuwnego 74HC595. W układzie nie użyłem Arduino tylko zwykłe przyciski. Ogólnie nie działa to poprawnie, świecą się wszystkie diody, albo migają. Jaka może być przyczyna ?
×
×
  • Utwórz nowe...