Arduino Polska Forum
Problem z połączeniem warunków, opóźnieniem i kontaktronem - Wersja do druku

+- Arduino Polska Forum (https://forum.arduinopolska.pl)
+-- Dział: Korzystanie z Arduino (https://forum.arduinopolska.pl/dzial-korzystanie-z-arduino)
+--- Dział: Piaskownica (https://forum.arduinopolska.pl/dzial-piaskownica)
+--- Wątek: Problem z połączeniem warunków, opóźnieniem i kontaktronem (/watek-problem-z-po%C5%82%C4%85czeniem-warunk%C3%B3w-op%C3%B3%C5%BAnieniem-i-kontaktronem)



Problem z połączeniem warunków, opóźnieniem i kontaktronem - krulas123 - 06-01-2017

Hej, mam nadzieję, że w miarę dobrze to nazwałem i odpowiedni dział. Do rzeczy. Mam kontaktron w drzwiach od szafy przesuwnej, po otwarciu drzwi, chcę aby załączał się przekaźnik który będzie miał dwie możliwości wyłączenia, albo po zamknięciu drzwi, albo po upływie np minuty. O ile pojedynczo obie metody nie robią problemów o tyle z połączeniem ich mam problem. Poniżej kod na typowy button, jest jakaś prosta opcja go zmodyfikować, na innym forum dostałem tylko odp aby skorzystać z millis() ale nie wiem jak się za to zabrać aby w dalszym stopniu mieć połączone te warunki.  Ma ktoś z was jakiś pomysł jak to zrobić z jakimś przykładem, ewentualnie modyfikacją tego kodu Smile
Kod:
int button = 9;
int przekaznik = 8;
void setup() {
 // put your setup code here, to run once:
 pinMode (button, INPUT_PULLUP);
 pinMode (przekaznik, OUTPUT);
 digitalWrite(przekaznik, HIGH);

}
void loop() {
 if (digitalRead(button) == HIGH)
 {
   delay(20);    
   digitalWrite(przekaznik, LOW);
   //delay(180000);
   //digitalWrite(przekaznik, stan);
   delay(20);
   }
   else {
     digitalWrite(przekaznik, HIGH);}
}



RE: Problem z połączeniem warunków, opóźnieniem i kontaktronem - piotr2393 - 06-01-2017

Opcja z metodą milis():
-deklarujesz nową zmienną, najlepiej typu long i w momencie otwarcia szafy (przy wejściu w odpowiedniego if'a) przypisujesz jej aktualną wartość zwróconą przez milis()
- tworzysz kolejnego if'a z warunkiem alternatywy (lub)
Warunki wyłączenia czyli wyrzucasz digitalWrite(przekaznik, HIGH) :
- po upływie minuty (wartość utworzonej zmiennej + 60*1000ms)
LUB
- po odczycie stanu LOW na button'ie


RE: Problem z połączeniem warunków, opóźnieniem i kontaktronem - krulas123 - 06-01-2017

Jeśli chodzi o takie coś to nie działa wyłączanie po upływie czasu, dopiero po zwarciu kontaktronu wyłącza przekaźnik
Kod:
unsigned long czas;

bool stan = 0;

int przekaznik = 6;
int kontaktron = 2;

void setup() {

unsigned long czasON = millis();
 pinMode(kontaktron, INPUT_PULLUP);
 pinMode(przekaznik, OUTPUT);
 digitalWrite(przekaznik, HIGH);
}

void loop() {
 // grab current time

 if (digitalRead(kontaktron) == HIGH)   // ON- STARTS TIMER
 {
   
   digitalWrite(przekaznik, LOW);  // przekaznik comes On
   czas = millis();
   stan = 1;
 }

 if (czas + 3000 || digitalRead(kontaktron) == LOW)
 {
   digitalWrite(przekaznik, HIGH);  // przekaznik goes off
   stan = 0;
   
 }

}



RE: Problem z połączeniem warunków, opóźnieniem i kontaktronem - Smaczek - 07-01-2017

Witam,
Bo tak nie ma prawa działać.
Musisz do pierwszej zmiennej zczytac za pomocą millis () czas załączenia a następnie co wykonanie pętli ponownie czytać wartość z millis i sprawdzać czy różnica tych dwóch wartości przekroczyła 300.
W Twoim if-ie brakuje wywołania millis.
Pozdrawiam.


RE: Problem z połączeniem warunków, opóźnieniem i kontaktronem - piotr2393 - 07-01-2017

Dokładnie o to mi chodziło, zmień tylko pierwszy warunek w if'ie wyłączającym na:
Kod:
if(millis() > czas + 3000 || digitalRead(kontaktron) == LOW)


To powinno śmigać tak jak sobie zakładasz, pozdrawiam


RE: Problem z połączeniem warunków, opóźnieniem i kontaktronem - krn78 - 10-01-2017

Pisałem już gdzieś o tym i powtarzał będę: o wiele łatwiej i pewniej jest sterować za pomocą przycisków (i, rzecz jasna, kontaktronów i innych elementów stykowych) stanem niskim, nie wysokim.
W takim przypadku należy przycisk podłączyć do masy, nie do zasilania, a następnie:

Kod:
void setup(){
  pinMode(przycisk, INPUT_PULLUP);
}

if (digitalRead(button) == LOW){
  tu wpisujemy to, co ma się stać po wciśnięciu przycisku.
}