Mostrando las entradas con la etiqueta Resistencias. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Resistencias. Mostrar todas las entradas
Back to basics #7 - Divisores resistivos.
Hola de nuevo a todos, el día de hoy vamos a ver un poco mas sobre el uso de las resistencias.
Hace algún tiempo hicimos un velocímetro para bicicleta, y todo funciona bien salvo un par de detalles. Un de las cosas que luego me pasa, es que la batería se acaba a la mitad del recorrido y cómo me es importante saber cuanta distancia hago en cada uno, siento que si se apaga el velocímetro a mitad del camino, éste simplemente ya no cuenta. Cómo ya van varias veces que me pasa, decidí mostrar la información de la batería en la pantalla (Aprovechando el espacio disponible en ella.) y así al menos tener una idea de cuando debo de cargar la batería.
Antes de empezar, hay que buscar un método para medir el voltaje; hay que recordar que el velocímetro está basado en arduino, esto significa que en las entradas podemos medir niveles de hasta 5V, la batería tiene niveles de 3v a 4.2v, esto significa que en teoría podríamos simplemente conectar la batería a una de las entradas y "medir", pero en general es una mala practica conectar directamente la batería al micro-controlador.
Para poder medir el voltaje de manera segura vamos a usar un divisor de tensión, pero antes de continuar veamos que es:
Y hay una formula que sirve para calcular cual es el voltaje que queremos usar. Para eso miremos la siguiente imagen:
Donde tenemos:
Ahora tomemos cómo ejemplo la siguiente configuración:
Si observas cuidadosamente, tenemos dos resistencia de 4.7 KΩ y 3v a la entrada que si reemplazamos en la formula
tenemos:
Y al realizar las mediciones, podemos comprobar que en efecto los cálculos son correctos:
Hace algún tiempo hicimos un velocímetro para bicicleta, y todo funciona bien salvo un par de detalles. Un de las cosas que luego me pasa, es que la batería se acaba a la mitad del recorrido y cómo me es importante saber cuanta distancia hago en cada uno, siento que si se apaga el velocímetro a mitad del camino, éste simplemente ya no cuenta. Cómo ya van varias veces que me pasa, decidí mostrar la información de la batería en la pantalla (Aprovechando el espacio disponible en ella.) y así al menos tener una idea de cuando debo de cargar la batería.
Antes de empezar, hay que buscar un método para medir el voltaje; hay que recordar que el velocímetro está basado en arduino, esto significa que en las entradas podemos medir niveles de hasta 5V, la batería tiene niveles de 3v a 4.2v, esto significa que en teoría podríamos simplemente conectar la batería a una de las entradas y "medir", pero en general es una mala practica conectar directamente la batería al micro-controlador.
Para poder medir el voltaje de manera segura vamos a usar un divisor de tensión, pero antes de continuar veamos que es:
Un divisor de tensión es una configuración de un circuito eléctrico que reparte la tensión de una fuente entre una o más impedancias conectadas en serie. wikipedia/divisordetensionPara crearlo, simplemente debemos de unir dos resistencias (o mas) en serie y tomar el voltaje de uno de los puntos medios cómo muestra el siguiente diagrama:
Y hay una formula que sirve para calcular cual es el voltaje que queremos usar. Para eso miremos la siguiente imagen:
Donde tenemos:
- V2 = Voltaje de salida
- R2 = El valor de la resistencia 2
- R1 = Valor de la resistencia 1
- V1 = Voltaje de entrada
Ahora tomemos cómo ejemplo la siguiente configuración:
Arreglo de resistencias
![]() |
| Tenemos 3v a la entrada |
Si observas cuidadosamente, tenemos dos resistencia de 4.7 KΩ y 3v a la entrada que si reemplazamos en la formula
tenemos:
Y al realizar las mediciones, podemos comprobar que en efecto los cálculos son correctos:
![]() |
| Medimos "en medio" de las resistencias |
Si no te gusta usar la formula, bastará con usar resistencias del mismo valor y el voltaje será proporcional, en el ejemplo anterior usamos dos resistencias de 4.7 por lo que al dividir entre dos nos resulta 1.5v.
Ahora de manera intuitiva, si usamos tres resistencias de 100kΩ y medimos en la primer sección tendremos una tercera parte del voltaje y si medimos en la segunda, tendremos dos terceras partes, eso significa que si usamos un voltaje de 3v a la entrada, tendríamos voltajes cercanos a 1v y 2v respectivamente. Ahora lo comprobaremos.
![]() |
| Ahora usamos tres resistencias de 100kΩ |
![]() |
| Voltaje en la primer unión |
![]() |
| Voltaje en la segunda unión |
Con esto podemos medir de manera más segura el voltaje directamente con el arduino, pero cómo siempre hay que tener consideraciones. La primera de ellas es que usar este método para reducir el voltaje no es la más conveniente si queremos alimentar un LED' por ejemplo, ya que implicaría un gasto de corriente adicional, pero además no funciona del todo bien y entre mas sea la corriente peor funcionará. La segunda, que valores son los que debemos de usar, eso depende mucho de la aplicación, pero bastara con resistencias dentro del rango de los kΩ y eso se debe a que el propio divisor resistivo gasta cierta potencia, si recordamos la ley del watt, si tenemos un divisor resistivo con dos resistencias de 4.7kΩ y un voltaje de 3v, la potencia que se disipa en las resistencias es de 0.0003w que no es mucho, pero si usamos resistencias de 10Ω en la misma configuración tendríamos un gasto de 0.15w (haciendo técnicamente nada). Para tener una mejor aproximación al resultado que queremos, debemos de usar resistencias de precisión, las resistencias que usé para el segundo ejemplo, no lo son y ahí es cuando se produce la diferencia (los colores dicen que son de 100kΩ pero en realidad son de 98kΩ~99kΩ).
Y bien, por ahora es todo, en el siguiente post veremos cómo medir el voltaje de una bateria usando arduino.
Los leo luego.
10/20/2019 05:55:00 p.m.
aprende
,
Basics
,
Divisores resistivos
,
Resistencias
Vamos a programar #72 - Calculadora de resistencias para diodos LED (ver. Java para android).
Hola de nuevo a todo, el día de hoy vamos a ver el código en java para hacer una calculadora de resistencias para diodos LED.
En los post anteriores vimos cómo hacer la calculadora en javascript para los navegadores y en C# para las computadoras de escritorio ahora con está versión tenemos la versión para los teléfonos móviles.
Cómo el código (y su funcionamiento) es muy similar al de las otras versiones vamos a pasar directamente a el. El código que hacer funcionar la calculadora es el siguiente:
EL código anterior solo consta de una funcion llamada "CalculateRes()" qué cómo su nombre lo sugiere, se usa para hacer el cálculo para saber el valor de la resistencia necesaria. Recibe cinco parametros. Los primeros cuatro son del tipo "String" y que en orden de aparicion se usan para:
Con la anterior tenemos la calculadorra lista para poder usarla en el celular. Cómo de costumbre puede bajar el APK ya compilado o puedes descargar el código fuente; recuerda que solo incluye el código fuente y se quito la gran mayoria de archivos generados por android studio.
Los leo luego.
En los post anteriores vimos cómo hacer la calculadora en javascript para los navegadores y en C# para las computadoras de escritorio ahora con está versión tenemos la versión para los teléfonos móviles.
Cómo el código (y su funcionamiento) es muy similar al de las otras versiones vamos a pasar directamente a el. El código que hacer funcionar la calculadora es el siguiente:
package com.mdev.ledrescalc;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioButton;
public class MainActivity extends Activity {
EditText ETVin, ETVLed, ETILed, ETNLed, ETResult;
Button BtnCalc;
RadioButton RConexion1, RConexion2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ETVin = findViewById(R.id.ETVin);
ETVLed = findViewById(R.id.ETVLed);
ETILed = findViewById(R.id.ETILed);
ETNLed = findViewById(R.id.ETNLed);
ETResult = findViewById(R.id.ETResult);
BtnCalc = findViewById(R.id.BtnCalc);
RConexion1 = findViewById(R.id.Conexion1);
RConexion2 = findViewById(R.id.Conexion2);
BtnCalc.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ETResult.setText(CalculateRes(ETVin.getText().toString(),ETVLed.getText().toString(),ETILed.getText().toString(),ETNLed.getText().toString(),RConexion1.isChecked()));
}
});
}
private String CalculateRes(String VIn, String VLed, String ILed, String NLed, boolean Serie)
{
double Corriente = 0;
double DropVol = 0;
double TotalRes = 0;
double TotalVolt = 0;
double Potencia = 0;
double Vin = Double.parseDouble(VIn);
double Vled = Double.parseDouble(VLed);
double Iled = Double.parseDouble(ILed);
double Nled = Double.parseDouble(NLed);
if (Serie)
{
TotalVolt = Vled * Nled;
if (Vin < TotalVolt){
return "El voltaje es bajo";
}
Corriente = Iled;
DropVol = Vin - TotalVolt;
TotalRes = DropVol/Corriente;
Potencia = Corriente * DropVol;
return "Se necesita una resistencia de "+ TotalRes +" ohm(s) de una potencia de superior a "+ Potencia + " Watt(s)";
}
else{
TotalVolt = Vled;
if (Vin < TotalVolt){
return "El voltaje es bajo";
}
Corriente = Iled * Nled;
DropVol = Vin - TotalVolt;
TotalRes = DropVol/Corriente;
Potencia = Corriente * DropVol;
return "Se necesita una resistencia de "+ TotalRes +" ohm(s) de una potencia de superior a "+ Potencia + " Watt(s)";
}
}
}
EL código anterior solo consta de una funcion llamada "CalculateRes()" qué cómo su nombre lo sugiere, se usa para hacer el cálculo para saber el valor de la resistencia necesaria. Recibe cinco parametros. Los primeros cuatro son del tipo "String" y que en orden de aparicion se usan para:
- El voltaje de entrada.
- El voltaje del LED.
- La corriente del LED.
- El número de LED's conectados.
Con la anterior tenemos la calculadorra lista para poder usarla en el celular. Cómo de costumbre puede bajar el APK ya compilado o puedes descargar el código fuente; recuerda que solo incluye el código fuente y se quito la gran mayoria de archivos generados por android studio.
Los leo luego.
4/28/2019 05:29:00 p.m.
c#
,
csharp
,
LED
,
programacion
,
Resistencias
Vamos a programar #70 - Calculadora de resistencias para diodos LED (ver. Javascript).
Hola de nuevo a todos, el día de hoy vamos a ver cómo hacer una calculadora en javascript que sirva para calcular que resistencia debemos de usar si queremos utilizar un diodo LED con un voltaje mayor a esperado.
Pero antes, unas consideraciones. Primero: esta no es la forma más eficiente de alimentar un LED, ya que mucha energia es deperdiciada. Segundo: Usar una sola resistencia para limitar la corriente que varios LED's no es lo mas recomendable; si se van a hacer uso de varios LED's lo mas recomendable sería poner una resistencia por cada LED que se conecte, es decir calcular el valor de cada uno y ponerle su resistencia y no cómo la imagen. En la calculadora es meramente ilustrativo.
Ahora si, con las previsiones hechas, pasemos al código de la calculadora.
El código en javascript que hace funcionar la calculadora es el siguiente:
Cómo podrás observar, simplemente pasamos a la computadora los cálculos que hicimos la vez pasada. El programa consta de dos funciones solamente. La primera de ellas es "RadioSelected()", que cómo su nombre lo indica, su trabajo es revisar cual de los controles del tipo "radio" es el que está seleccionado de la colección "Conexion", para ello itera a traves de todos los elementos y cuando encuentra uno que tenga la propiedad "checked" en "true" devuelve el valor del indice de este elemento.
Luego tenemos la funcion "CalculateRes()" primero lo que hacemos es obtener los valores que necesitamos usado la función "document.getElementById()" y los asignamos a la variables, luego se manda a llamar a la función "RadioSelected()" para ver que tipo de conexión es la que tienen los LED, en este caso, cuando es uno, significa que la conexión es en serie en caso contrario es paralelo .
Si revisas los apartado, veras que son muy similares y de hecho lo son, pero la diferencia, es que cuando la conexión es en serie, el voltaje aumenta y la corriente permanece, entonces la diferencia esta en cómo se mide esta, en una será la corriente que tenga la variable "VIn" y en la otra será la que resulte de multiplicar {"VIn * NLED"} donde "NLED" es el número de LED's conectados.
Finalmente, el resultado de los cálculos de la resistencia y la potencia se asignan al control "textarea" llamado "Result".
Cómo podrás ver, los cálculos son realmente sencillos y muy fáciles de portar a otro lenguajes; cosa que haremos la siguiente semana, ya que al igual que otros de los programas que hemos hecho, haremos una versión web, de escritorio y móvil.
El código lo puedes descargar de mi dropbox para que lo pruebes, pero además en breve subiré una versión al blog para que se pueda usar.
Y bien, por ahora es todo, en el próximo post veremos la version de C#.
Los leo luego.
Pero antes, unas consideraciones. Primero: esta no es la forma más eficiente de alimentar un LED, ya que mucha energia es deperdiciada. Segundo: Usar una sola resistencia para limitar la corriente que varios LED's no es lo mas recomendable; si se van a hacer uso de varios LED's lo mas recomendable sería poner una resistencia por cada LED que se conecte, es decir calcular el valor de cada uno y ponerle su resistencia y no cómo la imagen. En la calculadora es meramente ilustrativo.
Ahora si, con las previsiones hechas, pasemos al código de la calculadora.
El código en javascript que hace funcionar la calculadora es el siguiente:
<html>
<head>
<title>Calculadora de resistencias para LED's</title>
<style type="text/css">
.h1RC
{
font-size: 16px;
}
.formResCal{
font: 95% Arial, Helvetica, sans-serif;
max-width: 400px;
margin: 10px auto;
padding: 16px;
background: #F9F9F9;
}
.textareaRC
{
width: 100%;
height: 150px;
padding: 2px 5px;
box-sizing: border-box;
border: 2px solid #229;
border-radius: 4px;
resize: none;
-webkit-transition-duration: 0.4s; /* Safari */
transition-duration: 0.4s;
}
.textareaRC:focus
{
width: 100%;
height: 150px;
padding: 2px 5px;
box-sizing: border-box;
border: 2px solid #0000BB;
border-radius: 4px;
resize: none;
}
.TextRC
{
width: 100%;
box-sizing: border-box;
border: 2px solid #999;
border-radius: 4px;
}
.ButtonRC
{
width: 100%;
background-color: #57a2e2;
border: none;
color: white;
padding: 15px 32px;
text-align: center;
text-decoration: none;
display: inline-block;
-webkit-transition-duration: 0.4s; /* Safari */
transition-duration: 0.4s;
}
.ButtonRC:hover
{
width: 100%;
background-color: #276775;
border: none;
color: white;
padding: 15px 32px;
text-align: center;
text-decoration: none;
display: inline-block;
}
</style>
<script type="text/javascript">
function RadioSelected(){
var radios = document.getElementsByName('Conexion');
for (var i = 0, length = radios.length; i < length; i++) {
if (radios[i].checked) {
return Number(radios[i].value)
}
}
}
function CalculateRes()
{
var VIn = Number(document.getElementById('InV').value);
var VLED = Number(document.getElementById('LEDV').value);
var ILED = Number(document.getElementById('LEDI').value);
var NLED = Number(document.getElementById('LEDN').value);
var Corriente = 0;
var DropVol = 0;
var TotalRes = 0;
var TotalVolt = 0;
var Potencia = 0;
var ConexionType = RadioSelected();
if (ConexionType == 1){
TotalVolt = VLED * NLED;
if (VIn < TotalVolt){
alert('El voltaje es bajo');
return;
}
Corriente = ILED;
DropVol = VIn - TotalVolt;
TotalRes = Math.ceil(DropVol/Corriente);
Potencia = Corriente * DropVol;
document.getElementById('Result').value = "Se necesita una resistencia de "+ TotalRes +"ohm(s) de una potencia de superior a "+ Potencia + " Watt(s)";
}
else{
TotalVolt = VLED;
if (VIn < TotalVolt){
alert('El voltaje es bajo');
return;
}
Corriente = ILED * NLED;
DropVol = VIn - TotalVolt;
TotalRes = Math.ceil(DropVol/Corriente);
Potencia = Corriente * DropVol;
document.getElementById('Result').value = "Se necesita una resistencia de "+ TotalRes +"ohm(s) de una potencia de superior a "+ Potencia + " Watt(s)";
}
}
</script>
</head>
<body>
<form class="formResCal">
<span class="h1RC">Voltaje de alimentacion (V):</span><br />
<input class="TextRC" id="InV" type="number" value = "5" placeholder = "Voltaje en volts"></input><br />
<span class="h1RC">Voltaje del LED (V):</span><br />
<input class="TextRC" id="LEDV" type="number" value = "3.1" placeholder = "Voltaje en volts"></input><br />
<span class="h1RC">Corriente del LED (A):</span><br />
<input class="TextRC" id="LEDI" type="number" value = "0.02" placeholder = "Corriente en Amperes"></input><br />
<span class="h1RC">Numero de LED's:</span><br />
<input class="TextRC" id="LEDN" type="number" value = "1"></input><br />
<input type="radio" name="Conexion" value="1" checked> Serie<br>
<input type="radio" name="Conexion" value="2"> Paralelo con una sola resistencia<br>
<br>
<input class="ButtonRC" id="ToAny" onclick="CalculateRes()" type="button" value="Calcular" /><br />
<br />
<span class="h1RC">Resultado:</span><br />
<textarea class="textareaRC" id="Result" rows="5" placeholder = "Resultado"></textarea><br/>
<br />
</form>
</body>
</html>
Cómo podrás observar, simplemente pasamos a la computadora los cálculos que hicimos la vez pasada. El programa consta de dos funciones solamente. La primera de ellas es "RadioSelected()", que cómo su nombre lo indica, su trabajo es revisar cual de los controles del tipo "radio" es el que está seleccionado de la colección "Conexion", para ello itera a traves de todos los elementos y cuando encuentra uno que tenga la propiedad "checked" en "true" devuelve el valor del indice de este elemento.
Luego tenemos la funcion "CalculateRes()" primero lo que hacemos es obtener los valores que necesitamos usado la función "document.getElementById()" y los asignamos a la variables, luego se manda a llamar a la función "RadioSelected()" para ver que tipo de conexión es la que tienen los LED, en este caso, cuando es uno, significa que la conexión es en serie en caso contrario es paralelo .
Si revisas los apartado, veras que son muy similares y de hecho lo son, pero la diferencia, es que cuando la conexión es en serie, el voltaje aumenta y la corriente permanece, entonces la diferencia esta en cómo se mide esta, en una será la corriente que tenga la variable "VIn" y en la otra será la que resulte de multiplicar {"VIn * NLED"} donde "NLED" es el número de LED's conectados.
Finalmente, el resultado de los cálculos de la resistencia y la potencia se asignan al control "textarea" llamado "Result".
Cómo podrás ver, los cálculos son realmente sencillos y muy fáciles de portar a otro lenguajes; cosa que haremos la siguiente semana, ya que al igual que otros de los programas que hemos hecho, haremos una versión web, de escritorio y móvil.
El código lo puedes descargar de mi dropbox para que lo pruebes, pero además en breve subiré una versión al blog para que se pueda usar.
Y bien, por ahora es todo, en el próximo post veremos la version de C#.
Los leo luego.
4/07/2019 02:22:00 p.m.
LED
,
programacion
,
Resistencias
Back to basics #6 - Resistencias y diodos LED.
Hola de nuevo a todos, el día de hoy vamos a ver un poco de cómo usar unos de mi componentes electrónicos favoritos: el diodo LED.
Imaginemos que en algun momento contruyes un velocímetro para una bicicleta y te levantas por las mañanas a hacer tu recorrido, pero un buen dia, por alguna razon las lamparas ddel alumbrado publico no encienden, al inicio supones que es algo normal, ya que las cosas tienden a fallar, pero tras tres semanas te das cuenta que probablemente no las van a reparar en fechas próximas por lo que decides agregarle "iluminacion" a tu bicicleta, pero surge una pregunta ¿Cómo alimentar la iluminacion?
Ultimamente se han hecho bastante accesibles los diodos LED, gracias a su alta eficiencia, son muy utiles a la hora de obtener alimentacion por medio de pilas o baterias pues nos asegura que estas duraran algo de tiempo; cosa que no pasaba antes con las lamparas que usaban filamento incandescentes y que se devoraban las pilas.
Si no has visto cómo es que hice el velocímetro, aun puedes hacerlo pero haciendo memoria, este funciona con un voltaje de 5 v, si intentamos conectar un diodo directamente, este explotaría.
Dependiendo del tipo de diodo LED, este requerirá mas o menos voltaje, en mi caso conseguí LED's de color rojo, amarillo, azul, verde y blanco. Cada uno posee una hoja de datos en la cual podemos cuales son las condiciones para que cada uno de ellos funcione, en el caso de los LED's rojos, la hoja de datos dice que se le debe de aplicar un voltaje 2.1 v y una corriente de 0.02 A (20 mili Amperes), al conectarlo a una fuente con esas características, el diodo enciende.
Pero si vemos bien en la imagen, si limitamos la corriente a 20 mA, el voltaje no es el que viene descrito en la hoja de datos, hay una diferencia de 0.1 V.
Para trabajar con diodos LED, lo primero que debemos de tomar en cuenta, es que no todos los diodos son iguales, la hoja de datos presentará datos nominales, pero en si cada uno es diferente. Al revisar 10 LED's rojos, si la corriente se mantiene constante, el voltaje varia desde los 1.9 V hasta los 2.2 V. Si a todos estos LED's se les alimenta con los 2.1V que dice la hoja de datos, los que funcionaron a los 1.9 V, se terminarán "acabando" mas rápido, debido que a mayor voltaje (del requerido), mayor corriente va a circular, generado calor que es uno de los enemigos de los LED, ya que a mayor temperatura, mayor corriente circula por ellos.
Si no se dispone de una fuente con control de corriente o cómo en mi caso, no es facil agregar un control de corriente (porque soy flojo), podemos simplemente agregar una resistencia que sirva para limitar la corriente.
En algunos de los post pasados hemos usado LED's y algunos de los visitantes del blog me han preguntado si podía hacer una calculadora que sirva para calcular la resistencia para llevarla en el teléfono y eso es lo que haremos, pero no en este post; al igual que en ocasiones anteriores, primero veremos como hacer los cálculos "a mano".
Imaginemos que en algun momento contruyes un velocímetro para una bicicleta y te levantas por las mañanas a hacer tu recorrido, pero un buen dia, por alguna razon las lamparas ddel alumbrado publico no encienden, al inicio supones que es algo normal, ya que las cosas tienden a fallar, pero tras tres semanas te das cuenta que probablemente no las van a reparar en fechas próximas por lo que decides agregarle "iluminacion" a tu bicicleta, pero surge una pregunta ¿Cómo alimentar la iluminacion?
Ultimamente se han hecho bastante accesibles los diodos LED, gracias a su alta eficiencia, son muy utiles a la hora de obtener alimentacion por medio de pilas o baterias pues nos asegura que estas duraran algo de tiempo; cosa que no pasaba antes con las lamparas que usaban filamento incandescentes y que se devoraban las pilas.
Si no has visto cómo es que hice el velocímetro, aun puedes hacerlo pero haciendo memoria, este funciona con un voltaje de 5 v, si intentamos conectar un diodo directamente, este explotaría.
Dependiendo del tipo de diodo LED, este requerirá mas o menos voltaje, en mi caso conseguí LED's de color rojo, amarillo, azul, verde y blanco. Cada uno posee una hoja de datos en la cual podemos cuales son las condiciones para que cada uno de ellos funcione, en el caso de los LED's rojos, la hoja de datos dice que se le debe de aplicar un voltaje 2.1 v y una corriente de 0.02 A (20 mili Amperes), al conectarlo a una fuente con esas características, el diodo enciende.
![]() |
| La corriente esta limitada a 20mA |
Pero si vemos bien en la imagen, si limitamos la corriente a 20 mA, el voltaje no es el que viene descrito en la hoja de datos, hay una diferencia de 0.1 V.
Para trabajar con diodos LED, lo primero que debemos de tomar en cuenta, es que no todos los diodos son iguales, la hoja de datos presentará datos nominales, pero en si cada uno es diferente. Al revisar 10 LED's rojos, si la corriente se mantiene constante, el voltaje varia desde los 1.9 V hasta los 2.2 V. Si a todos estos LED's se les alimenta con los 2.1V que dice la hoja de datos, los que funcionaron a los 1.9 V, se terminarán "acabando" mas rápido, debido que a mayor voltaje (del requerido), mayor corriente va a circular, generado calor que es uno de los enemigos de los LED, ya que a mayor temperatura, mayor corriente circula por ellos.
Si no se dispone de una fuente con control de corriente o cómo en mi caso, no es facil agregar un control de corriente (porque soy flojo), podemos simplemente agregar una resistencia que sirva para limitar la corriente.
En algunos de los post pasados hemos usado LED's y algunos de los visitantes del blog me han preguntado si podía hacer una calculadora que sirva para calcular la resistencia para llevarla en el teléfono y eso es lo que haremos, pero no en este post; al igual que en ocasiones anteriores, primero veremos como hacer los cálculos "a mano".
Aguantando con resistencia.
Para empezar, lo primero que debemos de tomar en cuenta es la ley del Ohm.
- Donde R es la resistencia que se mide en Ohm y su símbolo es "Ω".
- V es el voltaje que se mide en volt y su símbolo es "V".
- I es la corriente que se mide en Ampere y su símbolo es "A".
Para conectar, la resistencia, simplemente debemos de ponerla en serie con el diodo.
De esta forma la resistencia "disipara" el voltaje excedente, es decir si vemos la imagen anterior, tendremos que la resistencia deberá de hacer algo con los 5V de entrada menos los 3.1V del diodo, es decir 5 V - 3.1 V = 1.9 V y aquí es donde entra la ley del Ohm, el revisar la formula, vemos que necesitamos tres componentes: la resistencia, el voltaje y la corriente, pero de estos solo conocemos dos que son: el voltaje y la corriente por lo tanto si sustituimos los valores en la ecuación, tendremos:
Si tenemos un diodo 20 mA a 3.1 V y lo alimentamos con 5 V, necesitamos una resistencia de 95 Ω para que el diodo no se queme.
Ahora supongamos que conectamos diez diodos de las mismas características en paralelo, es posible poner una sola resistencia, pero debemos de tener algunas cosas en consideración, pero primero los cálculos.
Tenemos una corriente de 20 mA * 10 = 200 mA (hay que recordar que en este caso, en paralelo la corriente aumenta pero no el voltaje. Cosa contraria a cuando se hacen las conexiones en serie), el voltaje que "caerá" en la resistencia es el mismo, ya que usamos los mismos 5V para alimentar el circuito.
Al momento de elegir el tipo de resistencia, debemos de tener en cuenta cuanta potencia es capaz de disipar, en esto casos, la resistencia más común de 0.250W por lo que si excedemos esa potencia, esta se destruirá.
Para calcular cual es la potencia que una resistencia debe de soportar, debemos de recurrir a la ley del Watt que la siguiente:
Donde:
- P es la potencia que se mide en Watts y su símbolo es "W".
- V es el voltaje que se mide en Volts y su símbolo es "V".
- I es la corriente que se mide en Ampere y su símbolo es "A".
Tomado el ultimo ejemplo tenemos:
Por lo quedemos de usar una resistencia de 9.5Ω a medio Watt (que es lo mas común).
Dado que toda la energía no usada por el LED es disipada en calor por la resistencia, esta es una forma no muy conveniente de regularlo, pero para pocos LED's sirve.
Y bien, por ahora es todo, en el siguiente post haremos una calculadora para android que nos ayude a calcular la resistencia y la potencia de esta para poder usarlas, además veremos otras posibles soluciones.
Los leo luego.
3/31/2019 03:53:00 p.m.
Basics
,
LED
,
Resistencias
Vamos a programar #30 - El código de Clock View (Android)
Hola de nuevo a todos, el día de hoy vamos a explicar el código que hace funcionar la aplicación de android Clock View.
Para mostrar la interfaz principal, en el Layout principal, debemos de agregar el siguiente código.
Tras implementar el código, la aplicacion lucira algo similar a la siguiente imagen:
Cómo verás, solo consta de 6 botones, una barra de seek y las etiquetas para mostrar texto.
La funcion de cada uno, la veremos en el código Java, pero antes, vamos a terminar con la interfaz. La lista que contiene los dispositivos emparejados, es un layout que solo contiene un list view y su código es el siguiente;
Con esto completamos la parte de la interfaz, además en el código completo he agregado el diseño para cuando la orientacion del dispositivo es vertical y para cuando es horizontal, en lo personal preferí forzar a que la aplicacion siempre este en horizontal, pero eres libre de cambiarla a tu gusto.
Ahora con el código actualizado vamos a ver que hace cada parte del el.
Clock view está compuesto por tres clases, la primera de ellas es la que se encarga de mostrar todos los componente de la interfaz principal (crear lo eventos para los botones, inflar las cosas necesarias, etc), la segunda es ConnectedThread.
La clase ConnectedThread, es la que se va a encarga de enviar y recibir los datos de y hacia la aplicación.
En ella hay dos métodos: run() y write(). En el método run es donde vamos a leer todos los datos que vienen desde el arduino. Lo pasaremos cómo mensaje y despues el manejado h, se encargará de re-direccionar el contenido y mostrarlo en un textview.
El método write(), servirá para enviar datos hacia el arduino, está es la función que se debe de usar para enviar los comandos, por ejemplo, para enviar el comando para mostrar los segundos, debemos de llamar a la función con el parámetro ">DISS" write(">DISS").
La tercera clase es la que se encarga de crear la conexion y mostrar un dialogo de progreso/espera, cuando la conexión se realiza, deja un socket bluetooth listo para usarse.
Cómo verás, la aplicación es realmente sencilla, pero aun queda mucho por agregar a ambas partes de Clock View, por ahora el código fuente completo lo reservo para cuando ya tenga todas la funciones listas, pero con lo anterior, ya puedes crear tu propia versión.
La parte del código para arduino se actualizará, pero ese en cuanto lo cambie, también actualizaré el vinculo en dropbox.
Por ahora es todo, pero a esto aun le resta bastante para que sea un reloj funcional (más funcional).
Los leo luego.
La interfaz.
Antes que nada vamos a empezar ´por la interfaz, para el caso de Clock View esta compuesta de 2 partes. La primera son todos los botones de "acción" y parte principal de la aplicacion; la segunda solo es la lista que se encarga de mostrar todos los dispositivos que estén emparejados al dispositivo.
Para mostrar la interfaz principal, en el Layout principal, debemos de agregar el siguiente código.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.mdev.clockview.MainActivity">
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:text="La hora actual es:"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/TXTView"
tools:ignore="HardcodedText" />
<TextClock
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="14dp"
android:id="@+id/TXTClock"
android:typeface="sans"
android:textAlignment="center"
android:textSize="30sp"
android:fontFamily="monospace"/>
<Button
android:text="Conectar con arduino."
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/BtnConnect"
android:textAlignment="center"
android:textAllCaps="false" />
<Button
android:text="Cambiar 12/24 Horas."
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/BtnFormat" />
<Button
android:text="No/Mostrar segundos."
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/BtnShowS"/>
<Button
android:text="Apagar/Encender matrices"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/BtnOn"/>
<Button
android:text="Sincronizar hora."
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/BtnSync"/>
<TextView
android:text="Nivel de brillo:"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="11dp"
android:layout_marginStart="11dp"
android:layout_marginTop="10dp"
android:id="@+id/textView2" />
<SeekBar
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:id="@+id/SKBrillo"
android:max="15"
android:progress="5" />
<TextView
android:text="Brillo: 15"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/txtSeekValue"/>
<TextView
android:text="Esperando a ClockView."
android:layout_width="match_parent"
android:id="@+id/TxtArduinoReturn"
android:layout_height="wrap_content" />
<Button
android:text="Desconectar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/BtnDisconnect" />
</LinearLayout>
</ScrollView>
</RelativeLayout>
Tras implementar el código, la aplicacion lucira algo similar a la siguiente imagen:
Cómo verás, solo consta de 6 botones, una barra de seek y las etiquetas para mostrar texto.
La funcion de cada uno, la veremos en el código Java, pero antes, vamos a terminar con la interfaz. La lista que contiene los dispositivos emparejados, es un layout que solo contiene un list view y su código es el siguiente;
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/bt_list" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <ListView android:id="@+id/BTList" android:layout_width="match_parent" android:layout_height="200dp" android:headerDividersEnabled="true" android:footerDividersEnabled="false"> </ListView> </LinearLayout>
Con esto completamos la parte de la interfaz, además en el código completo he agregado el diseño para cuando la orientacion del dispositivo es vertical y para cuando es horizontal, en lo personal preferí forzar a que la aplicacion siempre este en horizontal, pero eres libre de cambiarla a tu gusto.
El código en java.
El código en Java, lo he modificado un poco desde la última vez, corregi algunos errores, uno de ellos era: cuando se intentaba hacer la conexion y esta fallaba, al hacer click en cualquier botón, este intentaba mandar algo a traves del socket que supestemente debio de haber sido creado, al no estar disponible, la aplicion "crasheaba" y salia; el error se debia que a pesar de no haber conexion, la condicion que se debia de comprobar era verdadera debido a que se verificaba si el bluetooth estaba activado; la condicion se podia cumplir, pero eso significaria necesariamente que el socket ya se hubiera creado. Para solucionarlo, simplemente use un flag boleano que solo se cambiaba cuando se abria o cerraba la conexion, ahora si no hay conexion, simplemente no se intenta enviar nada.
Ademas coerregi algunos detalles y bugs minimos. El código actualizado es el siguiente:
package com.mdev.clockview;
import android.app.Activity;
import android.app.AlertDialog;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.os.Build;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Handler;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.UUID;
import java.lang.reflect.Method;
import java.util.Set;
import java.util.Calendar;
import static com.mdev.clockview.R.layout.paired_devices_list;
public class MainActivity extends Activity {
BluetoothAdapter myBluetoothAdapter = null;
Button BtnConnect, BtnOnOff, BtnSecondsShow, BtnSyncHour, BtnChangeFormat,BtnDisconnect;
SeekBar SkBright;
TextView TxtArduinoRec, TxtBrigthValue;
String address = null;
private ProgressDialog progress;
BluetoothSocket btSocket = null;
private boolean isBtConnected = false;
private static final UUID myUUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
final int RECEIVE_MESSAGE = 1;
private StringBuilder sb = new StringBuilder();
private ConnectedThread mConnectedThread;
Handler h;
private Set<BluetoothDevice> pairedDevices;
ListView myListView;
ArrayAdapter BTArrayAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
BtnConnect = (Button)findViewById(R.id.BtnConnect);
myListView = (ListView)findViewById(R.id.BTList);
TxtArduinoRec = (TextView)findViewById(R.id.TxtArduinoReturn);
BtnOnOff = (Button)findViewById(R.id.BtnOn);
BtnSecondsShow = (Button)findViewById(R.id.BtnShowS);
BtnSyncHour = (Button)findViewById(R.id.BtnSync);
BtnChangeFormat = (Button)findViewById(R.id.BtnFormat);
BtnDisconnect = (Button)findViewById(R.id.BtnDisconnect);
SkBright = (SeekBar)findViewById(R.id.SKBrillo);
TxtBrigthValue = (TextView)findViewById(R.id.txtSeekValue);
myBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (myBluetoothAdapter == null) {
msg("El bluetooth no es soportado por este dispositivo");
}
else {
msg("Esperando la conexion");
}
SkBright.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener(){
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
TxtBrigthValue.setText("Brillo: " + String.valueOf(progress));
if (isBtConnected)
{
String result = String.format(">SETB%1$02d", progress);
mConnectedThread.write(result);
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
BtnConnect.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (!myBluetoothAdapter.isEnabled()) {
Intent turnOnIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(turnOnIntent, 1);
}else{
showBTDialog();
}
}
});
BtnOnOff.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view){
if (isBtConnected)
{
mConnectedThread.write(">SCRA");
}
}
});
BtnSecondsShow.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view){
if (isBtConnected)
{
mConnectedThread.write(">DISS");
}
}
});
BtnSyncHour.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view){
if (isBtConnected)
{
mConnectedThread.write(BuildHour(true));
}
}
});
BtnChangeFormat.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view){
if (isBtConnected)
{
mConnectedThread.write(">SETF");
}
}
});
BtnDisconnect.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view){
if (isBtConnected)
{
Disconnect();
}
}
});
//encargado de procesar los mensajes.
h = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what)
{
case RECEIVE_MESSAGE:
byte[] readBuf = (byte[]) msg.obj;
String strIncom = new String(readBuf, 0, msg.arg1);
sb.append(strIncom);
int endOfLineIndex = sb.indexOf("\r\n");
if (endOfLineIndex > 0)
{
String sbprint = sb.substring(0, endOfLineIndex);
sb.delete(0, sb.length());
TxtArduinoRec.setText("Data from Arduino: " + sbprint);
}
break;
}
};
};
}
private void msg(String s)
{
Toast.makeText(getApplicationContext(),s,Toast.LENGTH_LONG).show();
}
private String BuildHour(boolean ForArduino){
//>SETH2016122119001004
//>SETHAAAAMMDDHHMMSSWW
Calendar c = Calendar.getInstance();
int DiaSemana = c.get(Calendar.DAY_OF_WEEK);
int Anio = c.get(Calendar.YEAR);
int Mes = c.get(Calendar.MONTH);
int Dia = c.get(Calendar.DAY_OF_MONTH);
int Horas = c.get(Calendar.HOUR_OF_DAY);
int Minutos = c.get(Calendar.MINUTE);
int Segundos = c.get(Calendar.SECOND);
String Fecha = null;
if (ForArduino == true){
Fecha = String.format(">SETH%1$04d%2$02d%3$02d%4$02d%5$02d%6$02d%7$02d",
Anio, Mes + 1, Dia, Horas, Minutos,Segundos, DiaSema);
msg(Fecha);
}else {
Fecha = String.format("%1$04d/%2$02d/%3$02d - %4$02d:%5$02d:%6$02d",
Anio, Mes + 1, Dia, Horas, Minutos,Segundos);
}
return Fecha;
}
private void Disconnect()
{
if (btSocket!=null)
{
try
{
btSocket.close();
isBtConnected = false;
}
catch (IOException e)
{ msg("Error");}
}
}
private AdapterView.OnItemClickListener myListClickListener = new AdapterView.OnItemClickListener()
{
public void onItemClick (AdapterView<?> av, View v, int arg2, long arg3) {
if (myBluetoothAdapter.isEnabled()) {
String info = ((TextView) v).getText().toString();
address = info.substring(info.length() - 17);
msg(info);
} else {
msg("El Bluetooth debe de estar encendido.");
}
}
};
public void showBTDialog() {
final AlertDialog.Builder popDialog = new AlertDialog.Builder(this);
final LayoutInflater inflater = (LayoutInflater) this.getSystemService(LAYOUT_INFLATER_SERVICE);
final View Viewlayout = inflater.inflate(paired_devices_list, (ViewGroup) findViewById(R.id.bt_list));
popDialog.setTitle("Dispositivos Bluetooth:");
popDialog.setView(Viewlayout);
myListView = (ListView) Viewlayout.findViewById(R.id.BTList);
BTArrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);
myListView.setAdapter(BTArrayAdapter);
pairedDevices = myBluetoothAdapter.getBondedDevices();
for(BluetoothDevice device : pairedDevices)
BTArrayAdapter.add(device.getName()+ "\n" + device.getAddress());
myListView.setOnItemClickListener(myListClickListener);
// Button OK
popDialog.setPositiveButton("Conectar",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
if (address != null)
{
new ConnectBT().execute();
}
dialog.dismiss();
}
});
popDialog.create();
popDialog.show();
}
private class ConnectedThread extends Thread {
private final InputStream mmInStream;
private final OutputStream mmOutStream;
public ConnectedThread(BluetoothSocket socket) {
InputStream tmpIn = null;
OutputStream tmpOut = null;
try {
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
} catch (IOException e) { }
mmInStream = tmpIn;
mmOutStream = tmpOut;
}
public void run() {
byte[] buffer = new byte[256];
int bytes;
while (true) {
try {
bytes = mmInStream.read(buffer);
h.obtainMessage(RECEIVE_MESSAGE, bytes, -1, buffer).sendToTarget();
} catch (IOException e) {
break;
}
}
}
public void write(String message) {
byte[] msgBuffer = message.getBytes();
try {
mmOutStream.write(msgBuffer);
} catch (IOException e) {
msg("Error al enviar: " + e.getMessage());
}
}
}
private class ConnectBT extends AsyncTask<Void, Void, Void>
{
private boolean ConnectSuccess = true;
@Override
protected void onPreExecute()
{
progress = ProgressDialog.show(MainActivity.this, "Conectando ("+ address +")...", "Espera...!!!");
}
@Override
protected Void doInBackground(Void... devices)
{
try
{
if (btSocket == null || !isBtConnected)
{
myBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
BluetoothAdapter.getDefaultAdapter().cancelDiscovery();
BluetoothDevice dispositivo = myBluetoothAdapter.getRemoteDevice(address);
btSocket = createBluetoothSocket(dispositivo);
btSocket.connect();
}
}
catch (IOException e)
{
ConnectSuccess = false;
}
return null;
}
private BluetoothSocket createBluetoothSocket(BluetoothDevice device) throws IOException {
if(Build.VERSION.SDK_INT >= 10){
try {
final Method m = device.getClass().getMethod("createInsecureRfcommSocketToServiceRecord", new Class[] { UUID.class });
return (BluetoothSocket) m.invoke(device, myUUID);
} catch (Exception e) {
msg("No se pudo crear la conexion");
}
}
return device.createRfcommSocketToServiceRecord(myUUID);
}
@Override
protected void onPostExecute(Void result)
{
super.onPostExecute(result);
if (!ConnectSuccess)
{
msg("La conexion falló, intentelo de nuevo");
isBtConnected = false;
}
else
{
msg("Conectado.");
isBtConnected = true;
mConnectedThread = new ConnectedThread(btSocket);
mConnectedThread.start();
}
progress.dismiss();
}
}
}
Ahora con el código actualizado vamos a ver que hace cada parte del el.
Clock view está compuesto por tres clases, la primera de ellas es la que se encarga de mostrar todos los componente de la interfaz principal (crear lo eventos para los botones, inflar las cosas necesarias, etc), la segunda es ConnectedThread.
La clase ConnectedThread, es la que se va a encarga de enviar y recibir los datos de y hacia la aplicación.
En ella hay dos métodos: run() y write(). En el método run es donde vamos a leer todos los datos que vienen desde el arduino. Lo pasaremos cómo mensaje y despues el manejado h, se encargará de re-direccionar el contenido y mostrarlo en un textview.
El método write(), servirá para enviar datos hacia el arduino, está es la función que se debe de usar para enviar los comandos, por ejemplo, para enviar el comando para mostrar los segundos, debemos de llamar a la función con el parámetro ">DISS" write(">DISS").
La tercera clase es la que se encarga de crear la conexion y mostrar un dialogo de progreso/espera, cuando la conexión se realiza, deja un socket bluetooth listo para usarse.
Cómo verás, la aplicación es realmente sencilla, pero aun queda mucho por agregar a ambas partes de Clock View, por ahora el código fuente completo lo reservo para cuando ya tenga todas la funciones listas, pero con lo anterior, ya puedes crear tu propia versión.
La parte del código para arduino se actualizará, pero ese en cuanto lo cambie, también actualizaré el vinculo en dropbox.
Por ahora es todo, pero a esto aun le resta bastante para que sea un reloj funcional (más funcional).
Los leo luego.
2/02/2017 05:37:00 p.m.
Android studio
,
Arduino
,
bluetooth
,
capacitores
,
clock view
,
DIY
,
electronica basica
,
how to
,
java
,
LED
,
matriz led
,
max7219
,
programacion
,
Resistencias
,
rfcomm
,
socket bluetooth
Vamos a programar #29 - Inútil Apps #2 - Creando un socket bluetooth (arduino y android)
Hola a todos, el día de hoy vamos a continuar con Clock View. Ahora con todo el hardware listo y con la parte de software de arduino también listo, solo queda crear una forma de interactuar con el hardware de Clock View. Al carecer de botones solo nos queda la opción de usar el modulo Bluetooth, para comunicarnos por medio de este, podemos usar aplicaciones que ya estan disponibles en la Playstore (S2 Terminal for bluetooth por ejemplo), pero esa no es la idea del blog, en la mediada de lo posible trataremos de usar nuestro propio software para hacer las cosas.
El dia de hoy les quiero presentar Clock View para android, una aplicación que tiene cómo unica función; conectar con el modulo bluetooth HC-05 o HC-06 y cambiar los ajustes de Clock View.
La aplicacion dispone de 6 botones y una barra de "seek". Para usarla, primero debes de asegurarte de que todo el hardware está listo, despues debes de iniciar la conexion con el boton "Conectar con clock view", cuando aparace un mensaje diciendo que la conexion se llevo a cabo, puedes modificar los ajustes.
Hoy solo veremos el código, en el siguiente post, explicaré un poco acerca de cómo se realiza el intercambio de datos entre arduino y android.
Cómo todo el código requiere una explicacion detallada (o si no quieres meterte en programacion), por ahora solo dejo el APK ya compilado,
Los leo luego.
El dia de hoy les quiero presentar Clock View para android, una aplicación que tiene cómo unica función; conectar con el modulo bluetooth HC-05 o HC-06 y cambiar los ajustes de Clock View.
La aplicacion dispone de 6 botones y una barra de "seek". Para usarla, primero debes de asegurarte de que todo el hardware está listo, despues debes de iniciar la conexion con el boton "Conectar con clock view", cuando aparace un mensaje diciendo que la conexion se llevo a cabo, puedes modificar los ajustes.
Hoy solo veremos el código, en el siguiente post, explicaré un poco acerca de cómo se realiza el intercambio de datos entre arduino y android.
El código.
El siguiente es el código en java que se encarga de hacer funcionar las cosas, los estilos y demás "layouts", irán en la descarga completa al final del post.
package com.mdev.clockview;
import android.app.Activity;
import android.app.AlertDialog;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.os.Build;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Handler;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.UUID;
import java.lang.reflect.Method;
import java.util.Set;
import java.util.Calendar;
import static com.mdev.clockview.R.layout.paired_devices_list;
public class MainActivity extends Activity {
BluetoothAdapter myBluetoothAdapter = null;
Button BtnConnect, BtnOnOff, BtnSecondsShow, BtnSyncHour, BtnChangeFormat,BtnDisconnect;
SeekBar SkBright;
TextView TxtArduinoRec, TxtBrigthValue;
String address = null;
private ProgressDialog progress;
BluetoothSocket btSocket = null;
private boolean isBtConnected = false;
private static final UUID myUUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
final int RECEIVE_MESSAGE = 1;
private StringBuilder sb = new StringBuilder();
private ConnectedThread mConnectedThread;
Handler h;
private Set<BluetoothDevice> pairedDevices;
ListView myListView;
ArrayAdapter BTArrayAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
BtnConnect = (Button)findViewById(R.id.BtnConnect);
myListView = (ListView)findViewById(R.id.BTList);
TxtArduinoRec = (TextView)findViewById(R.id.TxtArduinoReturn);
BtnOnOff = (Button)findViewById(R.id.BtnOn);
BtnSecondsShow = (Button)findViewById(R.id.BtnShowS);
BtnSyncHour = (Button)findViewById(R.id.BtnSync);
BtnChangeFormat = (Button)findViewById(R.id.BtnFormat);
BtnDisconnect = (Button)findViewById(R.id.BtnDisconnect);
SkBright = (SeekBar)findViewById(R.id.SKBrillo);
TxtBrigthValue = (TextView)findViewById(R.id.txtSeekValue);
myBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (myBluetoothAdapter == null) {
msg("El bluetooth no es soportado por este dispositivo");
}
else {
msg("Esperando la conexion");
}
SkBright.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener(){
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
TxtBrigthValue.setText(String.valueOf(progress));
if (isBtConnected)
{
String result = String.format(">SETB%1$02d", progress);
mConnectedThread.write(result);
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
BtnConnect.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (!myBluetoothAdapter.isEnabled()) {
Intent turnOnIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(turnOnIntent, 1);
}else{
showBTDialog();
}
}
});
BtnOnOff.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view){
if (isBtConnected)
{
mConnectedThread.write(">SCRA");
}
}
});
BtnSecondsShow.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view){
if (isBtConnected)
{
mConnectedThread.write(">DISS");
}
}
});
BtnSyncHour.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view){
if (isBtConnected)
{
mConnectedThread.write(BuildHourToArduino());
}
}
});
BtnChangeFormat.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view){
if (isBtConnected)
{
mConnectedThread.write(">SETF");
}
}
});
BtnDisconnect.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view){
if (isBtConnected)
{
Disconnect();
}
}
});
//encargado de procesar los mensajes.
h = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what)
{
case RECEIVE_MESSAGE:
byte[] readBuf = (byte[]) msg.obj;
String strIncom = new String(readBuf, 0, msg.arg1);
sb.append(strIncom);
int endOfLineIndex = sb.indexOf("\r\n");
if (endOfLineIndex > 0)
{
String sbprint = sb.substring(0, endOfLineIndex);
sb.delete(0, sb.length());
TxtArduinoRec.setText("Data from Arduino: " + sbprint);
}
break;
}
};
};
}
private void msg(String s)
{
Toast.makeText(getApplicationContext(),s,Toast.LENGTH_LONG).show();
}
private String BuildHourToArduino(){
//>SETH2016122119001004
//>SETHAAAAMMDDHHMMSSWW
Calendar c = Calendar.getInstance();
int DiaSemana = c.get(Calendar.DAY_OF_WEEK);
int Anio = c.get(Calendar.YEAR);
int Mes = c.get(Calendar.MONTH);
int Dia = c.get(Calendar.DAY_OF_MONTH);
int Horas = c.get(Calendar.HOUR_OF_DAY);
int Minutos = c.get(Calendar.MINUTE);
int Segundos = c.get(Calendar.SECOND);
String DateForArduino = String.format(">SETH%1$04d%2$02d%3$02d%4$02d%5$02d%6$02d%7$02d",
Anio, Mes + 1, Dia, Horas, Minutos,Segundos, DiaSemana);
msg(DateForArduino);
return DateForArduino;
}
private void Disconnect()
{
if (btSocket!=null)
{
try
{
btSocket.close();
isBtConnected = false;
}
catch (IOException e)
{ msg("Error");}
}
}
private AdapterView.OnItemClickListener myListClickListener = new AdapterView.OnItemClickListener()
{
public void onItemClick (AdapterView<?> av, View v, int arg2, long arg3) {
if (myBluetoothAdapter.isEnabled()) {
String info = ((TextView) v).getText().toString();
address = info.substring(info.length() - 17);
msg(address);
} else {
msg("El Bluetooth debe de estar encendido.");
}
}
};
public void showBTDialog() {
final AlertDialog.Builder popDialog = new AlertDialog.Builder(this);
final LayoutInflater inflater = (LayoutInflater) this.getSystemService(LAYOUT_INFLATER_SERVICE);
final View Viewlayout = inflater.inflate(paired_devices_list, (ViewGroup) findViewById(R.id.bt_list));
popDialog.setTitle("Dispositivos Bluetooth:");
popDialog.setView(Viewlayout);
myListView = (ListView) Viewlayout.findViewById(R.id.BTList);
BTArrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);
myListView.setAdapter(BTArrayAdapter);
pairedDevices = myBluetoothAdapter.getBondedDevices();
for(BluetoothDevice device : pairedDevices)
BTArrayAdapter.add(device.getName()+ "\n" + device.getAddress());
myListView.setOnItemClickListener(myListClickListener);
// Button OK
popDialog.setPositiveButton("Conectar",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
if (address != null)
{
new ConnectBT().execute();
}
dialog.dismiss();
}
});
popDialog.create();
popDialog.show();
}
private class ConnectedThread extends Thread {
private final InputStream mmInStream;
private final OutputStream mmOutStream;
public ConnectedThread(BluetoothSocket socket) {
InputStream tmpIn = null;
OutputStream tmpOut = null;
try {
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
} catch (IOException e) { }
mmInStream = tmpIn;
mmOutStream = tmpOut;
}
public void run() {
byte[] buffer = new byte[256];
int bytes;
while (true) {
try {
bytes = mmInStream.read(buffer);
h.obtainMessage(RECEIVE_MESSAGE, bytes, -1, buffer).sendToTarget();
} catch (IOException e) {
break;
}
}
}
public void write(String message) {
byte[] msgBuffer = message.getBytes();
try {
mmOutStream.write(msgBuffer);
} catch (IOException e) {
msg("Error al enviar: " + e.getMessage());
}
}
}
private class ConnectBT extends AsyncTask<Void, Void, Void>
{
private boolean ConnectSuccess = true;
@Override
protected void onPreExecute()
{
progress = ProgressDialog.show(MainActivity.this, "Conectando...", "Espera...!!!");
}
@Override
protected Void doInBackground(Void... devices)
{
try
{
if (btSocket == null || !isBtConnected)
{
myBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
BluetoothAdapter.getDefaultAdapter().cancelDiscovery();
BluetoothDevice dispositivo = myBluetoothAdapter.getRemoteDevice(address);
btSocket = createBluetoothSocket(dispositivo);
btSocket.connect();
}
}
catch (IOException e)
{
ConnectSuccess = false;
}
return null;
}
private BluetoothSocket createBluetoothSocket(BluetoothDevice device) throws IOException {
if(Build.VERSION.SDK_INT >= 10){
try {
final Method m = device.getClass().getMethod("createInsecureRfcommSocketToServiceRecord", new Class[] { UUID.class });
return (BluetoothSocket) m.invoke(device, myUUID);
} catch (Exception e) {
msg("No se pudo crear la conexion");
}
}
return device.createRfcommSocketToServiceRecord(myUUID);
}
@Override
protected void onPostExecute(Void result)
{
super.onPostExecute(result);
if (!ConnectSuccess)
{
msg("La conexion falló, intentelo de nuevo");
isBtConnected = false;
}
else
{
msg("Conectado.");
isBtConnected = true;
mConnectedThread = new ConnectedThread(btSocket);
mConnectedThread.start();
}
progress.dismiss();
}
}
}
Cómo todo el código requiere una explicacion detallada (o si no quieres meterte en programacion), por ahora solo dejo el APK ya compilado,
Los leo luego.
1/26/2017 06:02:00 p.m.
android
,
bluetooth
,
capacitores
,
clock view
,
ds1302
,
electronica basica
,
how to
,
java
,
LED
,
matriz led
,
max7219
,
programacion
,
Resistencias
,
rfcomm
,
socket bluetooth
Vamos a programar #28 - Inútil Apps #2 - Configurando el bluetooth
El dia de hoy continuaremos con la parte del software para Clock View.
En la entrega anterior prometí agregar una forma para modificar todos los ajustes que pueda llevar Clock View, al carecer de botones, solo hay un par de formas para cambiarlos; una de ellas es mediante un cable USB e introducir el comando adecuado (solo para recordar, es: >SETHXXXXXXXXX), lo cual resultará en algo tedioso o in-practico si no disponemos de una computadora portátil o si la computadora de escritorio está muy lejos del reloj.
La segunda solución y más practica, consiste en agregar un modulo bluetooth, en el post anterior vimos que podemos hacer uso de esa función con simplemente agregar un modulo cuyo precio es de un par de dolares.
Los modelos más comunes son los HC-06 y HC-05, al comprarlos y emparejarlos por primera vez, verás que tienen un nombre por default, pero que pasa si queremos mostrar un nombre más apropiado para nuestro arduino (ClockView por ejemplo).
Para ver una lista completa de todos lo comandos disponibles, puedes ver el este documento. Para usar el código anterior, debemos de conectar el pin TX del bluetooth al pin 2 del arduino, el pin RX al pin 3 y antes de cargar el código, debemos de editar el nombre, la velocidad de transferencia (aunque recomindo dejarla en 9600 para usarse en Clock View) y la contraseña. Si no quieres complicarte, podemos usar los valores tal y como vienen en el código, solo debes recordar que el nombre del dispositivo será "ClockView" y la contraseña será 0000.
Y bien, ahora que tenemos listo todo, solo nos queda por hacer la parte de android para poder comunicarnos con el arduino mediante el telefono.
Al igual que siempre, el código lo puedes descargar de mi dropbox.
Por ahora es todo, los leo luego.
En la entrega anterior prometí agregar una forma para modificar todos los ajustes que pueda llevar Clock View, al carecer de botones, solo hay un par de formas para cambiarlos; una de ellas es mediante un cable USB e introducir el comando adecuado (solo para recordar, es: >SETHXXXXXXXXX), lo cual resultará en algo tedioso o in-practico si no disponemos de una computadora portátil o si la computadora de escritorio está muy lejos del reloj.
La segunda solución y más practica, consiste en agregar un modulo bluetooth, en el post anterior vimos que podemos hacer uso de esa función con simplemente agregar un modulo cuyo precio es de un par de dolares.
Los modelos más comunes son los HC-06 y HC-05, al comprarlos y emparejarlos por primera vez, verás que tienen un nombre por default, pero que pasa si queremos mostrar un nombre más apropiado para nuestro arduino (ClockView por ejemplo).
![]() |
| En este caso el dispositivo se llama Siqueiros Printer. |
Para realizar esta operacion vamos a usar comandos AT, para el modulo HC-06 podemos usar los siguientes:
- Prueba de funcionamiento:
- Comando AT: AT
- Respuesta: OK
- Configurar el Baudrate:
- Enviar: AT+BAUD<Numero>
- El parámetro número es un carácter hexadecimal de ‘1’ a ‘c’ que corresponden a los siguientes Baud Rates:
- 1=1200
- 2=2400
- 3=4800
- 4=9600
- 5=19200
- 6=38400
- 7=57600
- 8=115200
- 9=230400
- A=460800
- B=921600
- C=1382400
- Respuesta: OK<baudrate>
- Configurar el Nombre de dispositivo Bluetooth:
- Comando: AT+NAME<Nombre>
- Respuesta: OKsetname
- Configurar el código PIN de emparejamiento:
- Comando: AT+PIN<pin de 4 dígitos>
- Recibe: OK<pin de 4 dígitos>
- Obtener la versión del firmware:
- Enviar: AT+VERSION
- REspuesta: VERSION
#include <SoftwareSerial.h>
/*CONEXIONES:
5V - VCC
GND - GND
PIN 2 - TX
PIN 3 - RX
*/
//Crea conexion al BlueToothModuletooth - PIN 2 a TX y PIN 3 a RX
SoftwareSerial BlueToothModule(2, 3);
//Nombre de 20 caracteres maximo
char NOMBRE[21] = "ClockView";
// 1=1200 , 2=2400, 3=4800, 4=9600, 5=19200, 6=38400, 7=57600, 8=115200
char BPS = '4';
//PIN O CLAVE de 4 caracteres numericos
char PASS[5] = "0000";
void setup()
{
// inicialmente la comunicacion serial a 9600 Baudios (velocidad de fabrica
BlueToothModule.begin(9600);
pinMode(13,OUTPUT);
delay(4000);
// Inicializa comando AT
BlueToothModule.print("AT");
delay(1000);
// Configura el nuevo nombre
BlueToothModule.print("AT+NAME");
BlueToothModule.print(NOMBRE);
delay(1000);
// Configura la nueva velocidad
BlueToothModule.print("AT+BAUD");
BlueToothModule.print(BPS);
delay(1000);
// Configura el nuevo PIN
BlueToothModule.print("AT+PIN");
BlueToothModule.print(PASS);
delay(1000);
}
void loop()
{
//Nada
}
Para ver una lista completa de todos lo comandos disponibles, puedes ver el este documento. Para usar el código anterior, debemos de conectar el pin TX del bluetooth al pin 2 del arduino, el pin RX al pin 3 y antes de cargar el código, debemos de editar el nombre, la velocidad de transferencia (aunque recomindo dejarla en 9600 para usarse en Clock View) y la contraseña. Si no quieres complicarte, podemos usar los valores tal y como vienen en el código, solo debes recordar que el nombre del dispositivo será "ClockView" y la contraseña será 0000.
Y bien, ahora que tenemos listo todo, solo nos queda por hacer la parte de android para poder comunicarnos con el arduino mediante el telefono.
Al igual que siempre, el código lo puedes descargar de mi dropbox.
Por ahora es todo, los leo luego.
1/19/2017 04:57:00 p.m.
Arduino
,
bluetooth
,
capacitores
,
clock view
,
DIY
,
matriz led
,
max7219
,
programacion
,
Resistencias
Vamos a programar #27 - Inútil Apps #2 - Clock View ++
Hola de nuevo a todos, el día de hoy vamos a continuar con el proyecto ClockView. En entregas anteriores, implementamos las funcionalidades básicas, pero ahora vamos a extender un poco más la funcionalidad.
Si has seguido los últimos post, sabrás que todo se retraso por falta de hardware, pero hace un par de días, llegó todo lo necesario. Al inicio no sabia de que forma iba cambiar los ajustes del reloj, la primer opción era usar botones, pero para mi caso concreto, no sería una opción, ya que acabaría desmontando todo el proyecto para hacer otro, además de que todo lo que se ha armado antes es un prototipo, en un futuro cambiare el arduino uno por un arduino nano, ademas de que agregaría 5 matrices más para mostrar todos los datos, en fin, crear un reloj que se pueda colgar en la pared, cosa que no es el caso ahora porque lo tengo instalado en protoboard.
Para poder usarlo de una forma más sencilla, llegué a la conclusión de que la manera más fácil de cambiar los ajustes, es mediante bluetooth.
Para continuar con el proyecto vamos a usar los siguiente materiales en adición a los que ya teníamos:
Para poder usar todos los componentes, vamos a cambiar las conexiones que ya teníamos antes, esto para evitar complicarnos, es cierto que podemos usar más de un Modulo en el mismo pin mediante el uso de SPI (Serial Peripheral Interface), pero cómo este proyecto está diseñado para ser estático, podemos usar todos los pines disponibles.
Hay que recordar que ya hemos definido algunos comandos entonces si queremos omitir o no cambiar su valor, basta con cambiar una letra del inicio. basado en lo estricto que es cada parámetro, entonces para cambiar al formato de 24 horas, hay que recordar que usamos una variable del tipo boolean, al inicio del código se declara y tiene un valor de verdadero (true), para no hacer ningun tipo de cambio, debemos de hacer que el comando que se guarde en la tarjeta SD no tenga la forma correcta. La manera correcta de hacerlo, seria eliminar la linea que lo contiene, pero en su lugar, decidí simplemente escribir "XSETF", al hacer esto, el reloj permanecerá en formato de 24 horas, esto debido a que el código indica eso, para hacer que al momento de encender el reloj este este en formato de 12 horas, debemos de guardar ">SETF" debido a que cada vez que introducimos ese comando, al momento de ser procesado, simplemente se invierte su valor, por lo que si queremos que este sea falso (false) basta que lo guardemos de esa manera.
Para la funcion "SaveSettings" simplemente sobre-escribimos el texto, para el brillo, siempre tendrá la forma: >SETBnn, donde nn es un número entre 1 y 15, luego >SETF, solo si se quiere que cada vez que el reloj encienda, este tenga el formato de 12 horas, y finalmente >DISS que al igual que >SETF solo se debe de escribir así, cuando NO se quiera mostrar los segundos, si se quiere el valor por default, basta con poner "XDISS". El código lo puedes bajar de mi dropbox.
Bien, por ahora es todo, en el siguiente Post veremos cómo controlar ClockView desde nuestro teléfono móvil. Además me enorgullece decir que el primer reto de XWork ha sido completado, en los proximos dias mostrare al ganado y además, lanzaré el segundo reto.
Los leo luego.
Si has seguido los últimos post, sabrás que todo se retraso por falta de hardware, pero hace un par de días, llegó todo lo necesario. Al inicio no sabia de que forma iba cambiar los ajustes del reloj, la primer opción era usar botones, pero para mi caso concreto, no sería una opción, ya que acabaría desmontando todo el proyecto para hacer otro, además de que todo lo que se ha armado antes es un prototipo, en un futuro cambiare el arduino uno por un arduino nano, ademas de que agregaría 5 matrices más para mostrar todos los datos, en fin, crear un reloj que se pueda colgar en la pared, cosa que no es el caso ahora porque lo tengo instalado en protoboard.
Para poder usarlo de una forma más sencilla, llegué a la conclusión de que la manera más fácil de cambiar los ajustes, es mediante bluetooth.
Para continuar con el proyecto vamos a usar los siguiente materiales en adición a los que ya teníamos:
- 1 Módulo bluetooth H06.
- 1 Módulo de tarjeta lector de tarjeta SD.
![]() |
| Módulo bluetooth HC06, se puede conseguir por un par de dolares. |
Ademas haremos uso de la libreria SD.h (ya incluida en la instalacion del arduino IDE), para controlar la tarjeta SD, en está ya se indican cuales son los pines que se usan para el módulo SD. Entonces para poder usar el código, antes vamos a realizar las siguiente conexiones.
- Del módulo SD:
- CLK al pin 13.
- MISO al pin 12.
- MOSI al pin 11.
- CS al pin 10.
- Para las matrices:
- DIN al pin 9.
- CS al pin 8.
- CLK al pin 7.
- Para el módulo de reloj (DS1302):
- CE(RST) al pin 6.
- IO (DAT) al pin 5.
- SCLK (CLK) al pin 4.
- Para el módulo Bluetooth HC06:
- TXD al pin RX (0) del arduino.
- RXD al pin TX (1) del arduino.
Una vez que las conexiones se han realizado, vamos a ver el código que hace funcionar las cosas.
Algunas partes del código fueron tomadas de los ejemplos que se incluyen con las librerías que se usan.
//Clockview 1.0
#include <DS1302.h>
#include "LedControl.h"
#include <SD.h>
/*
Para la conexión del modulo SD se siguen los siguientes:
** MOSI - pin 11
** MISO - pin 12
** CLK - pin 13
** CS - pin 10 - Este es el que se puede cambiar
*/
//Pin SD
int CS_PIN = 10;
//Constantes para los pines usados en la matriz
const int MaxDIn = 9;
const int MaxCS = 8;
const int MaxCLK = 7;
int MaxNDevices = 3;
bool IsConnected = false;
//Constantes para los pines usados en el reloj
const int kCePin = 6; // RST
const int kIoPin = 5; // Dat
const int kSclkPin = 4; // Serial Clock
//Inicializacion de la matriz
//DIN,CLK,CS
LedControl lc = LedControl(MaxDIn, MaxCLK, MaxCS, MaxNDevices);
//Inicializacion del reloj
DS1302 rtc(kCePin, kIoPin, kSclkPin);
//Algunas variables
File Archivo;
char Texto[24];
int MatrixB = 10;
bool H24 = true;
bool HalfSecond = true;
bool IsScreenEnable = true;
bool ShowSeconds = true;
bool SDCardReady = false;
//Matriz con los "Numeros"
const unsigned char Numbers[] = {
B111110, B100010, B111110, //0
B100100, B111110, B100000, //1
B111010, B101010, B101110, //2
B100010, B101010, B111110, //3
B001110, B001000, B111110, //4
B101110, B101010, B111010, //5
B111110, B101010, B111010, //6
B000010, B000010, B111110, //7
B111110, B101010, B111110, //8
B001110, B001010, B111110, //9
B111110, B001010, B001110, //A - 10
B111110, B001100, B111110, //M - 11
B111110, B001010, B001110, //P - 12
B111110, B001000, B111110, //H - 13
B111110 ,B011010, B101110, //R - 14
};
//Definimos simbolos
const unsigned char Symbols[] = {
B0100010, B0010100, B0001000, B1111111, B0101010, B0010100, //BT 0
B0011110, B0100011, B0101101, B0100101, B0100101, B0011110, //Clock Adjust 1
};
//Imprimir simbolos
void PrintSymbol(byte Index,byte SymDevice){
for (int Y = 1; Y < 7; Y++){
lc.setRow(SymDevice, Y, Symbols[Index * 5 + Y - 1]);
}
}
//Funcion para escribir los numero en la matriz.
void PrintNumber(byte NumberOne, byte NumberTwo, byte Device){
for (int X = 1; X < 8; X++){
if (X < 4){
lc.setRow(Device, X, Numbers[NumberOne * 3 + X - 1]);
}
if (X == 4){
lc.setRow(Device, 4, 0);
}
if (X > 4){
lc.setRow(Device, X, Numbers[NumberTwo * 3 + X - 5]);
}
}
}
//Imprimir el tiempo en las matrices y en el monitor serie
void printTime(){
Time t = rtc.time();
const String day = dayAsString(t.day);
char buf[50];
snprintf(buf, sizeof(buf), "%s %04d-%02d-%02d %02d:%02d:%02d",
day.c_str(), t.yr, t.mon, t.date, t.hr, t.min, t.sec);
PrintNumber(AdjustTime(t.hr, H24) / 10,AdjustTime(t.hr, H24) % 10, 0);
PrintNumber(t.min / 10, t.min % 10, 1);
if (ShowSeconds){
PrintNumber(t.sec / 10, t.sec % 10, 2);
}else{
if(H24)
PrintNumber(13, 14, 2);
if(!H24 && (t.hr-12) < 13)
PrintNumber(10, 11, 2);
if(!H24 && (t.hr-12) > 12)
PrintNumber(10, 12, 2);
}
//PrintSymbol(0, 2);
if (HalfSecond == true){
digitalWrite(3, HIGH);
HalfSecond = false;
}else{
digitalWrite(3, LOW);
HalfSecond = true;
}
Serial.println(buf);
}
//Ajustar la hora
int AdjustTime(int Hour, bool In24Hformat){
if(In24Hformat == true){
return Hour;
}
if(In24Hformat == false && Hour > 12){
Hour = Hour - 12;
return Hour;
}else{
return Hour;
}
}
void SaveSettings(){
Archivo = SD.open("Settings.clv", O_WRITE | O_CREAT);
char SaveBuf[8];
snprintf(SaveBuf, sizeof(SaveBuf), "%s%02d",">SETB", MatrixB);
Serial.println(SaveBuf);
if (Archivo){
Archivo.seek(0);
Archivo.println(SaveBuf);
if(H24)
Archivo.println(">SETF");
else
Archivo.println("XSETF");
if (ShowSeconds)
Archivo.println(">DISS");
else
Archivo.println("XDISS");
Archivo.flush();
Archivo.close();
Serial.println("Guardado");
} else {
Serial.println("error writing test.txt");
}
}
//Cargar los ajustes
void LoadSettings(){
Archivo = SD.open("Settings.clv", FILE_READ);
int B = 0;
byte CurRead;
char SettBuf[22];
if (Archivo) {
while (Archivo.available() > 0){
CurRead = Archivo.read();
if (CurRead != 10 && CurRead != 13){
SettBuf[B] = CurRead;
B++;
Serial.print(B);
}else{
CheckPetition(SettBuf, false);
Serial.print(B);
B = 0;
for (int BF = 0; BF < 22; BF++)
SettBuf[BF]=0;
}
}
Archivo.close();
}else{
Serial.println("error opening file");
}
}
//Comprobar que si hay algun comando
void CheckPetition(char DATA[], bool Save){
int i = 0;
int j = 0;
String Texto(DATA);
//>SETH2016122119001004
if (Texto.startsWith(">DISS")){
ShowSeconds = !ShowSeconds;
if (Save)
SaveSettings();
Serial.print("No/Se muestran los segundos");
for (int CurrentDevice = 0; CurrentDevice < MaxNDevices; CurrentDevice++){
lc.shutdown(CurrentDevice, !IsScreenEnable);
}
for (j = 0; j < 11; j++) {
DATA[j] = 0;
}
i = 0;
}
if (Texto.startsWith(">SCRA")){
IsScreenEnable = !IsScreenEnable;
Serial.print("Las matrices se apagaron/encendieron");
for (int CurrentDevice = 0; CurrentDevice < MaxNDevices; CurrentDevice++){
lc.shutdown(CurrentDevice, !IsScreenEnable);
}
for (j = 0; j < 11; j++) {
DATA[j] = 0;
}
i = 0;
}
if (Texto.startsWith(">RESET")){
SD.remove("Settings.clv");
for (int CurrentDevice = 0; CurrentDevice < MaxNDevices; CurrentDevice++){
lc.shutdown(CurrentDevice, !IsScreenEnable);
}
for (j = 0; j < 11; j++) {
DATA[j] = 0;
}
i = 0;
}
if (Texto.startsWith(">SETF")){
H24 = !H24;
if (Save)
SaveSettings();
Serial.print("EL reloj cambio de formato 12H-24H");
for (j = 0; j < 11; j++) {
DATA[j] = 0;
}
i = 0;
}
if (Texto.startsWith(">SETH")){
AdjustTime(Texto.substring(9, 5).toInt(),Texto.substring(11,9).toInt(),Texto.substring(13, 11).toInt(),
Texto.substring(15, 13).toInt(), Texto.substring(17, 15).toInt(), Texto.substring(19, 17).toInt(),
Texto.substring(21, 19).toInt());
for (j = 0; j < 11; j++) {
DATA[j] = 0;
}
i = 0;
}
if (Texto.startsWith(">SETB")){
MatrixB = Texto.substring(5).toInt();
if (Save)
SaveSettings();
Serial.println("El brillo se cambio");
for (int CurrentDevice = 0; CurrentDevice < MaxNDevices; CurrentDevice++){
lc.setIntensity(CurrentDevice, MatrixB);
}
for (j = 0; j < 11; j++) {
DATA[j] = 0;
}
i = 0;
}
else {
for (j = 0; j < 11; j++) {
DATA[j] = 0;
}
i = 0;
}
}
//Convertir los dias
String dayAsString(const Time::Day day){
switch (day){
case Time::kSunday: return "DOM";
case Time::kMonday: return "LUN";
case Time::kTuesday: return "MAR";
case Time::kWednesday: return "MIE";
case Time::kThursday: return "JUE";
case Time::kFriday: return "VIE";
case Time::kSaturday: return "SAB";
}
return "(unknown day)";
}
//Ajustar la hora
void AdjustTime(int Year,int Month, int Day, int Hour, int Minute, int Second, int DayOfWeek){
Time::Day CurrentDay;
switch (DayOfWeek){
case 1:
CurrentDay = Time::kSunday;
break;
case 2:
CurrentDay = Time::kMonday;
break;
case 3:
CurrentDay = Time::kTuesday;
break;
case 4:
CurrentDay = Time::kWednesday;
break;
case 5:
CurrentDay = Time::kThursday;
break;
case 6:
CurrentDay = Time::kFriday;
break;
case 7:
CurrentDay = Time::kSaturday;
break;
}
//Esta parte se usa para actualizar la hora.
rtc.writeProtect(false);
rtc.halt(false);
Time t(Year, Month, Day, Hour, Minute, Second, CurrentDay);
rtc.time(t);
}
//Inicializar la tarjeta SD para usarla
void InitializeSD(){
pinMode(CS_PIN, OUTPUT);
if (SD.begin()){
SDCardReady = true;
Serial.println("La tarjeta SD esta lista");
}else{
SDCardReady = false;
Serial.println("La tarjeta SD no esta lista");
return;
}
}
//Setup
void setup(){
Serial.begin(9600);
for (int CurrentDevice = 0; CurrentDevice < MaxNDevices; CurrentDevice++){
lc.shutdown(CurrentDevice, false);
lc.setIntensity(CurrentDevice, MatrixB);
lc.clearDisplay(CurrentDevice);
}
InitializeSD();
pinMode(3, OUTPUT);
if(SDCardReady){
LoadSettings();
}else{
Serial.println("La tarjeta no está lista");
}
}
//Loop
void loop(){
int i = 0;
printTime();
delay(500);
if (Serial.available()) {
while (Serial.available() > 0) {
Texto[i] = Serial.read();
i++;
}
Texto[i] = '\0';
}
CheckPetition(Texto, true);
}
Al código que teníamos la primera vez lo hemos modificado, las partes que se agregaron fueron las que se encargan de modificar y guardar los ajustes. la funcion "LoadSettings" se encarga de buscar un archivo llamado "Settings.clv" en la tarjeta SD y lo lee, para procesar lo que se lee, va a usar la misma función que se usaba cuando se enviaba un comando por el monitor serie, es decir para que podamos modificar los ajustes desde la tarjeta de memoria, debemos de guardar los comandos; por ejemplo: >SETB15, si lo guardamos en la tarjeta de memoria, al momento de que se carga, la función buscara por la frase ">SETB", cualquier linea que empiece por esa frase, tratará de ser procesada y hay que recordar que solo si después de ">SETB" hay un numero válido entre 1 y 15, solo entonces el valor se pasará para que sea la intensidad del brillo.Hay que recordar que ya hemos definido algunos comandos entonces si queremos omitir o no cambiar su valor, basta con cambiar una letra del inicio. basado en lo estricto que es cada parámetro, entonces para cambiar al formato de 24 horas, hay que recordar que usamos una variable del tipo boolean, al inicio del código se declara y tiene un valor de verdadero (true), para no hacer ningun tipo de cambio, debemos de hacer que el comando que se guarde en la tarjeta SD no tenga la forma correcta. La manera correcta de hacerlo, seria eliminar la linea que lo contiene, pero en su lugar, decidí simplemente escribir "XSETF", al hacer esto, el reloj permanecerá en formato de 24 horas, esto debido a que el código indica eso, para hacer que al momento de encender el reloj este este en formato de 12 horas, debemos de guardar ">SETF" debido a que cada vez que introducimos ese comando, al momento de ser procesado, simplemente se invierte su valor, por lo que si queremos que este sea falso (false) basta que lo guardemos de esa manera.
Para la funcion "SaveSettings" simplemente sobre-escribimos el texto, para el brillo, siempre tendrá la forma: >SETBnn, donde nn es un número entre 1 y 15, luego >SETF, solo si se quiere que cada vez que el reloj encienda, este tenga el formato de 12 horas, y finalmente >DISS que al igual que >SETF solo se debe de escribir así, cuando NO se quiera mostrar los segundos, si se quiere el valor por default, basta con poner "XDISS". El código lo puedes bajar de mi dropbox.
Bien, por ahora es todo, en el siguiente Post veremos cómo controlar ClockView desde nuestro teléfono móvil. Además me enorgullece decir que el primer reto de XWork ha sido completado, en los proximos dias mostrare al ganado y además, lanzaré el segundo reto.
Los leo luego.
1/12/2017 10:35:00 a.m.
Arduino
,
capacitores
,
ds1302
,
electronica basica
,
how to
,
matriz led
,
max7219
,
programacion
,
Resistencias
Vamos a programar #25 - Inútil Apps #2 - Clock View
Hola a todos, el día de hoy vamos a realizar otro pequeño proyecto con arduino, es muy simple en realidad, pero creo que sirve para reforzar lo básico, además, si cómo yo, eres fanático de los LED's de seguro este proyecto te encantará.
Cuando hice el proyecto para mostrar la información de ITunes en las matrices LED, usaba una librería que se encargaba de desplegar las letras, los números y además, también proporcionaba algunos efectos básicos: scroll a la derecha, scroll a la izquierda, etc.
Para está ocasión, vamos a hacer algo un poco más sencillo, porque me parece un desperdicio de recursos utilizar toda la librería que use en el proyecto antes dicho para mostrar la hora.
Para los componentes de hoy vamos a requerir:
El primer parámetro indica en que dirección se encuentra la matriz que queremos usar (de cero a siete), es decir, si tenemos 4 matrices conectadas en "serie", y queremos prender el primer led de la tercera matriz, tendremos que poner un 3 en el primer parametro.
El segundo parámetro indica en que columna está el LED que queremos encender (mejor dicho controlar).
El tercero indica en que columna está el LED que queremos controlar.
El último parametro indica el estado en que vamos a poner el LED, cuando se pone "True", el LED se enciende y cuando se pone "False", el LED se apaga.
Está funcion recibe 3 parametros, el primero es el mismo que el de la funcion anterior, el segundo indica que fila es la que se va controlar, despues, el ultimo parametro nos indica que LED´s son los que se van a prender.Para este último, hay una forma relativamente sencilla de cómo establecer los LED´s que deben de prender, tomando por ejemplo el numero 2 y el número 5 que queremos mostrar,
Antes que nada, es importante tomar en cuenta donde se ubica el origen, en mi caso (y supongo que para los que tienen un kit similar al que uso yo), el origen se encuentra en la esquina inferior izquierda, viendo la matriz como en la primer imagen, por lo que las columnas están en el lado izquierdo de la matriz y las filas en el lado inferior, entonces los LED's se controlaran de abajo hacia arriba y de izquierda a derecha si usamos la funcion "setRow". una vez que ya has determinado donde empieza la matriz, se deben de hacer los cambios pertinentes.
Para asignar el ultimo parámetro, miremos la imagen anterior, en ella se puede ver claramente que cuando un led está encendido tiene el valor de 1 y cuando está apagado es 0 y cada digito esta compuesto por 3 llamadas a la funcion "setRow", para hacer de forma rapida el dos, podriamos llamar a la función "setRow" y como ultimo parámetro el valor "B00011101" en la primera llamada, en la segunda, el ultimo parametro "B00010101" y en la tercera llamada a la función usar cómo ultimo valor "B00010111".
Cómo los 0´s que están al lado izquierdo no son significativos, podemos omitirlos y simplemente poner "B11101" para la primer llamada a la funcion "setRow", si te fijas en el código, veras que hay algunos valores que conservan los ceros a la izquierda, esto solo es con fines "estéticos" y para que todos los valores estén alineados.
Cuando hice el proyecto para mostrar la información de ITunes en las matrices LED, usaba una librería que se encargaba de desplegar las letras, los números y además, también proporcionaba algunos efectos básicos: scroll a la derecha, scroll a la izquierda, etc.
Para está ocasión, vamos a hacer algo un poco más sencillo, porque me parece un desperdicio de recursos utilizar toda la librería que use en el proyecto antes dicho para mostrar la hora.
Para los componentes de hoy vamos a requerir:
- Un arduino Uno/Mega/Nano.
- Un protoboard.
- Dos o más matrices led con driver Max7219.
- Modulo de reloj en tiempo real con DS1302.
- Liberia "LedControl.h"
- Liberia "DS1302.h"
- Algunos cables jumper para hacer las conexiones.
- Un par de manos (o en su defecto una).
Las conexiones.
Lo primero que debemos de hacer las conexiones entre los componentes. Yo en mi caso voy a usar 3 matrices LED, justo ahora compre más por internet, pero como van a tardar mas de 15 días en llegar, solo usaré las que tengo disponibles.
Las conexiones que voy a poner en este post lo más seguro es que cambien un poco en futuras actualizaciones del proyecto, por lo que si quieres usar pines diferentes en el arduino, eres libre de hacerlo.
Para empezar, vamos a conectar las matrices de izquierda a derecha, es decir si miramos de frente, la primer matriz estará al lado izquierdo, y la ultima estará al lado derecho.
Las conexiones de la matriz que se conecta al arduino irán de las siguiente manera:
- VCC. Se conecta a +5 voltios.
- GND. Se conecta a tierra.
- DIN. Lo conectaremos al pin 12 del arduino.
- CS. Lo conectaremos al pin 11 del arduino.
- CLK. Lo conectaremos al pin 10 del arduino.
- VCC. Se conecta a VCC en la entrada de la siguiente matriz.
- GND. Se conecta a tierra.
- DIN. Lo conectaremos a DIN en la entrada de la siguiente matriz.
- CS. Lo conectaremos a CS en la entrada de la siguiente matriz.
- CLK. Lo conectaremos CLK en la entrada de la siguiente matriz.
Para el modulo de reloj, las conexiones se harán de la siguiente manera:
- VCC. Se conecta a +5 voltios.
- GND. Se conecta a tierra.
- CLK (Serial clock). Lo conectaremos al pin 9 del arduino.
- DAT (IO). Lo conectaremos al pin 8 del arduino.
- RST (Chip enable). Lo conectaremos al pin 7 del arduino.
El código en C.
Primero vamos a ver el código fuente completo y después explicare cada una de las partes que lo compone.
//Clockview 1.0
#include <DS1302.h>
#include "LedControl.h"
//Constantes para los pines usados en la matriz
const int MaxDIn = 12;
const int MaxCS = 11;
const int MaxCLK = 10;
int MaxNDevices = 3;
//Constantes para los pines usados en el reloj
const int kCePin = 7; // RST
const int kIoPin = 8; // Dat
const int kSclkPin = 9; // Serial Clock
//Inicializacion de la matriz
//DIN,CLK,CS
LedControl lc = LedControl(MaxDIn, MaxCLK, MaxCS, MaxNDevices);
//Inicializacion del reloj
DS1302 rtc(kCePin, kIoPin, kSclkPin);
//Algunas variables
int MatrixB = 1;
//Matriz con los "Numeros"
const unsigned char Numbers[] = {
B11111, B10001, B11111, //0
B10010, B11111, B10000, //1
B11101, B10101, B10111, //2
B10001, B10101, B11111, //3
B00111, B00100, B11111, //4
B10111, B10101, B11101, //5
B11111, B10101, B11101, //6
B00001, B00001, B11111, //7
B11111, B10101, B11111, //8
B00111, B00101, B11111, //9
B11111, B00101, B00111, //A
B11111, B01100, B11111, //M
B11111, B00101, B00111, //P
};
//Funcion para escribir los numero en la matriz.
void PrintNumber(byte NumberOne, byte NumberTwo, byte Device){
for (int X = 1; X < 8; X++){
if (X < 4){
lc.setRow(Device, X, Numbers[NumberOne * 3 + X - 1]);
}
if (X == 4){
lc.setRow(Device, 4, 0);
}
if (X > 4){
lc.setRow(Device, X, Numbers[NumberTwo * 3 + X - 5]);
}
}
}
//Imprimir el tiempo en las matrices y en el monitor serie
void printTime(){
Time t = rtc.time();
char buf[10];
snprintf(buf, sizeof(buf), "%02d:%02d:%02d", t.hr, t.min, t.sec);
PrintNumber(t.hr / 10, t.hr % 10, 0);
PrintNumber(t.min / 10, t.min % 10, 1);
PrintNumber(t.sec / 10, t.sec % 10, 2);
Serial.println(buf);
}
//Convertir los dias
String dayAsString(const Time::Day day) {
switch (day){
case Time::kSunday: return "Sunday";
case Time::kMonday: return "Monday";
case Time::kTuesday: return "Tuesday";
case Time::kWednesday: return "Wednesday";
case Time::kThursday: return "Thursday";
case Time::kFriday: return "Friday";
case Time::kSaturday: return "Saturday";
}
return "(unknown day)";
}
//Setup
void setup(){
for (int CurrentDevice = 0; CurrentDevice < MaxNDevices; CurrentDevice++)
{
lc.shutdown(CurrentDevice, false);
lc.setIntensity(CurrentDevice, MatrixB);
lc.clearDisplay(CurrentDevice);
}
Serial.begin(9600);
//Esta parte se usa para actualizar la hora.
//rtc.writeProtect(false);
//rtc.halt(false);
//Time t(2016, 12, 7, 23, 57, 00, Time::kWednesday);
//rtc.time(t);
}
//Loop
void loop() {
printTime();
delay(1000);
}
Lo primero que hacemos es incluir las librerías "LedControl.h" y "DS1302.h", creamos constantes para los pines que usara la primer matriz, para el reloj y después creamos los objetos "lc" y "rtc" para la matriz y para el reloj respectivamente.
El objeto lc se le asigna un objeto "LedControl"; el cual recibe cuatro parámetros: los números de pines a usar, el primer parámetro debe de ser el pin que se usará para conectará a "DIN" en la primer matriz, el segundo conectará a "CLK", el tercero conectará a "CS" y finalmente el cuarto, sirve para indicar cuantas matrices se usarán con ese objeto.
Para el reloj, crearemos un objeto "DS1302" y para "inicializarlo", le pasaremos como parámetros, los pines que se usarán. El primer parámetro es el pin que conecta a "RST", el segundo parámetro es el pin que conecta a "DAT" y finalmente el tercero es el pin que conecta "CLK".
Una vez que tenemos lo objetos listos, creamos unas variables, la primera es "MatrixB" que las usaremos para almacenar el brillo que tendrán las matrices, por ahora la única forma de cambiarlo, es editando el valor que le asignamos, pero un poco mas adelante, seremos capaces de cambiar el brillo de forma externa.
Después viene una matriz que contiene los datos que vamos a usar para crear los "números" que después veremos en las matrices, pero antes de eso hay que saber como es que se controlan los LED´s de las matrices.
El objeto lc se le asigna un objeto "LedControl"; el cual recibe cuatro parámetros: los números de pines a usar, el primer parámetro debe de ser el pin que se usará para conectará a "DIN" en la primer matriz, el segundo conectará a "CLK", el tercero conectará a "CS" y finalmente el cuarto, sirve para indicar cuantas matrices se usarán con ese objeto.
Para el reloj, crearemos un objeto "DS1302" y para "inicializarlo", le pasaremos como parámetros, los pines que se usarán. El primer parámetro es el pin que conecta a "RST", el segundo parámetro es el pin que conecta a "DAT" y finalmente el tercero es el pin que conecta "CLK".
Una vez que tenemos lo objetos listos, creamos unas variables, la primera es "MatrixB" que las usaremos para almacenar el brillo que tendrán las matrices, por ahora la única forma de cambiarlo, es editando el valor que le asignamos, pero un poco mas adelante, seremos capaces de cambiar el brillo de forma externa.
Después viene una matriz que contiene los datos que vamos a usar para crear los "números" que después veremos en las matrices, pero antes de eso hay que saber como es que se controlan los LED´s de las matrices.
LedControl y Matrices LED.
Para este proyecto estamos usando la librería LEdControl.h, está nos ofrece varias maneras de controlar los LED's de la matriz, las funciones disponibles son: setLed, setRow y setColum.
La función setLed tiene una forma similar a la siguiente:
void setLed(int addr, int row, int col, boolean state);
El segundo parámetro indica en que columna está el LED que queremos encender (mejor dicho controlar).
El tercero indica en que columna está el LED que queremos controlar.
El último parametro indica el estado en que vamos a poner el LED, cuando se pone "True", el LED se enciende y cuando se pone "False", el LED se apaga.
void setRow(int addr, int row, byte value);
![]() |
| Como lucirá el numero 25 |
Para asignar el ultimo parámetro, miremos la imagen anterior, en ella se puede ver claramente que cuando un led está encendido tiene el valor de 1 y cuando está apagado es 0 y cada digito esta compuesto por 3 llamadas a la funcion "setRow", para hacer de forma rapida el dos, podriamos llamar a la función "setRow" y como ultimo parámetro el valor "B00011101" en la primera llamada, en la segunda, el ultimo parametro "B00010101" y en la tercera llamada a la función usar cómo ultimo valor "B00010111".
Cómo los 0´s que están al lado izquierdo no son significativos, podemos omitirlos y simplemente poner "B11101" para la primer llamada a la funcion "setRow", si te fijas en el código, veras que hay algunos valores que conservan los ceros a la izquierda, esto solo es con fines "estéticos" y para que todos los valores estén alineados.
Mostrando dígitos en las matrices.
Para mostrar los dígitos en las matrices, he creado una función que se encarga de eso. La función "PrintNumber", recibe tres parámetros, el primero es el primer numero que queremos mostrar (al lado izquierdo), el segundo es el numero que queremos mostrar y finalmente,se debe de indicar en que numero de matriz vamos a despegarlos.
Todos los datos de los numero están pensados de tal forma que se puedan poner dos dígitos por cada matriz, entonces cada una nos da un rango de 00 a 99, pero para mostrar algo cómo la hora. los segundos o los minutos funciona. Para que la función "funcione", debemos de alinear los datos que componen a cada numero, si te fijas bien leemos de tres en tres y debido al acomodo que tiene la matriz "Numbers", cuando le pedimos el número 0, leerá los valores Numbers[0], Numbers[1] y Numbers[2].
La formula que dexcribe cómo se obtienen los valores del primer dígito es la siguiente:
Indice = NumeroDado * 3 +ValorDelIterador - 1Y para el segundo:
Indice = NumeroDado * 3 +ValorDelIterador - 5Y con eso, podemos obtener los valores del 0 al 9 y a partir de ahi, componer cualquier numero. Por eso es importante el orden en que está cada parte de la matriz (arreglo desde este momento para evitar confusiones.).
Completando el resto del código.
La función "PrintTime" se encargará de obtener la hora y de llamar a la función "PrintNumber" para desplegar la información en la matriz LED, debido a que hay que pasar los dígitos por separado, no es posible usar "12" cómo parámetro para la función "PrintNumber", entonces lo que hacemos es dividir, primero entre 10 y para el segundo dígito, solo tomamos el residuo de la división, por lo que si tenemos el numero 21, al hacer la división entre 10, obtenemos 2; este lo pasamos cómo primer parámetro y luego obtenemos el residuo que es 1 y lo asignamos como valor del segundo parámetro, ademas de que la hora la mostramos en el monitor serie, eso es opcional pero para fines de debug funciona.
Después viene la parte de las funciones propias del arduino, "setup()" y "loop()", En la parte de setup, es donde vamos a inicializar los componentes (prácticamente aquí todo lo que se necesita ejecutar una sola vez), ademas hay unas lineas que están comentadas, estas solo sirven para ajustar la hora del reloj, si es la primera vez que vas a usar el modulo de reloj, o si cambias la batería o hiciste cualquier cosa y quieres establecer la fecha y hora, esas lineas las debes de des-comentar y editar solo la que contiene la fecha y hora, cuando hayas cargado el proyecto al arduino, si modificas alguna parte del código y ya no quieres actualizar la hora, debes de comentar de nuevo esas lineas para evitar que la hora se cambie de nueva cuenta.
Finalmente en "loop()" ponemos el código que se va a ejecutar de manera cíclica, en este caso, solo es la función que muestra la hora y un retraso de 1000ms que se usa para que la hora solo se actualice cada segundo.
Y bien, por ahora es todo, pero en el próximo post vamos a agregar un poco mas de hardware para que el uso sea mas sencillo. Cómo siempre, el código lo puedes bajar de mi dropbox para que lo revises.
Por ahora es todo. Los leo luego.
12/08/2016 12:13:00 p.m.
Arduino
,
capacitores
,
DIY
,
ds1302
,
electronica basica
,
matriz led
,
max7219
,
programacion
,
Resistencias
Suscribirse a:
Entradas
(
Atom
)





























