Boa tarde amigos!
Estou ressucitando uma centrifuga de laboratorio com um arduino nano, fiz a programação porem não estou conseguindo fazer ele ligar o motor. basicamente o arduino vai fazer o seguinte, na tela inicial é apresentado a rotação, força g, e tempo programado. ela possui 4 botões ( P, up, down e enter) ao apertar o p na tela inicial ela entra na tela para programar o tempo e a rotação, ao apertar o enter na tela inicial ela inicia uma contagem regressiva e ligaria o motor enquanto esta contagem regreciva não acaba.
A parte que estou tendo dificuldade é justamente por este motor pra rodar. Trata-se de um motor indutivo de 3 bobinas (3 fios), o controle de rotação dele é feito por uma placa que vou continuar utilizando, ela é alimentada direto da rede eletrica e posui uma 4 pinos para controlar a rotação (gnd, 1, 2, 3) a rotação do motor ocorre atraves de pulsos eletricos que chegam nos pinos 1, 2, 3.
O calculo do tempo para ligar motor no RPM que eu quero eu fiz certinho, más na hora de ligar ele junto com o inicio do contador não ta dando. Eu fiz o contador utilizando o comando delay() más acho que não vai dar certo pq o delay() vai parar a execução do codigo e eu preciso que enquanto ele esteja contando o contador ele tambem conte o tenpo que cada um dos 3 pinos vai ficar ligado.
esse foi o código que eu fiz:
// Recuperação de centrifuga excelsa II da fanem
// Desenvolvido por Celso Judson T B Ferreira
// === Bibliotecas === //
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <TimerOne.h>
// DEFINIÇÕES
#define endereco 0x27 // Endereço do display lcd
#define colunas 16
#define linhas 2
#define tempoReset 2000 //define o tempo em que o botao Start deve ficar apertado para efetuar o reset (em milisegundos)
#define tempoContador 30 //define o tempo do contador (em segundos)
#define tempoRota 30 //define o tempo do contador (em segundos)
#define botao_p 2 //define o botão no pino 2 (MAIS)
#define botao_up 3 //define o botão no pino 3 (ENTER/VOLTAR)
#define botao_down 4 //define o botão no pino 4 (MENOS)
#define botao_enter 5 //define o botão no pino 5 (MENOS)
#define pinRele1 6 //Porta do Arduino que irá acionar o relé 1
#define pinRele2 7 //Porta do Arduino que irá acionar o relé 2
#define pinRele3 8 //Porta do Arduino que irá acionar o relé 3
#define nivelRele1 HIGH //Nivel lógico de ACIONAMENTO do relé 1
#define nivelRele2 HIGH //Nivel lógico de ACIONAMENTO do relé 2
#define nivelRele3 HIGH //Nivel lógico de ACIONAMENTO do relé 3
bool L_botao_p = 1; //variável para fazer a leitura do botão (MAIS)
bool LA_botao_p = 1; //variável para verificar a leitura anterior do botão (MAIS)
bool L_botao_up = 1; //variável para fazer a leitura do botão (ENTER/VOLTAR)
bool LA_botao_up = 1; //variável para verificar a leitura anterior do botão (ENTER/VOLTAR)
bool L_botao_down = 1; //variável para fazer a leitura do botão (MENOS)
bool LA_botao_down = 1; //variável para verificar a leitura anterior do botão (MENOS)
bool L_botao_enter = 1; //variável para fazer a leitura do botão (MENOS)
bool LA_botao_enter = 1; //variável para verificar a leitura anterior do botão (MENOS)
// INSTANCIANDO OBJETOS
LiquidCrystal_I2C lcd(endereco, colunas, linhas);
//Variaveis
int tela = 1; //variável para controlar a mudança de tela no menu
int segundo;
int minuto;
int Hora = 0; //variável de correção de altitude em metros
int Min = 0; //variável de correção de altitude em metros
int Seg = 0; //variável de correção de altitude em metros
int Fun = 0;
int Horamost = ((Fun / 60)/ 60); //variável de correção de altitude em metros
int Minmost = (Fun / 60) % 60; //variável de correção de altitude em metros
int Segmost = Fun % 60; //variável de correção de altitude em metros
int Rota = 10; //variavel de correção da pressão em pascal
int temprot = 0; //variavel de correção da pressão em pascal
int G = 0; //variavel de correção da pressão em pascal
int Sele = 0; //variavel de correção da pressão em pascal
int Sele_2 = 0;
int tempo = tempoContador;
int contador = 0;
byte liga = 0;
void contaTempo();
/////////////////////////////////////////////////////////////////////////////////////////////
void setup(){
pinMode(botao_p, INPUT_PULLUP); //define o botao (MAIS) como uma entrada pull up
pinMode(botao_up, INPUT_PULLUP); //define o botao (ENTER/VOLTAR) como uma entrada pull up
pinMode(botao_down, INPUT_PULLUP); //define o botao (MENOS) como uma entrada pull up
pinMode(botao_enter, INPUT_PULLUP); //define o botao (MENOS) como uma entrada pull up
pinMode(pinRele1, OUTPUT);
digitalWrite(pinRele1, !nivelRele1);
pinMode(pinRele1, OUTPUT);
digitalWrite(pinRele2, !nivelRele2);
pinMode(pinRele3, OUTPUT);
digitalWrite(pinRele3, !nivelRele3);
lcd.init (); //inicia o display 16x2
lcd.backlight();
lcd.clear(); //limpa todos os caracteres do lcd
lcd.setCursor(0,0); //posiciona o cursor no display (caracter, linha)
lcd.print(F(" Centrifuga A1")); //imprime o texto entre aspas
lcd.setCursor(0,1); //posiciona o cursor no display (caracter, linha)
lcd.print(F(" Open system... ")); //imprime o texto entre aspas
delay (5000); //pausa o programa por 5 segundos
lcd.clear();
lcd.noBacklight();
delay(1000);
lcd.backlight();
}
void loop(){
temprot=(20000/Rota);
// === Ações no display LCD === //
if (tela==1){ //se a variável tela for igual a 1w, faça...
Fun=(((Hora*60)*60) + (Min*60) + Seg);
lcd.setCursor(0,0);
lcd.print("R=");
lcd.print(Rota);
lcd.print(" F=");
lcd.print(liga);
lcd.print("g ");
lcd.setCursor(0, 1);
lcd.print("t=");
if (Hora < 10) lcd.print("0"); // Se as horas forem menores que 10, coloque um "0" na frente.
lcd.print(Hora);
lcd.print(":");
if (Min < 10) lcd.print("0"); // Se as horas forem menores que 10, coloque um "0" na frente.
lcd.print(Min);
lcd.print(":");
if (Seg < 10) lcd.print("0"); // Se as horas forem menores que 10, coloque um "0" na frente.
lcd.print(Seg);
lcd.print(" H/m/s");
delay(500);
}
else if (tela==2){
lcd.setCursor(0,0); //posiciona o cursor no display (caracter, linha)
lcd.print(F(" << MENU >> ")); //imprime o texto entre aspas
lcd.setCursor(0,1); //posiciona o cursor no display (caracter, linha)
lcd.print(F("1 - Tempo ")); //imprime o texto entre aspas
}
else if (tela==3){
lcd.setCursor(0,0);
lcd.print(F(" << MENU >> "));
lcd.setCursor(0,1);
lcd.print(F("2 - Rotacao "));
}
else if (tela==21){
lcd.setCursor(0,0);
lcd.print("Alterar tempo ");
lcd.setCursor(0,1);
lcd.print("T= ");
if (Hora < 10) lcd.print("0"); // Se as horas forem menores que 10, coloque um "0" na frente.
lcd.print(Hora);
lcd.print(":");
if (Min < 10) lcd.print("0"); // Se as horas forem menores que 10, coloque um "0" na frente.
lcd.print(Min);
lcd.print(":");
if (Seg < 10) lcd.print("0"); // Se as horas forem menores que 10, coloque um "0" na frente.
lcd.print(Seg);
lcd.print(" H/m/s");
}
else if (tela==211){
lcd.setCursor(0,0);
lcd.print("Sel.: Hora ");
lcd.setCursor(0,1);
lcd.print("T= ");
if (Hora < 10) lcd.print("0"); // Se as horas forem menores que 10, coloque um "0" na frente.
lcd.print(Hora);
lcd.print(":");
if (Min < 10) lcd.print("0"); // Se as horas forem menores que 10, coloque um "0" na frente.
lcd.print(Min);
lcd.print(":");
if (Seg < 10) lcd.print("0"); // Se as horas forem menores que 10, coloque um "0" na frente.
lcd.print(Seg);
lcd.print(" H/m/s");
}
else if (tela==212){
lcd.setCursor(0,0);
lcd.print("Sel.: Minuto ");
lcd.setCursor(0,1);
lcd.print("T= ");
if (Hora < 10) lcd.print("0"); // Se as horas forem menores que 10, coloque um "0" na frente.
lcd.print(Hora);
lcd.print(":");
if (Min < 10) lcd.print("0"); // Se as horas forem menores que 10, coloque um "0" na frente.
lcd.print(Min);
lcd.print(":");
if (Seg < 10) lcd.print("0"); // Se as horas forem menores que 10, coloque um "0" na frente.
lcd.print(Seg);
lcd.print(" H/m/s");
}
else if (tela==213){
lcd.setCursor(0,0);
lcd.print("Sel.: Segundos ");
lcd.setCursor(0,1);
lcd.print("T= ");
if (Hora < 10) lcd.print("0"); // Se as horas forem menores que 10, coloque um "0" na frente.
lcd.print(Hora);
lcd.print(":");
if (Min < 10) lcd.print("0"); // Se as horas forem menores que 10, coloque um "0" na frente.
lcd.print(Min);
lcd.print(":");
if (Seg < 10) lcd.print("0"); // Se as horas forem menores que 10, coloque um "0" na frente.
lcd.print(Seg);
lcd.print(" H/m/s");
}
else if (tela==31){
lcd.setCursor(0,0);
lcd.print(F(" Rotacao "));
lcd.setCursor(0,1);
lcd.print("R= ");
lcd.print(Rota);
lcd.print(F(" RPM "));
}
else if (tela==11){
lcd.setCursor(0,0);
lcd.print(F(" Finalizado!! "));
lcd.setCursor(0,1);
lcd.print(" P para voltar. ");
}
/////////////////////////////////////////////////
// === Ações do Botão p === // ////////////
L_botao_p = digitalRead(botao_p);
if (!L_botao_p && LA_botao_p) {
if (tela==1) tela=2;
else if (tela==2) tela=1;
else if (tela==3) tela=1;
else if (tela==21){
if (Sele==0) tela=2;
else Sele = 0;
}
else if (tela==211){
tela=21;
Sele=0;
}
else if (tela==212){
tela=21;
Sele=0;
}
else if (tela==213){
tela=21;
Sele=0;
}
else if (tela==31) tela=3;
else if (tela==11) tela=1;
delay(30);}
LA_botao_p = L_botao_p;
/////////////////////////////////////////////////
// === Ações do Botão down === // ////////////
L_botao_down = digitalRead(botao_down);
if (!L_botao_down && LA_botao_down) {
if (tela==3){
lcd.clear();
tela=2;}
else if (tela==2){
lcd.clear();
tela=3;}
else if (tela==21){
if (Sele==0) tela=213;
}
else if (tela==213){
if (Sele==0) tela=212;
else if ( Sele=1){
if (Seg<1) Seg=0;
else Seg=Seg-1;
lcd.setCursor(2,1);
lcd.print(Hora);
lcd.print(":");
lcd.print(Min);
lcd.print(":");
lcd.print(Seg);
lcd.print(" H/m/s ");
}
}
else if (tela==212){
if (Sele==0) tela=211;
else if ( Sele=1){
if (Min<1) Min=0;
else Min=Min-1;
lcd.setCursor(2,1);
lcd.print(Hora);
lcd.print(":");
lcd.print(Min);
lcd.print(":");
lcd.print(Seg);
lcd.print(" H/m/s ");
}
}
else if (tela==211){
if (Sele==0) tela=213;
else if ( Sele=1){
if (Hora<1) Hora=0;
else Hora=Hora-1;
lcd.setCursor(2,1);
lcd.print(Hora);
lcd.print(":");
lcd.print(Min);
lcd.print(":");
lcd.print(Seg);
lcd.print(" H/m/s ");
}
}
else if (tela==31){
if (Sele==0) tela=21;
else {
Rota = (Rota - 10);
if (Rota<0) Rota=0;
}
}
delay(30);}
LA_botao_down = L_botao_down;
/////////////////////////////////////////////////
// === Ações do Botão up === // ////////////
L_botao_up = digitalRead(botao_up);
if (!L_botao_up && LA_botao_up) {
if (tela==3){
lcd.clear();
tela=2;}
else if (tela==2){
lcd.clear();
tela=3;}
else if (tela==21){
if (Sele==0) tela=211;
}
else if (tela==211){
if (Sele==0) tela=212;
else Hora = Hora + 1;
}
else if (tela==212){
if (Sele==0) tela=213;
else if ( Sele=1){
if (Min>58) Min=59;
else Min=Min+1;
}
}
else if (tela==213){
if (Sele==0) tela=211;
else if ( Sele=1){
if (Seg>58) Seg=59;
else Seg=Seg+1;
}
}
else if (tela==31){
if (Sele==0) tela=21;
else {
Rota = (Rota + 10);
if (Rota>20000) Rota=20000;
}
}
delay(30);}
LA_botao_up = L_botao_up;
/////////////////////////////////////////////////
// === Ações do Botão Enter === // ////////////
L_botao_enter = digitalRead(botao_enter);
if (!L_botao_enter && LA_botao_enter) {
if (tela==1) {
liga=1;
lcd.clear();
while (Fun > 0)
{
delay (1000); //descontamos em períodos de 1 segundo
Fun--;
Horamost = (Fun / 3600); //convertemos o total de segundos em horas
Minmost = (Fun % 60) / 60; //convertemos o total de segundos em minutos
Segmost = (Fun % 60) % 60; //convertemos o total de segundos em períodos de 60 segundos
lcd.setCursor(0,0);
lcd.print("Tempo restante"); //mostra mensagem de tempo restante
lcd.setCursor(4,1);
if (Horamost < 10) lcd.print("0"); // Se as horas forem menores que 10, coloque um "0" na frente.
lcd.print(Horamost); // Sem este código, mostra assim: H: M: S (1: M: S)
lcd.print(":");
if (Minmost < 10) lcd.print("0"); // Se os segundos forem menores que 10, coloque um "0" na frente.
lcd.print(Minmost); // Sem este código, parece com isto: H: M: S (H: 1: S)
lcd.print(":");
if (Segmost < 10) lcd.print("0"); // se o segundo valor estiver abaixo de 9 (unidade), ele prefixará um zero
lcd.print(Segmost);
}
tela=11;
}
else if (tela==2) tela=21;
else if (tela==3) tela=31;
else if (tela==21){
if (Sele==0) Sele=1;
else Sele = 0;
}
else if (tela==211){
if (Sele==0) Sele=1;
else Sele=0;
}
else if (tela==212){
if (Sele==0) Sele=1;
else Sele=0;
}
else if (tela==213){
if (Sele==0) Sele=1;
else Sele=0;
}
else if (tela==31){
if (Sele==0) Sele=1;
else Sele = 0;
}
delay(30);}
LA_botao_enter = L_botao_enter;
/////////////////////////////////////////////////
while (liga>1){
digitalWrite(6, LOW);
delay(temprot);
digitalWrite(6, HIGH);
digitalWrite(7, LOW);
delay(temprot);
digitalWrite(7 , HIGH);
digitalWrite(8, LOW);
delay(temprot);
digitalWrite(8, HIGH);
}
delay (Fun);
liga=0;
}
Unica forma que pensei que daria certo fazer isso seria com o timerone, usando timerone1 para o contador de liga e desliga e o timerone2 para a contagem de cada pino.
Obs: o tempo que cada pino fica ligado é o mesmo para todos os pinos, exempo: para 1 RPM, como o motor possui 3 bobinas e cada uma é ligada por um pino, precisariamos dividir 60segundos por 3, resultando em 20segundos para cada pino. Já para 10rpm seria (60/3)/10, que daria dois segundos por pino. ai ele faz esse ciclo 1,2,3,1,2,3... 2 segundos cada durante uma hora.
Não sei se conseguiram entender, más basicamente preciso criar um contador regressico simples com timerone.