• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Prośba o pomoc w napisaniu programu
#31
https://allegro.pl/oferta/przekaznik-12v...FiEALw_wcB
 
Odpowiedź
#32
No ale właśnie Ci pokazałem w przykładzie, że można to z grubsza zrobić z delay, tylko można zrobić 10000 delay 1ms lub raz delay (10000), różnica jest taka, że w między czasie z delay 1ms możesz wywołać sporo innych funkcji. Chodzi tylko o nauczenie się zliczania czasu w jakiś sposób, lepiej z millis.
Umiejąc mierzyć czas robisz jedną małą zmianę w sposobie programowania, zamiast zatrzymywać program na 1s, pomijasz robienie tego dopóki nie minie 1s od poprzedniego wykonania. Wtedy możesz w różnych blokach programu robić "równocześnie" wszystko, przynajmniej tak to wygląda dla kogoś, kto nie wie jak to działa.
Zapłacenie za kurs to też sposób, jest większa motywacja by z niego skorzystać.
Enum w tym przykładzie było niepotrzebne, to kolejny krok do użycia w swich case by etapy można było ponazywać bez potrzeby zapamiętywania co robi dany numer etapu, zamiast w programie napisać case 0: masz case oczekiwanie:
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#33
Kaczakat mam takie pytanie
Jeżeli stworzyłbym np kilka bloków
void napełBrudna()
void oprózBrudna()
void napelCzysta()
void oprozCzysta
Jak sprawić żeby te bloki były wykonywane jeden po drugim.... tablica ?
 
Odpowiedź
#34
Maszyna stanów, enum, switch case, masz link do filmiku na Youtube jak to zrobić, nawet jak nie znasz angielskiego to kod można przeklepać, skopiować, czy ściągnąć i analizować jak to działa.
W czasie jednej funkcji nie wydarzy się inna, a to co pokazujesz to nie bloki {} tylko funkcje ().
Napisanie funkcji jedna po drugiej, w których czekasz po kilka minut, zmienia tylko tyle, że loop ładnie wygląda i wiadomo jaka jest z grubsza kolejność zadań.
Może ten filmik po polsku lepiej zrozumiesz: https://www.youtube.com/watch?v=JdwUJvVaQPM , pokazana jest cała droga od delay, przez millis, do biblioteki timers. Włączanie przekaźników to dalej miganie ledami, to że one coś tam włączają to tylko nieistotny szczegół, przynajmniej na początku.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#35
Kod:
#define CZUJNIK_MAX 2
#define CZUJNIK_MIN 3
#define E1 4
#define E2 5
#define P1 6
#define P2 7
#define START 8
int etap=0;

void setup() {
  digitalWrite(P1, LOW);
  digitalWrite(P2, LOW);
  digitalWrite(E1, LOW);
  digitalWrite(E2, LOW);
  pinMode(P1, OUTPUT);
  pinMode(P2, OUTPUT);
  pinMode(E1, OUTPUT);
  pinMode(E2, OUTPUT);
  pinMode(CZUJNIK_MAX, INPUT_PULLUP);
  pinMode(CZUJNIK_MIN, INPUT_PULLUP);
  pinMode(START, INPUT_PULLUP);
}

void loop() {
  switch(etap){
    case 0://oczekiwanie na przycisk start
      if (digitalRead(START)==LOW)etap=1;
      break;
    case 1://załączenie E1
      digitalWrite(E1, HIGH);
      etap=2;
      break;
    case 2://oczekiwanie na czujnik MAX
      if (digitalRead(CZUJNIK_MAX)==LOW)etap=3;
      break;
    case 3://wyłączenie E1, załączenie P1
      digitalWrite(E1, LOW);
      digitalWrite(P1, HIGH);
      etap=4;
      break;
    case 4://oczekiwanie na czujnik MIN
      if (digitalRead(CZUJNIK_MIN)==LOW)etap=5;
      break;
    case 5://wyłączenie P1, załączenie E2
      digitalWrite(P1, LOW);
      digitalWrite(E2, HIGH);
      etap=6;
      break;
    case 6://oczekiwanie na czujnik MAX
      if (digitalRead(CZUJNIK_MAX)==LOW)etap=7;
      break;
    case 7://wyłączenie E2, załączenie P2
      digitalWrite(E2, LOW);
      digitalWrite(P2, HIGH);
      etap=8;
      break;
    case 8://oczekiwanie na czujnik MIN
      if (digitalRead(CZUJNIK_MIN)==LOW)etap=9;
      break;
    case 9://wyłączenie P2
      digitalWrite(P2, LOW);
      etap=0;
      break;
  }
}

Próbowałem  z switch case wyszło coś takiego.Na 2 zdjeciu jest stan przed wcisnieciem START i nie wiem dlaczego ale stan czujnika MAX powinien być wysoki a jest 0V.Po wcisnieciu START(zdj 1) zapala się P1 E2 P2 jednocześnie no a powinno zacząć od E1 i po kolei zapalac sie i gasic


Załączone pliki Miniatury
       
 
Odpowiedź
#36
(02-11-2023, 18:24)gintur napisał(a):
Kod:
#define CZUJNIK_MAX 2
#define CZUJNIK_MIN 3
#define E1 4
#define E2 5
#define P1 6
#define P2 7
#define START 8
int etap=0;

void setup() {
  digitalWrite(P1, LOW);
  digitalWrite(P2, LOW);
  digitalWrite(E1, LOW);
  digitalWrite(E2, LOW);
  pinMode(P1, OUTPUT);
  pinMode(P2, OUTPUT);
  pinMode(E1, OUTPUT);
  pinMode(E2, OUTPUT);
  pinMode(CZUJNIK_MAX, INPUT_PULLUP);
  pinMode(CZUJNIK_MIN, INPUT_PULLUP);
  pinMode(START, INPUT_PULLUP);
}

void loop() {
  switch(etap){
    case 0://oczekiwanie na przycisk start
      if (digitalRead(START)==LOW)etap=1;
      break;
    case 1://załączenie E1
      digitalWrite(E1, HIGH);
      etap=2;
      break;
    case 2://oczekiwanie na czujnik MAX
      if (digitalRead(CZUJNIK_MAX)==LOW)etap=3;
      break;
    case 3://wyłączenie E1, załączenie P1
      digitalWrite(E1, LOW);
      digitalWrite(P1, HIGH);
      etap=4;
      break;
    case 4://oczekiwanie na czujnik MIN
      if (digitalRead(CZUJNIK_MIN)==LOW)etap=5;
      break;
    case 5://wyłączenie P1, załączenie E2
      digitalWrite(P1, LOW);
      digitalWrite(E2, HIGH);
      etap=6;
      break;
    case 6://oczekiwanie na czujnik MAX
      if (digitalRead(CZUJNIK_MAX)==LOW)etap=7;
      break;
    case 7://wyłączenie E2, załączenie P2
      digitalWrite(E2, LOW);
      digitalWrite(P2, HIGH);
      etap=8;
      break;
    case 8://oczekiwanie na czujnik MIN
      if (digitalRead(CZUJNIK_MIN)==LOW)etap=9;
      break;
    case 9://wyłączenie P2
      digitalWrite(P2, LOW);
      etap=0;
      break;
  }
}

Próbowałem  z switch case wyszło coś takiego.Na 2 zdjeciu jest stan przed wcisnieciem START i nie wiem dlaczego ale stan czujnika MAX powinien być wysoki a jest 0V.Po wcisnieciu START(zdj 1) zapala się P1 E2 P2 jednocześnie no a powinno zacząć od E1 i po kolei zapalac sie i gasic
 
Odpowiedź
#37
Już wiem co było przyczyną .Kiedy pracował elektrozawór E1 i czekał na sygnał od czujnika MAX to przecież czujnik MIN tez zmienia swój stan podczas nalewania i te czujniki muszą działac wspólnie.Poprawiłem  to w kodzie i teraz działa. ;-)
Duzo czytałem na temat róznych funkcji i ciężko jest mi przerzucić działanie tych funkcji ,zmiennych itp na konkretny projekt a o switch case to sie dowiedziałem dopiero od Ciebie... jakos nigdy na to nie trafiłem
Kod:
#define CZUJNIK_MAX 2
#define CZUJNIK_MIN 3
#define E1 4
#define E2 5
#define P1 6
#define P2 7
#define START 8
int etap=0;

void setup() {
  digitalWrite(P1, LOW);
  digitalWrite(P2, LOW);
  digitalWrite(E1, LOW);
  digitalWrite(E2, LOW);
  pinMode(P1, OUTPUT);
  pinMode(P2, OUTPUT);
  pinMode(E1, OUTPUT);
  pinMode(E2, OUTPUT);
  pinMode(CZUJNIK_MAX, INPUT_PULLUP);
  pinMode(CZUJNIK_MIN, INPUT_PULLUP);
  pinMode(START, INPUT_PULLUP);
}

void loop() {
  switch(etap){
    case 0://oczekiwanie na przycisk start
      if (digitalRead(START)==LOW)etap=1;
      break;
    case 1://załączenie E1
      digitalWrite(E1, HIGH);
      etap=2;
      break;
    case 2://oczekiwanie na czujnik MAX
      if ((digitalRead(CZUJNIK_MAX)==LOW)&&(digitalRead (CZUJNIK_MIN)==LOW ))etap=3;
      break;
    case 3://wyłączenie E1, załączenie P1
      digitalWrite(E1, LOW);
      digitalWrite(P1, HIGH);
      etap=4;
      break;
    case 4://oczekiwanie na czujnik MIN
      if( (digitalRead(CZUJNIK_MIN)==HIGH)&& (digitalRead(CZUJNIK_MAX)==HIGH ))etap=5;
      break;
    case 5://wyłączenie P1, załączenie E2
      digitalWrite(P1, LOW);
      digitalWrite(E2, HIGH);
      etap=6;
      break;
    case 6://oczekiwanie na czujnik MAX
      if ((digitalRead(CZUJNIK_MAX)==LOW)&&(digitalRead(CZUJNIK_MAX)==LOW))etap=7;
      break;
    case 7://wyłączenie E2, załączenie P2
      digitalWrite(E2, LOW);
      digitalWrite(P2, HIGH);
      etap=8;
      break;
    case 8://oczekiwanie na czujnik MIN
      if ((digitalRead(CZUJNIK_MIN)==HIGH)&&(digitalRead(CZUJNIK_MAX)==HIGH))etap=9;
      break;
    case 9://wyłączenie P2
      digitalWrite(P2, LOW);
      etap=0;
      break;
  }
}
Nie wiem dlaczego ale kod w programie tincercad nie działa a na płytce stykowej jest ok.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości