Usar timerone dentro de outro timerone

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.

Tu precisas dum chip que faça isso por ti... ou então PWM talvez?

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.