Skocz do zawartości

Układ z silnikiem krokowym, przyciskami i wyświetlaczem


KrystianZ

Pomocna odpowiedź

Cześć Wszystkim. 

W zeszłym roku kupiłem płytkę Arduino UNOi silnik krokowy do małego projektu, który polegał aby silnik obracał się w jedną stronę przez pewien czas a później w druga... była to mała suszarka którą używałem do suszenia przynęt wędkarskich. Także w świecie programowania jestem stosunkowo zielony 🙂

Teraz chciałbym wykorzystać ten zestaw do innego projektu, ale niestety tu zaczynają się już problemy... 

Mam układ składający się z: 

- Arduino UNO
- Silnik krokowy (plus zasilacz i stepstic A4988)
- wyświetlacz LCD 16x2 z I2C
- 3 przyciski typu tact switch

Chcę zrobić program który będzie sterował silnikiem krokowym w następujący sposób. 

1. Przyciskami P1 i P2 ustawiamy czas przerwy pomiędzy kolejnymi krokami silnika (czas ten wyświetlany jest na LCD)
2. Po ustawieniu czasu przerwy program oczekuje na wciśnięcie przycisku P3 
3. Po wciśnięciu przycisku P3 (i puszczeniu go) silnik krokowy zaczyna się obracać zgodnie z zadaną ilością kroków i ustawionym czasie przerwy pomiędzy kolejnymi krokami. 
4. Program można zatrzymać przy ponownym wciśnięciu (i puszczeniu) przycisku P3

Przed napisaniem tego postu przez ostatnie dni wykonałem masę prób, czytając co raz to inne kursy, które myślałem, że coś mi pomogą... niestety ciągle bez skutku... 


Poniżej wklejam kod tego co już mam... bardzo proszę o wyrozumiałość 🙂

Aktualnie program działa bez użycia przycisku P3 - nie wiem gdzie i w jaki sposób go wsadzić w kod... Program działa tak:
- silnik działa od razu po przejściu do void loop()... z przerwą ustawioną na początku 3 sek. 
- przyciskami P1 i P2 można zmienić czas - ale tylko gdy "trafimy" na moment zakończenia pętli

Chciałbym Was prosić o pomoc w modyfikacji tego kodu aby dojść do docelowych założeń...  
Za każdą pomoc będę wdzięczny. 

 


#include <Arduino.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#define stepPin 3                             // ustawienie pinu SET na A4988
#define dirPin 9                              // ustawienie pinu DIR na A4988
#define stepTime 1500                         // prędkość obrotu
#define stopStep 100                          // ilość kroków
#define P1 5                                  // pin przycisku P1
#define P2 4                                  // pin przycisku P2
#define P3 2                                  // pin przycisku P3
#define sleep 7                               // pin SLEEP na A4988
#define reset 8                               // pin RESET na A4988


int countStep = 0;
int przerwaSilnik;
float czas=3;                                 // zmienna wyswietla liczby po przecinku

LiquidCrystal_I2C lcd(0x27,16,2);             // ustawienie adresu LCD
void setup()
{
  pinMode(P1, INPUT_PULLUP);                  //przycisk P2 jako wejście
  pinMode(P2, INPUT_PULLUP);                  //przycisk P2 jako wejście
  pinMode(P3, INPUT_PULLUP);                  //przycisk P3 jako wejście
  pinMode(stepPin, OUTPUT);                   //stepPin jako wyjście
  pinMode(dirPin, OUTPUT);                    //dirPin jako wyjście
  pinMode(sleep,OUTPUT);                      //sleep jako wyjście
  pinMode(reset,OUTPUT);                      //reset jako wyjście
  digitalWrite(dirPin, HIGH);                 //ustawienie dirPin HIGH
  lcd.begin(16, 2);                           //deklaracja typu wyświetlacza
  lcd.backlight();                            // włączenie podwietlenia 
  lcd.setCursor(4,0);                         //ustawienie kursora w kolumnie 4, lini 0 
  lcd.print("Test");                          //Wyświetlanie tekstu
  lcd.setCursor(5, 1);                        //ustawienie kursora w kolumnie 5, lini 1
  lcd.print("Programu");                      //Wyświetlanie tekstu  
  delay(1500);                                //Odczekanie 
  lcd.clear();                                //Wyczyszczenie ekranu
  lcd.setCursor(2, 0);                        //ustawienie kursora w kolumnie 2, lini 0
  lcd.print("Czas przerwy");                  //Wyświetlanie tekstu  

  lcd.setCursor(9, 1);                        //ustawienie kursora w kolumnie 9, lini 1
  lcd.print("sek.");                          //Wyświetlanie tekstu  


}



void loop()
{


lcd.setCursor(3,1);                           //ustawienie kursora w kolumnie 3, lini 1
lcd.print(czas);                              //Wyświetlanie tekstu  



 

if(digitalRead(P1)==LOW){         
  digitalWrite(sleep,LOW);
  czas=abs(czas+0.1);
  delay(250);
  
 }

 else
  if(digitalRead(P2)==LOW){
  digitalWrite(sleep,LOW);
  czas=abs(czas-0.1);
  lcd.setCursor(3,1);             //ustawienie kursora w kolumnie 3, lini 1 
  lcd.print(czas);                //Wyświetlanie tekstu
  delay(250);

 }

while(digitalRead(P1)==HIGH && digitalRead(P2)==HIGH){
digitalWrite(sleep,HIGH);
digitalWrite(reset,HIGH);

    digitalWrite(stepPin,LOW );
    delayMicroseconds(stepTime);
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(stepTime);
    countStep++;
    if (countStep >= stopStep) {
        countStep -= stopStep;
        przerwaSilnik=czas*1000;
        delay(przerwaSilnik);
   	 }
   }
}


 

Edytowano przez KrystianZ
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.