Вы находитесь на странице: 1из 5

#include <TimerThree.

h>
#include <math.h>
//includes
#include <TimerOne.h>
#include <Encoder.h>
#include <EEPROMex.h>
#include <EEPROMVar.h>
#include <Keypad.h>;
#include <LiquidCrystal.h>;
//defines za kasnije
#define s_kal 0; // indeks bita za kalibraciju
#define s_sp 1; // indeks bita za serijski port
#define s_kp 2; // indeks bita za tasteturu
//enumeracija pinova za enkoder
byte encoderPinA = 21; // A pin enkodera
byte encoderPinB = 20; // B pin enkodera
byte pp = 17; // pin koji povecava pulseve
byte pm = 16; // pin koji smanjuje pulseve
byte btnpp = 3;
byte btnpm = 2;
byte kalibracija = 19;
boolean atw=true;
boolean kalibracijautoku=false;
int greska = 0; // greska za algoritam voznje motora
String lnumber; //za displej broja ukucanog
String number; // broj koji ukucamo na tasteturi u obliku stringa
Encoder Enc(encoderPinB,encoderPinA);
int ppm_addr;
int pulses_addr;
int dpos=4;
long mpulses;
int ppm=1574;
long tempPulses; //varijabla za skladistenje pulseva prilikom nekih algoritamski
h mjerenja
volatile long pulses; // trenutni pulsevi
boolean A_set = false; //stanje na a
boolean B_set = false; //stanje na b
const byte ROWS = 4; //redovi matrice keypada
const byte COLS = 3; //kolone matrice keypada
char keys[ROWS][COLS] = { //char array za karaktere na keypadu
{'1', '2', '3'},
{'4', '5', '6'},
{'7', '8', '9'},
{'*', '0', '#'}
};
byte rowPins[ROWS] = {53, 52, 51, 50}; //pinovi redova keypada
byte colPins[COLS] = {49,47, 45}; //pinovi kolona keypada
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

LiquidCrystal lcd(46,38,42,43,41,39,37,35,33,31); //objekat lcd-a


void setup() {
/*
* EEPROM FUNCTIONS
*/
ppm_addr = EEPROM.getAddress(sizeof(int));
pulses_addr = EEPROM.getAddress(sizeof(long));
ppm=EEPROM.readInt(ppm_addr);
pulses=EEPROM.readLong(pulses_addr);
Enc.write(pulses);
/*
* END
*/
pinMode(encoderPinA, INPUT);
pinMode(encoderPinB, INPUT);
pinMode(btnpp, INPUT);
pinMode(btnpm, INPUT);
pinMode(kalibracija,INPUT);
pinMode(pp,OUTPUT);
pinMode(pm,OUTPUT);
digitalWrite(encoderPinA, HIGH); // turn on pullup resistor
digitalWrite(encoderPinB, HIGH); // turn on pullup resistor
attachInterrupt(0, btnpm_promjena, CHANGE);
attachInterrupt(1, btnpp_promjena, CHANGE);
attachInterrupt(4, kalpointer,LOW);
Serial.begin(115200);
Timer1.initialize(50);
Timer1.attachInterrupt(uPulses);
Timer3.initialize(5000);
Timer3.attachInterrupt(disp);
lcd.begin(16,2);
lcd.print("cao :) " );
}
void loop() {
chs();
if(kalibracijautoku){
kal();
}
keyp();
Serial.println(pulses);
Serial.println("Greska : " + String(greska));
Serial.println(String(pulses/ppm));
Serial.println(ppm);
}
void uPulses(){
pulses=Enc.read();
}
void disp()
{
if(lnumber != number || dpos != round((float)pulses/ppm)){
lcd.clear();
lcd.setCursor(0,0);
lcd.print(number);
lcd.setCursor(16-String(round((float)pulses/ppm)).length(),0);

lcd.print(round(pulses/ppm));
dpos=round((float)pulses/ppm);
lnumber=number;
}
}
void keyp(){
char key = keypad.getKey();
if (key != NO_KEY){
if(key=='#'){
gettopos(number.toInt());
}else{
if(key != '*'){
number = number+key;
}
}
}
}
void kal(){
float pv,dv;
Serial.println("Kalibracija...");
Serial.println("Izmjeriti od nule");
while(!Serial.available());
if(Serial.available()>0){
String msg = Serial.readStringUntil(';');
char floatbuf[32]; // make this at least big enough for the whole string
msg.toCharArray(floatbuf, sizeof(floatbuf));
pv = atof(floatbuf);
}
long curpulses=pulses;
Serial.println("Cekam da pritisnete dugme");
while(digitalRead(btnpm)==true && digitalRead(btnpp)==true);
Serial.println("Sada ga pusite nakon odredjenog vremena");
while(digitalRead(btnpm)==false || digitalRead(btnpp)==false);
Serial.println("Izmjerite ponovo");
while(!Serial.available());
if(Serial.available()>0){
String msg = Serial.readStringUntil(';');
char floatbuf[32]; // make this at least big enough for the whole string
msg.toCharArray(floatbuf, sizeof(floatbuf));
dv = atof(floatbuf);
}
ppm=abs(abs(pulses-curpulses)/abs(dv-pv));
EEPROM.updateInt(ppm_addr,ppm);
Serial.println("Kalibracija zavrsena");
Serial.println(String(ppm) + " ppm");
Enc.write(ppm*dv);
kalibracijautoku=false;
delay(200);
}
void kalpointer(){
if(!kalibracijautoku){
if(!digitalRead(kalibracija)){
kalibracijautoku=true;
}
}
}
void btnpm_promjena() {
if (atw) {
if (!digitalRead(btnpm)) {

digitalWrite(pm,1);
} else {
digitalWrite(pm,0);
}
}
}
void btnpp_promjena() {
if (atw) {
if (!digitalRead(btnpp)) {
digitalWrite(pp,1);
} else {
digitalWrite(pp,0);
}
}
}
void chs() {
if (Serial.available() > 0) {
String msg = Serial.readStringUntil(';');
if(msg == "null"){
EEPROM.updateLong(pulses_addr,0);
pulses=0;
greska=0;
Enc.write(0);
}else{
long i = msg.toInt();
gettopos(i);
}
}
}

void gettopos(long pos) {


if (pulses > pos * ppm) {
digitalWrite(pm, 1);
while (pulses > pos*ppm+greska) {
Serial.println(pulses);
}
digitalWrite(pm, 0);
do {
tempPulses = pulses;
delay(10);
} while (tempPulses != pulses);
if (pulses < pos*ppm) {
greska += abs(pulses - pos*ppm);
} else {
greska -= abs(pulses - pos*ppm);
}
} else {
digitalWrite(pp, 1);
while (pulses < pos*ppm-greska) {
Serial.println(pulses);
}
digitalWrite(pp, 0);
do {
tempPulses = pulses;
delay(10);
} while (tempPulses != pulses);
if (pulses > pos*ppm) {

greska += abs(pulses - pos*ppm);


} else {
greska -= abs(pos*ppm - pulses);
}
}
number="";
EEPROM.updateLong(pulses_addr,pulses);
}

Вам также может понравиться