Arduino Polska Forum

Pełna wersja: Prośba o pomoc w napisaniu programu
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Stron: 1 2 3 4
Spróbuj napisać cokolwiek wg podanej receptury, wrzuć tutaj, napisz co nie działa to będziemy dalej nad tym pracować.
(27-10-2023, 19:07)gintur napisał(a): [ -> ]Tak wiem wszystkie elementy beda sterowane poprzez moduły przekaznikowe .
OK podaj link do tego Modulu, Jedne sasterowene High inne z Low
int czujMax;              //czujnik max 
co za czujniki.
Chciałbym zacząć od samego początku a wiec od uruchomienia programu czyli START.
Przyciskiem chwilowym  uruchamiam elektrozawór E1 który ma się włączyć na np 10
Kod:
[code]
#define E1 7
#define Przycisk 6
int x = 0;
unsigned long aktualnyCzas = 0;
unsigned long zapamietanyCzasDzialania = 0;

//E1Status=Status zaworu
void setup() {
  pinMode(E1,OUTPUT);
  pinMode(Przycisk,INPUT_PULLUP);
 
}

void loop() {
  aktualnyCzas= millis();
  if(digitalRead(Przycisk)==LOW){
   x=x+1;
    if(x==2)
    {x=0;}
    if(x==0){
      digitalWrite(E1,HIGH);}
      if(digitalRead(E1)==HIGH)
      {
       zapamietanyCzasDzialania=aktualnyCzas;}
     
      if(aktualnyCzas - zapamietanyCzasDzialania>=10000)
      {digitalWrite(E1,LOW);}
     
     
}
[/code]sek i samoczynnie wyłączyć .Szperając w sieci wyszło to ale nie działa .Przycisk włączy E1 ale juz nie chce się samoczynnie wyłączyć po upływie tych 10 se
Niepotrzebnie przejmujesz się stanem przycisku po aktywacji. Można założyć na początek, że nawet jak go trzymasz to po prostu póki jest wciśnięty to tylko o tyle przedłuży czas działania pompy ciągle ustawiając czas startu na nowo, można to potem elegancko i bez wysiłku ogarnąć gotową biblioteką do przycisków.
Jak wejdziesz w ifa i aktywujesz start to zacznie się praca pompy, ale nie ma niczego co ją potem wyłączy, bo przycisk już nie jest 0, a program nie sprawdza nic co jest wewnątrz if(digitalRead)==0, a tu właściwie masz cały program.
Brakuje też nawiasu, ale zakładam, że nie skopiowałeś ostatniej linii kodu.
Czyli musisz zakończyć blok gdzie startujesz ten etap, ustawiasz E1 na HIGH,  gdzieś wcześniej, a w innym bloku programu sprawdzać czy upłynęło już wystarczająco dużo czasu by go zakończyć, taki ping pong między dwoma blokami, jednym załączasz by drugim niezależnym wyłączyć.
Przykład:
Kod:
const uint8_t led=4,przycisk=3;
const uint32_t czasDolewania=3000;
bool stanLania;
enum etapy{oczekiwanie,podlewanie};
void setup() {
  // put your setup code here, to run once:
pinMode(led,OUTPUT);
pinMode(przycisk,INPUT_PULLUP);
Serial.begin(115200);
}

void loop() {
  // put your main code here, to run repeatedly:
static uint32_t aktCzas=0,startPracy=0; 
delay(1);
aktCzas++;//zliczanie ilosci loop, czyli zatrzyman na 1 ms


if(digitalRead(przycisk)==0)
{
startPracy=aktCzas; //zapis czasu wystartowania
stanLania=1; // ustawienie, że praca jest aktywna
digitalWrite(led,1);
}


if(stanLania)
{
if((aktCzas-startPracy)>czasDolewania) //minelo czasDolewania ms
{
    digitalWrite(led,0);
    stanLania=0;
}

}

if(aktCzas%1000 == 0)
{
  Serial.print(aktCzas); Serial.print(" "); Serial.print(startPracy); Serial.print(" "); Serial.print(aktCzas-startPracy); Serial.print(" "); Serial.print(stanLania); Serial.println(" ");
}

}
(28-10-2023, 09:11)Old Fony napisał(a): [ -> ]
(27-10-2023, 23:50)kaczakat napisał(a): [ -> ]Niepotrzebnie przejmujesz się stanem przycisku po aktywacji. Można założyć na początek, że nawet jak go trzymasz to po prostu póki jest wciśnięty to tylko o tyle przedłuży czas działania pompy ciągle ustawiając czas startu na nowo, można to potem elegancko i bez wysiłku ogarnąć gotową biblioteką do przycisków.
Jak wejdziesz w ifa i aktywujesz start to zacznie się praca pompy, ale nie ma niczego co ją potem wyłączy, bo przycisk już nie jest 0, a program nie sprawdza nic co jest wewnątrz if(digitalRead)==0, a tu właściwie masz cały program.
Brakuje też nawiasu, ale zakładam, że nie skopiowałeś ostatniej linii kodu.
Czyli musisz zakończyć blok gdzie startujesz ten etap, ustawiasz E1 na HIGH,  gdzieś wcześniej, a w innym bloku programu sprawdzać czy upłynęło już wystarczająco dużo czasu by go zakończyć, taki ping pong między dwoma blokami, jednym załączasz by drugim niezależnym wyłączyć.
Przykład:
Kod:
const uint8_t led=4,przycisk=3;
const uint32_t czasDolewania=3000;
bool stanLania;
enum etapy{oczekiwanie,podlewanie};
void setup() {
  // put your setup code here, to run once:
pinMode(led,OUTPUT);
pinMode(przycisk,INPUT_PULLUP);
Serial.begin(115200);
}

void loop() {
  // put your main code here, to run repeatedly:
static uint32_t aktCzas=0,startPracy=0; 
delay(1);
aktCzas++;//zliczanie ilosci loop, czyli zatrzyman na 1 ms


if(digitalRead(przycisk)==0)
{
startPracy=aktCzas; //zapis czasu wystartowania
stanLania=1; // ustawienie, że praca jest aktywna
digitalWrite(led,1);
}


if(stanLania)
{
if((aktCzas-startPracy)>czasDolewania) //minelo czasDolewania ms
{
    digitalWrite(led,0);
    stanLania=0;
}

}

if(aktCzas%1000 == 0)
{
  Serial.print(aktCzas); Serial.print(" "); Serial.print(startPracy); Serial.print(" "); Serial.print(aktCzas-startPracy); Serial.print(" "); Serial.print(stanLania); Serial.println(" ");
}

}
Wszystko fajnie , zapomniales o odbijaniu kontaktöw (bounce contacts) nim ten sie uspokoi to przy START pare razy program przeleci w Loopie. Przyciski i kontaktrony odbijaja pare razy nim sie uspokoja, wzial bym podprogram(Biblioteke)
 https://www.arduino.cc/reference/en/libr...tdebounce/
albo maly delay (100) i juz spokoj w garnku Wink
To sa drobnostki o ktorych sie przewaznie zapomina
@ TO te przekazniki nie sa przewidziane dla 230V nie maja na plytce wyciec miedzy kontaktami i sterowaniem
Znaczy przekazik jest dla 230V plytka nie.
Tak, faktycznie, albo, albo przeczytaj poprzednie posty,to jest program od którego można zacząć, demo, dlatego jest tam delay 1, o którym pisałem.
Ludzie jak Wy to ogarniacie? Smile.Kaczakat wpisałem to co podesłałeś i działa jest super  Big Grin tylko co dalej .... Huh
Kod który ja wstawiłem oparty był na przykładzie z sieci  troszke go przerobiłem pod siebie ale był jakoś tak dla mnie w miarę zrozumiały .Autor napisał kod do lampki która był sterowana czujnikiem PIR i miała się  zapalić na 18 sek i zgasnąć
Czytam ,szukam przykładów  z opisem a tu prosze pojawia się enum Confused
(28-10-2023, 09:26)Old Fony napisał(a): [ -> ]
(28-10-2023, 09:11)Old Fony napisał(a): [ -> ]
(27-10-2023, 23:50)kaczakat napisał(a): [ -> ]Niepotrzebnie przejmujesz się stanem przycisku po aktywacji. Można założyć na początek, że nawet jak go trzymasz to po prostu póki jest wciśnięty to tylko o tyle przedłuży czas działania pompy ciągle ustawiając czas startu na nowo, można to potem elegancko i bez wysiłku ogarnąć gotową biblioteką do przycisków.
Jak wejdziesz w ifa i aktywujesz start to zacznie się praca pompy, ale nie ma niczego co ją potem wyłączy, bo przycisk już nie jest 0, a program nie sprawdza nic co jest wewnątrz if(digitalRead)==0, a tu właściwie masz cały program.
Brakuje też nawiasu, ale zakładam, że nie skopiowałeś ostatniej linii kodu.
Czyli musisz zakończyć blok gdzie startujesz ten etap, ustawiasz E1 na HIGH,  gdzieś wcześniej, a w innym bloku programu sprawdzać czy upłynęło już wystarczająco dużo czasu by go zakończyć, taki ping pong między dwoma blokami, jednym załączasz by drugim niezależnym wyłączyć.
Przykład:
Kod:
const uint8_t led=4,przycisk=3;
const uint32_t czasDolewania=3000;
bool stanLania;
enum etapy{oczekiwanie,podlewanie};
void setup() {
  // put your setup code here, to run once:
pinMode(led,OUTPUT);
pinMode(przycisk,INPUT_PULLUP);
Serial.begin(115200);
}

void loop() {
  // put your main code here, to run repeatedly:
static uint32_t aktCzas=0,startPracy=0; 
delay(1);
aktCzas++;//zliczanie ilosci loop, czyli zatrzyman na 1 ms


if(digitalRead(przycisk)==0)
{
startPracy=aktCzas; //zapis czasu wystartowania
stanLania=1; // ustawienie, że praca jest aktywna
digitalWrite(led,1);
}


if(stanLania)
{
if((aktCzas-startPracy)>czasDolewania) //minelo czasDolewania ms
{
    digitalWrite(led,0);
    stanLania=0;
}

}

if(aktCzas%1000 == 0)
{
  Serial.print(aktCzas); Serial.print(" "); Serial.print(startPracy); Serial.print(" "); Serial.print(aktCzas-startPracy); Serial.print(" "); Serial.print(stanLania); Serial.println(" ");
}

}
Wszystko fajnie , zapomniales o odbijaniu kontaktöw (bounce contacts) nim ten sie uspokoi to przy START pare razy program przeleci w Loopie. Przyciski i kontaktrony odbijaja pare razy nim sie uspokoja, wzial bym podprogram(Biblioteke)
 https://www.arduino.cc/reference/en/libr...tdebounce/
albo maly delay (100) i juz spokoj w garnku Wink
To sa drobnostki o ktorych sie przewaznie zapomina
@ TO te przekazniki nie sa przewidziane dla 230V nie maja na plytce wyciec miedzy kontaktami i sterowaniem
Znaczy przekazik jest dla 230V plytka nie.
(28-10-2023, 15:01)gintur napisał(a): [ -> ]
(28-10-2023, 09:26)Old Fony napisał(a): [ -> ]
(28-10-2023, 09:11)Old Fony napisał(a): [ -> ]
(27-10-2023, 23:50)kaczakat napisał(a): [ -> ]Niepotrzebnie przejmujesz się stanem przycisku po aktywacji. Można założyć na początek, że nawet jak go trzymasz to po prostu póki jest wciśnięty to tylko o tyle przedłuży czas działania pompy ciągle ustawiając czas startu na nowo, można to potem elegancko i bez wysiłku ogarnąć gotową biblioteką do przycisków.
Jak wejdziesz w ifa i aktywujesz start to zacznie się praca pompy, ale nie ma niczego co ją potem wyłączy, bo przycisk już nie jest 0, a program nie sprawdza nic co jest wewnątrz if(digitalRead)==0, a tu właściwie masz cały program.
Brakuje też nawiasu, ale zakładam, że nie skopiowałeś ostatniej linii kodu.
Czyli musisz zakończyć blok gdzie startujesz ten etap, ustawiasz E1 na HIGH,  gdzieś wcześniej, a w innym bloku programu sprawdzać czy upłynęło już wystarczająco dużo czasu by go zakończyć, taki ping pong między dwoma blokami, jednym załączasz by drugim niezależnym wyłączyć.
Przykład:
Kod:
const uint8_t led=4,przycisk=3;
const uint32_t czasDolewania=3000;
bool stanLania;
enum etapy{oczekiwanie,podlewanie};
void setup() {
  // put your setup code here, to run once:
pinMode(led,OUTPUT);
pinMode(przycisk,INPUT_PULLUP);
Serial.begin(115200);
}

void loop() {
  // put your main code here, to run repeatedly:
static uint32_t aktCzas=0,startPracy=0; 
delay(1);
aktCzas++;//zliczanie ilosci loop, czyli zatrzyman na 1 ms


if(digitalRead(przycisk)==0)
{
startPracy=aktCzas; //zapis czasu wystartowania
stanLania=1; // ustawienie, że praca jest aktywna
digitalWrite(led,1);
}


if(stanLania)
{
if((aktCzas-startPracy)>czasDolewania) //minelo czasDolewania ms
{
    digitalWrite(led,0);
    stanLania=0;
}

}

if(aktCzas%1000 == 0)
{
  Serial.print(aktCzas); Serial.print(" "); Serial.print(startPracy); Serial.print(" "); Serial.print(aktCzas-startPracy); Serial.print(" "); Serial.print(stanLania); Serial.println(" ");
}

}
Wszystko fajnie , zapomniales o odbijaniu kontaktöw (bounce contacts) nim ten sie uspokoi to przy START pare razy program przeleci w Loopie. Przyciski i kontaktrony odbijaja pare razy nim sie uspokoja, wzial bym podprogram(Biblioteke)
 https://www.arduino.cc/reference/en/libr...tdebounce/
albo maly delay (100) i juz spokoj w garnku Wink
To sa drobnostki o ktorych sie przewaznie zapomina
@ TO te przekazniki nie sa przewidziane dla 230V nie maja na plytce wyciec miedzy kontaktami i sterowaniem
Znaczy przekazik jest dla 230V plytka nie.
To był pierwszy lepszy przykład z sieci .O jakich dokładnie wycięciach piszesz?

Mam moduły przekaznikowe z optoizolacją służą mi ok 5 lat i takie same zastosuje do tego sterownika jeżeli taki powstanie Smile
Stron: 1 2 3 4