Mikolajkie Napisano Maj 7, 2023 Udostępnij Napisano Maj 7, 2023 (edytowany) Witam mam zagwozdkę dotyczącą kodu w samochodziku Bluetooth z modułem HC-05. Mam funkcję o nazwie mrugnij(), która zawiera kilka krótkich delay'ów i służy do mrugnięcia oczami na matrycy ledowej 8x8 ze sterownikiem MAX7219, ponieważ jest to trochę robocik. Samochód będzie miał również DFPlayer mini. Chodzi mi tylko głównie o to, czy delay'e w funkcji mrugnij() będą opóźniały pętlę loop. W kodzie jest kilka if'ów, które sprawdzają Serial. Na Serial wysyłane jest to, co klikam na telefonie. If'y muszą wykonywać się bez przerwy, bo gdyby wystąpiło niewielkie opóźnienie (nawet 10 milisekund) to wszystko wykonuje się z dużym opóźnieniem (sprawdzałem to). Mi tylko chodzi o to, żeby nie było opóźnienia nawet na 1 milisekundę. Czy przez to, że funkcja mrugnij() się wykonuje opóźni to trochę pętlę loop? Jeśli opóźnia to proszę o pomoc w poprawieniu tego. Czy ktoś mógłby pomóc? #include <LedControl.h> int DIN = A0; int CS = A1; int CLK = A2; char data; unsigned long czas; unsigned long zapamietanyCzas; LedControl lc=LedControl(DIN, CLK, CS, 0); byte smile[8] = {0x00,0x26,0x46,0x40,0x40,0x46,0x26,0x00}; byte half[8] = {0x00,0x24,0x44,0x40,0x40,0x44,0x24,0x00}; byte all[8] = {0x00,0x20,0x40,0x40,0x40,0x40,0x20,0x00}; void setup() { // put your setup code here, to run once: Serial.begin(9600); pinMode(9, OUTPUT); pinMode(10, OUTPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT); pinMode(6, OUTPUT); pinMode(7, OUTPUT); pinMode(12, OUTPUT); analogWrite(9, 175); analogWrite(10, 175); lc.shutdown(0, false); lc.setIntensity(0,15); lc.clearDisplay(0); printByte(smile); } void loop() { // put your main code here, to run repeatedly: if(Serial.available() > 0) { data = Serial.read(); if(data == 'F') { digitalWrite(3, HIGH); digitalWrite(6, HIGH); } else if(data == 'B') { digitalWrite(4, HIGH); digitalWrite(7, HIGH); } else if(data == 'L') { digitalWrite(4, HIGH); digitalWrite(6, HIGH); } else if(data == 'R') { digitalWrite(3, HIGH); digitalWrite(7, HIGH); } else if(data == 'S') { digitalWrite(3, LOW); digitalWrite(4, LOW); digitalWrite(6, LOW); digitalWrite(7, LOW); } else if(data == 'V') { digitalWrite(12, HIGH); } else if(data == 'v') { digitalWrite(12, LOW); } } czas = millis(); if((czas - zapamietanyCzas) >= 4000UL) { zapamietanyCzas = czas; mrugnij(); } } void mrugnij() { printByte(half); delay(100); printByte(all); delay(100); printByte(half); delay(100); printByte(smile); } void printByte(byte character[]) { int i; for(i=0;i<8;i++) { lc.setRow(0,i,character[i]); } } Edytowano Maj 7, 2023 przez Mikolajkie Chciałem dodać szybkie pytanie 1
Mikolajkie Maj 8, 2023 Autor tematu Udostępnij Maj 8, 2023 @Santiago Czy mógłbyś pokazać jak? Dać fragment kodu lub coś? Jestem początkujący.
SOYER Maj 8, 2023 Udostępnij Maj 8, 2023 https://forbot.pl/blog/kurs-arduino-ii-wielozadaniowosc-opoznienia-z-millis-id18418
Mikolajkie Maj 8, 2023 Autor tematu Udostępnij Maj 8, 2023 @SOYER Czytałem to, ale mi chodzi o to, żeby na wyświetlaczu się to zmieniało.
Santiago Maj 8, 2023 Udostępnij Maj 8, 2023 Dzisiaj nie mogę nic pomóc. Przeczytaj i zrozum jak to działa. Powodzenia !
SOYER Maj 8, 2023 Udostępnij Maj 8, 2023 1 godzinę temu, Mikolajkie napisał: @SOYER Czytałem to, ale mi chodzi o to, żeby na wyświetlaczu się to zmieniało. a myślałem, że nie chcesz żadnych opóźnień, przecież nikt Ci zmian na wyświetlaczu nie zakazuje.
farmaceuta Maj 8, 2023 Udostępnij Maj 8, 2023 @Mikolajkie sprawdz teraz..powinno dzialac a jaknie to bedziemy poprawiac #include <LedControl.h> int DIN = A0; int CS = A1; int CLK = A2; char data; unsigned long czas; unsigned long zapamietanyCzas; bool flaga = 0; byte zmienna = 0; uint32_t last = 0; LedControl lc=LedControl(DIN, CLK, CS, 0); byte smile[8] = {0x00,0x26,0x46,0x40,0x40,0x46,0x26,0x00}; byte half[8] = {0x00,0x24,0x44,0x40,0x40,0x44,0x24,0x00}; byte all[8] = {0x00,0x20,0x40,0x40,0x40,0x40,0x20,0x00}; void setup() { // put your setup code here, to run once: Serial.begin(9600); pinMode(9, OUTPUT); pinMode(10, OUTPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT); pinMode(6, OUTPUT); pinMode(7, OUTPUT); pinMode(12, OUTPUT); analogWrite(9, 175); analogWrite(10, 175); lc.shutdown(0, false); lc.setIntensity(0,15); lc.clearDisplay(0); printByte(smile); } void loop() { // put your main code here, to run repeatedly: if(Serial.available() > 0) { data = Serial.read(); if(data == 'F') { digitalWrite(3, HIGH); digitalWrite(6, HIGH); } else if(data == 'B') { digitalWrite(4, HIGH); digitalWrite(7, HIGH); } else if(data == 'L') { digitalWrite(4, HIGH); digitalWrite(6, HIGH); } else if(data == 'R') { digitalWrite(3, HIGH); digitalWrite(7, HIGH); } else if(data == 'S') { digitalWrite(3, LOW); digitalWrite(4, LOW); digitalWrite(6, LOW); digitalWrite(7, LOW); } else if(data == 'V') { digitalWrite(12, HIGH); } else if(data == 'v') { digitalWrite(12, LOW); } } czas = millis(); if((czas - zapamietanyCzas) >= 4000UL) { zapamietanyCzas = czas; flaga = 1; } if(flaga == 1) { if (millis() - last > 100UL) { zmienna++; last = millis(); } if (zmienna == 1) { printByte(half); } if (zmienna == 2) { printByte(all); } if (zmienna == 3) { printByte(half); } if (zmienna == 4) { printByte(smile); } if (zmienna == 5) { zmienna = 0; flaga = 0; } } } void printByte(byte character[]) { int i; for(i=0;i<8;i++) { lc.setRow(0,i,character[i]); } } 1
Mikolajkie Maj 8, 2023 Autor tematu Udostępnij Maj 8, 2023 Okej to zaraz sprawdzę, a czy w tym czasie mógłbyś mi powiedzieć co oznacza uint32_t i byte? Chciałbym to dokładnie wiedzieć.
farmaceuta Maj 8, 2023 Udostępnij Maj 8, 2023 Przed chwilą, Mikolajkie napisał: Okej to zaraz sprawdzę, a czy w tym czasie mógłbyś mi powiedzieć co oznacza uint32_t i byte? Chciałbym to dokładnie wiedzieć. to typy zm9iennych jak int itp...byte przechowuje liczby z zakresu 8 bitow a uint32 z zakresu 32 bitow (czyli duze wartosci) wpisz w googla "typy zmiennych jezyk C" to wszystko sie wyjasni
Mikolajkie Maj 8, 2023 Autor tematu Udostępnij Maj 8, 2023 @farmaceuta Wszystko działa, dzięki! A czy dało by się to zrobić ze switch-casem?
farmaceuta Maj 8, 2023 Udostępnij Maj 8, 2023 Przed chwilą, Mikolajkie napisał: @farmaceuta Wszystko działa, dzięki! A czy dało by się to zrobić ze switch-casem? jasne ze tak...tka jak teraz ma wyglodac tylko ify zastepujesz case...dasz rade??
Mikolajkie Maj 8, 2023 Autor tematu Udostępnij Maj 8, 2023 @farmaceuta Tak, spróbuję napisać i zaraz Ci pokażę.
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ę »