Skocz do zawartości
BananWszyscy

Sposób pisania programów na rzeczy typu Arduino

Pomocna odpowiedź

(edytowany)

A ta decyzja rozumiem ma być odczytana w obsłudze klawiszy tak? Bo tego akurat nie rozumiem. Znaczy no trochę mnie bolała ta nakładka, nie wiem po co te całe setupy, nie setupy jak wiedziałem, że w mainie implementuje się pętlę nieskończoną, a to co w setupie jest przed pętlą wprost wklejane. I tak wiem, jak działa program w C, już nie musicie aż tak tłumaczyć 😛

Wracając do pytania: no tak, czyli to powinno wyglądać chyba tak:
while(1)
{
    obsługa_przycisków();
    obsługa_prasy();
}

a w funkcji/procedurze obsługa prasy powinno być wtedy coś takiego

void obsługa_prasy()
{
    maszyna stanów - switch(stan)
i np. case (stempel_w_gore)
ruch_stempla_w_gore();
break;
....
}

EDIT. Czy to coś takiego ma być?  Czy w ogóle podział na stany jakie mam nie ma sensu do takiego układu, no bo skoro byłby cały czas w stanie np. czekaj, to ta funkcja po prostu przylatywała do czekaj, w czekaju ify nie byłyby spełnione więc skok na koniec i od nowa obieg pętli

Edytowano przez BananWszyscy

Udostępnij ten post


Link to post
Share on other sites
5 minut temu, daniel89 napisał:

Arduino nie zostało zrobione po to by pisać w C, można ale nie po to się kupuje tą platformę i instaluje ich soft .

Jaki soft? Soft to paszczarski edytor i builder, który doskonale sobie radzi z wiringiem, c++ i c i pozwala bez problemu na mieszanie c++ z c. A że niektórzy nie odróżniają buildera od kompilatora to ich sprawa - zawsze mogą się kiedyś nauczyć odróżniać.

4 minuty temu, BananWszyscy napisał:

Wracając do pytania: no tak, czyli to powinno wyglądać chyba tak:

Jeśli piszesz w C to owszem, coś podobnego.

Tak przy okazji - szkielet Wiringa jest wybitnie prosty:
 

int main()
{
	setup();
	while(1) loop();
}

Jeśli w pliku ino umieścisz własną funkcję main - szkielet nie będzie brany pod uwagę.

Jeśli koniecznie chcesz pisać w czystym C i korzystać z dobrodziejstw Arduino IDE - plik ino powinien być pusty, a w folderze wrzuć plik .c.

Jak mieszać C i C++ to pewnie wiesz.

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Ale nie myl setupu z Arduino i pętli loop z obsługą pętli while(1) w mainie() w C . Maszyna stanów to też nie jest switch , case m bo to zwykłe warunki wyboru są.

Edytowano przez daniel89

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

do daniel89:

Tak, chodzi tu o to, że w pętli while(1) wywoływana jest funkcja loop() którą sobie tam piszemy w IDE i przez to mamy pętlę nieskończoną. A za pomocą switcha maszynę można zaimplementować

Do ethanak
Tak, tylko nadal to pytanie jedno. O co chodzi z tym, że procedura/funkcja obsługa_prasy ma zależeć od decyzji operatora i w ogóle nie zależeć od funkcji obsługa_przycisków. Bo obsługa przycisków rozumiem ma zwracać właśnie ten ich stan (wciśnięcie czy co tam inne się działo). Biorąc pod uwagę, że zwracałaby ona np. tablicę z 0 i 1 na temat przycisków, to przekazując ją do obsługi_prasy na jej podstawie można decydować o wyjściu ze stanu czekania. Bo niezbyt wiem o co chodzi z tym, że nie przyciski a decyzja 😛

Edytowano przez BananWszyscy

Udostępnij ten post


Link to post
Share on other sites
(edytowany)
10 minut temu, daniel89 napisał:

Ale nie myl setupu z Arduino i pętli loop z obsługą pętli while(1) w mainie() w C

Po pierwsze w C++. Po drugie zerknij do pliku cores/arduino/main.cpp - tam naprawdę niewiele więcej znajdziesz 🙂

@BananWszyscy Przecież moment włączenia prasy nie zależu od bieżącej konfiguracji naciśniętych/puszczonych przycisków a od ich historii.

Procedura "decyzja operatora" ma zwrócić "włącz prasę", "zatrzymaj prasę" i tak dalej, a nie te nieszczęsne przyciski. Spróbuj napisać coś takiego:

typedef enum {
  START_PRASY  = 1,
  STOP_PRASY,
  /* i co tu jeszcze chcesz */
} decyzja;

decyzja decyzja_operatora(void) {
  /* tu masz pole do popisu */
}

 

Edytowano przez ethanak

Udostępnij ten post


Link to post
Share on other sites
7 minut temu, ethanak napisał:

Po pierwsze w C++. Po drugie zerknij do pliku cores/arduino/main.cpp - tam naprawdę niewiele więcej znajdziesz 🙂

@BananWszyscy Przecież moment włączenia prasy nie zależu od bieżącej konfiguracji naciśniętych/puszczonych przycisków a od ich historii.

Procedura "decyzja operatora" ma zwrócić "włącz prasę", "zatrzymaj prasę" i tak dalej, a nie te nieszczęsne przyciski. Spróbuj napisać coś takiego:


typedef enum {
  START_PRASY  = 1,
  STOP_PRASY,
  /* i co tu jeszcze chcesz */
} decyzja;

decyzja decyzja_operatora(void) {
  /* tu masz pole do popisu */
}

 

Dobra, wieczorem usiądę i spróbuję to przepisać 😛 potem tu wrócę i znowu będę truł tyłki

Udostępnij ten post


Link to post
Share on other sites

ja tak tylko wtrącę jeśli ktoś był by ciekawy jak wygląda main() w arduino

int main(void)
{
	init();
	initVariant();
 
	#ifdefine(USBCON)
	USBDevice.attach();
	#endif
 
	setup();
	for(;;) {
	loop();
	if (serialEventRun) serialEventRun();
	}
	return 0;
}

Źródło: arduino a technical reference (strona 170). Całość zaczyna się od strony 168 i można sobie to podejrzeć w bezpłatnej próbce na google play.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Podałem  źródło do książki bo nie wiedziałem, że to jest na forum.

Udostępnij ten post


Link to post
Share on other sites

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!

Gość
Napisz odpowiedź...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...