Skocz do zawartości

Programowanie serwomechanizmu do poszczególnych przycisków


Pomocna odpowiedź

@AlanB ok , mam teraz czas i jeszcze mam wszystko podłączone - działające :). Więc zaczynami dzieło :).  Wpierw musimy zaznajomić się co chcemy osiągnąć - więc zmieniać ilość nalanego płyny w zależności od odczytanej wartości z potencjometru. 

Teraz , jakie wartości to mają być , wspomniane było 20, 25 , 30 mililitrów ...nieco zaniżone no ale zaszalejmy i wprowadzimy jeszcze 40 ... 

Co potrzebujemy , potencjometr montażowy i kabelki. Następnie musimy to odpowiednio wpiąć , tak aby czytać sobie wartości analogowe. 

Musimy stworzyć tabele z czasami dla poszczególnych ustawień potencjometru

Najlepiej jeszcze aby robiła to jakaś funkcja, która tylko w razie potrzeby będzie wywoływana. I w sumie to by wystarczyło. 

Pozostaje kwestia wyświetlania ilości nalanego płynu - można przeliczać to z  czasu opóźnienia , albo stworzyć tablice z tymi wartościami. W tym przypadku (mało danych) stworzymy tablicę. Niestety nie znam wydajności tej ciekawej pompki więc to co ja napiszę autor Nalewaka będzie musiał skorygować, albo poda mi jaka ona jest wydajna. 

Jeszcze potrzebujemy informacji na wyświetlaczu - ile płynu jest nalewane obecnie.

@orb777 oczywiście to czytałem, w sumie wszystko co dotyczy się Arduino też przeczytałem. 

Dzisiaj niestety muszę zakończyć (chociaż ledwie zacząłem ) programowanie, jutro też jest dzień. 

  • Lubię! 1
(edytowany)

@Santiago , a to spoko, tego, wisz. Może kiedyś powrócę do biblioteki arduinów, a na razie standardowe c++ wypada sobie lepiej przypomnieć. Jaki jest twój natywny język, tzn. ten w którym mówisz od małego?

Edytowano przez orb777

@AlanB Na drugim Arduino Uno napisałem kod, potencjometr montażowy i dioda z opornikiem, która udaje przekaźnik. kod działa oraz licznik ilości nalanego płynu też działa. Jednak sam w tabeli musisz odpowiednio dobrać czasy opóźnień , ja nie wiem jak długo trwa napełnienie kieliszka 250ml czy 350... zrobisz to w tabeli tCzas[5] { 0, 1000, 1500, 2000, 2500};

Zera nie ruszaj, na razie nie jest ważne dlaczego jest 🙂 Kod mam na innym komputerze, a ze względu na swój wiek ma problem z internetem . dlatego muszę wrzucić na pendriva i za jakiś czas prześlę, Jest to tylko funkcja , oderwana od reszty  programu , ale wstawienie jej do programu docelowego jest proste. Jak czas pozwoli to do godziny wszystko będzie zrobione.

int zPotencjometr = 0;
int zSuma = 0;
int tCzas[5] { 0, 1000, 1500, 2000, 2500}; // tabela dla opuznienia
long tSuma[5] { 0, 250, 300, 350, 400};    // tabela do sumowania ile litrow nalachy

void setup() {
  Serial.begin(9600);         // uruchom USART
  pinMode(13, OUTPUT);        // przekaznik

}

void loop() {
 fPotencjometr();
 fNalewaj();
}

void fPotencjometr(){
 zPotencjometr = analogRead(A5);
 zPotencjometr = map(zPotencjometr, 0, 1023, 1, 4);  
 zSuma = zSuma + tSuma[zPotencjometr];
 Serial.print(tCzas[zPotencjometr] ) ;Serial.print("   ");  Serial.println(zSuma);
 delay(2500);
}

void fNalewaj () {
  digitalWrite(13, HIGH); delay(tCzas[zPotencjometr]); digitalWrite(13,LOW);
}

Ja jak zwykle nie pamiętałem jak się piszę 'map' , więc skok do podręcznej ściągi - Kurs podstaw Arduino poziom 1 , #4 . Zapoznaj się, warto.

@Santiago Wielkie Łał , niestety przez moją chorobę nie mogłem być aktywny na forum , za co przepraszam, pompka moja wg opisu producenta ma wydajność 1L na 4 min. Więc teraz ten gotowy kod muszę tylko wgrać już w aktualny kod i będzie działać ? Teraz aktualnie aby malało kieliszek to pompka działa 6sekund 

1 litr na 4 min , no teraz to już napisałem na sztywno wiec przesyłam tak jak

#include <Servo.h>          // biblioteka dla silnika serwo
#include <LiquidCrystal.h>  // biblioteka wyswietlacza
LiquidCrystal lcd (7, 6, 5, 4, 3, 2);   // jak podlaczony jest wyswietlacz
Servo serwomechanizm;

 int zPotencjometr;
 int zSuma;
 int tCzas[5] {0, 1000, 2000, 3000, 4000};
 int tSuma[5] {0, 25, 30, 35, 40};
 bool tPelny[7];            // warunek czy kieliszek zostal napelniony
 int  tOsoby[7];            // tablica dla kazdej osoby od 0 do 6 - takie sa tablice w c, ilosc na osobe
 const int tPozycja[7] {0, 10, 44, 78, 112, 146, 180};   // pozycja dla serwa
 long sumaZimprezy = 0;     // ile w sumie na imprezie bylo nalanych
 int czasStary, czasNowy;   // do wyswietlacza - zmiana napisow
 bool flaga;
 int licznik;               // delay miesza milisekundy... musze zrobic prowizorke
 
void setup() { Serial.begin(9600);
 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(10, INPUT_PULLUP);
 serwomechanizm.attach(12);     serwomechanizm.write(0);
 lcd.begin(12,2);     
                      lcd.print(" Napijemy sie ?");   delay(3000);
 lcd.setCursor(0,1);  lcd.print("Postaw kielich !"); delay(3000);
}

void loop() {
 
  fCzujniki();           // funkcja ktora sprawdza stan czujnikow
  Serial.println(tCzas[zPotencjometr]);
  if (millis() - czasStary > 5500) {czasStary = millis(); licznik++;}
  if (licznik > 3) {flaga = !flaga; licznik = 0;}
  if (flaga == 0) { fWyswietlacz1(0);} else {fWyswietlacz1(1);} 
 
}

void fCzujniki() {
  if (digitalRead(A0) == LOW) {delay(100); if (digitalRead(A0) == 0) {
    fUstawNalej(1);}  } else {tPelny[1] = false;}
  if (digitalRead(A1) == LOW) {delay(100); if (digitalRead(A1) == 0) {
    fUstawNalej(2);}  } else {tPelny[2] = false;}
  if (digitalRead(A2) == LOW) {delay(100); if (digitalRead(A2) == 0) {
    fUstawNalej(3);}  } else {tPelny[3] = false;}  
  if (digitalRead(A3) == LOW) {delay(100); if (digitalRead(A3) == 0) {
    fUstawNalej(4);}  } else {tPelny[4] = false;}
  if (digitalRead(A4) == LOW) {delay(100); if (digitalRead(A4) == 0) {
    fUstawNalej(5);}  } else {tPelny[5] = false;}
  if (digitalRead(10) == LOW) {delay(100); if (digitalRead(10) == 0) {
    fUstawNalej(6);}  } else {tPelny[6] = false;}   // sprawdzanie dwa razy aby wyeliminowac drgania stykow
    delay(1000); serwomechanizm.write(tPozycja[0]); // wracaj do pozycji poczatkowej
  
}

void fUstawNalej(int poz)    // sprawdz czy kieliszek pusty, jesli tak to nalewaj, zaznacz jako pelny
 {
  if (tPelny[poz] == false) { fPotencjometr();       // sprawdz ile ma byc nalewane
                             ++ tOsoby[poz]; ++ sumaZimprezy;
                             zSuma = zSuma + tSuma[zPotencjometr];
                             fWyswietlacz(poz);
                             delay(110); serwomechanizm.write(tPozycja[poz]);delay(2000); digitalWrite(13, HIGH);
                             delay(tCzas[zPotencjometr]); digitalWrite(13, LOW); tPelny[poz] = true;
                             
  }
 }
void fWyswietlacz(int poz)
 {
 // char numer; numer = tOsoby[poz];
  lcd.clear();
  lcd.setCursor(0,0);  lcd.print("Nalewam do -");
  lcd.setCursor(14,0); lcd.print(poz);
  lcd.setCursor(0,1);  lcd.print("To nalanie -");
  lcd.setCursor(14,1); lcd.print(tOsoby[poz]);
}

void fWyswietlacz1(int co)
{ 
  if (co == 0) {
   lcd.clear(); lcd.setCursor(0,0);  lcd.print("    ZDROWIE !");
                lcd.setCursor(0,1);  lcd.print("Suma - "); 
                lcd.setCursor(7,1);  lcd.print(sumaZimprezy);
                lcd.setCursor(10,1); lcd.print(zSuma/1000.0); // podanie w litrach o ile kieliszki sa 0.4
                lcd.setCursor(14,1); lcd.print("ml");
               }
 
  if (co == 1) {
    lcd.clear();
    lcd.setCursor(0,0);  lcd.print("1-");  lcd.setCursor(2,0);   lcd.print(tOsoby[1]);
    lcd.setCursor(6,0);  lcd.print("2-");  lcd.setCursor(8,0);   lcd.print(tOsoby[2]);
    lcd.setCursor(12,0); lcd.print("3-");  lcd.setCursor(14,0);  lcd.print(tOsoby[3]);
    lcd.setCursor(0,1);  lcd.print("4-");  lcd.setCursor(2,1);   lcd.print(tOsoby[4]);
    lcd.setCursor(6,1);  lcd.print("5-");  lcd.setCursor(8,1);   lcd.print(tOsoby[5]);
    lcd.setCursor(12,1); lcd.print("6-");  lcd.setCursor(14,1);  lcd.print(tOsoby[6]);
                 
  }            
}

void fPotencjometr() {                // funkcja - odczyt pozycji potencjometru 

  zPotencjometr = analogRead(A5);     // odczytaj wartossc
  zPotencjometr = map(zPotencjometr, 0, 1022, 1, 5); // zamien te dane na 1,2,3 albo 4
  
}

napisałem.

Miałem dziwne problemy, otóż na innej płytce gdzie było podłączone , dioda i potencjometr map, działało ok w zakresie od 1 do 4 , jednak jak przeniosłem na docelową płytkę to musiałem zwiększyć od 1 do 5.. 

nie wyświetla0,005mililitrów - ale to nie ma znaczenia tylko np. 0.03l później wiadomo więcej 1,25 l   itd.

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