Skocz do zawartości

Sterowanie 9 pompami poprzez 3 przyciski


Mariusz62

Pomocna odpowiedź

Witam wszystkich maniaków arduino do tej pory z prostymi układami jakoś sobie radziłem ale projekt który chciałem uruchomić przerósł moją wiedzę.Problem w tym że muszę napisać kod do urządzenia które składa się 3 przycisków chwilowych i 9 pomp membranowych. Każdy z przycisków ma uruchamiać po koleji 3 pompy przez określony czas np.3 sek i tak wciskam SW1 i uruchamia mi się pompa1 na 3sek pompa2 na 4sek i pompa3 na 3sek i tak z następnymi przyciskami

SW2    i P4 3sek P5 5sek i P6 na 3sek.   SW3      P7   P8  i P9   Oczywiście pompy załączane są przez moduł przekazników  Wejscia przycisków w Arduino to 2-3-4

 a wyjscia do przekazników to piny 5-6-7-8-9-10-11-12-13-  

PLEASE  o pomoc

Edytowano przez Mariusz62
Link do komentarza
Share on other sites

// Tryb przycisku (INPUT PULLUP lub INPUT)
#define BUTTON_MODE INPUT_PULLUP

// Standardowe ustawienie pomp
#define DEFAULT_PUMP_STATE LOW

/* Przyciski */
uint8_t buttons[] = {2,3,4};
bool isButtonPressed[] = {false, false, false};

/* Pompy */
uint8_t pumps[] = {5, 6, 7, 8, 9, 10, 11, 12, 13};
int times[] = {3000, 4000, 3000, 3000, 4000, 3000, 3000, 4000, 3000};

/* Ustawienia aplikacji */
void setup() {

  // UART ;)
  Serial.begin(115200);
  
  // Inicjacja przycisków
  for(int q = 0; q < sizeof(buttons)/sizeof(buttons[0]); q++)
    pinMode(buttons[q], BUTTON_MODE);

  Serial.println("Inicjacja przycisków zakończona");

  // Inicjacja pomp
  for(int q = 0; q < sizeof(pumps)/sizeof(pumps[0]); q++)
  {
    pinMode(pumps[q], OUTPUT);
    digitalWrite(pumps[q], DEFAULT_PUMP_STATE);
  }
  
  Serial.println("Inicjacja pomp zakończona");
}

/* Wykonaj operację pompy przez określony czas */
void executePump(int id, int time_ms)
{
  // Włącz pompę
  digitalWrite(pumps[id], DEFAULT_PUMP_STATE == LOW ? HIGH : LOW);

  // Odczekaj pewien czas
  delay(time_ms);

  // Wyłącz pompę
  digitalWrite(pumps[id], DEFAULT_PUMP_STATE);
}

/* Wykonywane po wciśnięciu przycisku */
void onButtonPressed(int button) // button - id przycisku (0,1,2)
{
  int pumpId = button * 3;
  
  executePump(pumpId, times[pumpId]);
  executePump(pumpId + 1, times[pumpId + 1]);
  executePump(pumpId + 2, times[pumpId + 2]);     
}

void loop() {

  // Sprawdź czy któryś z przycisków został wciśnięty
  for(int q = 0; q < sizeof(buttons)/sizeof(buttons[0]); q++)
  {
    // Sprawdź czy przycisk jest wciśnięty
    if(digitalRead(buttons[q]) == LOW)  
    {
      // Przycisk jest wciśnięty

      // Jeżeli nie był wciśnięty wykonaj zdarzenie informujące o wciśnięciu przycisku
      if(!isButtonPressed[q])  
        onButtonPressed(q);

      // Zmień status
      isButtonPressed[q] = true;
    }
    else
    {
      // Przycisk nie jest wciśnięty, zmień status
      isButtonPressed[q] = false;
    }
  }
}

Pisane na kolanie, ale masz wzór do rozpoczęcia pracy. Nie testowałem, więc nie wiem czy działa, ale teoretycznie powinno... (teoretycznie)

Rzeczy do poprawienia:

  1. Zamiana delay() na millis()
  2. Przetestowanie na płytce.
Link do komentarza
Share on other sites

(edytowany)

dzieki za zainteresowanie tematem przyciski jako INPUT

dobrze by było aby można było podstawić inny czas aby pompa nalała raz 60ml a innym razem 50ml ustawiając czas mogę regulować ilość przepompowanej cieczy.

po wgraniu bez podłączenia pomp przekazniki chodzą tak jak powinny pozniej podłaacze pompy i sprawdzę jak z pompami na ten czas to PERFECT

Czyli regulując int times ustalam czas pracy pompy🙂

Podłaczyłem pod przekazniki pompy i układ zaczął wariować włącza 1 za chwilę 2 i 3 pompę i tak w kółko bez obciązenia chodzi idealnie to schemat układu

DSCF2699.JPG

Edytowano przez Mariusz62
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

9 godzin temu, Mariusz62 napisał:

Podłaczyłem pod przekazniki pompy i układ zaczął wariować włącza 1 za chwilę 2 i 3 pompę i tak w kółko bez obciązenia chodzi idealnie to schemat układu

Widzę, że przyciski masz podciągnięte do masy. W moim kodzie założenie jest takie, że przyciski mają pull-up'y do 5V, więc w momencie wystąpienia stanu niskiego na przycisku aktywują się pompy.

Spróbuj poprawić linijkę:

if(digitalRead(buttons[q]) == LOW)  

na

if(digitalRead(buttons[q]) == HIGH)  

O ile tego nie zrobiłeś (ale na to wskazuje zachowanie programu). Jak to nie pomaga to trzeba szukać dalej...

Link do komentarza
Share on other sites

(edytowany)

poprawiłem kod jest ciut lepiej też mu się zdarza że Arduino jakby się resetowało ale myślę że wina może być po stronie zewnętrznego zasilacza Arduino bo jak ma Arduino podłączone tylko pod USB to chodzi dobrze. Też nie do końca bo coś może być z modułem przekazników bo jak wcisnę sw1 to idzie pompa1 potem 2 potem 3 ale jak wcisne sw2 to rusza pompa 4 i potem znowu poma 1 i 2 podmienie moduł przekazników i porównam bo teraz mam blok z 8 i dodatkowo 1 zamienie na 3 odzielne bloki po 3 a ze niem po 3 to dam po 4 trudno

Muszę to rozgryżć co jest powodem jak wcisnę 3 przycisk to powinna się właczyć pompa 7 8 i 9  a włacza się 7 i przeskakuje na 1 lub 4 zależy jak mu się chce

Edytowano przez Mariusz62
Link do komentarza
Share on other sites

8 godzin temu, Mariusz62 napisał:

Muszę to rozgryżć co jest powodem jak wcisnę 3 przycisk to powinna się właczyć pompa 7 8 i 9  a włacza się 7 i przeskakuje na 1 lub 4 zależy jak mu się chce

Może być coś w kodzie, dorób sobie "logging" zmiennych do seriala i przetestuj, może wyjdzie, że któraś wartość jest nadpisywana w locie... To jedyne co mi przychodzi na myśl...

Link do komentarza
Share on other sites

Jak te przekazniki zasilasz z ardu to byc moze to powoduje reset...dla ulatwienia zrob sobie prosta petle for gdzie bedziesz przelaczal po kolei te przekazniki co sekunde powiedzmy...i bedzie wiadomo czy uklad sprawia problem czy gdzies w kodzie jest malutki blad...

Link do komentarza
Share on other sites

wszystkie masy GND są wspólne oprócz zasilania pomp czyli moduł przekaźników zasilany jest z Arduino

kod jak zasilacz pompy jest odłaczony a moduł zasilany jest z Arduino to wszystko gra

Spróbuję dać dodatkowy zasilacz tylko dla modułu przekazników i zobacze jaki jest efekt.

DSCF2702.JPG

Link do komentarza
Share on other sites

Napisz coś więcej o tym module. Pokaż jego schemat i schemat podłączenia do Arduino. Przekaźniki (ich cewki) to z reguły "stosunkowo duże obciążenie" i warto przewidzieć dla nich oddzielne zasilanie, tym bardziej że masz ich 9. To przekaźniki 5V czy 12V? Zailasz je z +5V czy z Vin Arudino? A jak zasilasz Arduino?

Edytowano przez Belferek
Link do komentarza
Share on other sites

Nie wiem jak tam jest w ardu domyślnie zrobione, więc przyczyną może być ustawiony fusebit bodlevel na 4.8V co już przy minimalnym spadku napięcia zasilania spowoduje reset mikrokontrolera, przestawienie tego bitu( o ile jest tak jak myślę - 4.8V) powinno poprawić sytuację aczkolwiek nie jest rozwiązaniem problemu.

Link do komentarza
Share on other sites

Nie ma czegoś takiego jak "standardowy" moduł. Jeśli chodzi o moduły przekaźników to znajdziesz takie z przekaźnikami np. 5V i inne (wyglądające tak samo) z przekaźnikami 12V. Twoim problemem jest moim zdaniem zasilanie. Wbudowany stabilizator modułu Arduino Uno R3 na pinie +5V daje ci wydajność ok. 500 mA (max.) - to za mało moim zdaniem jak dla 9 przekaźników. Poza tym zasilany z tego pinu moduł przekaźników może być źródłem zakłóceń powodujących wadliwą pracę układu mikrokontrolera. Zmień sposób zasilania. Odczytaj typ przekaźnika z jego obudowy i zajrzyj do jego noty katalogowej. Wtedy będziesz wiedział jakiego zasilacza potrzebujesz. Zasilacz powinien dysponować "zapasem mocy" by uniknąć problemów.

Edytowano przez Belferek
Link do komentarza
Share on other sites

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

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.