farmaceuta Lipiec 24, 2022 Udostępnij Lipiec 24, 2022 4 minuty temu, ethanak napisał: Rozumiem ze chodzi o samą koncepcję a nie konkretny kod. Tak tak..jak najbardziej chodzi o koncepcję...napewno się to kiedyś przydać może gdzie trzeba będzie wpisać jakąś liczbe do sterowania... dzięki za odpowiedź 😉 Cytuj Link do komentarza Share on other sites More sharing options...
prezesedi Lipiec 25, 2022 Autor tematu Udostępnij Lipiec 25, 2022 Tak więc po dłuższym zastanowieniu, przyuczeniu i pogmeraniu w kodzie z pomocą "sami wiecie kogo" 🙂 otrzymałem oto taki kod: #include <Keypad.h> // ustawienie klawiatury const byte ROWS = 4; //cztery rzędy const byte COLS = 4; //trzy kolumny char hexaKeys[ROWS][COLS] = { {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'}}; // podłączenie klawiatury do Arduino byte rowPins[ROWS] = {9, 8, 7, 6}; //Piny, do których podłączamy wyprowadzenia od rzędów byte colPins[COLS] = {5, 4, 3, 2}; //Piny, do których podłączamy wyprowadzenia od kolumn Keypad keypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS ); static uint32_t seqKeyTimer; static uint8_t seqKeyState; #define SEQKEY_TIMEOUT 1500UL #define SEQ_PREFIX(a) ((char *)((a) >> 8)) #define SEQ_KEY(a) ((char *)((a) & 255)) #define SEQ_COMBINE(prefix, key) ((((prefix) << 8) & 0xff00) | ((key) & 0xff)) uint16_t getSequenceKey(void) { uint8_t k = keypad.getKey(); if (!k) { // zapominamy o wciśnięciu prefiksu jeśli za długo się namyślamy if (seqKeyState && millis() - seqKeyTimer > SEQKEY_TIMEOUT) { seqKeyState = 0; } return 0; } if (k >= 'A' && k <= 'D') { seqKeyState = k; seqKeyTimer = millis(); return 0; } if (!seqKeyState) { // nie było prefiksu return 0; } uint16_t rc = (seqKeyState << 8) | k; seqKeyState = 0; return rc; } void setup() { pinMode(A0, OUTPUT); //Dioda zielona pinMode(10, OUTPUT); //Dioda pomarańczowa1 pinMode(11, OUTPUT); //Dioda czerwona pinMode(12, OUTPUT); //Dioda pomarańczowa2 pinMode(13, OUTPUT); //Dioda biała digitalWrite(A0, LOW); //Wyłączenie diod digitalWrite(10, LOW); digitalWrite(11, LOW); digitalWrite(12, LOW); digitalWrite(13, LOW); } void loop() { uint16_t key = getSequenceKey(); switch(key) { case SEQ_COMBINE('A','1'): // kod dla wyświetlania S1 Serial.println("OK"); digitalWrite(A0, LOW); digitalWrite(10, LOW); digitalWrite(11, HIGH); //czerwona digitalWrite(12, LOW); digitalWrite(13, LOW); break; case SEQ_COMBINE('A','2'): // kod dla wyświetlania S2 Serial.println("OK"); digitalWrite(A0, HIGH); //zielona digitalWrite(10, LOW); digitalWrite(11, LOW); digitalWrite(12, LOW); digitalWrite(13, LOW); break; case SEQ_COMBINE('A','3'): // kod dla wyświetlania S3 Serial.println("OK"); digitalWrite(A0, HIGH); //zielona on digitalWrite(10, LOW); digitalWrite(11, LOW); digitalWrite(12, LOW); digitalWrite(13, LOW); delay(500); digitalWrite(A0, LOW); //zielona off digitalWrite(10, LOW); digitalWrite(11, LOW); digitalWrite(12, LOW); digitalWrite(13, LOW); delay(500); break; case SEQ_COMBINE('A','4'): // kod dla wyświetlania S4 Serial.println("OK"); digitalWrite(A0, LOW); digitalWrite(10, HIGH); //pomarańczowa1 on digitalWrite(11, LOW); digitalWrite(12, LOW); digitalWrite(13, LOW); delay(500); digitalWrite(A0, LOW); digitalWrite(10, LOW); //pomarańczowa1 off digitalWrite(11, LOW); digitalWrite(12, LOW); digitalWrite(13, LOW); delay(500); break; case SEQ_COMBINE('A','5'): // kod dla wyświetlania S5 Serial.println("OK"); digitalWrite(A0, LOW); digitalWrite(10, HIGH); //pomarańczowa1 digitalWrite(11, LOW); digitalWrite(12, LOW); digitalWrite(13, LOW); break; case SEQ_COMBINE('A','6'): // kod dla wyświetlania S10 Serial.println("OK"); digitalWrite(A0, HIGH); //zielona digitalWrite(10, LOW); digitalWrite(11, LOW); digitalWrite(12, HIGH); //pomarańczowa2 digitalWrite(13, LOW); break; case SEQ_COMBINE('A','7'): // kod dla wyświetlania S11 Serial.println("OK"); digitalWrite(A0, HIGH); //zielona on digitalWrite(10, LOW); digitalWrite(11, LOW); digitalWrite(12, HIGH); //pomarańczowa2 digitalWrite(13, LOW); delay(500); digitalWrite(A0, LOW); //zielona off digitalWrite(10, LOW); digitalWrite(11, LOW); digitalWrite(12, HIGH); //pomarańczowa2 digitalWrite(13, LOW); delay(500); break; case SEQ_COMBINE('A','8'): // kod dla wyświetlania S12 Serial.println("OK"); digitalWrite(A0, LOW); digitalWrite(10, HIGH); //pomarańczowa1 on digitalWrite(11, LOW); digitalWrite(12, HIGH); //pomarańczowa2 digitalWrite(13, LOW); delay(500); digitalWrite(A0, LOW); digitalWrite(10, LOW); //pomarańczowa1 off digitalWrite(11, LOW); digitalWrite(12, HIGH); //pomarańczowa2 digitalWrite(13, LOW); delay(500); break; case SEQ_COMBINE('A','9'): // kod dla wyświetlania S13 Serial.println("OK"); digitalWrite(A0, LOW); digitalWrite(10, HIGH); //pomarańczowa1 digitalWrite(11, LOW); digitalWrite(12, HIGH); //pomarańczowa2 digitalWrite(13, LOW); break; case SEQ_COMBINE('A','0'): // kod dla wyświetlania Sz Serial.println("OK"); digitalWrite(A0, LOW); digitalWrite(10, LOW); digitalWrite(11, HIGH); //czerwona digitalWrite(12, LOW); digitalWrite(13, HIGH); //biała on delay(500); digitalWrite(A0, LOW); digitalWrite(10, LOW); digitalWrite(11, HIGH); //czerwona digitalWrite(12, LOW); digitalWrite(13, LOW); //biała off delay(500); break; } } dziwne jest to, że wszystkie migające sygnały, w zasadzie migną raz i pozostają wyłączone. Przykładowo dla A0 (sygnał Sz) zaświecają się czerwona z białą, po czym biała gaśnie i nic więcej się nie dzieje. 1 Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Lipiec 25, 2022 Udostępnij Lipiec 25, 2022 2 godziny temu, prezesedi napisał: Przykładowo dla A0 (sygnał Sz) zaświecają się czerwona z białą, po czym biała gaśnie i nic więcej się nie dzieje. Przecież tak masz w programie: Zapal czerwona i białą Poczekaj pół sekundy Zgaś białą Poczekaj pół sekundy czort wie po co Nic nie rób dalej Pisałem jak ma wyglądać funkcja loop, bez żadnych ifów, casów, switchów, tylko wywołanie funkcji odpowiedzialnych za dany fragment programu, a Ty się upierasz zrobić po swojemu. To co ja mam w tej sytuacji zrobić? Dopisywać kolejne linijki to tego gniota? Cytuj Link do komentarza Share on other sites More sharing options...
prezesedi Maj 28, 2023 Autor tematu Udostępnij Maj 28, 2023 Witam wszystkich Forumowiczów po blisko rocznej przerwie. Z wielką pomocą kolegów @ethanak oraz @farmaceuta uzyskałem kod potrzebny do sterowania dwoma zestawami po 5szt. diod (w domyśle dwa semafory z 5 sygnalizatorami) za pomocą klawiatury. Schemat i kod prezentują się następująco: #include <Keypad.h> bool stanA = 0; bool stanB = 0; uint32_t aktualnyczas = 0; static uint8_t semA = 0; static uint8_t semB = 0; uint16_t key = 0; // ustawienie klawiatury const byte ROWS = 4; //cztery rzędy const byte COLS = 4; //cztery kolumny char hesemAaKeys[ROWS][COLS] = { {'1', '2', '3', 'A'}, {'4', '5', '6', 'B'}, {'7', '8', '9', 'C'}, {'*', '0', '#', 'D'}, }; // podłączenie klawiatury do Arduino byte rowPins[ROWS] = {9, 8, 7, 6}; //Piny, do których podłączamy wyprowadzenia od rzędów byte colPins[COLS] = {5, 4, 3, 2}; //Piny, do których podłączamy wyprowadzenia od kolumn Keypad keypad = Keypad(makeKeymap(hesemAaKeys), rowPins, colPins, ROWS, COLS ); static uint32_t seqKeyTimer; static uint8_t seqKeyState; #define SEQKEY_TIMEOUT 1500UL #define SEQ_PREFIsemA(a) ((char *)((a) >> 8)) #define SEQ_KEY(a) ((char *)((a) & 255)) #define SEQ_COMBINE(prefix, key) ((((prefix) << 8) & 0xff00) | ((key) & 0xff)) uint16_t getSequenceKey(void) { uint8_t k = keypad.getKey(); if (!k) { // zapominamy o wciśnięciu prefiksu jeśli za długo się namyślamy if (seqKeyState && millis() - seqKeyTimer > SEQKEY_TIMEOUT) { seqKeyState = 0; } return 0; } if (k >= 'A' && k <= 'D') { seqKeyState = k; seqKeyTimer = millis(); return 0; } if (!seqKeyState) { // nie było prefiksu return 0; } uint16_t rc = (seqKeyState << 8) | k; seqKeyState = 0; return rc; } void setup() { pinMode(A0, OUTPUT); //Dioda zielona (sem.1) pinMode(10, OUTPUT); //Dioda pomarańczowa1 (sem.1) pinMode(11, OUTPUT); //Dioda czerwona (sem.1) pinMode(12, OUTPUT); //Dioda pomarańczowa2 (sem.1) pinMode(13, OUTPUT); //Dioda biała (sem.1) pinMode(A1, OUTPUT); //Dioda zielona (sem.2) pinMode(A2, OUTPUT); //Dioda pomarańczowa1 (sem.2) pinMode(A3, OUTPUT); //Dioda czerwona (sem.2) pinMode(A4, OUTPUT); //Dioda pomarańczowa2 (sem.2) pinMode(A5, OUTPUT); //Dioda biała (sem.2) digitalWrite(A0, LOW); digitalWrite(10, LOW); digitalWrite(11, HIGH); digitalWrite(12, LOW); digitalWrite(13, LOW); digitalWrite(A1, LOW); digitalWrite(A2, LOW); digitalWrite(A3, HIGH); digitalWrite(A4, LOW); digitalWrite(A5, LOW); } void loop() { aktualnyczas = millis(); key = getSequenceKey(); key_semafor(); semaforA(); semaforB(); } bool timA(int X) { static uint32_t last; if (aktualnyczas - last > X) { last = aktualnyczas; stanA = !stanA; return true; } return false; } bool timB(int X) { static uint32_t last; if (aktualnyczas - last > X) { last = aktualnyczas; stanB = !stanB; return true; } return false; } void key_semafor() { switch (key) { case SEQ_COMBINE('A', '1'): semA = 0; stanA = 0; break; case SEQ_COMBINE('A', '2'): semA = 1; stanA = 0; break; case SEQ_COMBINE('A', '3'): semA = 2; stanA = 0; break; case SEQ_COMBINE('A', '4'): semA = 3; stanA = 0; break; case SEQ_COMBINE('A', '5'): semA = 4; stanA = 0; break; case SEQ_COMBINE('A', '6'): semA = 5; stanA = 0; break; case SEQ_COMBINE('A', '7'): semA = 6; stanA = 0; break; case SEQ_COMBINE('A', '8'): semA = 7; stanA = 0; break; case SEQ_COMBINE('A', '9'): semA = 8; stanA = 0; break; case SEQ_COMBINE('A', '0'): semA = 9; stanA = 0; break; case SEQ_COMBINE('B', '1'): semB = 10; stanB = 0; break; case SEQ_COMBINE('B', '2'): semB = 11; stanB = 0; break; case SEQ_COMBINE('B', '3'): semB = 12; stanB = 0; break; case SEQ_COMBINE('B', '4'): semB = 13; stanB = 0; break; case SEQ_COMBINE('B', '5'): semB = 14; stanB = 0; break; case SEQ_COMBINE('B', '6'): semB = 15; stanB = 0; break; case SEQ_COMBINE('B', '7'): semB = 16; stanB = 0; break; case SEQ_COMBINE('B', '8'): semB = 17; stanB = 0; break; case SEQ_COMBINE('B', '9'): semB = 18; stanB = 0; break; case SEQ_COMBINE('B', '0'): semB = 19; stanB = 0; break; } } void semaforA() { switch (semA) { case 0: // kod dla wyświetlania "S1-sem.1" ledA(0, 0, 1, 0, 0); break; case 1: // kod dla wyświetlania "S2-sem.1" ledA(1, 0, 0, 0, 0); break; case 2: // kod dla wyświetlania "S3-sem.1" if (stanA == 0 && timA(500)) { ledA(1, 0, 0, 0, 0); } if (stanA == 1 && timA(500)) { ledA(0, 0, 0, 0, 0); } break; case 3: // kod dla wyświetlania "S4-sem.1" if (stanA == 0 && timA(500)) { ledA(0, 1, 0, 0, 0); } if (stanA == 1 && timA(500)) { ledA(0, 0, 0, 0, 0); } break; case 4: // kod dla wyświetlania "S5-sem.1" ledA(0, 1, 0, 0, 0); break; case 5: // kod dla wyświetlania "S10-sem.1" ledA(1, 0, 0, 1, 0); break; case 6: // kod dla wyświetlania "S11-sem.1" if (stanA == 0 && timA(500)) { ledA(1, 0, 0, 1, 0); } if (stanA == 1 && timA(500)) { ledA(0, 0, 0, 1, 0); } break; case 7: // kod dla wyświetlania "S12-sem.1" if (stanA == 0 && timA(500)) { ledA(0, 1, 0, 1, 0); } if (stanA == 1 && timA(500)) { ledA(0, 0, 0, 1, 0); } break; case 8: // kod dla wyświetlania "S13-sem.1" ledA(0, 1, 0, 1, 0); break; case 9: // kod dla wyświetlania "Sz-sem.1" if (stanA == 0 && timA(500)) { ledA(0, 0, 1, 0, 1); } if (stanA == 1 && timA(500)) { ledA(0, 0, 1, 0, 0); } break; } } void semaforB() { switch (semB) { case 10: // kod dla wyświetlania "S1-sem.2" ledB(0, 0, 1, 0, 0); break; case 11: // kod dla wyświetlania "S2-sem.2" ledB(1, 0, 0, 0, 0); break; case 12: // kod dla wyświetlania "S3-sem.2" if (stanB == 0 && timB(500)) { ledB(1, 0, 0, 0, 0); } if (stanB == 1 && timB(500)) { ledB(0, 0, 0, 0, 0); } break; case 13: // kod dla wyświetlania "S4-sem.2" if (stanB == 0 && timB(500)) { ledB(0, 1, 0, 0, 0); } if (stanB == 1 && timB(500)) { ledB(0, 0, 0, 0, 0); } break; case 14: // kod dla wyświetlania "S5-sem.2" ledB(0, 1, 0, 0, 0); break; case 15: // kod dla wyświetlania "S10-sem.2" ledB(1, 0, 0, 1, 0); break; case 16: // kod dla wyświetlania "S11-sem.2" if (stanB == 0 && timB(500)) { ledB(1, 0, 0, 1, 0); } if (stanB == 1 && timB(500)) { ledB(0, 0, 0, 1, 0); } break; case 17: // kod dla wyświetlania "S12-sem.2" if (stanB == 0 && timB(500)) { ledB(0, 1, 0, 1, 0); } if (stanB == 1 && timB(500)) { ledB(0, 0, 0, 1, 0); } break; case 18: // kod dla wyświetlania "S13-sem.2" ledB(0, 1, 0, 1, 0); break; case 19: // kod dla wyświetlania "Sz-sem.2" if (stanB == 0 && timB(500)) { ledB(0, 0, 1, 0, 1); } if (stanB == 1 && timB(500)) { ledB(0, 0, 1, 0, 0); } break; } } void ledA(bool a, bool b, bool c, bool d, bool e) { digitalWrite(A0, a); digitalWrite(10, b); digitalWrite(11, c); digitalWrite(12, d); digitalWrite(13, e); } void ledB(bool a, bool b, bool c, bool d, bool e) { digitalWrite(A1, a); digitalWrite(A2, b); digitalWrite(A3, c); digitalWrite(A4, d); digitalWrite(A5, e); } Posiadam też 4 zestawy po 2szt. diod, sterowane analogicznie i z przerobionym nieco kodem: #include <Keypad.h> bool stanA = 0; bool stanB = 0; bool stanC = 0; bool stanD = 0; uint32_t aktualnyczas = 0; static uint8_t semA = 0; static uint8_t semB = 0; static uint8_t semC = 0; static uint8_t semD = 0; uint16_t key = 0; // ustawienie klawiatury const byte ROWS = 4; //cztery rzędy const byte COLS = 4; //cztery kolumny char hesemAaKeys[ROWS][COLS] = { {'1', '2', '3', 'A'}, {'4', '5', '6', 'B'}, {'7', '8', '9', 'C'}, {'*', '0', '#', 'D'}, }; // podłączenie klawiatury do Arduino byte rowPins[ROWS] = {9, 8, 7, 6}; //Piny, do których podłączamy wyprowadzenia od rzędów byte colPins[COLS] = {5, 4, 3, 2}; //Piny, do których podłączamy wyprowadzenia od kolumn Keypad keypad = Keypad(makeKeymap(hesemAaKeys), rowPins, colPins, ROWS, COLS ); static uint32_t seqKeyTimer; static uint8_t seqKeyState; #define SEQKEY_TIMEOUT 1500UL #define SEQ_PREFIsemA(a) ((char *)((a) >> 8)) #define SEQ_KEY(a) ((char *)((a) & 255)) #define SEQ_COMBINE(prefix, key) ((((prefix) << 8) & 0xff00) | ((key) & 0xff)) uint16_t getSequenceKey(void) { uint8_t k = keypad.getKey(); if (!k) { // zapominamy o wciśnięciu prefiksu jeśli za długo się namyślamy if (seqKeyState && millis() - seqKeyTimer > SEQKEY_TIMEOUT) { seqKeyState = 0; } return 0; } if (k >= 'A' && k <= 'D') { seqKeyState = k; seqKeyTimer = millis(); return 0; } if (!seqKeyState) { // nie było prefiksu return 0; } uint16_t rc = (seqKeyState << 8) | k; seqKeyState = 0; return rc; } void setup() { pinMode(10, OUTPUT); //Dioda niebieska (Tm.1) pinMode(11, OUTPUT); //Dioda biała (Tm.1) pinMode(12, OUTPUT); //Dioda niebieska (Tm.2) pinMode(A5, OUTPUT); //Dioda biała (Tm.2) pinMode(A4, OUTPUT); //Dioda niebieska (Tm.3) pinMode(A3, OUTPUT); //Dioda biała (Tm.3) pinMode(A2, OUTPUT); //Dioda niebieska (Tm.4) pinMode(A1, OUTPUT); //Dioda biała (Tm.4) digitalWrite(10, HIGH); digitalWrite(11, LOW); digitalWrite(12, HIGH); digitalWrite(A5, LOW); digitalWrite(A4, HIGH); digitalWrite(A3, LOW); digitalWrite(A2, HIGH); digitalWrite(A1, LOW); } void loop() { aktualnyczas = millis(); key = getSequenceKey(); key_semafor(); semaforA(); semaforB(); semaforC(); semaforD(); } bool timA(int X) { static uint32_t last; if (aktualnyczas - last > X) { last = aktualnyczas; stanA = !stanA; return true; } return false; } bool timB(int X) { static uint32_t last; if (aktualnyczas - last > X) { last = aktualnyczas; stanB = !stanB; return true; } return false; } bool timC(int X) { static uint32_t last; if (aktualnyczas - last > X) { last = aktualnyczas; stanC = !stanC; return true; } return false; } bool timD(int X) { static uint32_t last; if (aktualnyczas - last > X) { last = aktualnyczas; stanD = !stanD; return true; } return false; } void key_semafor() { switch (key) { case SEQ_COMBINE('A', '1'): semA = 0; stanA = 0; break; case SEQ_COMBINE('A', '2'): semA = 1; stanA = 0; break; case SEQ_COMBINE('A', '0'): semA = 2; stanA = 0; break; case SEQ_COMBINE('B', '1'): semB = 3; stanB = 0; break; case SEQ_COMBINE('B', '2'): semB = 4; stanB = 0; break; case SEQ_COMBINE('B', '0'): semB = 5; stanB = 0; break; case SEQ_COMBINE('C', '1'): semC = 6; stanC = 0; break; case SEQ_COMBINE('C', '2'): semC = 7; stanC = 0; break; case SEQ_COMBINE('C', '0'): semC = 8; stanC = 0; break; case SEQ_COMBINE('D', '1'): semD = 9; stanD = 0; break; case SEQ_COMBINE('D', '2'): semD = 10; stanD = 0; break; case SEQ_COMBINE('D', '0'): semD = 11; stanD = 0; break; } } void semaforA() { switch (semA) { case 0: // kod dla wyświetlania "Ms1-Tm.1" lub "S1-Tz.1" ledA(1, 0); break; case 1: // kod dla wyświetlania "Ms2-Tm.1" ledA(0, 1); break; case 2: // kod dla wyświetlania "Sz-Tz.1" if (stanA == 0 && timA(500)) { ledA(1, 1); } if (stanA == 1 && timA(500)) { ledA(1, 0); } break; } } void semaforB() { switch (semB) { case 3: // kod dla wyświetlania "Ms1-Tm.2" lub "S1-Tz.2" ledB(1, 0); break; case 4: // kod dla wyświetlania "Ms2-Tm.2" ledB(0, 1); break; case 5: // kod dla wyświetlania "Sz-Tz.2" if (stanB == 0 && timB(500)) { ledB(1, 1); } if (stanB == 1 && timB(500)) { ledB(1, 0); } break; } } void semaforC() { switch (semC) { case 6: // kod dla wyświetlania "Ms1-Tm.3" lub "S1-Tz.3" ledC(1, 0); break; case 7: // kod dla wyświetlania "Ms2-Tm.3" ledC(0, 1); break; case 8: // kod dla wyświetlania "Sz-Tz.3" if (stanC == 0 && timC(500)) { ledC(1, 1); } if (stanC == 1 && timC(500)) { ledC(1, 0); } break; } } void semaforD() { switch (semD) { case 9: // kod dla wyświetlania "Ms1-Tm.4" lub "S1-Tz.4" ledD(1, 0); break; case 10: // kod dla wyświetlania "Ms2-Tm.4" ledD(0, 1); break; case 11: // kod dla wyświetlania "Sz-Tz.4" if (stanD == 0 && timD(500)) { ledD(1, 1); } if (stanD == 1 && timD(500)) { ledD(1, 0); } break; } } void ledA(bool a, bool b) { digitalWrite(10, a); digitalWrite(11, b); } void ledB(bool a, bool b) { digitalWrite(12, a); digitalWrite(A5, b); } void ledC(bool a, bool b) { digitalWrite(A4, a); digitalWrite(A3, b); } void ledD(bool a, bool b) { digitalWrite(A2, a); digitalWrite(A1, b); } Wychodzę do Was Szanowni Forumowicze z prośbą, czy ktoś znajdzie czas, chęć, pomysł na to, by zrobić z tego jedno działające urządzenie? a konkretnie: scalenie 2 kodów w jeden by pracowały na jednym Arduino/ESP32. Wiem, że jest za mało wyjść więc pomyślałem o expanderze PCF8575 możliwość wyboru kombinacji świecenia poprzez komendę 1*x; 2*x itd. (gdzie x to cyfra od 0 do 9). Przykładowo kombinacja 1*1 uruchamia pierwszą z możliwości świecenia diod na 1szym urządzeniu; kombinacja 4*2 uruchamia drugą z możliwości świecenia diod na 4tym urządzeniu. po każdym wyborze kombinacji świecenia, powrót po 30sek. do wyświetlania sygnału głównego (dioda czerwona w przypadku zestawu 5diod i dioda niebieska w przypadku zestawu 2diod) Za wszelką pomoc bardzo dziękuje. Z góry też przepraszam, jeśli coś opisałem niezrozumiale. 1 Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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
farmaceuta Maj 28, 2023 Udostępnij Maj 28, 2023 ..."możliwość wyboru kombinacji świecenia poprzez komendę 1*x; 2*x itd. (gdzie x to cyfra od 0 do 9). Przykładowo kombinacja 1*1 uruchamia pierwszą z możliwości świecenia diod na 1szym urządzeniu; kombinacja 4*2 uruchamia drugą z możliwości świecenia diod na 4tym urządzeniu"... Możesz to jaśniej opisać?? Ile ma być tych kombinacji swiecenia? I ile teraz masz? Cytuj Link do komentarza Share on other sites More sharing options...
prezesedi Maj 28, 2023 Autor tematu Udostępnij Maj 28, 2023 12 minut temu, farmaceuta napisał: Możesz to jaśniej opisać?? Ile ma być tych kombinacji swiecenia? I ile teraz masz? Tak. w tej chwili w każdym przypadku jest możliwość podpięcia 4 urządzeń i wybiera się sygnały poprzez A0, A1, A2, do A9; Kolejne urządzenie B0, B1 do B9, Trzecie C0 do C9 i analogicznie dla czwartego. Literek na klawiaturze więcej nie ma, więc gdyby podpiąć piąte lub dalsze urządzenie (semafor czy tarcza manewrowa zawierające 2 lub 5 diod) to nie ma możliwości wyboru litery E (E0, E1 itd). Więc, zamiast A1 wybierać 1*1; zamiast C9 wybierać3*9 a zamiast E, F, G, H których nie ma wybierać odpowiednio 5*x; 6*x; 7*x; 8*. Do tego potrzebny też też expander by móc zwiększyć ilość wyjść. Cytuj Link do komentarza Share on other sites More sharing options...
farmaceuta Maj 28, 2023 Udostępnij Maj 28, 2023 No a kombinacje świecenia zostają takie jak już są teraz? Cytuj Link do komentarza Share on other sites More sharing options...
prezesedi Maj 28, 2023 Autor tematu Udostępnij Maj 28, 2023 (edytowany) Tak, zostają Tylko gdyby można było zrobić powrót z każdej kombinacji do diody czerwonej (w przypadku 5diod) i diody niebieskiej (w przypadku 2 diod) po powiedzmy 30sek. Edytowano Maj 28, 2023 przez prezesedi 1 Cytuj Link do komentarza Share on other sites More sharing options...
farmaceuta Maj 28, 2023 Udostępnij Maj 28, 2023 9 minut temu, prezesedi napisał: Tylko gdyby można było zrobić powrót z każdej kombinacji do diody czerwonej (w przypadku 5diod) i diody niebieskiej (w przypadku 2 diod) po powiedzmy 30sek. To akurat banał do ogarnięcia w pół minuty... Ile masz tych wszystkich diod? Najlepiej żeby się nie motać to wszystkie te diody wrzucić na expander tylko nie wiem czy jeden wystarczy (8575=16 wyjść) Cytuj Link do komentarza Share on other sites More sharing options...
prezesedi Maj 28, 2023 Autor tematu Udostępnij Maj 28, 2023 Diod mam (w planie oczywiście) 4x5 i 4x2 co daje łącznie 28 potrzebnych pinów Cytuj Link do komentarza Share on other sites More sharing options...
farmaceuta Maj 28, 2023 Udostępnij Maj 28, 2023 A jeszcze odnośnie tego gaszenia po 30s...to wtedy wszystkie diody mają przybrać odpowiedni kolor czy tylko dana sekcja...to jest dosyć ważne Cytuj Link do komentarza Share on other sites More sharing options...
prezesedi Maj 28, 2023 Autor tematu Udostępnij Maj 28, 2023 po 30 sek chciałbym by zawsze wróciło do tego co jest w sekcji kodu "VOID SETUP": czyli digitalWrite(A0, LOW); digitalWrite(10, LOW); digitalWrite(11, HIGH); digitalWrite(12, LOW); digitalWrite(13, LOW); digitalWrite(A1, LOW); digitalWrite(A2, LOW); digitalWrite(A3, HIGH); digitalWrite(A4, LOW); digitalWrite(A5, LOW); i digitalWrite(10, HIGH); digitalWrite(11, LOW); digitalWrite(12, HIGH); digitalWrite(A5, LOW); digitalWrite(A4, HIGH); digitalWrite(A3, LOW); digitalWrite(A2, HIGH); digitalWrite(A1, LOW); Oczywiście wiem, że numeracja pinów się zmieni Cytuj Link do komentarza Share on other sites More sharing options...
farmaceuta Maj 29, 2023 Udostępnij Maj 29, 2023 To nic nie pozostaje jak zakupić expandery i można działać...dwie sztuki by się przydały Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Maj 29, 2023 Udostępnij Maj 29, 2023 A czemu nie magistrala? CAN albo co... Poza tym istnieją lepsze ekspandery niż PCF - choćby możliwość działania z większymi prędkościami niż te rachityczne 100kHz... Cytuj Link do komentarza Share on other sites More sharing options...
farmaceuta Maj 30, 2023 Udostępnij Maj 30, 2023 19 godzin temu, ethanak napisał: A czemu nie magistrala? CAN albo co... Poza tym istnieją lepsze ekspandery niż PCF - choćby możliwość działania z większymi prędkościami niż te rachityczne 100kHz... Nigdy nie używałem CAN itp, a nauczyć się człowiekowi nie chce😜 a co do prędkości PCF'a, można by wybrać MCP23017, ale czy to będzie miało jakąś różnicę w tym projekcie? Wątpię 😉 a przy okazji pytanie...w tym pcf trzeba ustawiać kanały na input lub output? Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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!