Sito89 Luty 1, 2024 Udostępnij Luty 1, 2024 Zadanie 6.3 #define segC 2 #define segE 3 #define segD 4 #define segB 5 #define segG 6 #define segA 7 #define segF 8 #define wys1 10 //wyjścia wyświetlaczy #define wys2 9 int i = 0; //jedynki int j = 0; //dziesiatki void setup() { pinMode (segA, OUTPUT); pinMode (segB, OUTPUT); pinMode (segC, OUTPUT); pinMode (segD, OUTPUT); pinMode (segE, OUTPUT); pinMode (segF, OUTPUT); pinMode (segG, OUTPUT); pinMode(wys1, OUTPUT); pinMode(wys2, OUTPUT); } void loop() { for (j = 0; j < 10; j++) { //pętla dodająca dziesiątki for (i = 0; i < 10; i++) { //pętla dodająca cyfry projekcja(); //funkcja odpowiadająca za multipleksowanie } } } void wyswietlacz(int cyfra) { switch (cyfra) { case 0: digitalWrite(segA, HIGH); digitalWrite(segB, HIGH); digitalWrite(segC, HIGH); digitalWrite(segD, HIGH); digitalWrite(segE, HIGH); digitalWrite(segF, HIGH); digitalWrite(segG, LOW); break; case 1: digitalWrite(segA, LOW); digitalWrite(segB, HIGH); digitalWrite(segC, HIGH); digitalWrite(segD, LOW); digitalWrite(segE, LOW); digitalWrite(segF, LOW); digitalWrite(segG, LOW); break; case 2: digitalWrite(segA, HIGH); digitalWrite(segB, HIGH); digitalWrite(segC, LOW); digitalWrite(segD, HIGH); digitalWrite(segE, HIGH); digitalWrite(segF, LOW); digitalWrite(segG, HIGH); break; case 3: digitalWrite(segA, HIGH); digitalWrite(segB, HIGH); digitalWrite(segC, HIGH); digitalWrite(segD, HIGH); digitalWrite(segE, LOW); digitalWrite(segF, LOW); digitalWrite(segG, HIGH); break; case 4: digitalWrite(segA, LOW); digitalWrite(segB, HIGH); digitalWrite(segC, HIGH); digitalWrite(segD, LOW); digitalWrite(segE, LOW); digitalWrite(segF, HIGH); digitalWrite(segG, HIGH); break; case 5: digitalWrite(segA, HIGH); digitalWrite(segB, LOW); digitalWrite(segC, HIGH); digitalWrite(segD, HIGH); digitalWrite(segE, LOW); digitalWrite(segF, HIGH); digitalWrite(segG, HIGH); break; case 6: digitalWrite(segA, HIGH); digitalWrite(segB, LOW); digitalWrite(segC, HIGH); digitalWrite(segD, HIGH); digitalWrite(segE, HIGH); digitalWrite(segF, HIGH); digitalWrite(segG, HIGH); break; case 7: digitalWrite(segA, HIGH); digitalWrite(segB, HIGH); digitalWrite(segC, HIGH); digitalWrite(segD, LOW); digitalWrite(segE, LOW); digitalWrite(segF, LOW); digitalWrite(segG, LOW); break; case 8: digitalWrite(segA, HIGH); digitalWrite(segB, HIGH); digitalWrite(segC, HIGH); digitalWrite(segD, HIGH); digitalWrite(segE, HIGH); digitalWrite(segF, HIGH); digitalWrite(segG, HIGH); break; case 9: digitalWrite(segA, HIGH); digitalWrite(segB, HIGH); digitalWrite(segC, HIGH); digitalWrite(segD, HIGH); digitalWrite(segE, LOW); digitalWrite(segF, HIGH); digitalWrite(segG, HIGH); break; } } void projekcja() { //funkcja multipleksowania i regulacji czasu for (int k = 0; k < 5; k++) { digitalWrite(wys1, HIGH); digitalWrite(wys2, LOW); wyswietlacz(j); delay(10); digitalWrite(wys1, LOW); digitalWrite(wys2, HIGH); wyswietlacz(i); delay(10); } } 1
FTNewbie Maj 15, 2024 Udostępnij Maj 15, 2024 Tutaj mam zadanie 6.1 oraz 6.2 w jednym #define SEG_C 2 #define SEG_E 3 #define SEG_D 4 #define SEG_B 5 #define SEG_G 8 #define SEG_A 7 #define SEG_F 6 #define BUTTON_INCREMENT 9 #define BUTTON_DECREMENT 10 #define BUTTON_RESET 11 int passNumber = 0; void setup() { //Konfiguracja pinów jako wyjścia 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(BUTTON_INCREMENT, INPUT_PULLUP); pinMode(BUTTON_DECREMENT, INPUT_PULLUP); pinMode(BUTTON_RESET, INPUT_PULLUP); // Test segmentów digitalWrite(SEG_A, HIGH); delay(800); digitalWrite(SEG_B, HIGH); delay(800); digitalWrite(SEG_C, HIGH); delay(800); digitalWrite(SEG_D, HIGH); delay(800); digitalWrite(SEG_E, HIGH); delay(800); digitalWrite(SEG_F, HIGH); delay(800); digitalWrite(SEG_G, HIGH); delay(800); digitalWrite(SEG_A, LOW); digitalWrite(SEG_B, LOW); digitalWrite(SEG_C, LOW); digitalWrite(SEG_D, LOW); digitalWrite(SEG_E, LOW); digitalWrite(SEG_F, LOW); digitalWrite(SEG_G, LOW); } void loop() { if (digitalRead(BUTTON_INCREMENT) == LOW) { passNumber++; displayDigit(passNumber); } else if(digitalRead(BUTTON_DECREMENT) == LOW) { passNumber--; displayDigit(passNumber); } else if(digitalRead(BUTTON_RESET) == LOW) { passNumber = 0; displayDigit(passNumber); } delay(200); } void displayDigit(int digit){ switch (digit){ 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); } } Tutaj link. Jakby wygasł to dajcie znać to wrzucę znowu https://streamable.com/gyvt8b 2
Tymoteus Październik 14, 2024 Udostępnij Październik 14, 2024 Cześć, wprawdzie ja kurs arduino już jakiś czas temu przerobiłem, ale wróciłem przypomnieć sobie (na potrzeby projektu) na czym polegały te wyświetlacze 7-segmentowe. I natrafiłem na to (załącznik): Co autor miał na myśli sugerując iż "katoda" może pobrać więcej jak 20mA i że to jakoś może zaszkodzić arduino. Wspólna katoda zakładając ze każdy pin wyświetlacza 7segmentowego wydaje z arduino max 20mA (przez rezystor ofc) pobiera (7x20) 140mA. No ale to katoda, która idzie do masy GND, więc jakie istnieje ryzyko? Piny arduino ciągną tyle ile mają dozwolone (max 20mA), a masa chyba może przyjąć na siebie 140mA (no chyba, że nie może to proszę mnie poprawić)
jand Październik 14, 2024 Udostępnij Październik 14, 2024 Generalnie w swoich rozważaniach masz rację, ale nie bierzesz pod uwagę, że w przypadku wyświetlacza złożonego z kilku cyfr i ich multipleksowanego sterowania, ktoś mógłby mieć ochotę podłączyć bezpośrednio do Arduino katodę, by wysterować daną cyfrę. A wtedy te zastrzeżenie ma sens.
Sylba Listopad 24, 2024 Udostępnij Listopad 24, 2024 Zauważyłem jedną literówkę w opisie typów tranzystorów użytych do multipleksowania - raz jest BC547, a tuż obok BC546 1
Treker (Damian Szymański) Grudzień 22, 2024 Udostępnij Grudzień 22, 2024 @Sylba gratuluję czujności i dziękuję za sygnał - poprawione
PanMajster Luty 10, 2025 Udostępnij Luty 10, 2025 Hej. Zadanie domowe 6.3 . Jak zrobić by cyfry jednostek dłużej się świeciły? O ile dziesiątki sa ok to jednostki tak szybko sie zmieniają ze nie idzie zobaczyć praktycznie żadnej cyfry. Czy tu by zadziałało to słynne milis którego nie ma w kursie? Jest jakiś prosty sposób? np. więcej powtórzeń pętli for dla wyświetlacza z jednostkami. Próbuje ale to nie działa.. #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 #define WYSW_1 9 #define WYSW_2 10 int q = 0; // dziesiatki int r = 0; // jednostki void setup() { //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); pinMode(WYSW_1, OUTPUT); pinMode(WYSW_2, OUTPUT); } void loop() { for ( q = 0; q < 10; q++) { //petla dla dziesiatek for ( r = 0; r < 10; r++ ){ // petla dla jednostek wyswietlanie(); // funkcja wyswietlajaca cyfry } }} 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; } } void wyswietlanie(){ // funkcja okreslajaca wyswietlanie liczb for (int w = 0; w < 3; w++) digitalWrite(WYSW_1, HIGH); digitalWrite(WYSW_2, LOW); wyswietlacz(q); delay(10); digitalWrite(WYSW_1, LOW); digitalWrite(WYSW_2, HIGH); wyswietlacz(r); delay(10); }
jand Luty 10, 2025 Udostępnij Luty 10, 2025 Nie można spowolnić samych jednostek, a dziesiątek nie, bo wtedy wyświetlacz będzie pokazywał nieprawdę. Trzeba spowolnić cały proces liczenia. Można to zrobić przy pomocy millis(), ale w tym przypadku najprościej wstawić delay(200); gdzieś w pętli loop().
PanMajster Luty 10, 2025 Udostępnij Luty 10, 2025 @jand Wtedy o ile jednostki fajnie dzialaja to dziesiatki mrugaja. tzn wiecej wyświetlacz jest od dziesiątek wyłączony niż włączony. Dobra zostawie to tak jak jest. Może kiedyś do tego wróce
jand Luty 10, 2025 Udostępnij Luty 10, 2025 Musisz więc zróżnicować tempo wyświetlania i zliczania: licznik powinien pracować w miarę wolno, aby było widać zmiany jego zawartości, zaś odświeżanie cyfr szybko by bezwładność oka wytłumiła migotanie. 1
PanMajster Luty 10, 2025 Udostępnij Luty 10, 2025 @jand tylko jak to zrobić? odświeżanie działa dobrze szybko tak jak ma być, tylko problem waśnie ze spowolnieniem licznika
jand Luty 10, 2025 Udostępnij Luty 10, 2025 (edytowany) Żeby całkiem nie burzyć Twojej koncepcji - dodaj jeszcze jeden stopień zliczania (jakby następną cyfrę}. Potraktuj nowe dziesiątki jako jednostki, a nowych jednostek nie wyświetlaj. Twój licznik będzie chodził 10 razy wolniej. Edytowano Luty 10, 2025 przez jand 1 1
Sylba Luty 11, 2025 Udostępnij Luty 11, 2025 Zamiast for można równie prosto użyć if oraz Dnia 10.02.2025 o 14:37, PanMajster napisał: Jak zrobić by cyfry jednostek dłużej się świeciły? O ile dziesiątki sa ok to jednostki tak szybko sie zmieniają ze nie idzie zobaczyć praktycznie żadnej cyfry. Prędkość wyświetlania liczb jest ustawiana przy pomocy funkcji void wyswietlanie(){ // funkcja okreslajaca wyswietlanie liczb for (int w = 0; w < 3; w++) digitalWrite(WYSW_1, HIGH); digitalWrite(WYSW_2, LOW); wyswietlacz(q); delay(10); digitalWrite(WYSW_1, LOW); digitalWrite(WYSW_2, HIGH); wyswietlacz(r); delay(10); U ciebie w < 3. Zwiększ wartość w np. w < 10 i będziesz miał wolne zmiany. Jeśli ustawisz w < 100 zmiany będą jeszcze bardziej wolne.
PanMajster Luty 12, 2025 Udostępnij Luty 12, 2025 @Sylba Niestety ale to nie działa zmieniałem na 2 i na 500 nie ma dosłownie żadnej różnicy.
Pomocna odpowiedź
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ę »