Tema: Arduino
View Single Post
Staro 03.01.2020., 17:15   #38
Vjeko
V.I.P. član
Moj komp
 
Vjeko's Avatar
 
Datum registracije: Aug 2005
Lokacija: Hennef, DE
Postovi: 762
Upravljanje DC 220V motora

Pozdrav!

Novi sam u arduino ali unatoc neiskustvu pokusavam sklopiti uredjaj sa kojim bih upravljao sa brojem okretaja motora sa pwm izlazom.
Elektronski sam sklopio sve kao i mehanicki ali muku mucim sa kodiranjem, to nije bas moje podrucje.

Funkcija bi bila ovakva:

LCD 16x2 Prvi red:
-Tu bi se stalno prikazivao trenutni RPM kojeg citam sa HALL senzora. Taj dio i funckionira.

Drugi red:
-Ovdje bih trebao moci odabrati raspon izmedju 300-3000 rpm u koracima od 100 putem ENCODERA i potvrditi vrijednost koja ce napraviti odredjeni digitalWrite() kada iskalkuliram vrijednosti (izlaz za sada nebitan)

Trenutno me muci sto nikako nemogu na istom LCD-u dobiti da mi prikazuje trenutni RPM (prvi red) a da na drugom sa enkoderom dobijem vrijednosti.

evo kod:

Code:
#include 
#include 
#include 

#define BUTTON 4           // rottary encoder button pin

LiquidCrystal_I2C lcd(0x27, 20, 4);
Rotary rotary = Rotary(12, 11);            // define rottary encoder and pins
float value = 0;
float rev = 0;
int rpm;
int oldtime = 0;
int time;
int pwm = 9;
int counter = 300;
const int minrpm = 300;
const int maxrpm = 3000;

void isr() //interrupt service routine
{
  rev++;
}

void setup()
{
  lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("  Open Source");
  lcd.setCursor(0, 1);
  lcd.print("   Mini Lathe");
  delay(3000);
  lcd.clear();
  lcd.setCursor(0, 1);
  lcd.print("SET RPM: ");
  pinMode(pwm, OUTPUT);
  digitalWrite(BUTTON, INPUT);         // confirm set desired RPM
  attachInterrupt(0, isr, RISING); //attaching the interrupt
}

void loop()
{
  SetRPM();
  CheckRPM();
}

void CheckRPM() {               //tachometer
  delay(2000);
  detachInterrupt(0);           //detaches the interrupt
  time = millis() - oldtime;    //finds the time
  rpm = (rev / time) * 60000;   //calculates rpm
  oldtime = millis();           //saves the current time
  rev = 0;
  lcd.setCursor(0, 0);
  lcd.print(     rpm);
  lcd.print(" RPM");
  lcd.print("   ");
  attachInterrupt(0, isr, RISING);
}

void SetRPM() {                 //rotary encoder
  unsigned char result = rotary.process();

  if (result == DIR_CW)
  {
    lcd.clear();
    counter += 100;
    if (counter >= maxrpm) {
      counter = maxrpm;
    }
    lcd.setCursor(0, 1);
    lcd.print("SET RPM: ");
    lcd.print(counter);

  }
  else if (result == DIR_CCW)
  {
    lcd.clear();
    counter -= 100;
    if (counter <= minrpm) {
      counter = minrpm;
    }
    lcd.setCursor(0, 1);
    lcd.print("SET RPM: ");
    lcd.print(counter);
  }
}
Prakticki bih trebao odvojiti ova dva loopa(???) ili ih ukombinirati da rade zajedno.
Dakle CheckRPM() radi uredno, ali SetRPM() nikako u kombinaciji.
Kada obrisem CheckRPM(), onda dobivam vrijednosti sa enkodera ili na LCD ili serial, radi oboje), ali u kombinaciji sa CheckRPM() - nikako.

Moze li me netko savjetovat sta da pokusam ili kako da zdvojim te dvije funkcije?
Hvala!

EDIT: NVM, rijesio sam problem.

Zadnje izmijenjeno od: Vjeko. 04.01.2020. u 10:45.
Vjeko je offline   Reply With Quote