Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Primer proyecto propio: Display controlado mediante teclado
#1
Buenas a tod@s:

Ya hace algunos días que mi primer Arduino llegó a mis manos. Desde entonces ya han pasado muchas cosas, la família Arduino se ha ampliado y las horas que me he pasado delante del ordenador o en la mesa de trabajo con Arduino, investigando, leyendo, probando, mirando tutoriales, viendo proyectos cogados en la red, etc.... son incontables.

Pero todo trabajo y esfuerzo, tarde o temprano da sus frutos. Y aquí están. Puede que sean algo flojos, y que para muchos mi primer proyecto no entrañe mucha dificultad. Sin embargo, para mi es una gran victoria, ya que hasta ahora, iba aprendiendo mediante la repetición de los tutoriales y proyectos que seguía por internet y los hacía yo en casa. Para aprender como programar la placa, y entender porqué se hacía así y que quería decir cada signo, etc.

Un buen día, me vino a la cabeza la idea de controlar un display con un teclado numerico, ya que sabía hacer funcionar un display y hacía poco que había aprendido a comandar unos leds mediante la comunicación serial, y junté las dos cosas. Y de aquí salió mi primer proyecto propio. Ya que hasta entonces siempre me había respaldado de un proyecto de otra persona, para comprobar mis errores, etc.

He estado varios días peleandome ya que no me terminaba de salir. Primero no se encendía ningun segmento del display, después conseguí que se encendiesen pero no respondían a los comandos, etc... Pero finalmete salió.

A continuación os dejo el código fuente para que podéis darle una ojeada y debajo de este os dejo un vídeo a modo de demostración de mi proyecto.

Código:
void setup(){
  Serial.begin(9600);
  pinMode(12,OUTPUT);
  pinMode(11,OUTPUT);
  pinMode(10,OUTPUT);
  pinMode(9,OUTPUT);
  pinMode(8,OUTPUT);
  pinMode(7,OUTPUT);
  pinMode(6,OUTPUT);
}

void loop(){
  if (Serial.available()){
  
  int val = Serial.read();
  
  if (val == '0')
  {
  digitalWrite(12,HIGH);//Encendemos el nº0
digitalWrite(11,HIGH);
digitalWrite(10,HIGH);
digitalWrite(9,HIGH);
digitalWrite(8,HIGH);
digitalWrite(7,HIGH);
delay(1000);
  digitalWrite(12,LOW);//Apagamos el nº0
digitalWrite(11,LOW);
digitalWrite(10,LOW);
digitalWrite(9,LOW);
digitalWrite(8,LOW);
digitalWrite(7,LOW);
delay(1000);
  }

  if (val == '1')
  {
  digitalWrite(11,HIGH); //Encendemos el nº1
digitalWrite(10,HIGH);
delay(1000);
digitalWrite(11,LOW); //Apagamos el nº1
digitalWrite(10,LOW);
delay(1000);
  }
  
  if (val == '2')
  {
  digitalWrite(12,HIGH);//Encendemos el nº2
digitalWrite(11,HIGH);
digitalWrite(6,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
delay(1000);
digitalWrite(12,LOW);//Apagamos el nº2
digitalWrite(11,LOW);
digitalWrite(6,LOW);
digitalWrite(8,LOW);
digitalWrite(9,LOW);
delay(1000);
  }

  
  if (val == '3')
  {
  digitalWrite(12,HIGH);//Encendemos el nº3
digitalWrite(11,HIGH);
digitalWrite(6,HIGH);
digitalWrite(10,HIGH);
digitalWrite(9,HIGH);
delay(1000);
digitalWrite(12,LOW);//Apagamos el nº3
digitalWrite(11,LOW);
digitalWrite(6,LOW);
digitalWrite(10,LOW);
digitalWrite(9,LOW);
delay(1000);
  }


  if (val == '4')
  {
   digitalWrite(7,HIGH);//Encendemos el nº4
digitalWrite(6,HIGH);
digitalWrite(11,HIGH);
digitalWrite(10,HIGH);
delay(1000);
digitalWrite(7,LOW);//Apagamos el nº4
digitalWrite(6,LOW);
digitalWrite(11,LOW);
digitalWrite(10,LOW);
delay(1000);
  }


  if (val == '5')
  {
  digitalWrite(12,HIGH);//Encendemos el nº5
digitalWrite(7,HIGH);
digitalWrite(6,HIGH);
digitalWrite(10,HIGH);
digitalWrite(9,HIGH);
delay(1000);
digitalWrite(12,LOW);//Apagamos el nº5
digitalWrite(7,LOW);
digitalWrite(6,LOW);
digitalWrite(10,LOW);
digitalWrite(9,LOW);
delay(1000);
  }


  if (val == '6')
  {
   digitalWrite(12,HIGH);//Encendemos el nº6
digitalWrite(7,HIGH);
digitalWrite(6,HIGH);
digitalWrite(10,HIGH);
digitalWrite(9,HIGH);
digitalWrite(8,HIGH);
delay(1000);
digitalWrite(12,LOW);//Apagamos el nº6
digitalWrite(7,LOW);
digitalWrite(6,LOW);
digitalWrite(10,LOW);
digitalWrite(9,LOW);
digitalWrite(8,LOW);
delay(1000);
  }


  if (val == '7')
  {
   digitalWrite(12,HIGH);//Encendemos el nº7
digitalWrite(11,HIGH);
digitalWrite(10,HIGH);
delay(1000);
digitalWrite(12,LOW);//Apagamos el nº7
digitalWrite(11,LOW);
digitalWrite(10,LOW);
delay(1000);
  }


  if (val == '8')
  {
  digitalWrite(12,HIGH);//Encendemos el nº8
digitalWrite(11,HIGH);
digitalWrite(10,HIGH);
digitalWrite(9,HIGH);
digitalWrite(8,HIGH);
digitalWrite(7,HIGH);
digitalWrite(6,HIGH);
delay(1000);
digitalWrite(12,LOW);//Apagamos el nº8
digitalWrite(11,LOW);
digitalWrite(10,LOW);
digitalWrite(9,LOW);
digitalWrite(8,LOW);
digitalWrite(7,LOW);
digitalWrite(6,LOW);
delay(1000);
  }


  if (val == '9')
  {
  digitalWrite(12,HIGH);//Encendemos el nº9
digitalWrite(11,HIGH);
digitalWrite(7,HIGH);
digitalWrite(6,HIGH);
digitalWrite(10,HIGH);
delay(1000);
digitalWrite(12,LOW);//Apagamos el nº9
digitalWrite(11,LOW);
digitalWrite(7,LOW);
digitalWrite(6,LOW);
digitalWrite(10,LOW);
delay(1000);
  }
  
  }  
}

http://s1243.photobucket.com/user/driver...sort=3&o=1

Muchas gracias por vuestra ayuda ya que habéis puesto vuestro granito de arena en mi proyecto, ya que vosotr@s me habéis ayudado a iniciarme en el mundo Arduino y os estoy muy agradecido, y por eso he querido publicar mi primer proyecto, a modo de homenaje a tod@s vosotr@s y como muestra de agradecimiento, y para demostraros que a lo mejor, ahora soy un ignorante en el mundo Arduino, pero que poco a poco, todos vuestros consejos, posts, tutoriales, artículos, blogs, etc. Sirven de algo, para que la gente como yo, que no sabe casi nada, pueda, poco a poco, haciendo sus propios proyectos.
Citar
#2
La satisfacción de ver algo acabado y funcionando ya no te la quita nadie, por muchas horas de problemas que hayas tenido Guiño
Citar
#3
La verdad es que los primeros sketch que haces por ti mismo, cada avance y cada logro es una pasada Guiño
Resuelves lo que te lleva 2 horas tocando los webs, para quedar atrapado en el siguiente punto :elrisas: :elrisas: :elrisas:

Sobre el sketch, hasta 3 comprobaciones las puedes hacer con if, pero si son más, deberías usar switch y case.

El código queda más limpio, menos llaves, mas compacto y más optimizado. Cuando empiezas a trabajar con sketch grandes se agradece, así como la costumbre de tabular bien el código, ya que es muchísimo más fácil de leer.

por que ese delay después de borrar el número? mientras está en ese delay, no recibe órdenes. Siempre que tengas sensores o esperes señales, y en general, intenta minimizar al máximo los delays.


Te dejo tu ejemplo con switch/case y sin los delay. A mayores le he cambiado el cero a la opción default en el switch. No es obligatorio usarla, es opcional, pero así ves las 3 opciones en funcionamiento.
prueba a ejecutar vários comandos rápido en un sketch y en el otro, deberías de notar una mejoría notable Guiño

Código:
switch (inByte) {
    case '1':
       //ejecuta cuando sea igual a 1  
       digitalWrite(11,HIGH); //Encendemos el nº1
       digitalWrite(10,HIGH);
         delay(1000);
       digitalWrite(11,LOW); //Apagamos el nº1
       digitalWrite(10,LOW);
    break;
    case '2':    
      //ejecuta cuando sea igual a 2    
       digitalWrite(12,HIGH);//Encendemos el nº2
       digitalWrite(11,HIGH);
       digitalWrite(6,HIGH);
       digitalWrite(8,HIGH);
       digitalWrite(9,HIGH);
         delay(1000);
       digitalWrite(12,LOW);//Apagamos el nº2
       digitalWrite(11,LOW);
       digitalWrite(6,LOW);
       digitalWrite(8,LOW);
       digitalWrite(9,LOW);
    break;
    case '3':    
      //ejecuta cuando sea igual a 3    
       digitalWrite(12,HIGH);//Encendemos el nº3
       digitalWrite(11,HIGH);
       digitalWrite(6,HIGH);
       digitalWrite(10,HIGH);
       digitalWrite(9,HIGH);
         delay(1000);
       digitalWrite(12,LOW);//Apagamos el nº3
       digitalWrite(11,LOW);
       digitalWrite(6,LOW);
       digitalWrite(10,LOW);
       digitalWrite(9,LOW);
         break;
    case '4':    
      //ejecuta cuando sea igual a 4    
       digitalWrite(7,HIGH);//Encendemos el nº4
       digitalWrite(6,HIGH);
       digitalWrite(11,HIGH);
       digitalWrite(10,HIGH);
         delay(1000);
       digitalWrite(7,LOW);//Apagamos el nº4
       digitalWrite(6,LOW);
       digitalWrite(11,LOW);
       digitalWrite(10,LOW);
         break;
    case '5':    
      //ejecuta cuando sea igual a 5    
       digitalWrite(12,HIGH);//Encendemos el nº5
       digitalWrite(7,HIGH);
       digitalWrite(6,HIGH);
       digitalWrite(10,HIGH);
       digitalWrite(9,HIGH);
         delay(1000);
       digitalWrite(12,LOW);//Apagamos el nº5
       digitalWrite(7,LOW);
       digitalWrite(6,LOW);
       digitalWrite(10,LOW);
       digitalWrite(9,LOW);
    break;
    case '6':    
      //ejecuta cuando sea igual a 6    
       digitalWrite(12,HIGH);//Encendemos el nº6
       digitalWrite(7,HIGH);
       digitalWrite(6,HIGH);
       digitalWrite(10,HIGH);
       digitalWrite(9,HIGH);
       digitalWrite(8,HIGH);
         delay(1000);
       digitalWrite(12,LOW);//Apagamos el nº6
       digitalWrite(7,LOW);
       digitalWrite(6,LOW);
       digitalWrite(10,LOW);
       digitalWrite(9,LOW);
       digitalWrite(8,LOW);
         break;
    case '7':    
      //ejecuta cuando sea igual a 7    
       digitalWrite(12,HIGH);//Encendemos el nº7
       digitalWrite(11,HIGH);
       digitalWrite(10,HIGH);
         delay(1000);
       digitalWrite(12,LOW);//Apagamos el nº7
       digitalWrite(11,LOW);
       digitalWrite(10,LOW);
    break;
    case '8':    
      //ejecuta cuando sea igual a 8    
       digitalWrite(12,HIGH);//Encendemos el nº8
       digitalWrite(11,HIGH);
       digitalWrite(10,HIGH);
       digitalWrite(9,HIGH);
       digitalWrite(8,HIGH);
       digitalWrite(7,HIGH);
       digitalWrite(6,HIGH);
         delay(1000);
       digitalWrite(12,LOW);//Apagamos el nº8
       digitalWrite(11,LOW);
       digitalWrite(10,LOW);
       digitalWrite(9,LOW);
       digitalWrite(8,LOW);
       digitalWrite(7,LOW);
       digitalWrite(6,LOW);
    break;
    case '9':    
      //ejecuta cuando sea igual a 9    
       digitalWrite(12,HIGH);//Encendemos el nº9
       digitalWrite(11,HIGH);
       digitalWrite(7,HIGH);
       digitalWrite(6,HIGH);
       digitalWrite(10,HIGH);
         delay(1000);
       digitalWrite(12,LOW);//Apagamos el nº9
       digitalWrite(11,LOW);
       digitalWrite(7,LOW);
       digitalWrite(6,LOW);
       digitalWrite(10,LOW);
    break;      
    default:
            // si no hay coincidencias, ejecuta el "default"
       digitalWrite(12,HIGH);//Encendemos el nº0
       digitalWrite(11,HIGH);
       digitalWrite(10,HIGH);
       digitalWrite(9,HIGH);
       digitalWrite(8,HIGH);
       digitalWrite(7,HIGH);
      }
    }


y un ejemplo de switch

Código:
switch (var) {
    case 1:
      //hacer algo cuando sea igual a 1
      break;
    case 2:
      //hacer algo cuando sea igual a 2
      break;
    case 3:
      //hacer algo cuando sea igual a 3
      break;
    case 4:
      //hacer algo cuando sea igual a 4
      break;
    default:
      // si nada coincide, ejecuta el "default"
      // el "default" es opcional
  }
Citar
#4
Gracias¿? A ti por participar!!

Poquito a poco es como se aprende.

Como apunte de programador penoso que soy, fíjate que para cada número cambias el estado de casi todos los segmentos, realizando un digitalwrite por cada uno. Una cosa que no gusta mucho es la redundancia.
En este caso, puedes mandar un digitalwrite high para todos los pines comunes que quieras encender, y otro low para apagarlos. De esta forma, cada número solamente tendrá la estructura, por ejemplo para el cero:

if (val == '0')
{
digitalWrite(pines a encender,HIGH);//Encendemos el nº0
delay(1000);
digitalWrite(pines a apagar,LOW);//Apagamos el nº0
delay(1000);
}

Esto se puede hacer con el port manipulation (mira sus pros y sus contras): http://arduino.cc/es/Reference/PortManipulation

Otra detalle. Usas un if para cada número que puedas recibir. Quizás te sea más cómo utilizar un case: http://arduino.cc/es/Reference/SwitchCase
Esta estructura es muy cómoda para utilizar en menús por ejemplo.

Te lo comento muy así a mi manera y desde mi ignorancia de programador, no como crítica, sino para ofrecerte la misma solución de otra forma. (Si alguien ve que digo alguna barbaridad, que me corrija por favor, xD)
Citar
#5
Buenas a tod@s:

Muchas gracias por vuestros comentarios, críticas constructivas y sugerencias.

Por supuesto todo es mejorable, y aún más cuando es el primer proyecto, ya que los conocimientos son básicos y por supuesto se puede pulir mucho.

Pero está claro, que la satisfacción de ver correr el proyecto (por mucho que se pueda mejorar), pues lo que decís por aquí, no te la quita nadie. Por supuesto, que voy a mejorar el proyecto, pero por lo menos, ya es un proyecto que va a quedar en mi historial de proyectos Arduino, y con el que estoy muy satisfecho.

Muchas gracias de nuevo. Mola
Citar
#6
El lenguaje de programación da las opciones, después cada uno usará el que más rabia le dé.

Ventaja del "if": si necesitas añadir una condición de parada, test, etc, puedes hacerlo. Si tienes un case, tendrías que modificar todo el código de "case" o "switch".

Si utilizas un "if" es muy importante usar el "else" siempre por dos razones:
- En tu código, el programa hace 10 comprobaciones por cada número, porque no tienen else, es decir, se mira si el número es 1, es 2, es 3...aunque encienda el uno nada más, hará el resto de comprobaciones. De hecho, si quitas los "delay", y pulsas dos números a la vez, te los pintará al mismo tiempo. Si tienes "else", nunca te pasará, porque solo se ejecuta 1 "if".

- El "else" es tu seguro de vida, que debería hacer algo para indicar que ha entrado en esa parte. Justo cuando pienses que debe entrar en alguno de los "if" o "else" por fuerza, será cuando no lo haga XD.
El código sería (más o menos, no sé arduino)
Código:
if (numero = '1'){

} else if (numero = '2'){

} ....{
}else { beep(lo que sea)}

Edito: No es casualidad que los ordenadores lleven un altavoz interno que, según el número de pitidos que dé, sabes si lo que ha fallado es la gráfica, la placa base, el micro, etc. La diferencia entre 2 pitidos o 3 pitidos pueden quitarte días buscando un fallo en la programación.
Ulticampy V2: fundiendo plástico sin descanso...
Citar


Temas similares...
Tema Autor Respuestas Vistas Último mensaje
  Proyecto cofre abertura mediante RFID Electromecánico 17 1,964 10-09-2015, 11:10 AM
Último mensaje: chemamata
  Programar tu propio controlador de vuelo para un multirrotor alegorosito 0 452 21-07-2015, 11:39 PM
Último mensaje: alegorosito
  Problema Arduino Display Fechhe 2 686 12-03-2015, 11:02 PM
Último mensaje: Fechhe
  Mi primer Arduino (mejor dicho la copia Funduino) hansugrove 41 8,908 18-10-2014, 08:15 PM
Último mensaje: hansugrove
  Jardín Zen domotico controlado por arduino biketrial981 7 1,179 15-01-2014, 10:34 AM
Último mensaje: ClioS