Skocz do zawartości

Pomocna odpowiedź

Dnia 8.12.2021 o 10:36, g00pher napisał:

Witam, mam takie pytanie techniczne. Jak zrobić pauzę w wykonywaniu programu, żeby wymienić butelkę ???

Pauza to nie problem...pytanie czym ma być wyzwalana?

1 godzinę temu, farmaceuta napisał:

Pauza to nie problem...pytanie czym ma być wyzwalana?

Najprościej jak się da, czyli na oko, przycisk i robi pauzę. Najlepiej tym samym co się załącza akcje.

1 godzinę temu, g00pher napisał:
2 godziny temu, Kasztan napisał:

Jeżeli nie leci ciecz przez pewien czas 

Można i tak...na pewno pewniejsze niż przepływomierz chińskiego pochodzenia, choć ja z tych urządzeń nie korzystałem...

 

1 godzinę temu, g00pher napisał:

Najprościej jak się da, czyli na oko, przycisk i robi pauzę. Najlepiej tym samym co się załącza akcje.

No dobra...jak najbardziej wykonalne..np. dłuższe przytrzymanie guzika oznacza wymianę butli lub lepiej np dwa szybkie wciśnięcia, ale wtedy trzeba kod tak przerobić żeby poczekał na wybór trybu i nie załączał akcji...bo rozumiem że ten guzik po naciśnięciu poprostu uruchamia maszynę tak? (Nie patrzyłem uważnie na kod etc)

No i tu nasza ulubiona biblioteka Bounce2 🙂

Reakcja jest na puszczenie klawisza (nie wciśnięcie), a czas jak długo klawisz został przytrzymany odczytujesz odpowiednią metodą z biblioteki 🙂

 

Dnia 8.12.2021 o 10:36, g00pher napisał:

Witam, mam takie pytanie techniczne. Jak zrobić pauzę w wykonywaniu programu, żeby wymienić butelkę ???

moze teraz bedzie to czego chcesz...

#include <Servo.h>

Servo myservo;

#define kp 2
#define vp 3
#define czerwona 5
#define zielona 6
#define niebieska 4
#define start 7
#define Trig 8
#define Echo 9
#define serwo 10
#define bateria A0
#define potencjometr A2

int dystans;
long duration;
int a = 2;
int b = 5;
int pos = 0;
int odczytanaWartosc = 0;
int wartosc = 0;
int czasOpoznienia = 300;
byte akcja = 0;

void setup() 
{
  Serial.begin(9600);
  Serial.println("napięcie");
  myservo.attach(10);
  pinMode(kp, OUTPUT);
  pinMode(vp, OUTPUT);
  pinMode(czerwona, OUTPUT);
  pinMode(zielona, OUTPUT);
  pinMode(niebieska, OUTPUT);
  pinMode(start, INPUT_PULLUP);
  pinMode(Trig, OUTPUT);
  pinMode(Echo, INPUT); 
  pinMode(bateria, INPUT_PULLUP);
  pinMode(potencjometr, INPUT_PULLUP);
}

void loop()
{
  if (digitalRead(start) == LOW) {
    delay(1000);
    akcja = 1;
    if (digitalRead(start) == LOW) {
      delay(1000);
      akcja = 0;
      //tu wylacz pompy!! (dopisz)
      //ewentualnie zaswiec jakis led jako info o zablokowaniu
    }
  }
  
int wartosc = analogRead(bateria);
byte poziom = (wartosc / 204.8)*2.4;
Serial.println(poziom);
delay(50);

if (poziom < 7)
{
  myservo.write(0);
  digitalWrite(niebieska, LOW);        
  digitalWrite(zielona, LOW);
  digitalWrite(czerwona, HIGH);
}
else
{
  myservo.write(0);
  digitalWrite(niebieska, LOW);        
  digitalWrite(zielona, HIGH);
  digitalWrite(czerwona,LOW);
} 
if (akcja == 1){
 
   myservo.write(14);
   digitalWrite(niebieska, LOW);        
   digitalWrite(zielona, HIGH);
   digitalWrite(czerwona,LOW);
   delay(czasOpoznienia);
   dystans = calculateDistance();
   if((dystans >=a) && (dystans <= b))
{
lanie();
}
   myservo.write(28);
   digitalWrite(niebieska, LOW);        
   digitalWrite(zielona, HIGH);
   digitalWrite(czerwona,LOW);
   delay(czasOpoznienia);
   dystans = calculateDistance();
   if((dystans >=a) && (dystans <= b))
{
lanie();
}
   myservo.write(45);
   digitalWrite(niebieska, LOW);        
   digitalWrite(zielona, HIGH);
   digitalWrite(czerwona,LOW);
   delay(czasOpoznienia);
   dystans = calculateDistance();
   if((dystans >=a) && (dystans <= b))
{
lanie();
}
   myservo.write(62);
   digitalWrite(niebieska, LOW);        
   digitalWrite(zielona, HIGH);
   digitalWrite(czerwona,LOW);
   delay(czasOpoznienia);
   dystans = calculateDistance();
   if((dystans >=a) && (dystans <= b))
{
lanie();
}
   myservo.write(80);
   digitalWrite(niebieska, LOW);        
   digitalWrite(zielona, HIGH);
   digitalWrite(czerwona,LOW);
   delay(czasOpoznienia);
   dystans = calculateDistance();
   if((dystans >=a) && (dystans <= b))
{
lanie();
}
   myservo.write(99);
   digitalWrite(niebieska, LOW);        
   digitalWrite(zielona, HIGH);
   digitalWrite(czerwona,LOW);
   delay(czasOpoznienia);
   dystans = calculateDistance();
   if((dystans >=a) && (dystans <= b))
{
lanie();
}
   myservo.write(120);
   digitalWrite(niebieska, LOW);        
   digitalWrite(zielona, HIGH);
   digitalWrite(czerwona,LOW);
   delay(czasOpoznienia);
   dystans = calculateDistance();
   if((dystans >=a) && (dystans <= b))
{
lanie();
}
   myservo.write(140);
   digitalWrite(niebieska, LOW);        
   digitalWrite(zielona, HIGH);
   digitalWrite(czerwona,LOW);
   delay(czasOpoznienia);
   dystans = calculateDistance();
   if((dystans >=a) && (dystans <= b))
{
lanie();
}
   myservo.write(158);
   digitalWrite(niebieska, LOW);        
   digitalWrite(zielona, HIGH);
   digitalWrite(czerwona,LOW);
   delay(czasOpoznienia);
   dystans = calculateDistance();
   if((dystans >=a) && (dystans <= b))
{
lanie();
}
   myservo.write(174);
   digitalWrite(niebieska, LOW);        
   digitalWrite(zielona, HIGH);
   digitalWrite(czerwona,LOW);
   delay(czasOpoznienia);
   dystans = calculateDistance();
   if((dystans >=a) && (dystans <= b))
{
lanie();
}
  for (pos = 180; pos >= 0; pos -= 1) {
    myservo.write(pos);
    delay(15);  
} 

    
  }
}

int calculateDistance() { 
  
  digitalWrite(Trig, LOW); 
  delayMicroseconds(2);
  digitalWrite(Trig, HIGH); 
  delayMicroseconds(10);
  digitalWrite(Trig, LOW);
  duration = pulseIn(Echo, HIGH);
  dystans = duration / 58;
  return dystans;
}

void lanie ()
{
    odczytanaWartosc = analogRead(potencjometr);
    odczytanaWartosc = map(odczytanaWartosc, 0, 1023, 5, 30);
    digitalWrite(niebieska, HIGH);        
    digitalWrite(zielona, LOW);
    digitalWrite(czerwona,LOW);
    analogWrite(vp,200);
    digitalWrite(kp, 1);
    delay(100*odczytanaWartosc);
    analogWrite(vp,0);
    digitalWrite(kp, 0);
    digitalWrite(niebieska, HIGH);        
    digitalWrite(zielona, LOW);
    digitalWrite(czerwona,LOW);
    delay(500); 
}

krotkie wcisniecie maszyna startuje...przytrzymasz dluzej to praca zostanie przerwana z tym ze w drugim if musisz wylaczyc pompe,moze jakis led zapalic etc..jest opisane...opcja biblioteki o ktorej wspominal kolega @ethanak napewno lepsza jest bo nie blokuje no ale ja meczyl sie nie bede bo nie uzywam...😅

18 godzin temu, farmaceuta napisał:

krotkie wcisniecie maszyna startuje...przytrzymasz dluzej to praca zostanie przerwana z tym ze w drugim if musisz wylaczyc pompe,moze jakis led zapalic etc..jest opisane...

Dziękuję za fatygę ale coś jest nie tak, w monitorze portu nie widzi w ogóle wciskanej "pauzy" a po skończonej akcji już nie czeka na start tylko zaczyna wszystko do początku. Ale zaznaczam, że z programowaniem u mnie kiepsko a metodą prób i błędów kręcę się w kółko 😞

void loop()
{
  if (digitalRead(start) == LOW) {
    delay(1000);   
    akcja = 1;
    Serial.println("START"); 
  
  if (digitalRead(start) == LOW) {
    delay(1000);     
    akcja = 0;
    Serial.println("PAUZA");
    digitalWrite(niebieska, LOW);        
    digitalWrite(zielona, LOW);
    digitalWrite(czerwona, HIGH);
      //tu wylacz pompy!! (dopisz)
      //ewentualnie zaswiec jakis led jako info o zablokowaniu
    }
  }

https://www.tinkercad.com/things/4AsPcigh4lc-nalewacz-v12-z-pauza

1 godzinę temu, g00pher napisał:

 a po skończonej akcji już nie czeka na start tylko zaczyna wszystko do początku.


p()
{
 f (digitalRead(start) == LOW) {
 ona, LOW);
    digitalWrite(czerwona, HIGH);
      //tu wylacz

Ten kod nie jest istotny...nowy tel mam i coś tu nie gra..(nie mogę skasować tego?) 

Więc tak...zmienna akcja umieść na końcu warunku i dopisz do niej zero...wtedy przestanie się się powtarzać i będzie czekać na guzik...co do startu od nowa to nic nie poradzę bo tak kod jest zbudowany...poprostu musisz czekać aż całość się wykona...chociaż nie rozumiem teraz po co ta pauza wogole?? Skoro nalewasz tylko wtedy jak chcesz? Więc podczas postoju normalnie wymieniasz butelkę i nic złego się nie stanie...

  • 5 miesiące później...
(edytowany)

Modelarstwo nie ma tu nic do rzeczy(Bruder), to raczej zamiłowanie do pewnej zielonej marki, oraz maszyn i płynów z dużą mocą😁.

Edytowano przez SOYER

Normalnie szczyt lenistwa, żeby do kieliszka już się nie chciało samemu nalać. 😄😉

Ale jeszcze jest następny poziom, czyli kroplówka.

  • 6 miesiące później...

Witam serdecznie, trochę odkurzę zapomniany temat ale tak mi się to urządzonko spodobało że musiałem napisać. Bardzo dobry projekcik brawo 👏, może taki wykonam. Od razu nasunął mi się dodatkowy pomysł jak można by to udoskonalić. A mianowicie czy można by było dodać belki tensometryczne i serwo po wykryciu ciężaru od razu przemieszało by się pod wskazane miejsce aby nalać ? Urządzenie pracowałoby (byłoby w gotowości) od włączenia cały czas. Wydaje mi się to fajne rozwiązanie tylko czy wymagałoby dużej ingerencji w kod podany przez autora ? Dopiero raczkuje w arduino więc to ciężki kawałek chleba obecnie dla mnie ale mam nadzieję że ktoś pomoże.

Jakiego komponentu użyć w tinkercad do próby podłączenie czegoś takiego ponieważ belki tensometrycznej nie zauważyłem tam.

  • Lubię! 1

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...