SOLUCIONADO -- Problemas con contador matematico

Hola:

Estoy intentando iniciarme en programar el Arduino y todo va bien, hasta que toco los operadores matemáticos.

Tengo dos botones: Uno para encender un LED y otro para apagarlo. Quisiera que el LED se encendiera sólo cuando el número de pulsaciones del boton de encendido sea igual a un número. Es este caso le he puesto 1, pero bien podría ser 8.

Os dejo el código que realicé, ya que no me funciona y no se cual es su causa.

/* MARCHA-PARO*/

//Definimos los componentes int pinLED = 13; int Pulsador_Reset = 8; int Pulsador_Set = 9;

int Estado_Pulsador_Set ; int Estado_Pulsador_Reset ;

int contador ; //Variable para que solo encienda el led cuando sea =1

void setup(){ // Definimos el estado de las varibales.

pinMode (pinLED, OUTPUT); pinMode (Pulsador_Reset, INPUT); pinMode (Pulsador_Set, INPUT);

} void CONTADOR () { Estado_Pulsador_Set = digitalRead(Pulsador_Set); Estado_Pulsador_Reset = digitalRead (Pulsador_Reset);

if (Estado_Pulsador_Set == HIGH); delay (1000); { contador = contador+1 ;}

if (Estado_Pulsador_Reset == HIGH); delay (1000); { contador = 0;} }

void loop(){

CONTADOR ();

if (contador == 1) {digitalWrite (pinLED, HIGH);} }

Muchas gracias Un saludo

void loop(){

CONTADOR ();

if (contador == 1) {digitalWrite (pinLED, HIGH);} else {digitalWrite (pinLED, LOW);} }

Seria demasiado bonito para ser cierto, pero así tampoco va. Ya lo había probado antes.

/* MARCHA-PARO

//Definimos los componentes int pinLED = 13; int Pulsador_Reset = 8; int Pulsador_Set = 9; //Definimos las constantes int Estado_Pulsador_Set ; int Estado_Pulsador_Reset ;

int contador ; //Variable para que solo encienda el led cuando sea =1

void setup(){ // Definimos el estado de las varibales. contador ; //Variable para que solo encienda el led cuando sea =1 pinMode (pinLED, OUTPUT); pinMode (Pulsador_Reset, INPUT); pinMode (Pulsador_Set, INPUT); // Definimos el Reed apagar

} void CONTADOR () { Estado_Pulsador_Set = digitalRead(Pulsador_Set); Estado_Pulsador_Reset = digitalRead (Pulsador_Reset);

if (Estado_Pulsador_Set == HIGH); delay (1000); { contador++ ;}

if (Estado_Pulsador_Reset == HIGH); delay (1000); { contador =0;} }

void loop(){

CONTADOR ();

if (contador == 1) {digitalWrite (pinLED, HIGH);} else {digitalWrite (pinLED, LOW);} }

¿Sabe alguien cual es la solución? He estado leyendo sobre el cambio de estado de un pulsador pero no me entero de la parte del cálculo. Quizas en esa parte está mi problema.

Gracias de todas formas por contestar.

Repasate la sintaxis del IF porque no lo haces bien

if (Estado_Pulsador_Set == HIGH);
delay (1000);
{ contador = contador+1 ;}

Con el primer ; terminas el IF y lo de despues no esta dentro

IF (condición) {
acciones;
}

Jopapa
www.jopapa.me

Ni me fije, solo vi que encendía el pin y no lo apagaba. :blush:

El condicional If esta bien, de hecho el programa lo compila perfectament. Pero al cargarlo no pasa nada. Ni enciende, ni apaga. =( ;)

Si sigues creyendo que el IF esta bien, o no te lo has leido o peor, no lo comprendes. Pero la realidad es tozuda, el IF esta mal.

Jopapa

P.D. El compilador detecta errores de sintaxis, pero no dice ni mu frente a una mala programación.

Jopapa tiene mas razón que un santo.

Intentare explicarte el error:

if (Estado_Pulsador_Set == HIGH);
delay (1000);
{ contador = contador+1 ;}

es lo mismo que :

if (Estado_Pulsador_Set == HIGH) {;} // Si Variable=HIGH , No hagas nada
delay (1000); // en cualquie caso para 1 segundo
contador = contador+1 ; // en cualquer caso conador++

y yo creo que lo que pretendes hacer es:

if (Estado_Pulsador_Set == HIGH)
{
delay (1000);
contador = contador+1 ;
}

prueba algo así haber si hay mas suerte y es lo suficientemente bonito

byte pinLED = 13; 
byte Pulsador_Reset = 8;
byte Pulsador_Set = 9;
bool Estado_Pulsador_Set ;
bool Estado_Pulsador_Reset ;
bool Estado_Anterior_Set=false ;
bool Estado_Anterior_Reset=false ;
int contador=0; 
int valor_para_encender=1; 

void setup()
{
  pinMode (pinLED, OUTPUT);
  pinMode (Pulsador_Reset, INPUT);
  pinMode (Pulsador_Set, INPUT);
}
void loop()
{
  Estado_Pulsador_Set = digitalRead(Pulsador_Set);
  Estado_Pulsador_Reset = digitalRead (Pulsador_Reset);
  if (Estado_Pulsador_Set && !Estado_Anterior_Set && contador<32766) {contador++;}  
  if (Estado_Pulsador_Reset && !Estado_Anterior_Reset) {contador=0;}
  if (contador == valor_para_encender) {digitalWrite (pinLED, HIGH);} else {digitalWrite (pinLED, LOW);}
  Estado_Anterior_Set=Estado_Pulsador_Set;
  Estado_Anterior_Reset=Estado_Pulsador_Reset;
}

Marcial, tu si que tienes paciencia. Yo normalmente aclaro una duda, pero no suelo resolver "llave en mano" el programa que se pide. Especialmente si es un forero con uno o dos post ya que suelen ser (quizás me equivoque) tareas academicas. Y es flaco favor al alumno que ni se molesta en leerse la documentación (como en este caso).

Un saludo Jopapa

Jopapa:

Si he de ser sincero, es mas por mi que por el. Una buena manera de aprender es estudiar los errores de los de mas :blush: aun que en muchos casos es mas fácil hacerlo de nuevo que entender lo que intentan hacer. Por otro lado, cunado tengo tiempo, disfruto usando el coco :P

En este caso no estoy de acuerdo contigo, no es que no se moleste en leer la documentación, es que ni siquiera se molesta en leer la solución a su problema.

Hola a ambos:

Tengo que agradeceros vuestra aportación a mi problema. De verdad, que os agradezco la información prestada.

De lo que no estoy tan contenta es del trato que me habéis dado. No me parece educado por vuestra parte que saquéis conjeturas irreales de cosas que ni siquiera se han mencionado. Quizás la culpa es mía, por no leer antes como va este foro.

En primer lugar, como bien dice Marcial, es mi primer post en este foro. No he ingresado antes, porque he estado ojeando manuales y recordando los planteamientos de la programación en C, ya que la tengo algo olvidada. Hace tiempo que terminé la facultad. Así que si os sirve de dato, para que continuemos respondiéndonos en el futuro: Soy chica de 39 años, y estudie Ingeniería, la cual acabé hace ya unos cuantos años. Mi época de alumna desgraciadamente ya la terminé.

La tarea que planteo es simplemente, la realización de códigos básicos que se puedan acoplar a ciertos componentes en el futuro. He adquirido un modem "Efcom V1.2" y ya soy capaz de enviar SMS y realizar llamadas desde el Arduino Uno.

Una vez conseguido eso, tengo que seguir adjuntando código para terminar un proyecto que tenemos pendiente en la fábrica.

El código que he ingresado primeramente, lo hice escribiéndolo. Nada de Copiar_Pegar y tiene razón Jofapa. Se me olvidó inscribir bien los corchetes del "if", pero aún poniéndolos bien no funciona. A eso me refería cuando decía que sería demasiado bonito para ser cierto, ya que el problema creo que esta en los controladores de pulso de estado.

Jofapa. Muchas gracias por el código. Tiene problemas en el funcionamiento. A veces enciende el LED a pesar de que "contador" es distinto de 1. Pero no es lo que busco.

Sólo quería saber porque no funcionaba el que he puesto. Seguiré trabajando en ello.

Unha perta y graciñas de nuevo.

Katynga:

Sin animo de molestar, te respondo:

Una persona que ni siquiera se molesta en presentarse, su primer post en el mejor de los casos es un trozo de código y una solicitud de ayuda, en el 90% de los casos es como bien ha dijo Jopapa tareas académicas. Si en tu caso me he equivocado, te pido publica e humildemente disculpas. Pero veras que aun creyéndolo así hemos intentado resolverte el problema.

Por otro lado, el código te lo pongo yo y le das las gracias a Jopapa (menos mal que no soy celoso :P). Y que yo sepa si funciona, si no te va, o no te he entendido lo que pretendes hacer o tienes algo mal en las conexiones.

Si lo que quieres hacer es un marcha paro, es mucho mas sencillo que todo eso.

PD: Estás na horta e non ves as berzas :P

Marcial, lo siento pero tendrás que chincharte. ]:D Esta clarisimo que Katynga a pesar de cambiarme el nombre (por otro mas cariñoso, claro) me atribuye el código porque esta colada por mi. :grin:

Jopapa

Jopapa, cunado sea mayor ... quiero ser como tu :P

El tema de los pulsadores y los contadores puede no ser tan sencillo como en un primer momento parece. Yo también me he dado de cráneo contra ello y al final me diseñe un detector de cambio de estado con un contador integrado y no he vuelto a tener problemas con ello.

Lo tenéis en esta página: http://www.ardumania.es/cambio-de-estado-de-un-pulsador/

Jajajajaaj, pero que marujitas sois. Al final y después de rebuscar y hacer memoria, lo he resuelto. Os dejo el código, por si os sirve de algo.

Marcial, no te ofendas, pero tu código es un ladrillo y es complejo de entender. Gustame moito as berzas, pero a tua horta, ben asemexa unha selva. Pero gracias, gracias, gracias. :P

Jo!-Papa. No seas tan malo, y ayudanos un poco más.

Josemanu: Creo que con el código que hice, este tema de los cambios de estado, a mi por lo menos me costó, pero me quedó mas claro. De todas formas para evitar los retornos de pulsación he puesto unos condensadores .

El único problema que encuentro es que no se como diferenciar o como hacer para diferenciar, entre asiganarle un valor numérico a una variable o asignarle un valor del PIN: int contador = 1 (¿la variable contador le asigno el número 1 o el pin 1?)

int cerrojo = 0 ; void led();

void setup() { pinMode( 8, INPUT); pinMode( 9, INPUT); pinMode( 13 , OUTPUT); cerrojo = 0 ;

}

void loop() { if (( digitalRead( 8 ) && ( ( cerrojo ) == ( 0 ) ) )) { cerrojo = 1 ; led(); } if (digitalRead(9)) { cerrojo= 0 ; } }

void led() { digitalWrite( 13 , HIGH ); delay( 1000 ); digitalWrite( 13 , LOW );

¿Sabeis donde puedo encontra unos módulos GSM para arduino económicos? Hasta la próxima. Ha sido un placer.

Katynga: Hola:

Estoy intentando iniciarme en programar el Arduino y todo va bien, hasta que toco los operadores matemáticos.

Tengo dos botones: Uno para encender un LED y otro para apagarlo. Quisiera que el LED se encendiera sólo cuando el número de pulsaciones del boton de encendido sea igual a un número. Es este caso le he puesto 1, pero bien podría ser 8. ...

No soy un chico fácil ... de ofender :P, yo soy complejo y difícil de entender =(

Pero creo que tu código no hace lo que pretendías hacer en un principio, cambia el numero de pulsaciones para encender por cualquie valor mayor de 1 y mira que pasa, y después me cuentas.

int contador = 1; // define una variable tipo integer, y le asigna le valor 1 a=digitalRead(1) ; // Harian lo mismo a=digitalRead(contador ) ; // Por el valor de contador

El cambio de estado de una entrada no es por los rebotes, sino para detectar que has pulsado el botón, y diferenciarlo de cuando mantienes el botón pulsado.

El único problema que encuentro es que no se como diferenciar o como hacer para diferenciar, entre asiganarle un valor numérico a una variable o asignarle un valor del PIN:
int contador = 1 (¿la variable contador le asigno el número 1 o el pin 1?)

Le asignas el numero.

Tal vez estas confundiendo con como se suele declarar los pines, algunos por comodidad usamos variables que no cambian su valor para nombrar el pin y que sirva como guía por ejemplo un código que hice antes:

//  declaramos variables para pines del joistick
byte ejeHorizontal = A0;
byte ejeVertical = A1;
byte botonJoystick = A2;

// declaramos variables para pines de reles o leds
byte led1 = 2;
byte led2 = 3;
byte led3 = 4;
byte led4 = 5;
byte led5 = 6;
byte led6 = 7;

si te fijas son variables ( yo uso tipo byte para esto) y son números los que se asignan, aunque estos nunca cambien, claro esta que estas variables como mencione antes son de soporte para no confundirse en un código un poco mas grande, ademas también pueden ser constantes, agregando const antes, pero es mas cómodo así, solo hay que tener cuidado de no sobre escribir la variable. El porque? Es por el pinMapping, son alias que se le dan a los registros que corresponden a cada pin,veras: el microprocesador tiene (+ó-) cuatro puertos cada uno tiene hasta ocho pines y cada puerto tiene un nombre y cada pin tiene un numero del cero al ocho, para nombrar un pin normal mente sin la ayuda del Arduino seria:

#define ledRojo PC7     // en este caso declaramos una constante para el led rojo que esta conectado al pin 7 del puerto C. (13 en leonardo)
#define ledVerde PD6  //define declara una constante y se va sin punto y coma. 
/*Mucho mas FACIL, no?*/

http://arduino.cc/en/Hacking/PinMapping32u4 El valor del pin es tipo booleano, solo tiene dos posibles estados falso o verdadero; cero o uno. //----- en tu código tienes un if con muchos paréntesis, me parece que le sobran. Compañeros no le han explicado sobre las interferencias que genera la energía estática en los pulsadores y los mecanismos que se usa para esto como la resistencia pull-up, sera que también tendrá problemas con esto?

Bueno saludos espero que todo vaya bien.

Pues ahora que lo dices, tengo el arduino con el GSM y en pruebas desde el viernes pasado. La verdad es que hoy sin tener porque me ha enviado un SMS.

Los pulsadores los tengo instalados del modo Pull-Down, pero con resistencias de 2K2 en vez de 10K. ¿Sería conveniente cambiar las 2K2 por 10K.? A mayores le he intercalado un condesador de 1 MF no polarizado, entre el pulsador y la fuente de 5V.

Seguiré haciendo pruebas, espero que fuera una mera casualidad.

Gracias. Unha perta.