Vamos a programar #75 - Display de 7 segmentos y arduino.

Hola de nuevo a todos, el día de hoy vamos a ver cómo usar un display de 7 segmentos con arduino.

Si tes has dado vueltas por el blog, sabrás que tengo cierta fijacion por las luces parpadeantes. Cualquier tipo de aplicacion que use LED's llamará mi atención sin dudarlo. Hace algún tiempo hice un reloj llamado "clock view" que usaba una matriz de 8 x 8 LED's.


Y si bien funciona bastante bien, no se acerca al estilo del display de 7 segmentos que le da un toque muy especial a la apariencia del reloj.


Pero cómo conseguir display de siete segmentos en mi país es muy caro; y solo para ponerlo en perspectiva, sale casi tan caro conseguir ocho segmentos de 4 * 2 pulgadas que comprar un monitor de PC de 17 pulgadas; por lo que hay que recurrir a alternativas un poco más accesibles.

Una alternativa es usar diodos LED e intentar simular los dígitos, pero usar simples diodos, no le da mucho atractivo a la aplicación.

Para solucionarlo, recientemente adquirí unos cuantos LED's con un chip ws2812b y el día de hoy voy a mostrar un pequeño fragmento de código que se encargara de hacer lucir los LED's cómo si fueran los de siete segmentos, pero con la gran ventaja de que estos pueden soportar colores de hasta ocho bits por lo que una gran gama puede ser creada.

Para empezar, crearemos las conexiones. Para cada dígito usaremos 21 LED's ws2812b, suelen venir en tiras o por si acaso, puedes ver el esquema y conseguirlos de forma individual, el proyecto esta guardado en easy eda y puedes descargarlo aquí. Pero prácticamente solo hay que conectar un pin del arduino a "DIN" del LED y DOUT a la entrada "DIN" del próximo LED y asi sucesivamente hasta completar; en este caso; los 21 LED's que necesitaremos. También conectaremos VCC a 5v (aunque dependiendo del modelo, puede ser hasta 12v) y GND a tierra.



Con las conexiones hechas, pasemos a ver cómo implementar código en arduino para poder usar los LED's cómo si fueran segmentos.


void PrintNumber(int Value, int Digit, int Green, int Red, int Blue){
	for(int i = 0; i < 7; i++) {
		switch (Value)
		{
			case 0:
				if (i == 6){
					leds[(i * 3) + 2 + (Digit * 21)].setRGB(0, 0, 0);
					leds[(i * 3) + 1 + (Digit * 21)].setRGB(0, 0, 0);
					leds[i * 3 + (Digit * 21)].setRGB(0, 0, 0);
				}else{
					leds[(i * 3) + 2 + (Digit * 21)].setRGB(Green, Red,Blue);
					leds[(i*3) + 1 + (Digit * 21)].setRGB(Green, Red,Blue);
					leds[i*3+ (Digit * 21)].setRGB(Green, Red,Blue);		
				}
				FastLED.show(); 
				break;
			case 1:
				if (i == 0 || i == 1){
					leds[(i * 3) + 2 + (Digit * 21)].setRGB(Green, Red,Blue);
					leds[(i * 3) + 1 + (Digit * 21)].setRGB(Green, Red,Blue);
					leds[i * 3 + (Digit * 21)].setRGB(Green, Red,Blue);			
				}else{
					leds[(i * 3) + 2 + (Digit * 21)].setRGB(0,0,0);
					leds[(i*3) + 1 + (Digit * 21)].setRGB(0,0,0);
					leds[i * 3 + (Digit * 21)].setRGB(0,0,0);
				}
			FastLED.show();
			break;
			case 2:
				if (i == 0 || i == 3){
					leds[(i * 3) + 2 + (Digit * 21)].setRGB(0,0,0);
					leds[(i * 3) + 1 + (Digit * 21)].setRGB(0,0,0);
					leds[i * 3 + (Digit * 21)].setRGB(0,0,0);
				}else{
					leds[(i * 3) + 2 + (Digit * 21)].setRGB(Green, Red,Blue);
					leds[(i * 3) + 1 + (Digit * 21)].setRGB(Green, Red,Blue);
					leds[i * 3 + (Digit * 21)].setRGB(Green, Red,Blue);
				}
			FastLED.show();
			break;
			case 3:
				if (i == 3 || i == 4){
					leds[(i * 3) + 2 + (Digit * 21)].setRGB(0,0,0);
					leds[(i * 3) + 1 + (Digit * 21)].setRGB(0,0,0);
					leds[i * 3 + (Digit * 21)].setRGB(0,0,0);
				}else{
					leds[(i * 3) + 2 + (Digit * 21)].setRGB(Green, Red,Blue);
					leds[(i * 3) + 1 + (Digit * 21)].setRGB(Green, Red,Blue);
					leds[i * 3 + (Digit * 21)].setRGB(Green, Red,Blue);
				}
			FastLED.show();
			break;
			case 4:		
				if (i == 2 || i == 4 || i == 5){
					leds[(i * 3) + 2 + (Digit * 21)].setRGB(0,0,0);
					leds[(i * 3) + 1 + (Digit * 21)].setRGB(0,0,0);
					leds[i * 3 + (Digit * 21)].setRGB(0,0,0);
				}else{
					leds[(i * 3) + 2 + (Digit * 21)].setRGB(Green, Red,Blue);
					leds[(i * 3) + 1 + (Digit * 21)].setRGB(Green, Red,Blue);
					leds[i * 3 + (Digit * 21)].setRGB(Green, Red,Blue);
				}
			FastLED.show();
			break;
			case 5:
				if (i == 1 || i == 4){
					leds[(i * 3) + 2 + (Digit * 21)].setRGB(0,0,0);
					leds[(i * 3) + 1 + (Digit * 21)].setRGB(0,0,0);
					leds[i * 3 + (Digit * 21)].setRGB(0,0,0);
				}else{
					leds[(i * 3) + 2 + (Digit * 21)].setRGB(Green, Red,Blue);
					leds[(i * 3) + 1 + (Digit * 21)].setRGB(Green, Red,Blue);
					leds[i * 3 + (Digit * 21)].setRGB(Green, Red,Blue);
				}
			FastLED.show();
			break;
			case 6:
				if (i == 1){
					leds[(i * 3) + 2 + (Digit * 21)].setRGB(0,0,0);
					leds[(i * 3) + 1 + (Digit * 21)].setRGB(0,0,0);
					leds[i * 3 + (Digit * 21)].setRGB(0,0,0);
				}else{
					leds[(i * 3) + 2 + (Digit * 21)].setRGB(Green, Red,Blue);
					leds[(i * 3) + 1 + (Digit * 21)].setRGB(Green, Red,Blue);
					leds[i * 3 + (Digit * 21)].setRGB(Green, Red,Blue);
				}
			FastLED.show();
			break;
			case 7:
				if (i == 3 || i == 6 || i == 4 || i == 5){
					leds[(i * 3) + 2 + (Digit * 21)].setRGB(0,0,0);
					leds[(i * 3) + 1 + (Digit * 21)].setRGB(0,0,0);
					leds[i * 3 + (Digit * 21)].setRGB(0,0,0);
				}else{
					leds[(i * 3)+ 2 + (Digit * 21)].setRGB(Green, Red,Blue);
					leds[(i * 3)+ 1 + (Digit * 21)].setRGB(Green, Red,Blue);
					leds[i * 3 + (Digit * 21)].setRGB(Green, Red,Blue);
				}
			FastLED.show();
			break;
			case 8:
				leds[(i * 3) + 2 + (Digit * 21)].setRGB(Green, Red,Blue);
				leds[(i * 3) + 1 + (Digit * 21)].setRGB(Green, Red,Blue);
				leds[i * 3 + (Digit * 21)].setRGB(Green, Red,Blue);
			FastLED.show();
			break;
			case 9:
				if (i == 4){
					leds[(i * 3) + 2 + (Digit * 21)].setRGB(0,0,0);
					leds[(i * 3) + 1 + (Digit * 21)].setRGB(0,0,0);
					leds[i * 3 + (Digit * 21)].setRGB(0,0,0);
				}else{
					leds[(i * 3) + 2 + (Digit * 21)].setRGB(Green, Red,Blue);
					leds[(i * 3) + 1 + (Digit * 21)].setRGB(Green, Red,Blue);
					leds[i * 3 + (Digit * 21)].setRGB(Green, Red,Blue);
				}
			FastLED.show();
			break;
			default:		
				if (i == 0 || i == 1){
					leds[(i * 3) + 2 + (Digit * 21)].setRGB(0,0,0);
					leds[(i * 3) + 1 + (Digit * 21)].setRGB(0,0,0);
					leds[i * 3 + (Digit * 21)].setRGB(0,0,0);
				}else{
					leds[(i * 3) + 2 + (Digit * 21)].setRGB(Green, Red,Blue);
					leds[(i * 3) + 1 + (Digit * 21)].setRGB(Green, Red,Blue);
					leds[i * 3 + (Digit * 21)].setRGB(Green, Red,Blue);
				}
			FastLED.show();
			break;
		}
	}
}

Para usar los LED's con el chip ws2812b, haremos uso de la libreria FASTLED que puedes descargar desde su sitio en Github. Una vez instalada, importamos la librería e inicializamos la cantidad de LED's que vamos a usar, seguido del PIN del arduino que usaremos; en este caso el PIN número 9. En este caso en particular, los calculos están hecho para cuando queremos usar tres LED's por segmento (que se ve bien a mi gusto), pero si quieres hacer uso de un número mayor o menor el código deberá de ser modificado, pero está construido de tal forma que se entiende fácilmente.

Ya dentro del iterador, se crea un "case" para cada dígito y se dejan apagados o encendidos los LED's dependiendo del caso. Hay que tomar en cuenta donde es el punto de inicio. En este caso está en la esquina inferior derecha y sigue hacia arriba, luego a la izquierda, luego a la derecha y finalmente llega a la parte media en donde igual el primer LED del segmento estará ubicado a la derecha. Si miras la siguiente imagen, podrás apreciar el orden si sigues la numeración.


Y bien, por ahora es todo, en el siguiente post veremos cómo es que se usa la función que creamos y en el transcurso de la semana, arreglaré el diseño del PCB para que se vea mejor y se pueda expandir (si bien recuerdo hasta 500 LED's se pueden usar antes de agotar la memoria del Arduino) y además crearemos un nuevo reloj llamado Neo Clock View usando seis de estos "displays".

Los leo luego.

No hay comentarios.