Skocz do zawartości

Zagwozdka z funkcją w samochodziku Bluetooth (Arduino UNO)


Pomocna odpowiedź

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

 

auto_bluetooth_schemat.png

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

@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

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

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

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