Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos » Arduino y Raspberry Pi
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

13/10/2014 #1


Ejecutar un programa en Arduino una sola vez
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
13/10/2014 #2

Avatar de JoaquinFerrero

Mete todas las líneas que están dentro de loop(), dentro del setup().
13/10/2014 #3


amigo joaquin ya lo habia echo y no funciono gracias por responder
13/10/2014 #4

Avatar de JoaquinFerrero

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.
13/10/2014 #5
Visitante


gabriel17 dijo: Ver Mensaje
amigo joaquin ya lo habia echo y no funciono gracias por responder
gabriel17 Ya probaste con este...

http://www.qmbecanada.com/?p=720


Porque lo que dice JoaquinFerrero es asi si no hay nada en el:

void loop()
{

No se repite pero se debe a que lo escribiste asi:

void loop()
{}

Debe ser asi:

void loop() {
}
13/10/2014 #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
13/10/2014 #7

Avatar de JoaquinFerrero

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

Por otra parte,

void loop()
{}

es lo mismo que

void loop() {
}
13/10/2014 #8
Visitante


JoaquinFerrero dijo: Ver Mensaje
Yetrox, ¿qué ha dicho gabriel7? No entiendo nada...

Por otra parte,

void loop()
{}

es lo mismo que

void loop() {
}

JoaquinFerrero Gracias por la aclaracion, pues como siempre escribo ese codigo asi:



void loop() {
}

Pense que podria ser por algo al respecto

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.
13/10/2014 #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
13/10/2014 #10

Avatar de JoaquinFerrero

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)

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

void setup() {
  
pinMode(ledPinOUTPUT);    // inicializa el pin de salida del LED
  
pinMode(botonPinINPUT);   // inicializa el pin del botón como entrada

  
digitalWrite(ledPinLOW);  // apagar el LED

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

  
digitalWrite(ledPinHIGH); // encender el LED
}

void loop() {} 
El LOW puede ser HIGH dependiendo de cómo se conecte el botón.
13/10/2014 #11


y lo que dice yetrox es lo que necesito el lo explico mejor gracias

joaquinFerrero voy a probar y comento gracias mi pana
13/10/2014 #12

Avatar de JoaquinFerrero

Versión con toque():
Código 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;
        }
    }

13/10/2014 #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() {}

---------- Actualizado después de 25 minutos ----------

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
13/10/2014 #14


Joaquín, recién me di cuenta que ha publicado otro código, ya lo voy a analizar y a probar.
Saludos.

---------- Actualizado después de 11 minutos ----------

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; 
        } 
    } 
}
---------- Actualizado después de 9 minutos ----------

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; 
        } 
    } 
}
---------- Actualizado después de 8 minutos ----------

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.
14/10/2014 #15

Avatar de JoaquinFerrero

Había un error en mi código. Cambié pulsador por pulsado. Ahora le he reeditado y ya funciona.
14/10/2014 #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.
14/10/2014 #17

Avatar de JoaquinFerrero

No veo por qué no... Usando una bandera, como la variable pulsador, se puede saber si el umbral se pasó, o no.
14/10/2014 #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);
 } 
 
 
}
---------- Actualizado después de 5 minutos ----------

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.
15/10/2014 #19

Avatar de JoaquinFerrero

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):

Código 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() {

15/10/2014 #20


Amigo Joaquín, voy a probar el código y comento resultado. Gracias.
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Buscar más temas sobre:
Lupa Arduino y Raspberry Pi

Cerrar
Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos » Arduino y Raspberry Pi

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.