Skocz do zawartości

Programowanie serwomechanizmu do poszczególnych przycisków


Pomocna odpowiedź

@AlanB  no okazało się to prostrze niż z przyciskami . Ale jutro to przeleję na Arduino.. Jak wykonasz obudowę, jakie zasilanie ,? no i koniecznie ten wyświetlacz - spodoba się każdemu.

17287601740931354241444133272464.jpg

#include <Servo.h>
Servo serwomechanizm;
bool czujnik0, czujnik1, czujnik2, czujnik3, czujnik4, czujnik5;
bool pusty0,   pusty1,   pusty2,   pusty3,   pusty4,   pusty5;


void setup() {
 pinMode(13, OUTPUT);                  // przekaznik
 pinMode(A0, INPUT_PULLUP);    pinMode(A1, INPUT_PULLUP);    pinMode(A2, INPUT_PULLUP);
 pinMode(A3, INPUT_PULLUP);    pinMode(A4, INPUT_PULLUP);    pinMode(A5, INPUT_PULLUP);
 serwomechanizm.attach(9);     serwomechanizm.write(0);

}

void loop() {   // rozpoczecie (nie)obecnosci kieliszkow, i przy okazji ustawienie 'pusty' gdy nie jest obecny
  if (digitalRead(A0) == HIGH)  {pusty0 = true;}
  if (digitalRead(A1) == HIGH)  {pusty1 = true;}
  if (digitalRead(A2) == HIGH)  {pusty2 = true;}
  if (digitalRead(A3) == HIGH)  {pusty3 = true;}
  if (digitalRead(A4) == HIGH)  {pusty4 = true;}
  if (digitalRead(A5) == HIGH)  {pusty5 = true;}   // koniec ustawiania warunku dla nieobecnego kieliszka

  if ((digitalRead(A0) == LOW) && (pusty0 == true)) {       
       serwomechanizm.write(20);  digitalWrite(13, HIGH); delay(2000); digitalWrite(13, LOW); pusty0 = false;
        delay(1000);}    // opuznienie tylko po to aby jakies krople spokojnie sobie pospadaly
  if ((digitalRead(A1) == LOW) && (pusty1 == true)) {
       serwomechanizm.write(50);  digitalWrite(13, HIGH); delay(2000); digitalWrite(13, LOW); pusty1 = false;
       delay(1000);}
  if ((digitalRead(A2) == LOW) && (pusty2 == true)) {
       serwomechanizm.write(80);  digitalWrite(13, HIGH); delay(2000); digitalWrite(13, LOW); pusty2 = false;
       delay(1000);}
  if ((digitalRead(A3) == LOW) && (pusty3 == true)) {
       serwomechanizm.write(110); digitalWrite(13, HIGH); delay(2000); digitalWrite(13, LOW); pusty3 = false;
       delay(1000);}
  if ((digitalRead(A4) == LOW) && (pusty4 == true)) {
       serwomechanizm.write(140); digitalWrite(13, HIGH); delay(2000); digitalWrite(13, LOW); pusty4 = false;
       delay(1000);}
  if ((digitalRead(A5) == LOW) && (pusty5 == true)) {
       serwomechanizm.write(170); digitalWrite(13, HIGH); delay(2000); digitalWrite(13, LOW); pusty5 = false;
       delay(1000);}
       
  serwomechanizm.write(0);  // NIE MA POTRZEBY WRACAC NA POZYVJE 0
  

}

U  mnie działa. Pamiętaj, aby zamiast delay(2000);  wstawić delay(czasnalewania);

stworzyć stałą to samo może się dotyczyć A0, A1... 

stworzyć funkcje nalewanie aby nie powtarzać sześć razy tego samego 🙂

No ale na razie to nieistotne . Uruchom i pomyśl nad czujnikami. 

Kod działa, ale ma istotny mankament. Serwo ustawia się na określonej pozycji natychmiast po ustawieniu tam kieliszka. Rozsądnym byłoby najpierw ustawić kieliszki, a potem rozpocząć ich napełnianie. Swoją propozycję jak to zrobić pokazałem parę wpisów wcześniej.

10 godzin temu, AlanB napisał:

Wystarczy dać delay przed serwomechanizm.write i już mamy zapas czasu po ustawieniu kieliszka

Niby tak, ale... Obstaję przy swoim pomyśle, chociaż ostatecznie to twój program i ty decydujesz.

if ((digitalRead(A0) == LOW) && (pusty0 == true)) {       
       serwomechanizm.write(20); 
       lcd.begin(16, 2); //Deklaracja typu
       lcd.setCursor(0, 0); //Ustawienie kursora
       lcd.print("   NALEWAM 1 "); //Wyświetlenie tekstu
       lcd.setCursor(0, 1); //Ustawienie kursora
       lcd.print("   KIELISZEK"); //Wyświetlenie tekstu digitalWrite(13, HIGH); delay(2000); digitalWrite(13, LOW); pusty0 = false;
      delay(1000);} // opuznienie tylko po to aby jakies krople spokojnie sobie pospadaly
         
  if ((digitalRead(A1) == LOW) && (pusty1 == true)) {
       serwomechanizm.write(50); 
       lcd.begin(16, 2); //Deklaracja typu
       lcd.setCursor(0, 0); //Ustawienie kursora
       lcd.print("   NALEWAM 2 "); //Wyświetlenie tekstu
       lcd.setCursor(0, 1); //Ustawienie kursora
       lcd.print("   KIELISZEK"); //Wyświetlenie tekstu digitalWrite(13, HIGH); delay(2000); digitalWrite(13, LOW); pusty0 = false;  digitalWrite(13, HIGH); delay(2000); digitalWrite(13, LOW); pusty1 = false;
       delay(1000);}

Próbuję coś zdziałać z wyświetlaczem 2x16 lcd i jak zwykle mam problem , chciałem zrobić tak :

Kieliszek stoi na pozycji 1 , serwomechanizm obraca się  o 20 stopni i wyświetla się napis " NALEWAM 1 KIELISZEK" itd. z kolejnymi pozycjami . 

Teraz problem jest taki, że jak stoją dwa kieliszki naraz to napis uruchamia się na przemian raz wskakuje 1 raz 2 i cały czas na zmianę. Jakiś pomysł ? Czy da się to zrobić aby napis uruchamiał do danego stopnia serwomechanizmu ?

(edytowany)
  //rozpoczęcie napełniania
  while (beginFillUp) {
    for ( int i=0; i<5; i++) {
      if (posToFillUp[i] == LOW) {
        Serial.print("pojemnik ");
        Serial.print(i+1);
        Serial.print("\t");
        moove(moovePos[i]);
        posToFillUp[i] = HIGH;
      }
    }
    Serial.println("\nNapełnianie zakończone");
    moove(0);
    beginFillUp = false;
4 godziny temu, AlanB napisał:

Teraz problem jest taki, że jak stoją dwa kieliszki naraz to napis uruchamia się na przemian raz wskakuje 1 raz 2 i cały czas na zmianę. Jakiś pomysł ? Czy da się to zrobić aby napis uruchamiał do danego stopnia serwomechanizmu ?

Zajrzyj do mojej propozycji. Tam jest to zrobione pod komentarzem //rozpoczęcie napełniania. Tekst trochę inny, ale można go łatwo zmienić. I jeszcze Serial.print trzeba zamienić na lcd.print.

Napełnianie rozpoczyna się gdy zmienna beginFillUp = true

Następnie napełniane są kolejne kieliszki funkcja for i tablica posToFillUp i funkcja moove odpowiadająca za obrót serwa i napełnianie.
Napełniane są tylko te kieliszki dla, których wartość posToFillUp = LOW.

Serial.print wyświetla napis. W twoim przypadku byłoby:

lcd.clear(); lcd.setCursor(0, 0); lcd.print("NAPELNIAM "); lcd.print(i+1); lcd.print(" KIELISZEK");

Po zakończeniu nalewania kieliszka następuje ustawienie zmiennej posToFillUp = HIGH

Edytowano przez Sylba
(edytowany)
7 minut temu, Santiago napisał:

@Sylba  stwórz jeszcze tablice Wypite ,aby liczyć ile na danej pozycji było nalane.

Całe te kodowanie to dla mnie jest czarna magia 😕 powoli coś tam przyswajam natomiast tworzenie nowych tablic i stworzenie żeby jeszcze to liczyło tak jak powinno i resetowało przy ponownym włączeniu urządzenia to już w ogóle dla mnie szok... Zresztą widać jak o wszystko muszę się was pytać co jak zrobić ....

Edytowano przez AlanB

W niedzielę podłącze wyświetlacz i coś się napisze. Powiedz jak to ma być wyświetlane, bo zrobię po swojemu. 

3 godziny temu, AlanB napisał:

tworzenie nowych tablic i stworzenie żeby jeszcze to liczyło tak jak powinno i resetowało przy ponownym włączeniu

Kasować już umiesz ! To są dane ulotne, z zapamiętywaniem jest więcej myślenia, a przydałoby się zapisywać 

1  sumę wszystkich nalań  z wszystkich imprez 

2 rekord nalań z imprez

3 rekord nalań do danego kieliszka z danej imprezy

No i do tego daty...

@Santiago myślałem nad czymś takim że:

Włączam zasilanie nalewaka i pojawia się napis np " NAPIJEMY SIĘ?"  po czym po chwili pojawi się napis " POSTAW KIELISZEK"  jak kieliszek zostanie postawiony to pokaże się napis "NALEWAM 1 KIELISZEK "  i tak do każdego kieliszka (kieliszek1, kieliszek2, kieliszek3, kieliszek4, kieliszek5) po nalaniu do kieliszka pokaże się napis np "ZDROWIE" I później znów od nowa . A co do liczenia ile kieliszków wypitych z danego miejsca to może jakiś osobny przycisk do przełączania pomiędzy danymi ... Sam nie wiem 

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...