Hola . Soy nueva en todo el tema de códigos y programación, y la verdad me vendría bien un poco de ayuda
. Tengo que hacer un proyecto para la escuela sobre un portón corredizo manejado a control remoto con Arduino. El problema es que realiza la acción de abrir, pero no cierra. Y ahí queda, congelado sin hacer nada más. Si alguien le da un vistazo, gracias de antemano
#include <RCSwitch.h>
#include <Wire.h>
#include <EEPROM.h>
//Declaracion de pulsadores
#define optimo 5 // ---------------- mantenimiento y funcion remota ----------------
#define usuario 6 // ---------------- pulsador de registro ----------------
//Declaracion de variables
enum { asociar = 0, arranque, freno1, retroceso, freno2, automatico, nuevo }; // ||| ESTADOS DEL PORTON |||
byte estado;
unsigned long codigoPrincipal = 1, codigoAlmacenado = 2, codigoRecibido = 0; // || Slots para Controles ||
unsigned long tiempoactual = 0;
int led1 = 12, led2 = 11; //leds de testeo/identificacion de estados
int encendido = 10, direccion = 9, sensor1 = 7, sensor2 = 8; //sensor1 = FCA y sensor2 = FCC
//Declaracion de banderas
boolean primeravez = true;
boolean habilitarFCA = true;
boolean habilitarFCC = false;
boolean code = false, code2 = false, code3 = false, code4 = false;
boolean remoto, habilitar = false, OK = true;
//Declaración de funciones
boolean compararCodigo1();
boolean compararCodigo2();
boolean compararCodigo1(long int codigoPrincipal[],long int codigoRecibido[]){
if(codigoPrincipal[0] != codigoRecibido[0])return(false); //Si son distintos retorna falso la función [ 0 ]
if(codigoPrincipal[1] != codigoRecibido[1])return(false); //Si son distintos retorna falso la función [ 0 ]
if(codigoPrincipal[2] != codigoRecibido[2])return(false); //Si son distintos retorna falso la función [ 0 ]
if(codigoPrincipal[3] != codigoRecibido[3])return(false); //Si son distintos retorna falso la función [ 0 ]
return(true);
}
boolean compararCodigo2(long int codigoAlmacenado[],long int codigoRecibido[]){
if(codigoAlmacenado[5] != codigoRecibido[0])return(false); //Si son distintos retorna falso la función [ 0 ]
if(codigoAlmacenado[6] != codigoRecibido[1])return(false); //Si son distintos retorna falso la función [ 0 ]
if(codigoAlmacenado[7] != codigoRecibido[2])return(false); //Si son distintos retorna falso la función [ 0 ]
if(codigoAlmacenado[8] != codigoRecibido[3])return(false); //Si son distintos retorna falso la función [ 0 ]
return(true); //Si los códigos son iguales retorna verdadero [ 1 ]
}
RCSwitch mySwitch = RCSwitch();
void setup() {
Serial.begin(9600);
mySwitch.enableReceive(0); // Receiver on interrupt 0 => that is pin #2
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(encendido, OUTPUT);
pinMode(direccion, OUTPUT);
pinMode(optimo, INPUT);
pinMode(usuario, INPUT);
pinMode(sensor1, INPUT_PULLUP);
pinMode(sensor2, INPUT_PULLUP);
if(EEPROM.get(0, codigoPrincipal) != -1){
Serial.println(" - - - - - - - - - - - - - - - - - - - - - - - - - - -");
Serial.print(" Control disponible: ");
Serial.println( EEPROM.get(0, codigoPrincipal) );
Serial.println(" - - - - - - - - - - - - - - - - - - - - - - - - - - -");
estado = arranque;
} else{
Serial.print(" - - - - - Debe de asociar un control - - - - -");
estado = asociar;
}
}
void loop() {
switch (estado) {
case asociar: { //Asociar 1er control (Adaptacion de administrador)
if (mySwitch.available()) {
codigoRecibido = mySwitch.getReceivedValue();
if (codigoRecibido == 1111)
{
Serial.println("\nNo hay codigo || ERROR ||");
}
else
{
Serial.print("\n\nCodigo entrante: ");
Serial.println(codigoRecibido);
Serial.print( mySwitch.getReceivedBitlength() );
Serial.print(" bits \n");
codigoPrincipal = codigoRecibido;
EEPROM.put(0, codigoPrincipal);
Serial.print("\n\nCodigo entrante guardado exitosamente");
Serial.print("\nDireccion 0 | ");
Serial.print( EEPROM.get(0, codigoPrincipal) );
mySwitch.resetAvailable();
estado = arranque;
}
}
} break;//asociar
case arranque:{
if(mySwitch.available()){
OK = true;
codigoRecibido = mySwitch.getReceivedValue();
if((millis() >= (tiempoactual+2000)) && OK){
tiempoactual = millis();
Serial.print(mySwitch.getReceivedValue());
if(compararCodigo1(codigoRecibido, codigoPrincipal) || compararCodigo2(codigoRecibido, codigoAlmacenado) && remoto) {
delay(450);
code = true;
codigoRecibido = 0;
remoto = false;
OK = false;
}
mySwitch.enableReceive();
}
mySwitch.resetAvailable();
}
while(code){
digitalWrite(12,LOW);
digitalWrite(11,HIGH);
digitalWrite(direccion, HIGH);
delay(20);
digitalWrite(encendido, HIGH);
Serial.println("\n\nARRANQUE");
if(!digitalRead(sensor2)){
digitalWrite(encendido, LOW);
delay(20);
digitalWrite(direccion, LOW);
code = false;
estado = retroceso;
}
delay(150);
/*habilitar = true;
if((habilitar) && (!digitalRead(sensor1)) && (habilitarFCA)){
digitalWrite(encendido, LOW);
delay(20);
digitalWrite(direccion, LOW);
habilitarFCA = false;
habilitarFCC = true;
estado = retroceso;
}
if (digitalRead(usuario) == HIGH){ //Deriva a agregar nuevo control ||| ARRANQUE
while (digitalRead(usuario) == HIGH);
//Serial.println("Derivando a nuevo usuario");
while (digitalRead(usuario) == LOW);
delay(250);
estado = nuevo;
}
if((habilitar) && (digitalRead(nuevo) == LOW)){
Serial.println("Desabilitando");
remoto = true;
code = false;
habilitar = false;
delay(250);
estado = freno1;
// Serial.println( estado );
}*/
}
}break; //arranque
case freno1: {
if(mySwitch.available()){
OK = true;
codigoRecibido = mySwitch.getReceivedValue();
// if((millis() >= (tiempoactual+2000)) && OK){
// tiempoactual = millis();
Serial.print(mySwitch.getReceivedValue());
Serial.print(compararCodigo1(codigoRecibido, codigoPrincipal));
if(compararCodigo1(codigoRecibido, codigoPrincipal) || compararCodigo2(codigoRecibido, codigoAlmacenado) && remoto) {
delay(450);
code2 = true;
codigoRecibido = 0;
remoto = false;
OK = false;
}
mySwitch.enableReceive();
// }
mySwitch.resetAvailable();
}
while(code2){
digitalWrite(12,HIGH);
digitalWrite(11,LOW);
digitalWrite(encendido, LOW);
delay(20);
digitalWrite(direccion, LOW);
Serial.println("\n\nFRENO - 1");
delay(1000);
habilitar = true;
if(habilitar){
Serial.println("Desabilitando");
remoto = true;
delay(250);
code2 = false;
habilitar = false;
estado = retroceso;
// Serial.println( estado );
}
}
}break; //FRENO - 1
case retroceso: {
if(mySwitch.available()){
OK = true;
codigoRecibido = mySwitch.getReceivedValue();
// if((millis() >= (tiempoactual+2000)) && OK){
// tiempoactual = millis();
Serial.print(mySwitch.getReceivedValue());
Serial.print(compararCodigo1(codigoRecibido, codigoPrincipal));
if(compararCodigo1(codigoRecibido, codigoPrincipal) || compararCodigo2(codigoRecibido, codigoAlmacenado) && remoto) {
delay(450);
code3 = true;
codigoRecibido = 0;
remoto = false;
OK = false;
}
mySwitch.enableReceive();
// }
mySwitch.resetAvailable();
}
while(code3){
digitalWrite(12,LOW);
digitalWrite(11,HIGH);
digitalWrite(direccion, LOW);
delay(20);
digitalWrite(encendido, HIGH);
Serial.println("\n\nRETROCESO");
if(!digitalRead(sensor1)){
digitalWrite(encendido, LOW);
delay(20);
digitalWrite(direccion, LOW);
code3 = false;
estado = arranque;
}
delay(150);
/*if (digitalRead(optimo) == HIGH){ //Deriva a modo automatico |||| RETROCESO
while (digitalRead(optimo) == HIGH);
Serial.println("AUTOMATICO");
while (digitalRead(optimo) == LOW);
delay(250);
estado = automatico;
}
if((habilitar) && (digitalRead(optimo) == LOW)){
Serial.println("Desabilitando");
remoto = true;
delay(250);
code3 = false;
habilitar = false;
estado = freno2;
// Serial.println( estado );
}*/
}
}break; //retroceso
case freno2: {
if(mySwitch.available()){
OK = true;
codigoRecibido = mySwitch.getReceivedValue();
// if((millis() >= (tiempoactual+2000)) && OK){
// tiempoactual = millis();
Serial.print(mySwitch.getReceivedValue());
Serial.print(compararCodigo1(codigoRecibido, codigoPrincipal));
if(compararCodigo1(codigoRecibido, codigoPrincipal) || compararCodigo2(codigoRecibido, codigoAlmacenado) && remoto) {
delay(450);
code4 = true;
codigoRecibido = 0;
remoto = false;
OK = false;
}
mySwitch.enableReceive();
// }
mySwitch.resetAvailable();
}
while(code4){
digitalWrite(12,HIGH);
digitalWrite(11,LOW);
digitalWrite(encendido, LOW);
delay(20);
digitalWrite(direccion, LOW);
Serial.println("\n\nFRENO - 2");
delay(1000);
habilitar = true;
if(habilitar){
Serial.println("Desabilitando");
remoto = true;
delay(250);
code4 = false;
habilitar = false;
estado = arranque;
// Serial.println( estado );
}
}
}break; //FRENO - 2
case automatico: { //Funcion automatica para corroborar estado | MANTENIMIENTO |
boolean modoautomatico = true;
while(modoautomatico){
if(primeravez){
digitalWrite(encendido, HIGH);
digitalWrite(direccion, LOW);
digitalWrite(12,HIGH);
digitalWrite(11,HIGH);
primeravez = false;
}
if(!digitalRead(sensor1) && habilitarFCA){
digitalWrite(encendido, LOW);
delay(5000);
digitalWrite(direccion, HIGH);
digitalWrite(encendido, HIGH);
habilitarFCA = false;
habilitarFCC = true;
}
if(!digitalRead(sensor2) && habilitarFCC){
digitalWrite(encendido, LOW);
habilitarFCC = false;
modoautomatico = false;
Serial.println("\n\nVUELTA AL PORTON\n");
estado = arranque;
}
}
} break;//automatico
case nuevo: { //Asociar control nuevo (Adaptacion de usuario)
if (mySwitch.available()) {
codigoRecibido = mySwitch.getReceivedValue();
if (codigoRecibido == 1111)
{
Serial.println("\nNo hay codigo || ERROR ||");
}
else
{
Serial.print("\n\nCodigo entrante: ");
Serial.println(codigoRecibido);
Serial.print( mySwitch.getReceivedBitlength() );
Serial.print(" bits \n");
codigoAlmacenado = codigoRecibido;
EEPROM.put(0, codigoAlmacenado);
Serial.print("\n\nCodigo entrante guardado exitosamente");
Serial.print("\nDireccion 5 | ");
Serial.print( EEPROM.get(5, codigoAlmacenado) );
mySwitch.resetAvailable();
estado = arranque;
}
}
} break;//nuevo
} //Cierre de switch-case
}