Skocz do zawartości

Kurs Arduino - #3 - UART (komunikacja z PC), zmienne


Pomocna odpowiedź

Dnia 4.05.2022 o 13:13, farmaceuta napisał:

Zmienna kolor nie ulega zmianie w while, wiec ta petla jest petla nieskonczona...tak jak kolega @Gieneq odpowiedzial, wywal tego while bo go wogole tam nie potrzebujesz...no chyba ze chcesz migac ciagle i komenda stop wylaczyc diode...wtedy pasuje do while wrzucic kod sprawdzajacy cos jak...


    while(kolor == "mig"){
    digitalWrite(13, HIGH);
    delay(1000);    
    digitalWrite(13, LOW);
    delay(1000);  
   if(Serial.available()>0){
    kolor = Serial.readStringUntil('\n');
        }
     }
  

(Zainteresuj sie millis() i funkcjami...to znacznie przyspieszy, przestanie blokowac i upiekszy kod😉)

witam ponownie

zgodnie z Twoimi sugestiami zacząlem się bawić z millis, nawet zrobiłem jakieś pierwsze kroki, ale znowu się zblokowałem i już po prostu nie mam koncepcji 🙂

problem polega na tym, że potrafie sobie zasterować czasem migania diody: ustawiłem czas opóźnienia (wyłączenia), czas świecenia i wszystko jest super, ale chciałem iść dalej czyli chciałbym wprowadzić sekwencję swiecenia (nie tylko miganie ze zdefiniowanym czasem świecenia i przerwy) - poniżej krótki draft mojego konceptu gdzie kolorem żółtym zaznaczyłem co zrobiłem, kolor biały to dla mnie już czarna magia:

dioda.thumb.JPG.48dbf58278711fa43d2a505eb65e965f.JPG

wstawiam też kod z tym co mam - może jest to biedne, ale jak dla osoby początkującej to już coś 🙂

unsigned long czas = 0;
boolean ledstate = LOW;
unsigned long timer = 0;
void setup() {
pinMode(11, OUTPUT);
digitalWrite(11, LOW);
Serial.begin(9600);
}

void loop() {
if(ledstate==LOW && millis() - timer >= 5000){
ledstate = !ledstate;
  czas = (millis() - timer)/1000;
  timer = millis(); 
  digitalWrite(11,ledstate);
  Serial.print("opóźnienie uruchomienia dioda 11 ");  
  Serial.print(czas);
  Serial.println(" s");
}
if(ledstate==HIGH && millis() - timer >= 3000){
ledstate = !ledstate;
  czas = (millis() - timer)/1000;
  timer = millis(); 
  digitalWrite(11,ledstate);
  Serial.print("uruchomienie dioda 11 ");  
  Serial.print(czas);
  Serial.println(" s");
}
}

bardzo bym prosił o jakieś wskazówki, które by mnie nakierowały na rozwiązanie problemu. z góry dziękuję

image.png

Link do komentarza
Share on other sites

To może stwórz sobie programowy "sekundnik" i "tablicę stanów oświetlenia w czasie". Program sprawdza "sekundnik" i w zależności od bieżącej sekundy odczytuje tablicę ustawiając "wyjście" w odpowiednim stanie.

Link do komentarza
Share on other sites

13 minut temu, Belferek napisał:

To może stwórz sobie programowy "sekundnik" i "tablicę stanów oświetlenia w czasie". Program sprawdza "sekundnik" i w zależności od bieżącej sekundy odczytuje tablicę ustawiając "wyjście" w odpowiednim stanie.

tak, wszystko fajnie tylko jak się za to zabrać, póki co to dopiero stawiam pierwsze kroki w tej tematyce jak by można było liczyć na jakieśwsparcie to bardzo byłbym wdzięczny

Link do komentarza
Share on other sites

(edytowany)
45 minut temu, merinum napisał:

jak się za to zabrać

Jak się za to zabrać pytasz? Weź kartkę i długopis i narysuj sobie jak ten "sekundnik" (program) ma działać - narysuj sobie algorytm Twojego programu. Potrafisz jak piszesz korzystać z millis() więc idąc tą drogą można np. tak:

1. Pobierz czas.
2. Czy minęła sekunda?
3. Jeśli nie to KONIEC OBSŁUGI SEKUNDNIKA
4. Jeśli sekunda < 59 to zwiększ o 1  i KONIEC OBSŁUGI SEKUNDNIKA
5. sekunda = 0
6. KONIEC OBSŁUGI SEKUNDNIKA

7. DALSZA CZĘŚĆ PROGRAMU

i tak w kółko (loop)

Kiedy ten koncepcyjny etap swojej pracy będziesz już miał za sobą to pozostaje nic innego jak zakodować swój algorytm (punkt po punkcie) za pomocą używanego języka programowania (tutaj C). Po zakodowaniu pozostaje weryfikacja (kompilacja) programu i jego wgranie do modułu Arduino.

Edytowano przez Belferek
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

(edytowany)
long time[]= {5,2,4,12,7}; //czas w sekundach dla sekwencji
byte led[] = {1,0,1,0,1}; //stan led dla danego czasu sekwencji
long last = 0; //zapisz ostatni czas
byte i = 0;

void setup() {
  pinMode(13, OUTPUT);
digitalWrite(13,led[i]);
  
}

void loop() {
  if (millis() - last >(time[i]*1000UL)) { 
    i++;
    if (i == 5) //jesli wyszedles poza zakres tablic (sekwencja sie skonczyla) zacznij od nowa{
      i = 0;
      digitalWrite(13,led[i]);
      }
    
    digitalWrite(13,led[i]);
    last = millis(); //zapisz aktualny czas do starego
    }
    
 

Nie wiem czy o to Ci chodzilo...pierwsza tablica to czas danego stanu z drugiej tablicy (mozna zmieniac dowolnie)

Edytowano przez farmaceuta
Link do komentarza
Share on other sites

2 godziny temu, farmaceuta napisał:

Nie wiem czy o to Ci chodzilo...pierwsza tablica to czas danego stanu z drugiej tablicy (mozna zmieniac dowolnie)

witam

wielkie dzięki za pomoc, jest to dokładnie to o co mi chodziło, niemniej jednak przy moim stopniu zaawansowania, a raczej niezaanwansowania to będę ten kod rozgryzał do końca dnia, ale najważniejsze, że mam co rozgryzać 🙂

Link do komentarza
Share on other sites

35 minut temu, merinum napisał:

witam

wielkie dzięki za pomoc, jest to dokładnie to o co mi chodziło, niemniej jednak przy moim stopniu zaawansowania, a raczej niezaanwansowania to będę ten kod rozgryzał do końca dnia, ale najważniejsze, że mam co rozgryzać 🙂

Tam jeszcze komentarze dopisalem to moze cos z nich wiecej zrozumiesz ..dodatkowo w tym if'ie 

if (i == 5)

liczba 5 oznacza ilosc czasow w sekwencji...czyli jesli chcialbys sekwencje na 30 roznych czasow to muszisz sobie je dopisac w tablicy jak wyzej i ten if ma wygladac tak..

if (i == 30)

Przy czy jesli jesli sekwencja ma zmieniac stan na przeciwny to wystarczy negacja stanu, czyli tablica led[] jest nie potrzebna, ale to tylko w przypadku sekwencji parzystych...ale narazie rob jak w przykladzie dopoki nie zrozumiesz jak dziala..😉

Link do komentarza
Share on other sites

25 minut temu, farmaceuta napisał:

Tam jeszcze komentarze dopisalem to moze cos z nich wiecej zrozumiesz ..dodatkowo w tym if'ie 


if (i == 5)

liczba 5 oznacza ilosc czasow w sekwencji...czyli jesli chcialbys sekwencje na 30 roznych czasow to muszisz sobie je dopisac w tablicy jak wyzej i ten if ma wygladac tak..


if (i == 30)

Przy czy jesli jesli sekwencja ma zmieniac stan na przeciwny to wystarczy negacja stanu, czyli tablica led[] jest nie potrzebna, ale to tylko w przypadku sekwencji parzystych...ale narazie rob jak w przykladzie dopoki nie zrozumiesz jak dziala..😉

dzięki za wsparcie, pobawię sie tym by to dogłębnie rozgryść - spróbuje dodać na tym przykładzie kolejna diodę z innymi czasami - może mi się uda .. hehe

Link do komentarza
Share on other sites

Zabrałem się właśnie za tę lekcję i zacząłem kombinować nad zadaniem z gwiazdką. Sugestia o dodatkowej zmiennej mnie w gruncie rzeczy zbiła z tropu, bo ona tam jest zupełnie niepotrzebna. Ciekawszym odkryciem było to, że można zrobić digitalRead z pinu zdefiniowanego jako OUTPUT, więc mój kod wyglądał tak:

    if (odebraneDane == "zielona") { 
      if (digitalRead(zielona) == LOW){
      digitalWrite(zielona, HIGH); 
      } else {
      digitalWrite(zielona, LOW); }

Po czym dowiedziałem się, że HIGH i LOW to w zasadzie boolean, więc HIGH = !LOW. Zatem dla czerwonej:

    } else if (odebraneDane == "czerwona") {
          digitalWrite(czerwona, !digitalRead(czerwona));

I teraz pytanie, czy stosując digitalRead i następnie od razu digitalWrite nie narażam się na jakieś zakłócenia lub inne problemy?
 

Link do komentarza
Share on other sites

witam

Szanowni Państwo, cwiczę sobie tą więdze, którą tutaj nabył i zastanawiam się czy jest jakaś możliwość by poniższy kod zescalić w jedną całosć by go tak wiecznie nie powtarzać, obiło mi się o oczy coś w kwestii zmiennych tablicowych bądź "switch", ale zawiesiłem się i nic mi nie wychodzi, jak byście mogli mnie jakoś naprowadzić to byłbym bardzo wdzięczny - z góry dziękuję za pomoc

int kolejnosc = 1;
unsigned long proznia_maszyna1_t = 0;
unsigned long proznia_maszyna2_t = 0;
unsigned long proznia_maszyna3_t = 0;
unsigned long proznia_maszyna4_t = 0;

unsigned long proznia_maszyna1_d = 2;
unsigned long proznia_maszyna2_d = 3;
unsigned long proznia_maszyna3_d = 4;
unsigned long proznia_maszyna4_d = 5;

#define proznia_maszyna1_LED 0
boolean sproznia_maszyna1_LED = HIGH;

#define proznia_maszyna2_LED 3
boolean sproznia_maszyna2_LED = LOW;

#define proznia_maszyna3_LED 6
boolean sproznia_maszyna3_LED = LOW;

#define proznia_maszyna4_LED 9
boolean sproznia_maszyna4_LED = LOW;

void setup() {
Serial.begin(9600);

pinMode(proznia_maszyna1_LED, OUTPUT);
pinMode(proznia_maszyna2_LED, OUTPUT);
pinMode(proznia_maszyna3_LED, OUTPUT);
pinMode(proznia_maszyna4_LED, OUTPUT);

digitalWrite(proznia_maszyna1_LED, sproznia_maszyna1_LED);
digitalWrite(proznia_maszyna2_LED, sproznia_maszyna2_LED);
digitalWrite(proznia_maszyna3_LED, sproznia_maszyna3_LED);
digitalWrite(proznia_maszyna4_LED, sproznia_maszyna4_LED);
}

void loop() {
if(kolejnosc == 1 && millis()-proznia_maszyna1_t>=proznia_maszyna1_d * 1000UL){
  digitalWrite(proznia_maszyna1_LED, !sproznia_maszyna1_LED);
  digitalWrite(proznia_maszyna2_LED, !sproznia_maszyna2_LED);
  kolejnosc = 2;
  proznia_maszyna2_t = millis();
}
if(kolejnosc == 2 && millis()-proznia_maszyna2_t>=proznia_maszyna2_d * 1000UL){
  digitalWrite(proznia_maszyna2_LED, sproznia_maszyna2_LED);
  digitalWrite(proznia_maszyna3_LED, !sproznia_maszyna3_LED);
  kolejnosc = 3;
  proznia_maszyna3_t = millis();
}
if(kolejnosc == 3 && millis()-proznia_maszyna3_t>=proznia_maszyna3_d * 1000UL){
  digitalWrite(proznia_maszyna3_LED, sproznia_maszyna3_LED);
  digitalWrite(proznia_maszyna4_LED, !sproznia_maszyna4_LED);
  kolejnosc = 4;
  proznia_maszyna4_t = millis();
}
if(kolejnosc == 4 && millis()-proznia_maszyna4_t>=proznia_maszyna4_d * 1000UL){
  digitalWrite(proznia_maszyna4_LED, sproznia_maszyna4_LED);
  digitalWrite(proznia_maszyna1_LED, sproznia_maszyna1_LED);
  kolejnosc = 1;
  proznia_maszyna1_t = millis();
}
}

 

Link do komentarza
Share on other sites

 

Cytat

Szanowni Państwo, cwiczę sobie tą więdze, którą tutaj nabył i zastanawiam się czy jest jakaś możliwość by poniższy kod zescalić w jedną całosć by go tak wiecznie nie powtarzać,

Możesz sobie stworzyć własna bibliotekę, i jej używać. Aczkolwiek nie wiem co masz na myśli pisząc "wiecznie powtarzać"?

Link do komentarza
Share on other sites

1 godzinę temu, BlackJack napisał:

Aczkolwiek nie wiem co masz na myśli pisząc "wiecznie powtarzać"?

bo sprawa wygląda tak, że tych powtórzeń będzie około 15, w sumie to pytałem raczej w kwestii tego by zaoszczędzić pamięci płytki, ale w sumie jeśli to wyjdzie na to samo to nie ma tematu

Link do komentarza
Share on other sites

8 godzin temu, merinum napisał:

bo sprawa wygląda tak, że tych powtórzeń będzie około 15, w sumie to pytałem raczej w kwestii tego by zaoszczędzić pamięci płytki, ale w sumie jeśli to wyjdzie na to samo to nie ma tematu

W zasadzie nie potrzebujesz tylu zmiennych.
Po pierwsze zrób poprawną pętlę while, i zwiększaj  zmienną kolejnosc na końcu (albo na poczatku) pętli:

kolejnosc++;

Jak będziesz miał kolejnosc rosnącą z każdym przebiegiem pętli, to mozesz jej uzyć do wskazania pinu, ktory chcesz zmieniac w danym przebiegu.
I do tego mozesz sobie zrobic tablice:

long maszynaLED[] = {0,3,6,9};


a nastepnie:

digitalWrite(maszynaLED(kolejnosc), LOW);

Wtedy w pierwszym przebiegu petli kolejnosc = 0, a digitalWrite zapisze na pinie 0, w drugim kolejnosc = 1, wiec digitalWrite zapisze na pinie 3. Tylko pamietaj, ze indeks startuje od 0

Nie wiem teź za bardzo po co Ci zmienne sproznia_maszyna  skoro wszystkie zawierają tę samą wartość, i to jeszcze po prostu stan.

Link do komentarza
Share on other sites

8 godzin temu, merinum napisał:

pytałem raczej w kwestii tego by zaoszczędzić pamięci płytki, ale w sumie jeśli to wyjdzie na to samo to nie ma tematu

Tak jeszcze dodam na marginesie, że kwestia optymalizacji pod użycie zasobów lub prędkość to jedno. Ale to, by nie robić "roboty głupiego" przy pisaniu kodu i by kod był potem czytelny i łatwy do zmian, też jest ważne.

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.