Sou programador mas é meu primeiro contato com o Arduino, estou tentando ajudar no projeto de faculdade do meu irmão. Ainda não entendi bem como o Arduino funciona dentro do loop() dele, qual a velocidade de processamento desse loop, algumas coisas andam ocorrendo aqui e me parecem estranhas, erros de hardware e não de software, preciso de ajuda para entender o que pode estar ocorrendo de errado. Vamos lá.
Tratasse de um projeto de automação residencial onde será controlado o portão da garagem e algumas luzes da casa. Esta sendo usado o Arduino Uno e no portão um motor de passo.
O código abaixo funciona com o portão do projeto, porém ocorre que quando eu desligo a função controlandoCasa() no loop, o código funciona bem e o portão responde a todos os comandos para Abrir, Fechar e Parar, mostrando as mensagens de debug na tela. Mas quando ligo a função controlandoCasa(), o portão apenas executa o modo Fechar e não consegue fazer os outros comandos enviados. O que me intriga aqui é o fato do Arduino não estar debugando direito as ações do programa quando rodado com todas as funções, do portão e da casa. Por exemplo, eu envio o comando 3 para parar o motor quando ele esta andando, o motor faz uma pausa e depois retorna, porém no debug do aplicativo ele não emite a execução da linha de código do comando Parar, que deveria mostrar o texto "parado" na tela. Tenho a impressão de que o código roda mais lento e o Arduino não consegue processar os envios dos comandos.
#include <Stepper.h>
// Configuração de pinos dos equipamentos ligados
#define lampada1 2
#define lampada2 3
#define lampada3 4
#define lampada4 5
#define ventilador 6
#define limiteAbertura 7 // switch que limita a abertura do portão
#define limiteFechamento 8 // switch que limita o fechamento do portão
int acaoPortao = 0; // registro da ação escolhida pelo aplicativo
int acaoCasa = 0; // registro da ação escolhida pelo aplicativo
int passosDoMotor = 100; // número de passos que o motor suport
// Conectando pinos do motor à biblioteca
Stepper portao(passosDoMotor, 10, 12, 11, 13); // sequência de pinos 1, 3, 2, 4
void setup() {
// Executando setups
setupPortao();
setupCasa();
// Inicia a porta serial
Serial.begin(9600);
}
void loop() {
// Executando controladores
controlandoPortao();
controlandoCasa();
}
// Setup do portão
void setupPortao() {
portao.setSpeed(350); // velocidade do portão
pinMode(limiteAbertura, INPUT); // switch da abertura
pinMode(limiteFechamento, INPUT); // switch do fechamento
}
// Setup dos equipamentos da casa
void setupCasa() {
// Lista de equipamentos
pinMode(lampada1, OUTPUT);
pinMode(lampada2, OUTPUT);
pinMode(lampada3, OUTPUT);
pinMode(lampada4, OUTPUT);
pinMode(ventilador, OUTPUT);
// Iniciando todos como desligado
digitalWrite(lampada1, LOW);
digitalWrite(lampada2, LOW);
digitalWrite(lampada3, LOW);
digitalWrite(lampada4, LOW);
digitalWrite(ventilador, LOW);
}
/*
* Controlando ações do portão
* Ações de valor 1 a 9 correspondem aos eventos do portão
* O funcionamento segue o ciclo do loop(), em cada passada é checado os switches
* para saber se deve continuar ou não com os steps() do motor.
* Ações: 1 = Abrir, 2 = Fechar, 3 = Parar
*/
void controlandoPortao() {
// Verificando entrada dos botões do aplicativo
if (Serial.available() > 0) {
if (Serial.parseInt() >= 1 && Serial.parseInt() <= 9)
acaoPortao = Serial.parseInt();
}
// Botões do aplicativo
switch (acaoPortao) {
// Abrindo portão
case 1:
if (digitalRead(limiteAbertura) == LOW) {
portao.step(-100);
Serial.println("abrindo");
} else {
acaoPortao = 0;
Serial.println("limite de abertura alcançado");
}
break;
// Fechando portão
case 2:
if (digitalRead(limiteFechamento) == LOW) {
portao.step(100);
Serial.println("fechando");
} else {
acaoPortao = 0;
Serial.println("limite de fechamento alcançado");
}
break;
// Parando portão
case 3:
acaoPortao = 0;
Serial.println("parado");
break;
}
}
/*
* Controlando equipamentos da casa
* Ações a partir do valor 11 correspondem aos eventos dentro da casa
*/
void controlandoCasa() {
// Verificando entrada dos botões do aplicativo
if (Serial.available() > 0) {
acaoCasa = Serial.parseInt();
} else {
return;
}
// Botões do aplicativo
switch (acaoCasa) {
// Lâmpada 1
case 11: interruptor(lampada1); break;
// Lâmpada 2
case 12: interruptor(lampada2); break;
// Lâmpada 3
case 13: interruptor(lampada3); break;
// Lâmpada 4
case 14: interruptor(lampada4); break;
// Ventilador
case 15: interruptor(ventilador); break;
}
}
// Função liga/desliga para equipamentos simples
void interruptor(int equipamento) {
if (digitalRead(equipamento) == LOW) {
digitalWrite(equipamento, HIGH);
} else {
digitalWrite(equipamento, LOW);
}
}