Skocz do zawartości

Programowanie serwomechanizmu do poszczególnych przycisków


Pomocna odpowiedź

(edytowany)
2 godziny temu, AlanB napisał:

muszę coś wymyśleć bo jeśli Arduino wykona wszystkie kody itd. to jeśli nie zabierzmy kieliszka w ciągu 10s to znowu zaczyna się nalewać.

To taka właściwość void loop() 🙂

 

Edytowano przez Sylba
#include <Servo.h>

Servo myServo; // tworzenie obiektu dla serwa
const int buttonPin5 = 7; // pin przycisk5
const int buttonPin4 = 5; // pin przycisk 4
const int pumpPin = 8;    // pin pompka-przekaznik
const int buttonPin3 = 4; // pin przycisk 3
const int buttonPin2 = 3;  // pin przycisk 2 
const int buttonPin = 2;  //  pin przycisk 1
const int servoPin = 9;  // pin serwo

void setup() {
  pinMode(buttonPin5, INPUT_PULLUP); // przycisk5 jako wejscie
  pinMode(buttonPin4, INPUT_PULLUP); // przycisk4 jako wejscie
  pinMode(pumpPin, OUTPUT); // pin jako wyjscie
  pinMode(buttonPin3, INPUT_PULLUP); // przycisk3 jako wejscie
  pinMode(buttonPin2, INPUT_PULLUP); // przycisk2 jako wejscie
  pinMode(buttonPin, INPUT_PULLUP);  // przycisk1 jako wejscie
  myServo.attach(servoPin);  // 
}

void loop() {
  int buttonState = digitalRead(buttonPin);  // odczytaj stan przycisku

  if (buttonState == LOW) {  // jesli przycisk wcisniety
  delay(1000);
  myServo.write(20);  // sets the servo position to 50 degrees
    delay(1000);  // wait for 1 second
    digitalWrite(8, HIGH);
    delay(1000);
    digitalWrite(8, LOW);
    delay(1000);

  } else{
  }

  int buttonState2 = digitalRead(buttonPin2);

  if (buttonState2 == LOW) {
     delay(1000);
  myServo.write(40);  // sets the servo position to 50 degrees
    delay(1000);  // wait for 1 second
    digitalWrite(8, HIGH);
    delay(1000);
    digitalWrite(8, LOW);
    delay(1000);
   
  }else{
    //myServo.write(0);
  }
  int buttonState3 = digitalRead(buttonPin3);

  if (buttonState3 == LOW) {
    delay(1000);
  myServo.write(60);  // sets the servo position to 50 degrees
    delay(1000);  // wait for 1 second
    digitalWrite(8, HIGH);
    delay(1000);
    digitalWrite(8, LOW);
    delay(1000);
   
  }else{ 
  }
  int buttonState4 = digitalRead(buttonPin4);

  if (buttonState4 == LOW) {
    delay(1000);
  myServo.write(90);  // sets the servo position to 50 degrees
    delay(1000);  // wait for 1 second
    digitalWrite(8, HIGH);
    delay(1000);
    digitalWrite(8, LOW);
    delay(1000);
  }else{
  
  }
  int buttonState5 = digitalRead(buttonPin5);

  if (buttonState5 == LOW) {
    delay(1000);
  myServo.write(120);  // sets the servo position to 50 degrees
    delay(1000);  // wait for 1 second
    digitalWrite(8, HIGH);
    delay(1000);
    digitalWrite(8, LOW);
    delay(1000);
  }else{ 
myServo.write(0);
  }
     
delay(10000);
}

stworzyłem cos takiego natomiast jak minie 10s od ostatniej wykonanej komendy to znowu rusza cykl (zależy który przycisk jest wciśnięty) a chciałbym tak zrobić , żeby po tych 10 sekundach to co jest nadal wciśnięte zostanie pominięte i przejdzie do tego co dopiero został wciśnięty ...

1 godzinę temu, AlanB napisał:

jak minie 10s od ostatniej wykonanej komendy to znowu rusza cykl (zależy który przycisk jest wciśnięty) a chciałbym tak zrobić , żeby po tych 10 sekundach to co jest nadal wciśnięte zostanie pominięte i przejdzie do tego co dopiero został wciśnięty ...

Przydałyby się kontrolki przechowujące stan realizacji zadań. Np. dla każdego stanowiska są dwa stany: 1. Brak kieliszka, 2. Jest kieliszek. Inna kontrolka mogłaby kontrolować napełnienie: 1. Pusty 2. Napełniony. Jeszcze inna mogłaby kontrolować realizację rundy napełniania: 1. nierozpoczęte napełnianie, 2. zakończone napełnianie. Itd...

@AlanB przyjacielu , dzisiaj zacząłem pisać kod i nawet dobrze szło. Niestety pewnie nie do końca mogę logicznie myśleć wyskakiwały dziwne błędy, następnie moje 2 Usb odmówiły posłuszeństwa. Bałem się, że mogłem spalić ale po restarcie wszystko dobrze. 

Przygotowałem 2 wersje . Pierwsza zakłada , że masz 6 przycisków odpowiadających za 6 kieliszków, druga zakłada, że masz 1 przycisk oraz 6 czujników odpowiadających za (nie)obecność kieliszków. 

Zaraz wstawię jak się męczyłem z przyciskami 🙂 już za to Twoja maszyna powinna odpalić kolejkę z delajem  (3000) + (3000) ...

1 minutę temu, Santiago napisał:

 17282379771074421664397654067195.thumb.jpg.77f6c5b5b6d3bc3ed4099527abc148ac.jpg

Nie wszystkie kabelki są podłączone od przycisków, dioda symuluje przekaźnik.

We wtorek może się uda skończyć ! 

@Santiago


#include <Servo.h>

Servo myServo; // tworzenie obiektu dla serwa
const int buttonPin5 = 7; // pin przycisk5
const int buttonPin4 = 5; // pin przycisk 4
const int pumpPin = 8;    // pin pompka-przekaznik
const int buttonPin3 = 4; // pin przycisk 3
const int buttonPin2 = 3;  // pin przycisk 2 
const int buttonPin = 2;  //  pin przycisk 1
const int servoPin = 9;  // pin serwo

void setup() {
  pinMode(buttonPin5, INPUT_PULLUP); // przycisk5 jako wejscie
  pinMode(buttonPin4, INPUT_PULLUP); // przycisk4 jako wejscie
  pinMode(pumpPin, OUTPUT); // pin jako wyjscie
  pinMode(buttonPin3, INPUT_PULLUP); // przycisk3 jako wejscie
  pinMode(buttonPin2, INPUT_PULLUP); // przycisk2 jako wejscie
  pinMode(buttonPin, INPUT_PULLUP);  // przycisk1 jako wejscie
  myServo.attach(servoPin);
  if (buttonState == LOW) {
    continue;  // 
}

void loop() {
  int buttonState = digitalRead(buttonPin);  // odczytaj stan przycisku

  if (buttonState == LOW) {  // jesli przycisk wcisniety
  delay(1000);
  myServo.write(20);  // sets the servo position to 50 degrees
    delay(1000);  // wait for 1 second
    digitalWrite(8, HIGH);
    delay(1000);
    digitalWrite(8, LOW);
    delay(1000);
    

    
  } else{
  }

  int buttonState2 = digitalRead(buttonPin2);

  if (buttonState2 == LOW) {
     delay(1000);
  myServo.write(40);  // sets the servo position to 50 degrees
    delay(1000);  // wait for 1 second
    digitalWrite(8, HIGH);
    delay(1000);
    digitalWrite(8, LOW);
    delay(1000);
   
  }else{
    //myServo.write(0);
  }
  int buttonState3 = digitalRead(buttonPin3);

  if (buttonState3 == LOW) {
    delay(1000);
  myServo.write(60);  // sets the servo position to 50 degrees
    delay(1000);  // wait for 1 second
    digitalWrite(8, HIGH);
    delay(1000);
    digitalWrite(8, LOW);
    delay(1000);
   
  }else{ 
  }
  int buttonState4 = digitalRead(buttonPin4);

  if (buttonState4 == LOW) {
    delay(1000);
  myServo.write(90);  // sets the servo position to 50 degrees
    delay(1000);  // wait for 1 second
    digitalWrite(8, HIGH);
    delay(1000);
    digitalWrite(8, LOW);
    delay(1000);
  }else{
  
  }
  int buttonState5 = digitalRead(buttonPin5);

  if (buttonState5 == LOW) {
    delay(1000);
  myServo.write(120);  // sets the servo position to 50 degrees
    delay(1000);  // wait for 1 second
    digitalWrite(8, HIGH);
    delay(1000);
    digitalWrite(8, LOW);
    delay(1000);

  
  }else{ 
myServo.write(0);
  }
     
delay(10000);
}

Coś sie pobawiłem i wyszlo coś takiego , natomiast na koncu całej komendy czas na zabranie kieliszka to 10sek. po tym czasie jesli przycisk jest nadal wcisniety to zaczyna na nowo nalewac a chciałbym zeby ominąl ten przycisk ktory caly czas jest wcisniety...

(edytowany)
if (buttonState == LOW) {
    continue;  // 

Tu jest coś nie tak, o klamrę za dużo. Poza tym odczytujesz zmienną, której nawet nie zadeklarowałeś, jej deklaracja pojawia się dopiero w loop().

 

20 godzin temu, AlanB napisał:

na koncu całej komendy czas na zabranie kieliszka to 10sek. po tym czasie jesli przycisk jest nadal wcisniety to zaczyna na nowo nalewac a chciałbym zeby ominąl ten przycisk ktory caly czas jest wcisniety...

Twój kod jest mało responsywny przez to 10-sekundowe spanie. Nie sprawdzasz też poprzedniego stanu przycisku, czy kiedykolwiek został puszczony. Przed wywołaniami "if (buttonStateX == LOW)" musisz sprawdzić, czy buttony zostały wcześniej naciśnięte i dostosować do tego dalsze działanie. Najprościej stany buttonów wrzucić do tablicy i sprawdzać w pętli.

Nie mam arduino, więc kod obsługi jednego buttona podaję w micropythonie; chodzi o logikę działania:

import machine, time

button = machine.Pin(26, machine.Pin.IN) # używam rezystorów zewnętrznych, więc nie ma PULL
LOW = 1 # dopasowałem stan do twojego zapisu
jest_wcisniety = False # flaga stanu przycisku

while True: # u ciebie pętla "void loop()"
    if jest_wcisniety == True and button.value() == LOW: # sprawdzam stan przycisku
        print("olewka, nadal wciśnięty")
    else:
        jest_wcisniety = False
    
    if not jest_wcisniety and button.value() == LOW:  # tu twoje serwa, np. "if (buttonState2 == LOW)"
        jest_wcisniety = True
        print(">>> wciśnięty, coś tam działam z serwami ...")
        time.sleep(1)
    
    # długie spanie
    time.sleep(10)
Edytowano przez orb777
opisy

@orb777

import machine, time
button = machine.Pin(26, machine.Pin.IN) # używam rezystorów zewnętrznych, więc nie ma PULL
LOW = 1 # dopasowałem stan do twojego zapisu
jest_wcisniety = False # flaga stanu przycisku 

To muszę wstawić w kodzie przed void setup ? 

if jest_wcisniety == True and button.value() == LOW: # sprawdzam stan przycisku
        print("olewka, nadal wciśnięty")
    else:
        jest_wcisniety = False
    
    if not jest_wcisniety and button.value() == LOW:  # tu twoje serwa, np. "if (buttonState2 == LOW)"
        jest_wcisniety = True
        print(">>> wciśnięty, coś tam działam z serwami ...")
        time.sleep(1)
    
    # długie spanie
    time.sleep(10)

A to ma być u mnie w Void Loop? 

(edytowany)
7 godzin temu, AlanB napisał:

To muszę wstawić w kodzie przed void setup ? 

Nie, to schemat w innym języku, jednak wprowadził tylko zamęt. Chodziło mi o coś takiego jak poniżej, dopasowałem do twojego zapisu. Dobrze by było, gdybyś douczył się o tablicach, pętlach i chociaż strukturach, wtedy twój kod byłby krótszy i wyglądał dużo lepiej. Operacje na przyciskach powinna załatwiać krótka pętla for + tablica struktur. Poniższego nie sprawdzałem, nie mam arduino ide.

#include <Servo.h>

Servo myServo; // tworzenie obiektu dla serwa
const int buttonPin5 = 7; // pin przycisk5
const int buttonPin4 = 5; // pin przycisk 4
const int pumpPin = 8;    // pin pompka-przekaznik
const int buttonPin3 = 4; // pin przycisk 3
const int buttonPin2 = 3;  // pin przycisk 2 
const int buttonPin = 2;  //  pin przycisk 1
const int servoPin = 9;  // pin serwo

// --------------------
// to dodajesz
#define LICZBA_PRZYCISKOW 5
bool stan[LICZBA_PRZYCISKOW] = {false};
// --------------------

void setup() {
	pinMode(buttonPin5, INPUT_PULLUP); // przycisk5 jako wejscie
	pinMode(buttonPin4, INPUT_PULLUP); // przycisk4 jako wejscie
	pinMode(pumpPin, OUTPUT); // pin jako wyjscie
	pinMode(buttonPin3, INPUT_PULLUP); // przycisk3 jako wejscie
	pinMode(buttonPin2, INPUT_PULLUP); // przycisk2 jako wejscie
	pinMode(buttonPin, INPUT_PULLUP);  // przycisk1 jako wejscie
	myServo.attach(servoPin);
}

void loop() {

	int buttonState = digitalRead(buttonPin);  // odczytaj stan przycisku
	if(stan[0] == true && buttonState != LOW) {
		stan = false;
	}
	
	if(stan[0] == false && buttonState == LOW) {
		stan[0] = true // dodajesz stanu przycisku, indeks tablicy [5] zaczyna się od 0, kończy na 4
		
		delay(1000);
		myServo.write(20);  // sets the servo position to 50 degrees
		delay(1000);  // wait for 1 second
		digitalWrite(8, HIGH);
		delay(1000);
		digitalWrite(8, LOW);
		delay(1000);
		}
		
	int buttonState2 = digitalRead(buttonPin2);
	if(stan[1] == true && buttonState2 != LOW) {
		stan = false;
	}
	
	if(stan[1] == false && buttonState2 == LOW) {
		stan[1] = true // indeks 2
		
		delay(1000);
		myServo.write(40);  // sets the servo position to 50 degrees
		delay(1000);  // wait for 1 second
		digitalWrite(8, HIGH);
		delay(1000);
		digitalWrite(8, LOW);
		delay(1000);
		}
		
	// itd
	
	delay(10000);
}

 

Edytowano przez orb777

@AlanB całe szczęście komputer i arduino komunikują się i wszystko działa to zaczynam pisać od nowa program na 6 nieszczęsnych przycisków. Aby łatwiej mi było przygotowałem to co jest na zdjęciu🙂17283874601737897764568121612007.thumb.jpg.af06c514d57c8d8f6f43bdc8fa13ec0b.jpg

@AlanB

45 minut temu, AlanB napisał:

Jej jakie profesjonalne podejście do tematu

Widzę że koledze zebrało się na żarty :) no, ale na 6 przycisków już masz, podczas pisania popełniłem taki błąd zamiast == wstawilem = i szukałem .... 

#include <Servo.h>
Servo serwomechanizm;
bool przycisk0, przycisk1, przycisk2, przycisk3, przycisk4, przycisk5 = 0;
bool czekaj,    nalewaj = 0;
long czas, czas1;

void setup() {
 pinMode(13, OUTPUT);                   // dioda udaje przekaznik
 pinMode(A0,INPUT_PULLUP); pinMode(A1,INPUT_PULLUP); pinMode(A2,INPUT_PULLUP);  //przyciski
 pinMode(A3,INPUT_PULLUP); pinMode(A4,INPUT_PULLUP); pinMode(A5,INPUT_PULLUP);  //przyciski 
 serwomechanizm.attach(9);
 serwomechanizm.write(0);
 Serial.begin(9600);             // kontrola
}

void loop() {
  
 if (digitalRead(A0) == LOW) {  przycisk0 = true; czekaj = true; czas = millis(); }
 if (digitalRead(A1) == LOW) {  przycisk1 = true; czekaj = true; czas = millis(); }   
 if (digitalRead(A2) == LOW) {  przycisk2 = true; czekaj = true; czas = millis(); }  
 if (digitalRead(A3) == LOW) {  przycisk3 = true; czekaj = true; czas = millis(); } 
 if (digitalRead(A4) == LOW) {  przycisk4 = true; czekaj = true; czas = millis(); }
 if (digitalRead(A5) == LOW) {  przycisk5 = true; czekaj = true; czas = millis(); }         
 
 if ((czekaj = true) && (millis() - czas > 2000))     {
      
        if ( przycisk0 == true) {serwomechanizm.write(20);  digitalWrite(13,HIGH); delay(2000); digitalWrite(13, LOW);
                                przycisk0 = false;         delay(1000);  }
        if ( przycisk1 == true) {serwomechanizm.write(50);  digitalWrite(13,HIGH); delay(2000); digitalWrite(13, LOW);
                                przycisk1 = false;         delay(1000);  }
        if ( przycisk2 == true) {serwomechanizm.write(80);  digitalWrite(13,HIGH); delay(2000); digitalWrite(13, LOW);
                                przycisk2 = false;         delay(1000);  }
        if ( przycisk3 == true) {serwomechanizm.write(110); digitalWrite(13,HIGH); delay(2000); digitalWrite(13, LOW);
                                przycisk3 = false;         delay(1000);  }
        if ( przycisk4 == true) {serwomechanizm.write(140); digitalWrite(13,HIGH); delay(2000); digitalWrite(13, LOW);                           
                                przycisk4 = false;         delay(1000);  }
        if ( przycisk5 == true)  {serwomechanizm.write(170); digitalWrite(13,HIGH); delay(2000); digitalWrite(13, LOW);
                                przycisk5 = false;         delay(1000);  }
        
          
     serwomechanizm.write(0); czekaj = false;
 } // czekaj   
                                                                                                                                  
}    

 

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