Ejecutar un programa en Arduino una sola vez

#1
amigos saludos necesito ejecutar una sola vez un programa en arduino y que no se este ejecutando repetidamente , este seria el codigo que encontrado como base este funciona pero mi requerimiento es otro

Código:
void setup() {
// initialize the digital pin as an output.
// Pin 13 has an LED connected on most Arduino boards:
pinMode(10, OUTPUT);
blink();
blink();
}

void loop()
{}
void blink(){
digitalWrite(10, HIGH); // set the LED on
delay(1000); // wait for a second
digitalWrite(10, LOW); // set the LED off
delay(1000); // wait for a second
digitalWrite(10, HIGH); // set the LED on
delay(1000); // wait for a second
digitalWrite(10, LOW); // set the LED off
delay(1000); // wait for a second 
}
debido a que no lee entradas y funciona apenas se alimente este codigo funciona perfectamente ahora aplicandolo a mi codigo no lo hace ya que el mio lee entradas de un pulsador


int pulsador ;

void setup()
{
pinMode(10,OUTPUT);
pinMode(3,INPUT);

toque();

}

void loop()
{}

void toque()
{
pulsador=digitalRead(3);
if (pulsador==HIGH)
{
digitalWrite(10,LOW);
}
else digitalWrite(10,HIGH);

}
mi idea es que al pulsar un a sola vez ejecute el programa luego de eso si vulvo a pulsar ya no haria esta funcion al menos que desconecte y conecte de nuevo la alimentacion , gracias por su ayuda
 
Última edición por un moderador:
#4
Te aseguro que si no hay nada en el loop(), no se repite nada.

Aquí tengo a mi lado el Arduino. Cargo el ejemplo Blink. Le quito todas las líneas al loop(). Lo compilo y lo subo. Arranca, y no hace nada (mejor dicho: ejecuta una sola vez las instrucciones que hay en setup()).

Sería interesante que publicaras un trozo de código que reproduzca el error que te sale. Es decir: muestra el mínimo número de líneas de tu programa que hacen que se produzca el error.
 
#6
amigos el ejmplo del principio el del blink si funciona , pero el que yo intento hacer como lo han visto tiene un pulsador al momento de pulsar no hace nada si carga el programa pero no funciona , yoi creo que debido a este inicio que yo tengo que dar no funciona en cambio el del pulador lo tengo que iniciar yo, gracias por su ayuda amigos
 
Y

Yetrox

#8
Yetrox, ¿qué ha dicho gabriel7? No entiendo nada...

Por otra parte,

void loop()
{}

es lo mismo que

void loop() {
}

@JoaquinFerrero Gracias por la aclaracion(y), pues como siempre escribo ese codigo asi:



void loop() {
}

Pense que podria ser por algo al respecto:D:LOL:

Que con el Codigo Blink si funciona pero intenta realizarlo con el pulsador Void toque ()

En pocas palabras el codigo esta bien, pero lo que necesita @gabriel17 es que al pulsar se efectue o ejecute una sola vez, luego al pulsar nuevamente no se repita mas, a menos que reinicie el Arduino segun entendi no se si sea asi.
 
Última edición:
#9
amigos si estoy equivocado disculpenmen, ya realice la prueba de poner solo el codigo en el void setup(); y dejar vacio el void loop(), y no me funciono , cree un void llamado void toque como ven en el ejemplo y tampoco funciono , el ejemplo del blink si funciona , YO PIENSO , a que este se ejecuta al comenzar el programa no necesita de alguien que lo inicie a diferencia de el programa que necesito que si necesita ser inicializado por el pulsador
 
#10
Pues entonces... sería, en el setup(), hacer un bucle while() donde esperamos la pulsación del botón. Una vez pulsado, hacemos lo que sea, y termina el setup().

Algo así (no probado)

PHP:
const int botonPin = 2;      // botón
const int ledPin =  13;      // led

void setup() {
  pinMode(ledPin, OUTPUT);    // inicializa el pin de salida del LED
  pinMode(botonPin, INPUT);   // inicializa el pin del botón como entrada

  digitalWrite(ledPin, LOW);  // apagar el LED

  while(digitalRead(botonPin) == LOW);    // bucle infinito esperando pulsación

  digitalWrite(ledPin, HIGH); // encender el LED
}

void loop() {}
El LOW puede ser HIGH dependiendo de cómo se conecte el botón.
 
Última edición:
#12
Versión con toque():
PHP:
int pulsador = LOW;

void setup() {
    pinMode(10,OUTPUT);    // LED de salida
    pinMode(3,INPUT);      // botón de entrada, conectado por defecto a GND

    digitalWrite(10,LOW);  // apagado al principio

    toque();
}

void loop() {}

void toque() {
    while (pulsador == LOW) {

        if (digitalRead(3) == HIGH) {     // pulsado el botón

            digitalWrite(10,HIGH);        // encender el LED
            pulsador = HIGH;
        }
    }
}
 
Última edición:
#13
joaquinFerrero lo probe en el proteus y funciona pero tuve que poner una resistencia no a positivo como normalmente se hace al conectar un pulsador sino a negativo de este forma obtuve la funcion adecuada y le agregue un delay porque queria que estuviera prendido un tiempo para luego regresar a su estado inicial osea apagado , en unos minutos lo armo y lo ptuebo con el arduino este es el codigo te agrdeceria me si pudieses mi pana darme una clasesita a manera de explicarme como funciona

onst int botonPin = 2; // botón
const int ledPin = 13; // led

void setup() {
// inicializa el pin de salida del LED
pinMode(ledPin, OUTPUT);

// inicializa el pin del botón como entrada
pinMode(botonPin, INPUT);

while(digitalRead(botonPin) == LOW); // bucle infinito esperando pulsación

digitalWrite(ledPin, HIGH);
delay(1000);
digitalWrite(ledPin, LOW);
}

void loop() {}



funciona amigo joaquin muchas gracias este es un primer paso para lo que realmente necesito que en breve lo contare tuve que cambiar solamente en while(digitalread(botonpin)==HIGH) para que me funcionara deaxuerdo a lo requerido por lo tanto mi ciodigo ene este ejemplo quedaria de esta forma

const int botonPin = 2; // botón
const int ledPin = 13; // led

void setup() {
// inicializa el pin de salida del LED
pinMode(ledPin, OUTPUT);

// inicializa el pin del botón como entrada
pinMode(botonPin, INPUT);

while(digitalRead(botonPin) == HIGH); // bucle infinito esperando pulsación

digitalWrite(ledPin, HIGH);
delay(1000);
digitalWrite(ledPin, LOW);
}

void loop() {}

ahora bien requeria esta accion ya que mi proyecto consiste en que ahora en los vehiculo nuevos cuando pasas de 30 km al iniciar la marcha automaticamente se deben cerrar lo seguros o cierre centrlaizado mi idea aqui es activar esa funcion enviando un pulso negativo al cierre centralizado cuando presione el potenciometro que viene como acelerador en los vehiculos modernos , lo normal seria hacerlo con la velocidad pero la senal esta codficada por pulsos y crepo seria muy complicado por eso opte por el potenciometro de aceleracion
 
Última edición:
#14
Joaquín, recién me di cuenta que ha publicado otro código, ya lo voy a analizar y a probar.
Saludos.



Al hacer leves cambios conseguí el objetivo planteado con el nuevo código.
Al parecer todo funciona gracias al WHILE, si no me equivoco.

Código:
int pulsador = LOW; 

void setup() { 
    pinMode(10,OUTPUT);    // LED de salida 
    pinMode(3,INPUT);      // botón de entrada, conectado por medio de resistor a popsitivo 10k

    digitalWrite(10,LOW);  // apagado al principio 

    toque(); 
} 

void loop() {} 

void toque() { 
    while (pulsador == LOW) { 

        if (digitalRead(3) == LOW) {     // pulsado el botón 

            digitalWrite(10,HIGH);        // encender el LED 
            pulsador = LOW; 
        } 
    } 
}
Al realizar la siguiente prueba usando delay(1000) para que quede encendido y luego se apague, el código falla.
O sea, al pulsar éste, hace función pero si vuelvo a pulsar de igual forma se realiza la tarea, con lo que la función original de sólo prender y apagar una sola vez, ya no queda establecida.
Código:
int pulsador = LOW; 

void setup() { 
    pinMode(10,OUTPUT);    // LED de salida 
    pinMode(3,INPUT);      // botón de entrada, conectado por defecto a GND 

    digitalWrite(10,LOW);  // apagado al principio 

    toque(); 
} 

void loop() {} 

void toque() { 
    while (pulsador == LOW) { 

        if (digitalRead(3) == LOW) {     // pulsado el botón 

            digitalWrite(10,HIGH);        // encender el LED 
            delay(1000);
             digitalWrite(10,LOW); 
             pulsador = LOW; 
        } 
    } 
}
Sólo bastó cambiar esta palabra y el código funciona.
if (digitalRead(3) == LOW) { // pulsado el botón

Y dejando el código planteado por Joaquín, funciona perfectamente.
Muchas gracias @JoaquinFerrero

Seguiré haciendo pruebas y comentando resultados.

Saludos.
 
Última edición por un moderador:
#16
Amigo Joaquín y compañeros que están presentes con su ayuda, ahora me surge otra duda en este mismo código.
¿Sí podría funcionar si se pone un potenciómetro y que a cierta medida haga solo por una vez la función de prender un led?
Saludos.
 
Última edición por un moderador:
#18
Amigo Joaquín ¿Cómo hago para que este código funcione y sense constantemente el valor del potenciómetro o resistencia, y que me haga la misma secuencia que la del pulsador solo encienda una sola vez el led?

Saludos.



Código:
int resistencia;

void setup()
{
 pinMode(10,OUTPUT);
 Serial.begin(9600);
 serial();
}
void loop()
{

 

}
void serial()
{
 resistencia=analogRead(A0)*100.0/100.0;
 Serial.println(resistencia);
 if (resistencia==102)
 {
  digitalWrite(10,HIGH);
  delay(1000);
  digitalWrite(10,LOW);
 } 
 
 
}


El serial printnl no necesariamente hiría en la practica, lo usé para visualizar los valores y con eso poder hacer la acción de encender el led, no sé si eso cause problema en el funcionamiento, lo pruebo en el proteus y no funciona.
 
Última edición por un moderador:
#19
Debes hacer lo mismo que antes: debes crear un bucle que esté comprobando continuamente si se da la condición (en este caso, que resistencia >= 102). Cuando ocurra, se debe salir del bucle (bien mediante el cambio de una variable o por la ejecución de un break). Sería algo así (no probado):

PHP:
#define LIMITE 102

void setup() {
    pinMode(10,OUTPUT);
    Serial.begin(9600);

    while (analogRead(A0) < LIMITE) {    // mientras el valor analógico no supere el límite
        delay(1000);                     // esperamos 1 s hasta la siguiente comprobación
    }

    Serial.println(analogRead(A0));      // mostrar valor

    digitalWrite(10,HIGH);               // flash
    delay(1000);
    digitalWrite(10,LOW);
}

void loop() {
}
 
Arriba