novato empezando

hola hace poco que e empezado con arduino y después de leer un poco e provado de hacer un skech sencillo e echo el típico montaje de un pulsador y un led que cuando apreté el pulsador se encienda el led y cuando lo vuelva a apretar se apage también e puesto un contador para ver el nº de pulsaciones el montaje es el led al pin 8 (con su resistencia) y el pulsador al pin 4 con resistencia pull dow

os pongo el código escrito int estado; int led; int contador=0;

void setup() { Serial.begin(9600); pinMode(4,OUTPUT); //entrada pulsador pinMode(8,INPUT); //salida led int estado=0; int led=0; }

void loop() { int estado=digitalRead (8); int led=digitalRead (4);

if(estado == HIGH) {//cuando se apreta el pulsador se ejecuta el bucle if(led == HIGH) { // si el led esta HIGH lo apaga digitalWrite(4,LOW); } if (led == LOW) { // si el led esta LOW lo enciende digitalWrite(4,HIGH); } contador=contador+1; //contador de pulsaciones Serial.println(contador); // me dice las pulsaciones por el serial monitor

if(estado == HIGH) { } // meto esta linea para que asta que no se quede en LOW el pusador no salga del bucle } }

el problema que no se solucionar es que al apretar el pulsador enciende y apaga muchas veces el led vamos que no para de contar pulsaciones e añadido la línea "if(estado == HIGH) { }" (esta al final) para que si detecta que el pulsador esta pulsado se quede en ese bucle y no salga asta que se suelte el pulsador pero nada también e provado de añadir un "delay 1000" pero si mantengo el pulsador apretado el led se enciende y apaga cada segundo asi que no consigo lo que yo quiero llevo unos días rompiéndome la cabeza y eso que lo considero un programa sencillo con lo que quiero hacer después jeje si me pudieseis decir lo que ago mal os lo agradaceria adios

Hola.
Lo primero, para evitar que tu código aparezca tal cual, en lugar de con emoticonos, cuando lo pongas en el editor, selecciónalo y envuélvelo entre etiquetas code (el icono en forma de papel con <> superpuesto).
Lo segundo, creo que estás un poco verde aún. Un if no tiene nada que ver con un bucle. Se evalúa, y si se cumple se ejecutan sus llaves una vez; si no se cumple se salta. Los bucles se hacen con for o while.

int estado;
int led;
int contador=0;

void setup() {
      Serial.begin(9600);
      pinMode(4,OUTPUT);  //entrada pulsador
      pinMode(8,INPUT);   //salida led
      int estado=0;
      int led=0;
}

void loop() {
      int estado=digitalRead (8);
      int led=digitalRead (4);


      if(estado == HIGH) {//cuando se apreta el pulsador se ejecuta el bucle
            if(led == HIGH) { // si el led esta HIGH lo apaga
                  digitalWrite(4,LOW); 
            } 
            else {  // si el led esta LOW lo enciende
                  digitalWrite(4,HIGH); 
            }
            contador=contador+1; //contador de pulsaciones
            Serial.println(contador); // me dice las pulsaciones por el serial monitor
            while (estado == HIGH) {} // esto sí es un bucle, del que no saldremos mientras se cumpla la condición
      }
}

Debería funcionar algo mejor, aunque quizás tengas problemas de rebote (sí :slight_smile: los pulsadores “rebotan”).
Edito: he sustituído tu segundo if por un else. Funcionaría igual con dos if, pero es más efectivo así.

hola
perdona un poco por no saber poner el código bien pero no se como se hace intentare hacerlo bien
lo que me dices que estoy algo verde es verdad pero confundir un IF con un bucle lo se diferenciar un bucle son con WHILE, DO WHILE Y FOR
he provado tu código y aun va peor el led se enciende pero ya no se apaga el contador se queda solo en 1 yo supongo que no sale del bucle while y hay se queda en teoría al soltar el pulsador deveria salir del bucle pero no se que debe haber mal
lo del efecto bounce seguro que tengo pero el problema creo que esta en el skech

este skech se esta volviendo ya una cosa personal entre yo y el arduino el problema debe ser sencillo de arreglar pero no soi capaz de localizarlo
ire probando y aver si lo consigo porque es mi primer skech pero estoy algo desmoralizado jejej
adios

Diria que tienes los pines al reves,segun comentas el 8 es el led y el 4 la entrada y has puesto:

pinMode(4,OUTPUT); //entrada pulsador
pinMode(8,INPUT); //salida led

Deberia ser:

pinMode(4,INPUT); //entrada pulsador
pinMode(8,OUTPUT); //salida led

Tambien veo que defines varias veces la misma variable en varias ocasiones ,por ejemplo: int estado.

Sin ir mas lejos ,en el propio IDE Menu Archivo->Ejemplos->02.Digital->Button tienes un ejemplo parecido al que quieres hacer,solo tienes que cambiar los pines por los que usas y adaptarlo un poco.

/*
  Button
 
 Turns on and off a light emitting diode(LED) connected to digital  
 pin 13, when pressing a pushbutton attached to pin 2. 
 
 
 The circuit:
 * LED attached from pin 13 to ground 
 * pushbutton attached to pin 2 from +5V
 * 10K resistor attached to pin 2 from ground
 
 * Note: on most Arduinos there is already an LED on the board
 attached to pin 13.
 
 
 created 2005
 by DojoDave <http://www.0j0.org>
 modified 30 Aug 2011
 by Tom Igoe
 
 This example code is in the public domain.
 
 http://www.arduino.cc/en/Tutorial/Button
 */

// constants won't change. They're used here to 
// set pin numbers:
const int buttonPin = 2;     // the number of the pushbutton pin
const int ledPin =  13;      // the number of the LED pin

// variables will change:
int buttonState = 0;         // variable for reading the pushbutton status

void setup() {
  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);      
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);     
}

void loop(){
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);

  // check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH:
  if (buttonState == HIGH) {     
    // turn LED on:    
    digitalWrite(ledPin, HIGH);  
  } 
  else {
    // turn LED off:
    digitalWrite(ledPin, LOW); 
  }
}

hola de nuevo

bueno al final lo e conseguido después de mucho pensar el porque no salía del bucle WHILE
el problema estaba en que una vez entraba en el bucle WHILE se quedaba dentro
lo que se tenia que hacer es leer el valor del pulsador porque solo se leia al principio del skech y cogia el valor del HIGH y de hay no salía

voy a poner el skech completo (espero que lo aga bien)

int estado=0;
int led=0;
int contador=0;
void setup() {
Serial.begin(9600);
pinMode(4,OUTPUT);  //salida pulsador
pinMode(8,INPUT);   //entrada pulsador
}

void loop() {
estado=digitalRead (8);
led=digitalRead (4);
 

if(estado == HIGH) {//cuando se apreta el pulsador se ejecuta el bucle
  if(led == HIGH) { // si el led esta HIGH lo apaga
    digitalWrite(4,LOW); }
    if (led == LOW) {  // si el led esta LOW lo enciende
    digitalWrite(4,HIGH); }
    contador=contador+1; //contador de pulsaciones
  Serial.println(contador); // me dice las pulsaciones por el serial monitor
}

while (estado == HIGH) {
estado=digitalRead (8);
}
}

ahora ya funciona perfecto
gracias por todo
adios

Saludos no es mas fácil esto:

#define led 4
#define boton 8

void setup(){    
  pinMode(boton, INPUT);
  pinMode(led, OUTPUT);
  digitalWrite(boton,HIGH);
}


void loop(){

  if(digitalRead(boton)==LOW){
    delay(50);
    if(digitalRead(boton)==LOW){
      while(digitalRead(boton)==LOW){
      }
      digitalWrite(led,!digitalRead(led));
    }
  }
}

hola pos la verdad es mas sencillo pero para mi que tengo conocimientos mas limitados me cuesta mas entenderlo que el código que e escrito yo probando tu programa veo que si le quitas las líneas

if(digitalRead(boton)==LOW){
    delay(50);

también funciona bien adiós y gracias por la aportación

Saludos
Es cierto si quitas esas dos lineas funciona pero esas son para evitar falsos positivos.