Skocz do zawartości

HC-SR04 - Wielofunkcyjność programowa na podstawie czujnika odległości. Modyfikacja programu


Forseti

Pomocna odpowiedź

2 minuty temu, Forseti napisał:

W sensie w każdą pętlę for wpisać warunek if (!digitalRead(Przycisk_1)) ?

A może tak wywalić te pętle i poczytać coś o millis(), Bounce2 i maszynie stanów?

3 minuty temu, Forseti napisał:

ten sposób przełączania (przycisk) programów dla bardziej rozbudowanego kodu ma sens i

Przełączania tak, ale implementacji gdzie sprawdza się stan przycisku więcej niż raz w loop() - nie.

4 minuty temu, Forseti napisał:

nie będę musiał pobawić się (nauczyć) w przerwania

Nie będziesz musiał, choć to i tak Ciebie prędzej czy później czeka.

Link do komentarza
Share on other sites

1 minutę temu, ethanak napisał:

A może tak wywalić te pętle i poczytać coś o millis(), Bounce2 i maszynie stanów?

Już zacząłem czytać o millis ale niestety brak doświadczenia i ograniczenia czasu w korelacji z ilością wiedzy do przyswojenia powodują, że idzie to jak po grudzie 😕 

Chcę zrobić prostego robot z możliwością przełączania trybów pracy. Mogę dać kopiuj wklej gotowca z netu ale .... nie w tym rzecz 🙂 Chcę rozumieć co mam w kodzie aby móc go modyfikować po swojemu. Jak ogarnę te przełączenia to już powinno być z górki. 

 

Link do komentarza
Share on other sites

Przed chwilą, Forseti napisał:

ograniczenia czasu

Naprawdę, dużo mniej czasu poświęcisz na zrozumienie jak działa maszyna stanów niż na poprawianie programu, który po prostu jest do rzyci tylko na razie tego jeszcze nie widzisz.

Link do komentarza
Share on other sites

Tak jak napisal kolega @ethanak , zapoznanie sie z millis() bylo by jednym z najlepszych wyjsc...bo w porownaniu do delay(), to nie ma czego porownywac😉...o przerwaniach zapomnij narazie calkowicie , choc jak rowniez kolega @ethanak wspomnial, predzej czy pozniej i tak ten temat Cie czeka...no ale to w sytuacjach w ktorych naprawde musisz zareagowac natychmiast...mozesz dac na poczatek sprawdzenie tego przycisku na koncach tych wszystkich "for" 

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

@ethanak Zrobię co się da. Zaczynam dostrzegać bezsensowność delay do mojego projektu. Robot ma pracować cały czas w danym programie dopóki nie przerwę mu pracy przyciskiem. Jak nie będzie reagował na to co od niego chcę od razu to cała zabawa mija się z celem 😕  Wbiłeś mi ćwieka bo w sumie wygląda na to, że straciłem zbyt dużo czasu na naukę odczytania stanu przycisku oraz case... niepotrzebnie skoro i tak tego nie wykorzystam. Do migania ledów się nadaje.....  

 

Link do komentarza
Share on other sites

13 minut temu, farmaceuta napisał:

mozesz dac na poczatek sprawdzenie tego przycisku na koncach tych wszystkich "for"

Możesz mi wyjaśnić, po kiego grzyba tam jest ten for i dlaczego trzeba przerabiać fatalny kod na kod fatalny inaczej?

Link do komentarza
Share on other sites

14 minut temu, Forseti napisał:

straciłem zbyt dużo czasu na naukę odczytania stanu przycisku oraz case...

Nic nie straciles...to czego sie nauczyles to juz twoje i Ci sie wielokrotnie przyda...

 

8 minut temu, ethanak napisał:

Możesz mi wyjaśnić, po kiego grzyba tam jest ten for 

kolega @Forseti chce wykonywac cos okreslona ilosc razy itp...a jak to bedzie pozniej wygladac to juz sam zdecyduje..

 

9 minut temu, ethanak napisał:

dlaczego trzeba przerabiać fatalny kod na kod fatalny inaczej?

Ja nie twierdze ze to co tu zaproponowalem jest dobrym wyjsciem...bo szczerze jest to marne wyjscie i ja dzis juz o tym wiem, ale kolega @Forseti dopiero zaczyna zabawe z tym wszystkim i nie co go wrzucac na "gleboka" wode bo poprostu sie pogubi...to co ja zaproponowalem mniej/wiecej bedzie dzialac tak jak autor chce, co oczywiscie nie oznacza ze sie nie da lepiej bo sie da...poprostu z mojego punktu widzenia (poczatkujacego!), wszystko na spokojnie..😉 malymi kroczkami do przodu zeby sie nie przestraszyc..

Link do komentarza
Share on other sites

6 minut temu, farmaceuta napisał:

kolega @Forseti dopiero zaczyna zabawe z tym wszystkim i nie co go wrzucac na "gleboka" wode

Czyli uważasz, że jeśli ktoś początkujący robi coś źle trzeba dalej ciągnąć to "źle"? I pokazanie mu na początku jak powinno być "dobrze" to absolutnie nie jest dobry uczynek? Czy jak ktoś będzie próbował wbijać gwóźdź kamieniem będziesz proponował znalezienie innego kamienia, czy może dasz mu młotek?
 

8 minut temu, farmaceuta napisał:

bo poprostu sie pogubi

Zdaje się że juz się pogubił... a szczerze przyznam gdybym tego typu kod zobaczył to też bym się pogubił.

9 minut temu, farmaceuta napisał:

to co ja zaproponowalem mniej/wiecej bedzie dzialac tak jak autor chce

Mniej więcej tak jak mały Franio na nartach jeździł: mniej na nartach a więcej na tyłku.

11 minut temu, farmaceuta napisał:

kolega @Forseti chce wykonywac cos okreslona ilosc razy

I nie ma innego wyjścia niż pętla w pętli?

Ja coś zaproponowałem. millis(), Bounce2, maszyna stanów (w tej kolejności). I nie rzucać się na głęboką wodę. Napisać programik który np. miga ledą używając millis(), potem użyć Bounce2 do włączania/wyłączenia migania, potem napisać coś co będzie np. migało ledą uzależniając prędkość migania np. od ilości naciśnięć przycisku i zaprzęgnąć do tego maszynę stanów. A dopiero później mając to opanowane brać się za kod robota.

 

 

  • Lubię! 1
Link do komentarza
Share on other sites

(edytowany)

Racja, uważam że po pierwszym mruganiu ledem na delay jak najprędzej trzeba przejść na bardziej zaawansowane funkcje. Zwłaszcza że w arduino jest funkcja millis. A przerwania też nie są tak straszne jak je malują o czym @farmaceuta chyba się już przekonał? 

Edytowano przez _LM_
Link do komentarza
Share on other sites

57 minut temu, ethanak napisał:

Czyli uważasz, że jeśli ktoś początkujący robi coś źle trzeba dalej ciągnąć to "źle"? I pokazanie mu na początku jak powinno być "dobrze" to absolutnie nie jest dobry uczynek?

Nie no jasne ze to dobry uczynek i trzeba koledze tlumaczyc ze da sie lepiej/prosciej..chodzilo mi o to zeby pomalutku najpierw zrozumial co jest co i jak to dziala...a nie odrazu wzial sie za to wszystko w tym konkretnym przypadku bo to za duzo...ale jak sam dalej wspomniales..

 

1 godzinę temu, ethanak napisał:

Ja coś zaproponowałem. millis(), Bounce2, maszyna stanów (w tej kolejności). I nie rzucać się na głęboką wodę. Napisać programik który np. miga ledą używając millis(), potem użyć Bounce2 do włączania/wyłączenia migania, potem napisać coś co będzie np. migało ledą uzależniając prędkość migania np. od ilości naciśnięć przycisku i zaprzęgnąć do tego maszynę stanów. A dopiero później mając to opanowane brać się za kod robota.

I z tym sie zgadzam calkowicie!...dokladnie cos takiego mialem na mysli...czyli na spokojnie/pokolei, tak zeby te pojecia dokladnie zrozumiec i wiedziec jak uzywac i kiedy..

 

1 godzinę temu, ethanak napisał:

Mniej więcej tak jak mały Franio na nartach jeździł: mniej na nartach a więcej na tyłku.

O przepraszam bardzo...ale jechal! 😏

 

33 minuty temu, _LM_ napisał:

Racja, uważam że po pierwszym mruganiu ledem na delay jak najprędzej trzeba przejść na bardziej zaawansowane funkcje. Zwłaszcza że w arduino jest funkcja millis.

No jasna sprawa...delay() to zabojca kodu i nie wolno go uzywac praktycznie wcale, ale do nauki na poczatku mozna przymknac oko..

 

36 minut temu, _LM_ napisał:

A przerwania też nie są tak straszne jak je malują o czym @farmaceuta chyba się już przekonał? 

Pewnie ze nie sa straszne..😅hehe , ale przynajmniej mi czesto sie przewijala informacja ze przerwan uzywa sie w ostatecznosci kiedy programowo jest ciezko odrazu zareagowac na jakas tam zmiane...wiec ja narazie nie uzywam tego nigdzie bo i nie potrzebuje, no a w tym tu konkretnym przypadku to naprawde nie potrzebne

Link do komentarza
Share on other sites

27 minut temu, farmaceuta napisał:

delay() to zabojca kodu i nie wolno go uzywac praktycznie wcale,

E tam. Spróbuj napisać coś poważniejszego na ESP8266 nie wtykając delajów czy yieldów w rozmaite miejsca, to będziesz miał nieoczekiwane spotkanie z watchdogiem albo będziesz się dziwić, czemu wifi nie działa 😉

Nieprawda że nie wolno go używać: należy go używać tam, gdzie jest potrzebny.

 

Link do komentarza
Share on other sites

5 minut temu, ethanak napisał:

Nieprawda że nie wolno go używać: należy go używać tam, gdzie jest potrzebny.

Nie no wiadomo ze jesli np. chce zrobic "pauze" w kodzie o dlugosci powiedzmy 2s i w tym czasie kompletnie nie wymagam od procka zeby sie zajmowal czyms innym to delay() jest najprostrzym rozwiazaniem i nie ma sensu sie napinac zeby znalezdz lepsze...wkoncu do tego zadania on zostal stworzony😉 

Link do komentarza
Share on other sites

(edytowany)

@ethanak @farmaceuta @ethanak @_LM_

Popracowałem nad millis() i z zaczynam rozumieć zasadę wykorzystania ww.  Rozbudowuję kod do nauki coraz bardziej. Dla nauki chciałem w Program_1 (case1) wpisać proste polecenie sterowania silnikiem DC tj. włącz silnik - > zwiększ obroty do 25% -> utrzymuj obroty np. przez 2sek. -> zmniejsz obroty do 0% -> wyłącz silnik. Równolegle migamy LED_1 w zadanym interwale dla wizualizacji. Nie potrafię jednak zmniejszyć obrotów po osiągnięciu zadanych w jednym CASE. 

I tutaj moje pytanie. Czy w case1 można to zrobić czy muszę przerobić kod w taki sposób aby powiedzmy automatycznie przeskakiwał pomiędzy casami celem wykonywania polecenia?

//Program do nauki millis - miganie led oparte o L293D Motor Driver Shield.

#define LED_1 A3 //LED czerwona 1
#define LED_2 A4 //LED zielona 2
#define Przycisk_1 A5 //Microswitch_1
#include <AFMotor.h> //Wczytanie Biblioteki AFMotor dla Arduino Shield

AF_DCMotor motor1(4); //Przypisanie silnika 1 na wyjście M1 Shielda

int stanLED1 = LOW; //Przypisanie stanu LED 1 do zmiennej int - Zapamiętanie stanu LED
int stanLED2 = LOW; //Przypisanie stanu LED 1 do zmiennej int - Zapamiętanie stanu LED

uint8_t tryb_program = 0; //Zmienna trybu programu

int Ustaw_predkosc = 0; //ustawienie prędkości startowej silnika


unsigned long aktualnyCzas = 0 ; //Czas, który jest zliczany - ciągle rośnie - Wartość od której odejmujemy zapamiętany czas!!!
unsigned long zapamietanyCzas_LED1 = 0; //Czas, który był zapamiętany w ostatnim obiegu pętli dla LED1
unsigned long zapamietanyCzas_LED2 = 0; //Czas, który był zapamiętany w ostatnim obiegu pętli dla LED2
unsigned long zapamietanyCzas_DC1 = 0; //Czas, który był zapamiętany w ostatnim obiegu pętli dla silnika DC1


unsigned long miganie_LED1 = 500; //Interwał migania LED1
unsigned long miganie_LED2 = 200; //Interwał migania LED2

void setup() {

  Serial.begin(9600);

  //Wyprowadzenie przycisków
  pinMode(Przycisk_1, INPUT_PULLUP); //Wejście przycisku 1 w trybie PULLUP


  //Wyprowadzenia LED
  pinMode(LED_1, OUTPUT);
  pinMode(LED_2, OUTPUT);

  //Ustawienie wyjściowego stanu LED
  digitalWrite(LED_1, LOW); //Stan diody LED1 - wyłączona
  digitalWrite(LED_2, LOW); //Stan diody LED2 - wyłączona

  //Ustawienie początkowej wartości silnika DC oraz STOP
  motor1.setSpeed(0);
  motor1.run(RELEASE);

  //Ustawienie wyjściowe dla millis() - zerowanie liczenia
  aktualnyCzas = millis();

}

void loop() {

  aktualnyCzas = millis();

  if (!digitalRead(Przycisk_1)) tryb_program++; //Jeśli ostatni stan był wyłączony i aktualny stan jest włączony to:

  switch (tryb_program % 4)  {

    //Modulo - reszta z dzielenia przez 4 - bo 3 programy

    case 1:

      //Jeśli przycisk wciśnięty x1 to włącz PROGRAM 1
      //Włącz silnik
      motor1.run(FORWARD);

      //Przyśpiesz od 0 do 25% (max obroty 255)

      if (aktualnyCzas - zapamietanyCzas_DC1 > 10 ) {
        if (Ustaw_predkosc < 65 ) { //Ustawienie prędkości na 25%
          motor1.setSpeed(Ustaw_predkosc);
          Ustaw_predkosc += 2; //Przyśpiesz co 2 jednostki
          zapamietanyCzas_DC1 = aktualnyCzas; //zapamiętaj aktualny czas

        }

        // ▼▼▼ JAK ZAIMPLEMENTOWAĆ KOD NA HAMOWANIE SILNIKIEM W CASE 1? Czy mam wprowadzać jakieś dodatkowe zmienne? ▼▼▼





        //▲▲▲JAK ZAIMPLEMENTOWAĆ TEN KOD NA HAMOWANIE SILNIKIEM W CASE 1?▲▲▲



        //Miganie sygnalizacyjne LED_1 w zadanym interwale
        if (aktualnyCzas - zapamietanyCzas_LED1 >= miganie_LED1) {
          stanLED1 = !stanLED1; //Zmiana stanu LED przez negację
          digitalWrite(LED_1, stanLED1);
          digitalWrite(LED_2, LOW);
          zapamietanyCzas_LED1 = aktualnyCzas;  //zapamiętaj aktualny czas

          Serial.println(Ustaw_predkosc); //Weryfikacja zmiennej Ustaw_predkosc w monitorze portu szeregowego
        }
      }
      break;
    case 2:

      if (aktualnyCzas - zapamietanyCzas_LED2 >= miganie_LED2) {
        zapamietanyCzas_LED2 = aktualnyCzas;
        stanLED2 = !stanLED2;
        digitalWrite(LED_2, stanLED2);
        digitalWrite(LED_1, LOW);

        Serial.println(Ustaw_predkosc); //Weryfikacja zmiennej Ustaw_predkosc w monitorze portu szeregowego
      }
      break;
    case 3:
      digitalWrite(LED_1, LOW); //Stan diody LED1 - wyłączona
      digitalWrite(LED_2, LOW);

      Serial.println(Ustaw_predkosc); //Weryfikacja zmiennej Ustaw_predkosc w monitorze portu szeregowego
      break;
  }

  while (!digitalRead(Przycisk_1));
  delay(50);
}

Opisy jak dla totalnego laika ale pomagają. Program_2 oraz Program_3 (migają dla wizualizacji). 

Oczywiście walczę równolegle z różnymi kombinacjami 🙂

Edytowano przez Forseti
Link do komentarza
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!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

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

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.