Problema con encendido de led por botom y por IR

Buenos dias

Comunidad espero se encuntren bien les comento que soy nuevo en esto y se me ha presentado un inconveniente en esta pequeña practica de encender un led por un boton y con un IR el cual solo me enciende por el boton y por el IR pero no me apaga por el boton , sin embargo por el control enciende y apaga normalmente pero por el boton solo enciende en lo que pudiesen ayudarme se los agradeceria

#include <boarddefs.h>
#include <IRremote.h>
#include <IRremoteInt.h>
#include <ir_Lego_PF_BitStreamEncoder.h>

const int boton=4;   // boton conectado al pin 4
const int tiempoantirebote=10;

int cuenta=0;   // lleva la cuenta de cuantas veces ha sido presionado el boton
int estadoboton;
int estadobotonanterior;

boolean antirebote(int pin) {
  int contador=0;
  boolean estado;  // guarda el estado del boton
  boolean estadoanterior; // guarda el ultimo estado del boton

  do {
    estado=digitalRead(pin);
    if(estado != estadoanterior){  // comparampos el estado actual con el estado anterior
      contador=0;  //  reiniciamos el contador
      estadoanterior= estado;
     }
     else{
      contador= contador+1;
     }
  delay(1); 
  }
  
while(contador< tiempoantirebote);
return estado;
  }

int val = 0; //val se emplea para almacenar el estado del boton
int state = 0; // 0 LED apagado, mientras que 1 encendido
int old_val = 0; // almacena el antiguo valor de val
const int BOTON=3;
int ReceptorIR = 2; //pin del receptor infrarrojo
int led = 5; //pin del led
int i;       // variable auxiliar
 
IRrecv irrecv(ReceptorIR); //instanciar pin a la librería
decode_results CodigoTecla; ////variable que guarda el código de tecla recibido por receptor
 
void setup()
{
 Serial.begin(9600); //inicio comunicación serial
 irrecv.enableIRIn(); //comienza a tomar datos
 pinMode(led, OUTPUT);//establece el pin del led como salida
}
void loop(){

estadoboton=digitalRead(boton);          // leemos el estado del boton
  if(estadoboton != estadobotonanterior){  // si hay cambio con respecto al estado anterior
    if(antirebote(boton)){               // checamos si esta presionado y si lo esta 
      cuenta++;                         // aumentamos la cuenta
      digitalWrite(led,HIGH);
      
    }
  }
  estadobotonanterior=estadoboton;    // gurdamos el estado del boton










{
 if (irrecv.decode(&CodigoTecla)) //si alguna tecla se pulso:
 {
 Serial.print("0x"); //macro para ver código de tecla por comunicación serial
 Serial.println(CodigoTecla.value, HEX); //
 
 switch (CodigoTecla.value) //la variable CodigoTecla como switch
 {
 case 0xA2AD03FC: //al presionar la primera tecla:
 if (digitalRead(led)) //si el led se encuentra prendido
 digitalWrite(led, LOW);
 else //por el contrario, si led esta apagado, se prende
 digitalWrite(led, HIGH);
 break;
 
 }
 delay(250); //delay para evitar que se presione la tecla 2 veces
 irrecv.resume(); //dejar de recibir datos
 
 }
}
}

IR_Pulsador.ino (2.45 KB)

Bueno dias, cyberluis18,

Es mejor incluir código como texto en tu post que cargar el archivo INO. De esta forma, se puede leer fácilmente y responder, sin necesidad de que la persona descargue el archivo y lo abra en Arduino. Puede utilizar etiquetas de código para dar formato al texto como código.

tengo dos codigos, uno seria el codigo principal y debo insertar un codigo de timer dentro de ese codigo, al intentar hacerlo me da un error, alguien podra tener una idea de como hacerlo: eh aqui los dos codigos:

Main cpodigo:

#define DO_NOT_USE_0 0
#define DO_NOT_USE_1 1

#define NOT_USED_2 2
#define NOT_USED_3 3

#define R_MOTOR_DIREC 4 // digitalWrite LOW forward HIGH reverse
#define R_MOTOR_SPEED 5 // analogWrite from 0 thru 255
#define L_MOTOR_SPEED 6 // analogWrite from 0 thru 255
#define L_MOTOR_DIREC 7 // digitalWrite LOW forward HIGH reverse

#define NOTst_USED_8 8
#define NOT_USED_9 9
#define NOT_USED_10 10
#define NOT_USED_11 11

#define NOT_USED_12 12
#define NOT_USED_13 13

#define NOT_USED_A0 A0
#define NOT_USED_A1 A1
#define NOT_USED_A2 A2
#define NOT_USED_A3 A3
#define NOT_USED_A4 A4
#define NOT_USED_A5 A5

// Definitions for motor controller commands

#define FORWARD LOW
#define REVERSE HIGH
#define STOP 0
#define MAXSPEED 255

#include “Timer.h” //May 5 2017 timer

Timer signalLeft;//may 5 2017 timer
Timer signalRight; // may 6 2017

// Set initial speed to 50% of maximum. Do you always drive at full speed???

int leftSpeed = MAXSPEED * .50;
int rightSpeed = MAXSPEED * .50;

// Set initial vehicle direction
bool leftDirec = FORWARD;
bool rightDirec = FORWARD;

// Current and previous pilot command
String pilotCommand;
String pilotCommandPrevious;

int L_SIGNAL; //MAY 6 2017
int R_SIGNAL; // MAY 6 2017

void setup() {

// Reserve 200 bytes for pilotCommand, and set initial action to “Stop”
pilotCommand.reserve ( 200 );
pilotCommandPrevious.reserve ( 200 );
pilotCommand = pilotCommandPrevious = “Stop”;

Serial.begin ( 9600 );

pinMode ( R_MOTOR_DIREC , OUTPUT );
pinMode ( R_MOTOR_SPEED , OUTPUT );
pinMode ( L_MOTOR_DIREC , OUTPUT );
pinMode ( L_MOTOR_SPEED , OUTPUT );

pinMode ( L_SIGNAL , OUTPUT ); //may 6 2017
pinMode ( R_SIGNAL , OUTPUT ); //may 6 2017

while ( 1 ) {
forward ( ); delay ( 2000 );
reverse ( ); delay ( 2000 );
left ( ); delay ( 2000 );
right ( ); delay ( 2000 );
allStop ( ); delay ( 2000 );
}
*/

}

void loop ( void ) {

getPilotCommand ( );

getSensorReadings ( );

vehicleAction ( );//activated on may 5 2017

updateTimers ( );

}

void getPilotCommand ( void ) {

if ( Serial.available ( ) == 0 ) return;

char inChar;

// Reset the current pilotCommand
pilotCommand = “”;

// While there are characters in the Serial input stream, read them
do {

inChar = (char) Serial.read ( );

pilotCommand += inChar;

delay ( 10 );

} while ( Serial.available ( ) );

// If a new command has been received, display it on the Serial Monitor
if ( pilotCommand != pilotCommandPrevious ) {

Serial.print ( "New command received … " + pilotCommand + " @ Throttle ( " );
Serial.print ( leftSpeed );
Serial.print ( " , " );
Serial.print ( rightSpeed );
Serial.println ( " ) " );

}

}

void getSensorReadings ( void ) {
command for vehicleAction()

}

void vehicleAction ( void ) {
// Responsibilities :: Performs appropriate vehicle action that matches desired pilot and sensor commands

if ( pilotCommand == pilotCommandPrevious ) return;

Serial.print ( "Executing action… " );

// Cascading series of “if’s” to determine appropriate action.
if ( pilotCommand == “w” || pilotCommand == “W” ) {
Serial.println ( “Forward” );
forward ( );
}
else
if ( pilotCommand == “s” || pilotCommand == “S” ) {
Serial.println ( “Reverse” );
reverse ( );
}
else
if ( pilotCommand == “a” || pilotCommand == “A” ) {
Serial.println ( “Left” );
left ( );
}
else
if ( pilotCommand == “d” || pilotCommand == “D” ) {
Serial.println ( “Right” );
right ( );
}
else {
Serial.println ( “Stop” );
allStop( );
}

// Save the command just processed
pilotCommandPrevious = pilotCommand;

}

static bool signalStarted = false; //may 6

void allStop ( void ) {

digitalWrite ( L_MOTOR_DIREC, FORWARD );
digitalWrite ( R_MOTOR_DIREC, FORWARD );

analogWrite ( L_MOTOR_SPEED, STOP ); //done may 3 2017
analogWrite ( R_MOTOR_SPEED, STOP );//done may 3 2017

}

void forward ( void ) {

if ( leftSpeed > MAXSPEED ) leftSpeed = MAXSPEED;
if ( rightSpeed > MAXSPEED ) rightSpeed = MAXSPEED;

if ( leftSpeed < 0 ) leftSpeed = 0;
if ( rightSpeed < 0 ) rightSpeed = 0;

analogWrite ( L_MOTOR_SPEED, 200 - leftSpeed );
digitalWrite ( L_MOTOR_DIREC, FORWARD );
analogWrite ( R_MOTOR_SPEED, 200 - rightSpeed );
digitalWrite ( R_MOTOR_DIREC, FORWARD );

}

void reverse ( void ) {
// Responsibilities :: Motors Reverse at (leftSpeed, rightSpeed)

// 4U2Do … add the correct code/done may 3 2017

analogWrite ( L_MOTOR_SPEED, 255 - leftSpeed );// add on may 3 2017 tested ok
digitalWrite ( L_MOTOR_DIREC, REVERSE );
analogWrite ( R_MOTOR_SPEED, 255 - leftSpeed );
digitalWrite ( R_MOTOR_DIREC, REVERSE );

}

void left ( void ) {
// Responsibilities :: Motors Left pivot at (leftSpeed, rightSpeed)

// 4U2Do … add the correct code/done may 3 2017

analogWrite ( L_MOTOR_SPEED, 200 - leftSpeed ); //add on may 3 2017 tested ok
digitalWrite ( L_MOTOR_DIREC, STOP );
analogWrite ( R_MOTOR_SPEED, 127 - leftSpeed );
digitalWrite ( R_MOTOR_DIREC, FORWARD );

}

void right ( void ) {
// Responsibilities :: Motors Right pivot at (leftSpeed, rightSpeed)

// 4U2Do … add the correct code/done may 3 2017

analogWrite ( L_MOTOR_SPEED, 127 - leftSpeed );
digitalWrite ( L_MOTOR_DIREC, REVERSE );
analogWrite ( R_MOTOR_SPEED, 200 - leftSpeed );
digitalWrite ( R_MOTOR_DIREC, REVERSE );

}

void updateTimers ( void ) {
// Responsibilities :: Update all active timers

// 4U2Do … if you have any timers running, this is a nice central location to update them!

}

cpodigo que debo insertar en el main codigo(especie de timer para hacer que las luces del smart car encienda cuando gira a la derecha o la izquierda:

#define DO_NOT_USE_0 0
#define DO_NOT_USE_1 1

#define NOT_USED_2 2
#define NOT_USED_3 3

#define R_MOTOR_DIREC 4 // digitalWrite LOW forward HIGH reverse
#define R_MOTOR_SPEED 5 // analogWrite from 0 thru 255
#define L_MOTOR_SPEED 6 // analogWrite from 0 thru 255
#define L_MOTOR_DIREC 7 // digitalWrite LOW forward HIGH reverse

#define NOT_USED_8 8
#define NOT_USED_9 9
#define NOT_USED_10 10
#define NOT_USED_11 11

#define NOT_USED_12 12
#define L_SIGNAL 13

#define NOT_USED_A0 A0
#define NOT_USED_A1 A1
#define NOT_USED_A2 A2
#define NOT_USED_A3 A3
#define NOT_USED_A4 A4
#define NOT_USED_A5 A5

#include “Timer.h”//line 80 added on may 5 2017

Timer signalLeft;//line 86 added on may 5 2017

void setup ( void ) {

pinMode ( L_SIGNAL , OUTPUT );//line 126 added on may 5 2017

}

void loop ( void ) {

vehicleAction ( );//was already there, line 156, notr added

}

void vehicleAction ( void ) {
static bool signalStarted = false; //line 279

// “Start” the blinking.
// This block of logic is only executed the first time vehicleAction() is called.
if ( signalStarted == false ) { //line 236 adden on may code may 5 2017

// Blink the appropriate LED every 500ms, starting with OFF
// This “starts” the blinking process, but the “actual” blinking is caused by the “signalLeft.update()” below!
signalLeft.oscillate ( L_SIGNAL, 500, LOW );//line281

signalStarted = true;//line 238

}//line 240

// In this simple example, the LED should blink for 15 seconds, then stop.
// https://www.arduino.cc/en/reference/millis
if ( millis ( ) <= 15000 ) {//line 241 may 5 2017

// You need to update the Timer object so blinking will occur. <----------------- IMPORTANT -----------------
// Comment out this line to see what happens.
signalLeft.update ( );

}
else {

signalLeft.stop ( L_SIGNAL );

}

}