Skocz do zawartości
wojt3k_h

Pomoc w programie dozownika automatycznego

Pomocna odpowiedź

witam mam program  działa tylko jest problem bo dysza rozpylająca jest ok 2 cm od czujnika" HC-SR04" wszystko skierowane pionowo w dół. Podsuwam dłoń czujnik czyta że coś się znajduje w odległości mniejszej niż zadana, następuje załączenie pompy tylko ze jak jest wystrzał cieczy to tak jakby sczytywał ze dalej jest dłoń na czujniku i tak zaczyna się zapętlać i tak strzela tryska co jest w programie nie tak prosił bym o pomoc

#define potentiometer  A0

#define echopin 11 // echo pin
#define trigpin 12  // Trigger pin

int read_pot =0;
unsigned long set_time =0;
unsigned long rememTime;

float distance_cm;
unsigned long ultra_time;
int set_cm = 20;
int motor = 2; // wyjście silnik
int flag=0;

void setup(){
Serial.begin(9600);

pinMode(potentiometer, INPUT);

pinMode (trigpin, OUTPUT);
pinMode (echopin, INPUT);

pinMode(motor, OUTPUT); 

delay(200); 
}

void loop(){ 

ultrasonicRead();

read_pot = analogRead(potentiometer);
set_time = map(read_pot, 0, 1023, 1UL, 50UL);

Serial.print("Distance :");
Serial.println(distance_cm); 
Serial.print("Time:");
Serial.println(set_time); 


if(distance_cm<set_cm && flag==0)
{

digitalWrite(motor,HIGH);
Serial.println("Motor On");
rememTime = millis();
flag=1; 

}

if(distance_cm > set_cm)
{
  flag=0;
}

if((millis()- rememTime) > set_time)
{   
digitalWrite(motor,LOW);
Serial.println("Motor Off");
}
delay(100); 
}


void ultrasonicRead()
{
digitalWrite(trigpin, LOW);
delayMicroseconds(2);
digitalWrite(trigpin, HIGH);
delayMicroseconds(10);
ultra_time = pulseIn (echopin, HIGH);
distance_cm =  ultra_time / 29 / 2; 
}

 

Udostępnij ten post


Link to post
Share on other sites

Ciągły odczyt z czujnika. Wykrycie dłoni powinno "zablokować" odczyty z czujnika do czasu zabrania dłoni (może być to stała wartość którą po prostu zmierzysz).

Udostępnij ten post


Link to post
Share on other sites

Napisz dokładniej, czy problem polega na tym, że:

  • gdy już zabierzesz dłoń to czujnik wciąż ją "widzi" i odpala silnik, albo..
  • gdy trzymasz dłoń pod dozownikiem to urządzenie wielokrotnie włacza pompkę a powinno tylko raz?

Pierwsze wskazuje na jakiś problem ze sprzętem (zakłócanie pracy czujnika przez silnik lub przez strumień tego czegoś co wypływa z dozownika), drugie raczej na braki w algorytmie.

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Mam podobny problem daj znać jak rozwiązałeś wielokrotne zapytania

ale jeśli :

Dnia 19.10.2020 o 10:06, wojt3k_h napisał:

Podsuwam dłoń czujnik czyta że coś się znajduje w odległości mniejszej niż zadana, następuje załączenie pompy tylko ze jak jest wystrzał cieczy to tak jakby sczytywał ze dalej jest dłoń na czujniku i tak zaczyna się zapętlać

to może umiejscowienie czujnika ruchu (ręki) bo czyta ciecz jako ręke ?? (przykładowo na górze i nadanie mu akcji poczekaj aż wykonasz rozwiąże problem tak jak naciskanie wody od góry , a czasem jest tak jak u ciebie od dołu i woda leci , spróbuj innego rozwiązania z umiejscowieniem czujki

Edytowano przez MrH4ze

Udostępnij ten post


Link to post
Share on other sites

Przepraszam,że się wtrącam ale problem nie jest w programie.Problem jest w zjawiskach fizycznych.Proszę przeczytać załączony pdf.Po przeczytaniu wszystko będzie jasne i klarowne.

M-15.pdf

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Żeby rozwiązać ten problem należało by po odczytaniu czujnika włączyć dyszę na określony czas, po tym czasie wyłączyć i odczekać określony czas i dopiero znowu sprawdzać czy czujnik został zasłonięty. Jednym słowem mogło by to wyglądać tak:
1. Sprawdzanie zasłonięcia czujnika
2. Jeśli czujnik zasłonięty to
3. Włączona dysza na określony czas
4. Po czasie z pkt 3 dysza wyłączona
5. Przerwa - czas oczekiwania (pewnie 1sek nawet starczy)
6. Sprawdzanie czy czujnik zasłonięty
7. Jeśli czujnik zasłonięty wracanie do pkt 3

Edytowano przez matrix0606

Udostępnij ten post


Link to post
Share on other sites

 

przepraszam dawno mnie nie było bo późno wracałem, dzięki  dla niektórych to chwilka napisać taki kod a mógł by ktoś wskazać co dopisać żeby odblokowywało kod po zabraniu dłoni

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Po pierwsze:
- nie wiem czy dobrze przeanalizowałem część kodu ale według mnie ten kawałek kodu nigdy Ci się nie wykona.

if((millis()- rememTime) > set_time)
{   
digitalWrite(motor,LOW);
Serial.println("Motor Off");
}
delay(100); 
}

a jeśli się wykona to powiedz mi dlaczego ? Bo ja uważam jak wyżej.

Po drugie:
- odczyt czujnika masz prawdopodobnie w funkcji:

void ultrasonicRead()

więc w tejże funkcji ja bym dopisał to co niżej na końcu, z tymże nie wiem jak działa Ci część sprzętowa więc nie daję sobie włosów obciąć że to będzie działać jak należy.

void ultrasonicRead()
{
digitalWrite(trigpin, LOW);
delayMicroseconds(2);
digitalWrite(trigpin, HIGH);
delayMicroseconds(10);
ultra_time = pulseIn (echopin, HIGH);
distance_cm =  ultra_time / 29 / 2; 

do
{
  //nie robisz nic
}while(digitalRead(echopin)); //ten kawałek kodu - czyli nic - będzie się wykonywało póki na wejściu echopin będzie stan wysoki
  delay(100);
}

 

Edytowano przez matrix0606

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

po wstawieniu kodu z while pompka załącza się sama z przerwami

Dnia 25.10.2020 o 13:51, matrix0606 napisał:

 

więc w tejże funkcji ja bym dopisał to co niżej na końcu, z tymże nie wiem jak działa Ci część sprzętowa więc nie daję sobie włosów obciąć że to będzie działać jak należy.

 


void ultrasonicRead()
{
digitalWrite(trigpin, LOW);
delayMicroseconds(2);
digitalWrite(trigpin, HIGH);
delayMicroseconds(10);
ultra_time = pulseIn (echopin, HIGH);
distance_cm =  ultra_time / 29 / 2; 

do
{
  //nie robisz nic
}while(digitalRead(echopin)); //ten kawałek kodu - czyli nic - będzie się wykonywało póki na wejściu echopin będzie stan wysoki
  delay(100);
}

 

 

Edytowano przez wojt3k_h

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...