• 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
Problem z połączeniem warunków, opóźnieniem i kontaktronem
#1
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);}
}
 
Odpowiedź
#2
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
 
Odpowiedź
#3
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;
   
 }

}
 
Odpowiedź
#4
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.
 
Odpowiedź
#5
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
 
Odpowiedź
#6
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.
}
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości