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.