#include <LiquidCrystal_I2C.h>
#include <AccelStepper.h>
//setup de botões:
const int botao_verde = 13;
const int botao_selecao = 12;
const int LimitSwitch = 11;
//setup do motor:
#define dirPin 2
#define stepPin 3
#define motorInterfaceType 1
AccelStepper stepper = AccelStepper(motorInterfaceType, stepPin, dirPin);
// O numero de stepes é calculado através da formula:
// NºStepes=(AnguloPretendido*200)/360
// Para andar no sentido horário o valor de stepes tem de ser positivo
// Para andar no sentido anti horário o valor de stepes tem de ser negativo
//setup do LCD:
#define col 16 // Serve para definir o numero de colunas do display utilizado
#define lin 2 // Serve para definir o numero de linhas do display utilizado
#define ende 0x27 // Serve para definir o endereço do display.
LiquidCrystal_I2C lcd(ende,col,lin); // Chamada da funcação LiquidCrystal para ser usada com o I2C
int ciclos;
int N_ciclos=3;
int menuOption;
void setup()
{
// Declação de Outputs e Imputs
pinMode(stepPin, OUTPUT);
pinMode(dirPin, OUTPUT);
pinMode(botao_verde, INPUT_PULLUP);
pinMode(botao_selecao, INPUT_PULLUP);
pinMode(LimitSwitch, INPUT_PULLUP);
//define a velocidade maxima do motor (steps por segundo)
stepper.setMaxSpeed(1000);
stepper.setAcceleration(500);
//inicia o LCD
lcd.begin(16, 2);
}
void loop () {
lcd.init(); // Serve para iniciar a comunicação com o display já conectado
//lcd.backlight(); // Serve para ligar a luz do display
lcd.setBacklight(HIGH); // Serve para ligar a luz do display
//chama o menu inicial:
updateMenu();
//cicla entre as opções do menu usando o botão de seleção até que o botão verde seja pressionado:
while (digitalRead(botao_verde)==HIGH){
if (digitalRead(botao_selecao) == LOW) { // Botão de seleção pressionado
menuOption = (menuOption % 4) + 1; // Cicla entre 1, 2, 3 e 4
updateMenu();
delay(200); // Debounce
}
}
if (digitalRead(botao_verde) == LOW) { // Botão pressionado
// Função para obter a seleção do menu
if (menuOption == 1){
Teste_dobragem_1();
}else if(menuOption == 2){
Teste_dobragem_2();
}else if(menuOption == 3){
Teste_2();
}else if(menuOption == 4){
Breaking_load();
}
}
} //end loop
//menu inicial
void updateMenu() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Selecionar Teste:");
lcd.setCursor(0, 1);
if (menuOption==1){
lcd.print(String("Teste Dobragem 1"));
}else if (menuOption==2){
lcd.print(String("Teste Dobragem 2"));
}else if (menuOption==3){
lcd.print(String("Teste 2"));
}else if (menuOption==4){
lcd.print(String("Braking Load"));
}
}
//codigo para os testes
void Teste_dobragem_1() //Anda 45º no sentido anti-horário e de seguida 45º no sentido horário.
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("A Preparar");
lcd.setCursor(0, 1);
lcd.print("Teste Dobragem 1");
// Defina a velocidade em passos por segundo:
//velocidade em RPM =(200*RPM)/60
int velocidade = 40;
//homing do motor
while (digitalRead(LimitSwitch)==HIGH){
stepper.setSpeed(-velocidade);
stepper.runSpeed();
}
stepper.setCurrentPosition(0);
//espera que seja inserida uma peça e que o botão verde seja primido:
while (digitalRead(botao_verde)==HIGH){
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Inserir Peca");
lcd.setCursor(0, 1);
lcd.print("Primir Verde");
delay(100);
}
//roda o motor para o centro:
while(stepper.currentPosition() != 28)//ajustar o numero de stepes consuante o angulo a que estiver o LimitSwitch
{
stepper.setSpeed(velocidade);
stepper.runSpeed();
}
// Define a posição atual para 0:
stepper.setCurrentPosition(0);
//inicio do teste
if (ciclos<=N_ciclos)
{
for (ciclos=1; ciclos <= N_ciclos; ciclos++) //repete o procedimento até ao numero de ciclos definido
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Teste Dobragem 1");
lcd.setCursor(0, 1);
lcd.print(ciclos);
lcd.print(" ciclos");
//roda até os 45 sentido anti-horario:
while(stepper.currentPosition() != -25)
{
stepper.setSpeed(-velocidade);
stepper.runSpeed();
}
delay(500); //espera meio segundo para evitar aquecimento da peça
//roda até os 90 sentido horario:
while(stepper.currentPosition() != 25)
{
stepper.setSpeed(velocidade);
stepper.runSpeed();
}
delay(500); //espera meio segundo para evitar aquecimento da peça
//roda até chegar ao centro:
while(stepper.currentPosition() != 0)
{
stepper.setSpeed(-velocidade);
stepper.runSpeed();
}
}
}
//aguarda até que o botão verde seja precionado:
while (digitalRead(botao_verde)==HIGH){
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Teste Dobragem 1");
lcd.setCursor(0, 1);
lcd.print("concluido");
delay(100);
}
//Faz reset ao teste e volta para o menu inicial:
if(digitalRead(botao_verde)==LOW){
ciclos=0;
updateMenu();
delay(500);
}
} //end Teste_dobragem 1
void Teste_dobragem_2()
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("A Preparar");
lcd.setCursor(0, 1);
lcd.print("Teste Dobragem 2");
// Defina a velocidade em passos por segundo:
//velocidade em RPM =(200*RPM)/60
int velocidade = 40;
//homing do motor
while (digitalRead(LimitSwitch)==HIGH){
stepper.setSpeed(-velocidade);
stepper.runSpeed();
}
stepper.setCurrentPosition(0);
//espera que seja inserida uma peça e que o botão verde seja primido:
while (digitalRead(botao_verde)==HIGH){
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Inserir Peca");
lcd.setCursor(0, 1);
lcd.print("Primir Verde");
delay(100);
}
//roda o motor para o centro:
while(stepper.currentPosition() != 28)//ajustar o numero de stepes consuante o angulo a que estiver o LimitSwitch
{
stepper.setSpeed(velocidade);
stepper.runSpeed();
}
// Define a posição atual para 0:
stepper.setCurrentPosition(0);
//inicio do teste
if (ciclos<=N_ciclos)
{
for (ciclos=1; ciclos <= N_ciclos; ciclos++) //repete o procedimento até ao numero de ciclos definido
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Teste Dobragem 2");
lcd.setCursor(0, 1);
lcd.print(ciclos);
lcd.print(" ciclos");
//roda até os 45 sentido anti-horario:
while(stepper.currentPosition() != -25)
{
stepper.setSpeed(-velocidade);
stepper.runSpeed();
}
delay(500); //espera meio segundo para evitar aquecimento da peça
//roda até os 90 sentido horario:
while(stepper.currentPosition() != 50)
{
stepper.setSpeed(velocidade);
stepper.runSpeed();
}
delay(500); //espera meio segundo para evitar aquecimento da peça
//roda até chegar ao centro:
while(stepper.currentPosition() != 0)
{
stepper.setSpeed(-velocidade);
stepper.runSpeed();
}
}
}
//aguarda até que o botão verde seja precionado:
while (digitalRead(botao_verde)==HIGH){
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Teste Dobragem 2");
lcd.setCursor(0, 1);
lcd.print("concluido");
delay(100);
}
//Faz reset ao teste e volta para o menu inicial:
if(digitalRead(botao_verde)==LOW){
ciclos=0;
updateMenu();
delay(500);
}
} //end Teste_dobragem 2
void Teste_2()
{
lcd.clear();
lcd.print("teste 2");
delay(1000);
}//end Teste_2
void Breaking_load()
{
lcd.clear();
lcd.print("Breaking Load");
delay(1000);
} //Breaking_load