• 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
czujnik - arduino
#1
Witam,
bardzo proszę o pomoc - wskazówkę w kodzie 
Podłączyłem czujnik do mojego Arduino i mam tylko jeden problem - chciałbym aby jeden z pinów przechodził w tryb HIGH dopiero kiedy czujnik jest zakryty przez okres 5s. Jeśli obiekt przykryje czujnik na krótszy czas wtedy pin ma pozostać LOW
Bardzo proszę o wyrozumiałość i wskazówki
 
Odpowiedź
#2
Nie wiemy jaki czujnik, nie wiemy jaki pin. Podaj jakikolwiek schemat, bo nie jesteśmy jasnowidzami.

Generalnie kod będzie wyglądał następująco (to tylko algorytm, więc będziesz musiał większość napisać sam):
Kod:
int czas;

Potem, gdzieś w loopie:
if(sygnał z czujnika<jakaś wartość){
czas=millis();
if((sygnał z czujnika<jakaś wartość)&&(millis()-czas>5000){
digitalWrite(jakisPin, HIGH);
}
}
Tak to chyba będzie wyglądać.
 
Odpowiedź
#3
(01-12-2017, 13:18)krn78 napisał(a): Nie wiemy jaki czujnik, nie wiemy jaki pin. Podaj jakikolwiek schemat, bo nie jesteśmy jasnowidzami.

Generalnie kod będzie wyglądał następująco (to tylko algorytm, więc będziesz musiał większość napisać sam):
Kod:
int czas;

Potem, gdzieś w loopie:
if(sygnał z czujnika<jakaś wartość){
czas=millis();
if((sygnał z czujnika<jakaś wartość)&&(millis()-czas>5000){
digitalWrite(jakisPin, HIGH);
}
}
Tak to chyba będzie wyglądać.

Witam,
bardzo dziękuję za odpowiedź i przepraszam za brak konkretów
jest to czujnik indukcyjny NPN - sygnał 0V
Sygnał z czujnika podpięty jest do pinu 7 (wejście) a pin 8 służy jako wyjście
Dziękuję i doceniam każdą wskazówkę

Kod jaki napisałem to

Kod:
void setup() {
 pinMode(8, OUTPUT);
 pinMode(7, INPUT_PULLUP);
 digitalWrite(8, LOW);
}

void loop()
{

 if (digitalRead(7)== LOW){
   delay(5000);
   digitalWrite(8, HIGH);
 } else {
   digitalWrite(8, LOW);
 }
}


Działa jednak po jakimś czasie załącza pin 8 nawet kiedy obiekt nie przykrywa czujnika przez 5s
 
Odpowiedź
#4
Zrób tak:
Kod:
int czas;
void setup() {
  pinMode(8, OUTPUT); 
  pinMode(7, INPUT_PULLUP); 
  digitalWrite(8, LOW); 
}
 
void loop()
{
  czas=millis();
  while(digitalRead(7)== LOW){
    if((digitalRead(7)== LOW)&&(millis()-czas>5000){
    digitalWrite(8, HIGH); 
  }
  digitalWrite(8, LOW); 
  }
}
To może zadziałać Smile
 
Odpowiedź
#5
(01-12-2017, 14:39)josseff napisał(a):
(01-12-2017, 13:54)krn78 napisał(a): Zrób tak:
Kod:
int czas;
void setup() {
  pinMode(8, OUTPUT); 
  pinMode(7, INPUT_PULLUP); 
  digitalWrite(8, LOW); 
}
 
void loop()
{
  czas=millis();
  while(digitalRead(7)== LOW){
   if((digitalRead(7)== LOW)&&(millis()-czas>5000){
    digitalWrite(8, HIGH); 
  }
  digitalWrite(8, LOW); 
  }
}
To może zadziałać Smile
Niestety nie działa tak jak potrzebuję
Z jakiegoś powodu przy tym kodzie daje mi 1.2V na pin 8 kiedy jest HIGH i kiedy już raz pin przechodzi w stan HIGH to potem za kazdym razem kiedy czujnik jest zakryty na sekundę pin 8 też przechodzi w stan HIGH
Naprawdę bardzo doceniam pomoc
 
Odpowiedź
#6
Pseudokod:
jeśli (czujnik == 1) to czas=millis(); kasuj wyjście
jeśli (millis() - czas > 5s) to ustaw wyjście
Pomagam za darmo więc szanuj mój czas.
Wklejaj tekst a nie jego zdjęcie.
Nie pisz następnego postu jak nie odpowiedziałeś na poprzedni.
Jak mądrze zadawać pytania
 
Odpowiedź
#7
(01-12-2017, 15:06)namok napisał(a): Pseudokod:
jeśli (czujnik == 1) to czas=millis(); kasuj wyjście
jeśli (millis() - czas > 5s) to ustaw wyjście

Witam i dziękuję za zainterseowanie i pomoc
Wtej chwili kod wygląda tak

Kod:
int czas;
void setup() {
 pinMode(8, OUTPUT);
 pinMode(7, INPUT_PULLUP);
 digitalWrite(8, LOW);
}

void loop()
{
 czas=millis();
 while(digitalRead(7)== LOW){
 
  if((digitalRead(7)==1)&&(millis())){
  }
  if(millis()-czas>5000)
   digitalWrite(8, HIGH);
 
  }
 digitalWrite(8, LOW);
 }


Problem jest tylko jeden - po kilkudziesięciu krótkich sygnałach z czujnika (poniżej 5s) pin 8 przechodzi w tryb HIGH za każdym razem kiedy czujnik daje sygnał
 
Odpowiedź
#8
Zamień mój pseudokod na program i będzie działało tak jak oczekujesz.
Pomagam za darmo więc szanuj mój czas.
Wklejaj tekst a nie jego zdjęcie.
Nie pisz następnego postu jak nie odpowiedziałeś na poprzedni.
Jak mądrze zadawać pytania
 
Odpowiedź
#9
(01-12-2017, 15:06)namok napisał(a): Pseudokod:
jeśli (czujnik == 1) to czas=millis(); kasuj wyjście
jeśli (millis() - czas > 5s) to ustaw wyjście
Nie do końca, bo ustawienie wyjścia ma się odbyć, jeśli przycisk będzie wciśnięty przez dłużej niż pięć sekund. W tym przypadku wyjście ustawi się pięć sekund po naciśnięciu przycisku, nawet jeśli będzie puszczony. Jeśli dolny warunek jest wnętrzem górnego, to też nie zadziała, bo czas przy każdej pętli zmienna czas będzie przyjmować nową wartość.
 
Odpowiedź
#10
Pseudokod jest prawidłowy.
Wciśnięty przycisk(zadziałany czujnik) daje na wyjściu sygnał niski.
Pomagam za darmo więc szanuj mój czas.
Wklejaj tekst a nie jego zdjęcie.
Nie pisz następnego postu jak nie odpowiedziałeś na poprzedni.
Jak mądrze zadawać pytania
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości