Arduino Polska Forum

Pełna wersja: Wprowadzanie danych do programu
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Witam, mam problem, gdyż nie mogę wprowadzić parametrów do programu, gdyż program nie czeka na wpisanie przez użytkownika wartości, tylko pobiera ją od razu po wyświetleniu polecenia. Podpowiecie w którym miejscu robię błąd? Tymczasowo ominąłem program komendą delay(), ale nie zadowala mnie ta opcja, gdyż jest sprzeczne z naturalną reakcją.
Kod:
void silnik() {

  //***********************Pobieranie danych od użytkownika***************************************************//

  char kierunek = '0';
  char sterowanie = '0';
  unsigned long kroki = 0;
  unsigned long predkosc = 0;
Serial.print("\n\nPodaj tryb sterowania silnika:\n1. Falowe\n2. Pełnokrokowe\n3. Półkrokowe\n");

  delay(10000);
  if (Serial.available() > 0)
    sterowanie = (char)Serial.read();
  delay(1500);
  Serial.print(sterowanie);

  Serial.print("\n\nPodaj kierunek obrotu:\n1. Zgodnie z ruchem wskazówek zegara\n2. Przeciwnie do ruchu wskazówek zegara\n");
  delay(10000);
  if (Serial.available() > 0)
    kierunek = (char)Serial.read();
  delay(1500);
  Serial.print(kierunek);

  Serial.print("\n\nPodaj opóżnienie między krokami silnika:\n");
  delay(10000);
  if (Serial.available() > 0)
    predkosc = (Serial.readString()).toInt();
  delay(1500);
  Serial.print(predkosc);

  Serial.print("\n\nPodaj liczbę kroków silnika:\n");
  delay(10000);
  if (Serial.available() > 0)
    kroki = (Serial.readString().toInt());
  delay(1500);
  Serial.print(kroki);
}
Pętla loop() powinna sobie lecieć swoim tokiem, bez żadnych delay(). W wybranym momencie wysyłasz komunikat o wprowadzeniu danych do użytkownika i nie czekasz na nie, procesor zajmuje się tym co ma robić w między czasie, lub nic. Jeśli komenda musi przyjść, to odliczasz zadany czas, potem nalegasz ponownie by coś wysłał (obsługujesz ten błąd). Ty masz wykryć, że coś przyleciało z UART, jeśli to jest komenda dla silnika powinieneś przekazać ją do funkcji silnik() jako argumenty funkcji. Podstawę tego mechanizmu znajdziesz w przykładach arduino 04 komunikacja, szkic serialEvent. Pętla sobie leci, (nieważne jak dla użytkownika arduino) każdy nadlatujący znak jest przekazywany do funkcji serialEvent(), i zapisywany do Stringa, tablicy char, no jakiegoś bufora na przechowanie, i ta funkcja sprawdza, czy odebrała znak nowej linii - to znaczy cały ciąg znaków aż do wciśnięcia ENTER w oknie SerialMonitor, odebrano całą komendę.
Daje znać o tym ustawiając flagę stringComplete, potem już inna funckja w pętli głównej drukuje odebrany ciąg z powrotem na UART do okna SierialMonitor. Ty powinieneś sobie wziąć ten string, sprawdzić czy to Twoja komenda dla silnika  i albo w tym miejscu sobie to porozbijać na poszczególne parametry albo całość przesłać do funkcji silnik(), wewnątrz niej zrobić z poleceniem co tam chcesz. Rozmawiałem tu o sterowaniu komendami z sms, to jest analogicznie, dane też przylatują na UART, ten wątek: https://forum.arduinopolska.pl/watek-ste...%C5%82-gsm. Do wyboru czy wolisz to mieć jako String, czy tablicę char, wg mnie tablica będzie lepsza bo po prostu wysyłasz cały ciąg char, "cmd1234" + NL i do bufora wpada bufor=['c','m','d','1','2','3','4',0], z poszczególnych pól tablicy odczytujesz: bufor[0]='c', z pozycji bufor[5] masz znak '3', czyli jeśli twoje komendy to literki, to z odpowiednich pól je wyciągasz, jeśli liczby to wysyłasz zawsze jako np. 3 cyfrowe i konwertujesz znaki na liczby z 3 pól. Jeśli chcesz mieć różne długości to sobie komendę dzielisz znakiem specjalnym (jaki sobie tam wybierzesz - :,%^&, ważne, że nie używany wewnątrz pola parametru) i używasz funkcji strtok(), np. cmd:123,L,23.1,4243,42424 - dzielisz dwukropkiem, potem przecinkami, konwersja na liczbę/lub jako napis. Funkcjami do obróbki napisów wrzucasz te kawałeczki do swoich zmiennych - parsujesz. W tym wypadku ważne, by ilość pól komendy  (między przecinkami)  i ich kolejność była taka sama, np. cmd:nrsilnika,kierunek,predkosc,liczbakrokow\n. Funkcja silnik() ewentualnie może też sama sięgać do bufora, powinna tam znaleźć informację, że jest to nowa komenda (i od razu to wyzerować), wykonać pracę, czekać na kolejny znak, że jest nowa komenda.