Apreto boton y prende led1, apreto boton nuevamente y prende led2

Saludos. estoy tratando de hacer un programa el cual apreto un boton y prende led1, luego si dejo de apretarlo el led1 debe seguir encendido pero si apreto de nuevo el botón debe encender el led2 y debe estar en ese ciclo.

estoy trancado en el código ya que soy principiante, pero si me dan algunas ideas en que debería hacer o donde buscar estaria agradecido.

el codigo que llevo es el siguiente:

const int  boton = 10;    
const int led1 = 11;     
const int led2 = 12;   

int estadoboton = 0 ;         

void setup() {
  pinMode(10, INPUT);  
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  
}

void loop() {
 estadoboton = digitalRead(10);
 if (estadoboton == HIGH)  
     {  
      delay(20); 
      digitalWrite(12, HIGH);
      digitalWrite(11, LOW);
      estadoboton = digitalRead(10);
      
      if (estadoboton == LOW) 
      {
        delay(20); 
        digitalWrite(12, HIGH);
        digitalWrite(11, LOW);
      }}}

de antemano agradezco cualquier opinion o ayuda.

El esquema no sé si esta bien montado, no es lo mío y los PullUp y PullDown me llevan PullKao, pero el código con un extra sería este:

// --- Declaración de constantes, nº de puertos
const int boton = 10;
const int led1 = 11;
const int led2 = 12;


// --- Variables de trabajo
int estadoboton = 0;

// --- Botones apagados
bool estadoLED1 = false;
bool estadoLED2 = false;


// --- Funciones
void ManejaLED(int led, int estado) {
	digitalWrite(led, estado);
}


// --- Configuración general
void setup() {
	// --- Activación de los estados de los puertos
	pinMode(10, INPUT); 
  	pinMode(11, OUTPUT);
  	pinMode(12, OUTPUT);


  	// --- Dejar apagados los led, por si quedaron encendidos
  	ManejaLED(led1, LOW);
  	ManejaLED(led2, LOW);


  	// --- Esto no hace falta es para que se entienda mejor
  	estadoLED1 = false;
  	estadoLED2 = false;
}


// --- Ciclo
void loop() {
 estadoboton = digitalRead(boton);
 if (estadoboton == HIGH) {

 	// --- LED1 está apagado, lo encendemos
 	if (estadoLED1 == false) {
 		ManejarLED(led1, HIGH);
  		estadoLED1 = true;
 	}
 	// --- LED1 ya está encendido
 	else {
 		// --- LED2 está apagado, lo encendemos
		if (estadoLED2 == false) {
 			ManejarLED(led2, HIGH);
  			estadoLED2 = true;
  		}
  		// --- LED2 está encendido, lo apago (un extra)
  		else {
 			ManejarLED(led2, LOW);
  			estadoLED2 = false;
  		}
 	}
}

Otro extra: No pongas espacios en blanco al final de las líneas de programa o irás el infierno de los programadores.

Estoy en windows montando un vídeo para mis clases, así que no puedo probar ni compilar el código, pero debería funcionar tal cual.

Saludos TonyDiana, gracias por la ayuda, el codigo en si no funciona (ya lo compile), pero con esta información adicional quizás pueda arreglarlo. Comentare avances. gracias

Moderador:
Hola, bienvenido al foro Arduino.
En la sección proyectos tienes estos dos hilos que debiste haber leído antes de postear

Como tu consulta es para otra sección lo muevo a Software.
Agradezco que hayas posteado debidamente el código. Solo ubicaste mal tu tópico.

Normas del foro

Encontrado

  • Como lo escribía con el editor de textos de windows, no me dí cuenta que aveces llamo a la función ManejarLED y otras a ManejaLED sin la r delante de LED, hay que ponerlas a todas con el mismo nombre
  • Al copiar y pegar que me quedó el último } fuera, es el que cierra el loop

Con eso compila, lo acabo de probar

En este foro ayudamos, lo que hizo TonyDiana ya de por si fue una gran ayuda.
Debes aprender a entender como se manifiestan los errores y cuando dice

error: 'ManejarLED' was not declared in this scope

Pues miras tu programa y dices : pero cómo?

Definió asi

void ManejaLED(int led, int estado) {
	digitalWrite(led, estado);
}

ahhh claro, dice ManejaLED y se queja por ManejarLED

Entiendo que hay que agudizar la vista pero de eso se trata.
Te damos empujones pero tu debes resolver cosas por tu cuenta también.

Y eso no lo digo como reproche, lo digo para que logres mayor autonomía de cara a tus programaciones futuras.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.