AULA 11 - Microcontroladores - Eng
Ir para navegação
Ir para pesquisar
Trabalho Bernardo
Protótipo
Construído com motor de passo e controlado por IR/controle remoto
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 Eduardo
Protótipo
Esse protótipo requer que o pet esteja na plataforma que fica logo à frente do pote, para que a ração seja liberada. E conforme mostra o vídeo, um pequeno peso na plataforma aciona o botão que manda o comando para o arduino, que por sua vez aciona o servo motor se estiver no horário correto para alimentar (led acesso).
Vídeos do dispositivo:
Firmware
#include <Servo.h>
#define SERVO 6
//Projeto 2 - Alimentador de Pet - Eduardo Schaefer
Servo s;
int botao = 2; //Botão que vai identificar se o animal está no lugar para comer
int estado_botao = 0; // Variavel para ler o botão
int segundos = 0;
void setup ()
{
s.attach(SERVO);
Serial.begin(9600);
s.write(0);
pinMode(botao, INPUT);
pinMode(10, OUTPUT);
}
void loop()
{
int timer = temporizador();
if (timer == 1)
{
digitalWrite(10, HIGH); //LED que informa que ja esta na hora alimentar novamente
}
estado_botao = digitalRead(botao);
if (estado_botao == HIGH && timer == 1) //Se o animal estiver no local e estiver na hora de alimentar o animal o
motor move
{
s.write(90);
delay(300); //Tempo para cair ração
s.write(0);
segundos = 0;
digitalWrite(10, LOW);// Led apaga e so vai acender novamente se estiver no horario para comer novamente
}
}
int temporizador() // Função que vai determinar o intervalo que o pet será alimentado, no caso a cada 5 segundos,
mas pode ser alterado para qualquer intervalo
{
if (segundos == 5)
{
return 1;
}
for (segundos = 0; segundos < 5; segundos++) //contador de segundos
{
delay(1000);
}
}
Trabalho Nelson
Protótipo
Hardware/Eletrônica
Partes Mecânicas
[ Projeto 2 Alimentador de gatos Nelson]
Firmware
Trabalho Thiago
Protótipo
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
| < Projeto 2 - Alimentador automático de pets | AULA 11 - Projeto 2 - Protótipos dos Alunos - Apresentação | Projeto 3 - Sistema de segurança residencial > |
|---|

