AULA 11 - Microcontroladores - Eng

De IFSC
Revisão de 07h28min de 23 de abril de 2021 por imported>Fargoud
Ir para navegação Ir para pesquisar

<< Página do curso



Trabalho Bernardo

Protótipo

Construído com motor de passo e controlado por IR/controle remoto

Vídeo do protótipo]


Firmware

#include <Stepper.h>
#include <IRremote.h>

// Definição de Pinos
#define STEPS 512
#define pinLed2 53
#define pinLed 34
#define RECV_PIN 32
#define pinBuzzer 30
#define pinIN4 28
#define pinIN3 26
#define pinIN2 24
#define pinIN1 22

// Definição de Objetos
IRrecv irrecv(RECV_PIN); //PASSA O PARÂMETRO PARA A FUNÇÃO irrecv
decode_results results; //VARIÁVEL QUE ARMAZENA OS RESULTADOS (SINAL IR RECEBIDO)
Stepper stepper(STEPS, pinIN1, pinIN2, pinIN3, pinIN4);

// Prototipagem de funções
void piscaled(); void apito(); void lerIr(); void automatico();

// Definição de variáveis
int vel = 30, meiavolta = 1024, tempo = 0, armazenatempo = 0, timer = 8000;
// respectivamente, a velocidade de rotação do stepper, o valor que faz ele rotacionar 180º, variavel para 
comparação de tempo, variavel para armazenamento de tempo, tempo em milisegundos.
bool estado;
// variável de estado, para pushbutton, da função timer

void setup() {
  stepper.setSpeed(vel);
  Serial.begin(9600);
  irrecv.enableIRIn();
  pinMode(pinBuzzer, OUTPUT);
  pinMode(pinLed, OUTPUT);
  pinMode(pinLed2, OUTPUT);
}

void loop() {
 lerIr(); // FUNÇÃO DE LEITURA DOS COMANDOS DO CONTROLE
 automatico(); // FUNÇÃO DE ALIMENTAÇÃO AUTOMATICA
}


void apito() {
 for (int i = 0; i < 3; i++) { // SOA O BUZZER, CONFIRMANDO O ABASTECIMENTO DE ALIMENTO
   digitalWrite(pinBuzzer, HIGH);
   delay(100);
   digitalWrite(pinBuzzer, LOW);
   delay(100);
 }
}

void piscaled() { // PISCA O LED AZUL DUAS VEZES, CONFIRMAR RECEBIMENTO DE SINAL.
 digitalWrite(pinLed, HIGH);
 delay(50);
 digitalWrite(pinLed, LOW);
 delay(50);
 digitalWrite(pinLed, HIGH);
 delay(50);
 digitalWrite(pinLed, LOW);
 delay(50);
}

void lerIr() {
 if (irrecv.decode(&results)) {
   if (results.value == 0xFFC23D || results.value == 0x5BFA89D3) { //QUANDO ESSES VALORES FOREM LIDOS DO 
CONTROLE, EXECUTAM A FUNÇÃO DE DAR COMIDA
     Serial.println("PLAY | DAR COMIDA");
     piscaled();
     stepper.step(meiavolta);
     delay(1000);
     stepper.step(meiavolta);
     delay(1000);
     apito();
   }
   if (results.value == 0xFFA857 || results.value == 0x6E570BF3) { //QUANDO ESSES VALORES FOREM LIDOS DO  
CONTROLE, EXECUTAM A FUNÇÃO DE AUMENTAR O TIMER EM 1 SEG
     Serial.println("VOLUME+ | AUMENTAR TIMER");
     timer = timer + 1000;
     piscaled();
   }
   if (results.value == 0xFFE01F || results.value == 0xA166B553) { //QUANDO ESSES VALORES FOREM LIDOS DO 
CONTROLE, EXECUTAM A FUNÇÃO DE DIMINUIR O TIMER EM 1 SEG
     Serial.println("VOLUME- | DIMINUIR TIMER");
     timer = timer - 1000;
     piscaled();
   }
   if (results.value == 0xFF629D || results.value == 0x51AA59D3) { //QUANDO ESSES VALORES FOREM LIDOS DO 
CONTROLE, O MOTOR DÁ UM PEQUENO PASSO PARA REAJUSTE DO EIXO
     Serial.println("CH | PEQUENO PASSO PARA REAJUSTE");
     piscaled();
     stepper.step(64);
   }
   if (results.value == 0xFF4AB5 || results.value == 0x8010D93) { //QUANDO ESSES VALORES FOREM LIDOS DO CONTROLE, 
LIGA A FUNÇÃO TIMER
     Serial.println("8 | LIGAR TIMER");
     if (!estado) { // SE  O ESTADO FOR 0, ELE ZERA O TEMPO DE COMPARAÇÃO, ARMAZENA O TEMPO DE EXECUÇÃO 
MOMENTANEO, E MUDA ESTADO PARA "HIGH"
       tempo = 0;
       armazenatempo = millis();
       estado = !estado;
       digitalWrite(pinLed2, estado); // LED VERMELHO, CONFIRMA A LIGAÇÃO DA FUNÇÃO TIMER
     } else {
       estado = !estado; // ESSA PARTE SERVE PARA CASO VOCÊ QUEIRA DESATIVAR O TIMER, DESLIGANDO TAMBÉM O LED.
       digitalWrite(pinLed2, estado); 
     }
     piscaled();
   }
   if (results.value == 0xFFA25D || results.value == 0xCC718833) {
     Serial.println("CH- | DIMINUIR VELOCIDADE DO PASSO"); //QUANDO ESSES VALORES FOREM LIDOS DO CONTROLE, 
DIMINUI VELOCIDADE DO MOTOR, AUMENTA A PRECISÃO DO MOTOR E AUMENTA A QUANTIDADE DE RAÇÃO.
     piscaled();
     if (vel > 5) {
       vel = vel - 5;
       stepper.setSpeed(vel);
     }
     Serial.println(vel);
   }
   if (results.value == 0xFFE21D || results.value == 0xB5A7E1D7) {
     Serial.println("CH+ | AUMENTAR VELOCIDADE DO PASSO"); //QUANDO ESSES VALORES FOREM LIDOS DO CONTROLE, 
AUMENTA A VELOCIDADE DO MOTOR, MAS DEIXA O SISTEMA MAIS INSTAVEL
     piscaled();
     if (vel < 60) {
       vel = vel + 5;
       stepper.setSpeed(vel);
     }
     Serial.println(vel);
   }
   // ESSAS FUNÇÕES DE AJUSTE, CH, CH+, CH- EXISTEM, POIS O MOTOR RESPONDE DIFERENTE A CADA NIVEL DE TENSÃO (5- 
12V).
   irrecv.resume(); //AGUARDA O RECEBIMENTO DE UM NOVO SINAL IR
 }
}
void automatico() {  // ESSA FUNÇÃO IRA DEPOSITAR O ALIMENTO, QUANDO ESTIVER LIGADA A FUNÇÃO TIMER, ASSIM, A CADA 
TEMPO DE TIMER (AJUSTÁVEL) IRÁ ALIMENTAR.
 tempo = millis() - armazenatempo; // TEMPO DE EXECUÇÃO ATUAL MENOS O TEMPO DE EXECUÇÃO ARMAZENADO.
 if (tempo > timer && estado) { // QUANDO O TEMPO DE COMPARAÇÃO FOR MAIOR QUE O TEMPO DO TIMER, E A FUNÇÃO TIMER 
ESTIVER LIGADA, EXECUTA A ALIMENTAÇÃO.
   stepper.step(meiavolta);
   delay(1000);
   stepper.step(meiavolta);
   delay(1000);
   armazenatempo = millis(); // ARMAZENA O TEMPO DE EXECUÇÃO ATUAL, MANTENDO A ALIMENTAÇÃO AUTOMATICA.
   apito();
 }
}

Trabalho Júlia

Protótipo

Hardware/Eletrônica

MIC2Proj2Julia.png

Partes Mecânicas

Vídeos do dispositivo:

Parte 1

Parte 2

Firmware

 #include <LiquidCrystal.h> //Inclui biblioteca do LCD
 #include <Stepper.h> 
   
 LiquidCrystal lcd(12, 11, 5, 4, 3, 2); 
 const int stepsPerRevolution = 500;
 //Inicializa a biblioteca utilizando as portas de 8,9,10 e 13 para 
 //ligacao ao motor 
 Stepper myStepper(stepsPerRevolution, 8,10,9,13);  
  
 int segundo,minuto,hora,dia,mes,ano; 
 unsigned long UtlTime; 
  
 void setup(){ 
  //Determina a velocidade inicial do motor 
   myStepper.setSpeed(60);
    
   //Para o LCD 
   UtlTime=0;   
   minuto=0;   
   hora=0;   
   dia=0;   
   mes=0;   
   ano=0;   
   Serial.begin(9600); 
   lcd.begin(16, 2);      
   
   lcd.setCursor(0,0);   
   lcd.print(" Data e hora ");   
   lcd.setCursor(0,1);   
   lcd.print(" com Arduino");   
   delay (2000); 
 
   //Configura o minuto   
   lcd.clear();   
   lcd.setCursor(0,0);   
   lcd.print("Minuto: ");   
   Serial.print("\nEntre Minuto:");  
   while(minuto==0){     
     if (Serial.available() > 0){       
     minuto= Serial.parseInt();
     Serial.print(minuto);     
     }   
   }   
   lcd.print(minuto);   
   delay(1000);

    //Configura a hora   
   lcd.clear();   
   lcd.setCursor(0,0);   
   lcd.print("Hora: ");   
   Serial.print("\nEntre Hora:"); 
   while(hora==0){     
     if (Serial.available() > 0){       
     hora= Serial.parseInt();
     Serial.print(hora);     
     }   
   }   
   lcd.print(hora);   
   delay(1000); 

   //Configura o Dia   
   lcd.clear();   
   lcd.setCursor(0,0);   
   lcd.print("Dia: ");   
   Serial.print("\nEntre Dia:");   
   while(dia==0)   
   {     
     if (Serial.available() > 0){       
       dia= Serial.parseInt();
        Serial.print(dia);     
     }   
   }   
   lcd.print(dia);   
   delay(1000);    
   
   //Configura o mês   
   lcd.clear();   
   lcd.setCursor(0,0);   
   lcd.print("Mes: ");   
   Serial.print("\nEntre Mes:");  
   while(mes==0)   
   {     
     if (Serial.available() > 0){       
       mes= Serial.parseInt();
        Serial.print(mes);     
     }   
   }   
   lcd.print(mes);   
   delay(1000);    
   
   //Configura o Ano   
   lcd.clear();   
   lcd.setCursor(0,0);   
   lcd.print("Ano: ");   
   Serial.print("\nEntre ano:");   
   while(ano==0){     
     if (Serial.available() > 0){       
       ano= Serial.parseInt();
       Serial.print(ano);    
     }   
   }   
   lcd.print(ano);   
   delay(1000);    
   lcd.clear(); 
 }
 
 void EscreveDataHora(){  
   if(millis()-UtlTime<0){     
     UtlTime=millis();   
   }   
   else{     
     segundo=int((millis()-UtlTime)/1000);   
   }   
   if(segundo>59){     
     segundo=00;
     lcd.clear();     
     minuto++;     
     UtlTime=millis();     
     if(minuto>59){       
       hora++;
       lcd.clear();       
       minuto=00;       
       if(hora>23){         
         dia++;         
         hora=00;         
         if(mes==1||mes==3||mes==5||mes==7||mes==8||mes==10||mes==12){           
           if(dia>31){             
             dia=1;             
             mes++;             
             if(mes>12){               
              ano++;               
              mes=1;             
             } 
           }       
         }         
       else if(mes==2){           
          if(ano%400==0){             
           if(dia>29){               
             dia=1;               
             mes++;             
           }           
          }         
           else if((ano%4==0)&&(ano%100!=0)){             
             if(dia>29){              
               dia=1;               
               mes++;             
             }           
           }           
           else{             
             if(dia>28){               
               dia=1;               
               mes++;             
             }           
           }         
         }         
       else{           
         if(dia>30){             
           dia=1;             
           mes++;           
         }         
       }      
     }     
   }   
 }    
   lcd.setCursor(0,0);   
   lcd.print("Data ");   
   lcd.print(dia);   
   lcd.print("/");   
   lcd.print(mes);   
   lcd.print("/");   
   lcd.print(ano);  
   lcd.setCursor(0,1);   
   lcd.print("Hora ");   
   lcd.print(hora);   
   lcd.print(":");   
   lcd.print(minuto);   
   lcd.print(":");   
   lcd.print(segundo);
 }

 void SelecionaHoraAlimentaPET(){
   //Seleciona a hora da refeição
   int h=15;
   //Seleciona os minutos da refeição
   int m=15;
     
   //Mostra no DISPLAY
   if(hora==h&&minuto==m&&segundo>=30){
     lcd.clear(); 
     lcd.setCursor(0,0);
     lcd.print(" Hora da racao ");
     lcd.setCursor(0,1);
     lcd.print(" Bom apetite! ");
     //Liga o motor
     LigaMotor();
   }
   else{
      lcd.clear();
      EscreveDataHora();
   }
 }
 void LigaMotor(){
 //O motor faz 2 giros completos
  for (int i = 0; i<=2; i++)
  {
    myStepper.step(2048); 
    delay(2000);
  }
  delay(2000);
}
 
  void loop(){ 
   EscreveDataHora();
   SelecionaHoraAlimentaPET();
 }

Trabalho Nelson

Protótipo

Hardware/Eletrônica

Partes Mecânicas

[ Projeto 2 Alimentador de gatos Nelson]

Firmware


Trabalho Thiago

Protótipo

MIC2Proj2Thiago1.png
MIC2Proj2Thiago2.png

Hardware/Eletrônica

Vídeo Projeto 2 Alimentador de peixes Thiago

Partes Mecânicas

Firmware

 #include <LiquidCrystal.h> //Inclui biblioteca do LCD
 #include <Stepper.h> 
     
 LiquidCrystal lcd(12, 11, 5, 4, 3, 2); 
 const int stepsPerRevolution = 500;
 //Inicializa a biblioteca utilizando as portas de 8,9,10 e 13 para 
 //ligacao ao motor 
 Stepper myStepper(stepsPerRevolution, 8,10,9,13);  
 
 int segundo,minuto,hora,dia,mes,ano; 
 unsigned long UtlTime; 
 
 void setup(){ 
  //Determina a velocidade inicial do motor 
   myStepper.setSpeed(60);
   
   //Para o LCD 
   UtlTime=0;   
   minuto=0;   
   hora=0;   
   dia=0;   
   mes=0;   
   ano=0;   
   Serial.begin(9600); 
   lcd.begin(16, 2);      
   
   lcd.setCursor(0,0);   
   lcd.print(" Data e hora ");   
   lcd.setCursor(0,1);   
   lcd.print(" com Arduino");   
   delay (2000); 
  
   //Configura o minuto   
   lcd.clear();   
   lcd.setCursor(0,0);   
   lcd.print("Minuto: ");   
   Serial.print("\nEntre Minuto:");  
   while(minuto==0){     
     if (Serial.available() > 0){       
     minuto= Serial.parseInt();
     Serial.print(minuto);     
     }   
   }   
   lcd.print(minuto);   
   delay(1000);

    //Configura a hora   
   lcd.clear();   
   lcd.setCursor(0,0);   
   lcd.print("Hora: ");   
   Serial.print("\nEntre Hora:"); 
   while(hora==0){     
     if (Serial.available() > 0){       
     hora= Serial.parseInt();
     Serial.print(hora);     
     }   
   }   
   lcd.print(hora);   
   delay(1000); 
 
   //Configura o Dia   
   lcd.clear();   
   lcd.setCursor(0,0);   
   lcd.print("Dia: ");   
   Serial.print("\nEntre Dia:");   
   while(dia==0)   
   {     
     if (Serial.available() > 0){       
       dia= Serial.parseInt();
        Serial.print(dia);     
     }   
   }   
   lcd.print(dia);   
   delay(1000);    
   
   //Configura o mês   
   lcd.clear();   
   lcd.setCursor(0,0);   
   lcd.print("Mes: ");   
   Serial.print("\nEntre Mes:");  
   while(mes==0)   
   {     
     if (Serial.available() > 0){       
       mes= Serial.parseInt();
        Serial.print(mes);     
     }   
   }   
   lcd.print(mes);   
   delay(1000);    
   
   //Configura o Ano   
   lcd.clear();   
   lcd.setCursor(0,0);   
   lcd.print("Ano: ");   
   Serial.print("\nEntre ano:");   
   while(ano==0){     
     if (Serial.available() > 0){       
       ano= Serial.parseInt();
       Serial.print(ano);    
     }   
   }   
   lcd.print(ano);   
   delay(1000);    
   lcd.clear(); 
 }
 
 void EscreveDataHora(){  
   if(millis()-UtlTime<0){     
     UtlTime=millis();   
   }   
   else{     
     segundo=int((millis()-UtlTime)/1000);   
   }   
   if(segundo>59){     
     segundo=00;
     lcd.clear();     
     minuto++;     
     UtlTime=millis();     
     if(minuto>59){       
       hora++;
       lcd.clear();       
       minuto=00;       
       if(hora>23){         
         dia++;         
         hora=00;         
         if(mes==1||mes==3||mes==5||mes==7||mes==8||mes==10||mes==12){           
           if(dia>31){             
             dia=1;             
             mes++;             
             if(mes>12){               
              ano++;               
              mes=1;             
             } 
           }       
         }         
       else if(mes==2){           
          if(ano%400==0){             
           if(dia>29){               
             dia=1;               
             mes++;             
           }           
          }         
           else if((ano%4==0)&&(ano%100!=0)){             
             if(dia>29){              
               dia=1;               
               mes++;             
             }           
           }           
           else{             
             if(dia>28){               
               dia=1;               
               mes++;             
             }           
           }         
         }         
       else{           
         if(dia>30){             
           dia=1;             
           mes++;           
         }         
       }      
     }     
   }   
 }    
   lcd.setCursor(0,0);   
   lcd.print("Data ");   
   lcd.print(dia);   
   lcd.print("/");   
   lcd.print(mes);   
   lcd.print("/");   
   lcd.print(ano);  
   lcd.setCursor(0,1);   
   lcd.print("Hora ");   
   lcd.print(hora);   
   lcd.print(":");   
   lcd.print(minuto);   
   lcd.print(":");   
   lcd.print(segundo);
 }
  
 void SelecionaHoraAlimentaPET(){
   //Seleciona a hora da refeição
   int h=15;
   //Seleciona os minutos da refeição
   int m=15;
   
   //Mostra no DISPLAY
   if(hora==h&&minuto==m&&segundo>=30){
     lcd.clear(); 
     lcd.setCursor(0,0);
     lcd.print(" Hora da racao ");
     lcd.setCursor(0,1);
     lcd.print(" Bom apetite! ");
     //Liga o motor
     LigaMotor();
   }
   else{
      lcd.clear();
      EscreveDataHora();
   }
 }
 void LigaMotor(){
 //O motor faz 2 giros completos
  for (int i = 0; i<=2; i++)
  {
    myStepper.step(2048); 
    delay(2000);
  }
  delay(2000);
}
 
  void loop(){ 
   EscreveDataHora();
   SelecionaHoraAlimentaPET();
 }

Trabalho Vitor

Protótipo

Hardware/Eletrônica

Partes Mecânicas

Firmware


<< Página do curso

< Projeto 2 - Alimentador automático de pets AULA 11 - Projeto 2 - Protótipos dos Alunos - Apresentação Projeto 3 - Sistema de segurança residencial >