Skocz do zawartości

Pomoc w programie dozownika automatycznego


wojt3k_h

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; 
}

 

Link do komentarza
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.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Ż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
Link do komentarza
Share on other sites

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
Link do komentarza
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
Link do komentarza
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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.