27-10-2023, 20:23
Spróbuj napisać cokolwiek wg podanej receptury, wrzuć tutaj, napisz co nie działa to będziemy dalej nad tym pracować.
Miło być decenianym https://buycoffee.to/kaczakat
Ocena wątku:
Prośba o pomoc w napisaniu programu
|
[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);}
}
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):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)(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(" ");
}
}
(28-10-2023, 09:26)Old Fony napisał(a):(28-10-2023, 09:11)Old Fony napisał(a):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)(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(" ");
}
}
https://www.arduino.cc/reference/en/libr...tdebounce/
albo maly delay (100) i juz spokoj w garnku
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):To był pierwszy lepszy przykład z sieci .O jakich dokładnie wycięciach piszesz?(28-10-2023, 09:26)Old Fony napisał(a):(28-10-2023, 09:11)Old Fony napisał(a):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)(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(" ");
}
}
https://www.arduino.cc/reference/en/libr...tdebounce/
albo maly delay (100) i juz spokoj w garnku
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.