Skocz do zawartości

Zagwozdka z funkcją w samochodziku Bluetooth (Arduino UNO)


Mikolajkie

Pomocna odpowiedź

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]);
  }
}

 

auto_bluetooth_schemat.png

Edytowano przez Mikolajkie
Chciałem dodać szybkie pytanie
  • Lubię! 1
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

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.

Link do komentarza
Share on other sites

@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]);
  }
}

 

  • Pomogłeś! 1
Link do komentarza
Share on other sites

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ć.

Link do komentarza
Share on other sites

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

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.