Mostrando las entradas con la etiqueta capacitores. Mostrar todas las entradas
Mostrando las entradas con la etiqueta capacitores. Mostrar todas las entradas
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
Vamos a programar #6 - Inútil-apps #1 - Visualizar información de Itunes en matriz led con arduino.
El día de hoy les voy a mostrar una solución a un pequeño problema al que supongo, muchos de nosotros nos enfrentamos diariamente.
Siempre que me pongo a programar, abro ITunes y pongo un poco de música, pero en ocasiones tengo tantas ventanas abiertas que es difícil saber que es lo que estoy escuchando en ese momento (especialmente porque luego me preguntan que estoy escuchando.).
Por eso el día de hoy decidí hacer algo que me ayudara a saber que es lo que estoy escuchando sin la necesidad de buscar la ventana de itunes. La solución, emplearemos un arduino junto a una matriz de LEDs para mostrar esa información y ahorrarme el trabajo de buscar la ventana cada vez que quiera saber que escucho en ese momento.
¿Que necesitamos?
Las cosas que vamos a usar son la siguientes:
- 1 Arduino (nano, mega, uno)
- 1 matriz de led (Kit que incluye el driver Max7219)
- Compildor de c# (usare #Develop, pero puedes usar el que viene con Visual Studio)
- Arduino IDE
- Cautín
- Soldadura
- Un poco de paciencia.
Paso 1: Las conexiones.
El primer paso seria ensamblar el kit, Si conseguiste uno similar al de la imagen, el proceso de armado es muy sencillo, el capacitor cerámico y la resistencia pueden ir en cualquier orientación, solo hay que tener cuidado de ponerlos en su sitio.
A tener en cuenta.
El capacitor electrolítico posee polaridad, si se conecta de manera incorrecta hay el riesgo de que todo el circuito no funcione o incluso el capacitor puede explotar (literal).
Mas no hay de que preocuparse porque hay manera de identificar como es que se debe de colocar.
![]() |
| Aspecto de la mayoria de los capacitores electroliticos, hay otros diseños, pero por ahora solo de este tipo. |
Si observamos la imagen detenidamente, veremos que hay varias marcas en el capacitor. En primer lugar vemos 1500uF16v, esto nos indica que este capacitor tiene una capacitancia de 1500 micro Farads, ademas indica que el voltaje máximo a manejar es de 16 volts. Despues hay una linea blanca, esta sirve como referencia para indicarnos que es el negativo del capacitor (por ende la otra será el positivo).
Para soldarlo en la placa, hay que revisar donde nos marca el postivo y el negativo para el capacitor.
Esta matriz esta controlada por el integrado Maxx7219CNG.
![]() |
| Imagen 3: Max7219cng |
Una vez que ya está puesto el socket, la manera de saber como ponerlo es sencilla, todos los circuitos integrados que vienen en este tipo de presentación, vienen con una marca, un medio circulo, esto nos indica que ahí esta el primer pin.
![]() |
| Imagen 4: Cómo estan configurados los pines en el Max7219/7221. |
Si conseguiste el kit como el de la primer imagen, deberas de ponerlo de modo que la muesca (medio circulo) quede a la izquierda (viéndolo como en la imagen 2).
Luego continuaremos con las conexiones entre el arduino y el max7219, para eso usaremos el proto-board.
las conexiones se harán de la siguiente manera:
Para el kit
Y con esto ya estaría cubierta toda la parte de la conexión, en el próximo post terminaremos con la implementación del código que hará funcionar las cosas. Ademas si eres de los que no puede conseguir el kit para la matriz LED, también aprenderemos a armar una propia.
Por el momento es todo y los leo la próxima.
La siguiente parte está aquí.
Luego continuaremos con las conexiones entre el arduino y el max7219, para eso usaremos el proto-board.
las conexiones se harán de la siguiente manera:
Para el kit
- DIN lo conectaremos al PIN 12 del arduino.
- CS lo conectaremos al PIN 11 del arduino.
- CLK lo conectaremos al PIN 10 del arduino.
- El PIN 1 del Max7219 al PIN 12 del arduino.
- El PIN 12 del Max7219 al PIN 11 del arduino.
- El PIN 13 del Max7219 al PIN 10 del arduino.
![]() |
| Vista frontal de la matriz conectada al protoboard. |
![]() |
| Vista posterior de la matriz con las conexiones indicadas (Sin la conexion a tierra y VCC) |
![]() |
| Conexion a los pines del arduino. |
Por el momento es todo y los leo la próxima.
La siguiente parte está aquí.
7/12/2016 04:11:00 p.m.
aprende
,
Arduino
,
capacitores
,
csharp
,
DIY
,
electronica basica
,
how to
,
max7219
,
programacion
Suscribirse a:
Entradas
(
Atom
)


















