Sie sind auf Seite 1von 15

UNA APLICACIN DEL

DS1307 RTC
Serie Bus I
2
C
Hoy: Domingo, 16 Marzo 2014, Incluir en favoritos, para volver a
visitarnos. Creado por: V. Garca.
PRACTICO RELOJ.
En el tutorial ds1307reloj ya puse de manifiesto las caractersticas y algunas
capacidades de este pequeo y prctico dispositivo, en el que document el cdigo que
permita poner en hora el reloj que soporta el dispositivo DS1307.
Ahora, tratar de llevar a cabo un proyecto en el que podamos dar cierta utilidad a las
posibilidades que ofrece esta pequea maravilla (es cierto que el mismo fabricante,
dispone de productos ms especializados con los que, se puede disponer de ms
opciones de lectura de los registros que pone a nuestro servicio, alarmas, cronmetros y
ms), sin embargo como el nico que tengo a mano es el DS1307A (*), es con el que
voy a realzar esta prctica.
Partiendo del montaje que se desarroll en el mencionado ds1307reloj, voy a
introducir unas variables y rutinas en el cdigo descrito all para mejorar las
prestaciones que nos proporciona y podemos aprovechar a nuestra voluntad.

Como se desprende de la foto, realic este montaje sobre una pequea porcin de
placa preformada, para dar una ms rpida solucin al proyecto. A pesar de todo, la
exactitud del reloj obtenido, es digna de tener en cuenta, vengo observando que, la
deriva despus de tres meses es de 1 segundo, aunque no puedo 'afinar' ms dado que la
referencia que utilizo es el reloj de mi PC.
Este montaje est basado en el esquema del propio Dallas, actualmente Maxim,
que es el siguiente:

Como se aprecia es muy sencillo, el dispositivo ms critico, como siempre es el cristal
de cuarzo, la exactitud del reloj depende casi exclusivamente de este dispositivo.
Personalmente recomiendo siempre que sea posible uno de los que llevan los relojes de
pulsera que tengamos en desuso, estar bien por que aprovecharemos un producto
probado y nos resulta econmico, por otra parte cumple los requisitos bsicos, tiene una
frecuencia fundamental de oscilacin perfectamente calibrada a los 32.768 kHz, en
cuanto a la estabilidad, es conveniente soldar la cpsula a masa de forma que no
adquiera una alta temperatura al soldarla, para no producir alteraciones en la pastilla de
cuarzo.
Caractersticas.
Las caractersticas del proyecto que emprendemos, pueden ser mejoradas tantas veces
como le parezca necesario al interesado, sin embargo por el momento son las
siguientes:
1.- Puesta en hora y fecha, para iniciar el reloj, mediante la
introduccin de los datos
anteponiendo una "T", en la forma: T(seg) (min)
(hora)(da s)(da) (mes) (ao)
T(00-59)(00-59)(00-23)
(1-7) (01-31)(01-12)(00-99).
2.- Podemos consultar el contenido de la memoria, en
pantalla, mediante Q y el parmetro (1 o 2)
(1- Consultar Memoria y 2- Volcado de Memoria del RTC).
3.- Consultar la fecha mediante el parmetro L, podemos leer
la fecha y la hora actual.
4.- Al mismo tiempo nos indicar la onomstica de algn
familiar o la fiesta del da.
....
n-1.- El interesado, puede usar la caracterstica de
cronmetro, mediante su propio cdigo.
El cdigo.
En principio, vamos a utilizar el mismo cdigo mencionado del ejemplo
anterior, ds1307reloj, al que iremos ampliando en cada nuevo parmetro. Respecto al
cdigo, le doy la versin 2, debido a las mejoras introducidas por mi, si bien es cierto
que me apoyo en rutinas que extraigo de distintas partes (vamos que, como dice aquel
"no fabrico los ladrillos, ni las ventanas, ni los utensilios de bao, para construir el
edificio, y sin embargo, el mrito es del arquitecto").
/*
* RTC Control v.01
* by <http://www.combustory.com> John Vaughters
* Credit to:
* Maurice Ribble - http://www.glacialwanderer.com/hobbyrobotics
for RTC DS1307 code
*
* Con este cdigo se puede establecer la fecha y la hora,
recuperar la fecha y la hora
* y usar la memoria adicional de un chip DS1307 RTC.
* El programa tambin pone todo el espacio de memoria
suplementaria a 0xff.
* mtodo de Comunicacin Serie con el Arduino que, utiliza un
Carcter Mayscula para cada
* orden descrita a continuacin. Ahora tambin, admite el
carcter q (minscula).
* Comandos: T(00-59)(00-59)(00-23)(1-7)(01-31)(01-12)(00-99)
*
* T(sec)(min)(hour)(dayOfWeek)(dayOfMonth)(month)(year) - T
pone la fecha del chip RTC DS1307.
* Ejemplo para poner la fecha y hora: 02-Feb-09 @ 19:57:11
para el da 3 de la semana,
* use la orden - T1157193020209 // T11 57 19 3 02 02 09.
* Q(1-2) -:- (Q1) Consulta Memoria (Q2) RTC - Volcado
Memoria
* mm:ss:hh:ds:DD:MM:AA
* T20:11:18: 4:15:10:09
* T2011184151009 otro: T4034195251209
* ultimo: T4052001110110
*
* Modificado el: 19-09-2009.
* by V. Garca v.01.2 <http://www.hispavila.com>
*
* Ahora, puedes leer la hora y da de la fecha con introducir l
o L
* Para poner en hora y la fecha del chip RTC DS1307, usa t o T:
* ss:mm:hh:ds:DD:MM:AA
* T20:11:18: 4:15:10:09
* ultimo: T4052001110110
*
* El cdigo funciona bien,
*
* Modificado el: 11-01-2010.
* by V. Garca v.02 <http://www.hispavila.com>
*
*/
#include "Wire.h"
#define DS1307_I2C_ADDRESS 0x68 // Esta es la address I2C
// Variables Globales RTC

int command = 0; // Es el comando de carcter, en formato
ASCII, enviados desde el puerto serie
int i;
long previousMillis = 0; // almacenar la ltima vez que Temp
se ha actualizado
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
byte test;
int ledpin = 13; // activa el LED cada consulta

// Convierte nmeros decimales normales a binario codificado
decimal
byte decToBcd(byte val)
{
return ( (val/10*16) + (val%10) );
}

// Convierte binario codificado decimal a nmeros decimales
normales
byte bcdToDec(byte val)
{
return ( (val/16*10) + (val%16) );
}

// 1) Establece la fecha y la hora en el ds1307
// 2) Inicia el reloj
// 3) Establece el modo de hora de reloj a 24 horas
// Se supone que est pasando nmeros vlidos, probablemente
// tendr que controlar poner nmeros vlidos.

void setDateDs1307() {
// Uso de (byte) tipo de conversin ASCII y matemticas para
alcanzar el resultado.

second = (byte) ((Serial.read() - 48) * 10 + (Serial.read() -
48));
minute = (byte) ((Serial.read() - 48) * 10 + (Serial.read() -
48));
hour = (byte) ((Serial.read() - 48) * 10 + (Serial.read() -
48));
dayOfWeek = (byte) (Serial.read() - 48);
dayOfMonth = (byte) ((Serial.read() - 48) * 10 +
(Serial.read() - 48));
month = (byte) ((Serial.read() - 48) * 10 + (Serial.read() -
48));
year = (byte) ((Serial.read() - 48) * 10 + (Serial.read() -
48));
Wire.beginTransmission(DS1307_I2C_ADDRESS); // Empieza
transmisin.
Wire.send(0x00);
Wire.send(decToBcd(second)); // 0 a bit 7 Inicia el reloj
Wire.send(decToBcd(minute));
Wire.send(decToBcd(hour)); // Si quiere 12 horas am/pm
tiene que poner
// bit 6 (tambin tiene que
cambiar readDateDs1307)
Wire.send(decToBcd(dayOfWeek));
Wire.send(decToBcd(dayOfMonth));
Wire.send(decToBcd(month));
Wire.send(decToBcd(year));
Wire.endTransmission(); // Termina transmisin
}

// Extrae la fecha y el tiempo del ds1307 e imprime el resultado
void getDateDs1307(){
// Resetea el registro puntero
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.send(0x00);
Wire.endTransmission();

Wire.requestFrom(DS1307_I2C_ADDRESS, 7);

// Alguna necesitar enmascarar porque ciertos bits son bits
de control
second = bcdToDec(Wire.receive() & 0x7f);
minute = bcdToDec(Wire.receive());
hour = bcdToDec(Wire.receive() & 0x3f); // Tiene que
cambiar esto para 12 hora am/pm.
dayOfWeek = bcdToDec(Wire.receive());
dayOfMonth = bcdToDec(Wire.receive());
month = bcdToDec(Wire.receive());
year = bcdToDec(Wire.receive());

if (hour < 10) Serial.print("0");
Serial.print(hour, DEC);
Serial.print(":");
if (minute < 10) Serial.print("0");
Serial.print(minute, DEC);
Serial.print(":");
if (second < 10) Serial.print("0");
Serial.print(second, DEC);
Serial.print(" ");
if (dayOfMonth < 10) Serial.print("0");
Serial.print(dayOfMonth, DEC);
Serial.print("-");

// if (month < 10) Serial.print("0"); // esto para poner mes
de 01 a 12
// Serial.print(month, DEC);

switch (month) // pone el nombre en e del mes
{
case 1: Serial.print("Ene"); break;
case 2: Serial.print("Feb"); break;
case 3: Serial.print("Mar"); break;
case 4: Serial.print("Abr"); break;
case 5: Serial.print("May"); break;
case 6: Serial.print("Jun"); break;
case 7: Serial.print("Jul"); break;
case 8: Serial.print("Ago"); break;
case 9: Serial.print("Sep"); break;
case 10: Serial.print("Oct"); break;
case 11: Serial.print("Nov"); break;
case 12: Serial.print("Dic"); break;
}
Serial.print("-");
Serial.print("20");
if (year < 10) Serial.print("0");
Serial.print(year, DEC);
// Serial.print(" Hoy es:"); // Da de la semana:
switch (dayOfWeek) // Esto pone nombre del da
{
case 1: Serial.println(" Lunes"); break;
case 2: Serial.println(" Martes"); break;
case 3: Serial.println(" Miercoles"); break;
case 4: Serial.println(" Jueves"); break;
case 5: Serial.println(" Viernes"); break;
case 6: Serial.println(" Sabado"); break;
case 7: Serial.println(" Domingo"); break;
}
}

//
void lectura()
{
// ==== modificado, puesto aqu para que lea bien
int hour;
int minute;
int second;
int month;
int dayOfWeek;
int dayOfMonth;
int year;
// ====

// Below required to reset the register address to 0.
Wire.beginTransmission(104); // transmit to device #104, the
ds1307
Wire.send(0x00);
Wire.endTransmission(); // stop transmitting

Wire.requestFrom(104, 7); // request 7 bytes from slave
ds1307,
we'll assume it'll send them all even
though it doesn't have to
second = Wire.receive();
minute = Wire.receive();
hour = Wire.receive();
dayOfWeek = Wire.receive();
dayOfMonth = Wire.receive();
month = Wire.receive();
year = Wire.receive();

// Convertir todos los valores BCD que podrn tener "decenas" a
decimal.
// Mucha gente en arduino hace esto w/shits pero esto solamente
lo veo ms fcil.
hour=hour/16 * 10 + hour % 16;
minute=minute/16 * 10 + minute % 16;
second=second/16 * 10 + second % 16;
dayOfMonth=dayOfMonth/16 * 10 + dayOfMonth % 16;
month=month/16 * 10 + month % 16;
year=2000 + year/16 * 10 + year % 16;

// Algunas fiestas
Serial.print ("HOLA, hoy es: ");
if (month == 12 && dayOfMonth == 25){ Serial.println ("NAVIDAD
"); }
if (month == 12 && dayOfMonth == 31){ Serial.println ("FIN DE
A? "); }
if (month == 01 && dayOfMonth == 01){ Serial.println ("FELIZ
A? NUEVO "); }
if (month == 03 && dayOfMonth == 17){ Serial.println ("S.
JOSE, FALLAS "); }
// if (month == XX && dayOfMonth == XX){ Serial.print ("Pon el
cumple de xxx "); }

if (year < 10) { Serial.print("0"); }
Serial.print(year);
Serial.print("-");
if (month < 10) { Serial.print("0"); }
Serial.print(month);
Serial.print("-");
if (dayOfMonth < 10) { Serial.print("0"); }
Serial.print(dayOfMonth);
Serial.print(" ");
if (hour < 10) { Serial.print("0"); }
Serial.print(hour);
Serial.print(":");
if (minute < 10) { Serial.print("0"); }
Serial.print(minute);
Serial.print(":");
if (second < 10) { Serial.print("0"); }
Serial.print(second);
Serial.print(" ");

// Serial.print(" "); // Esto pone nombre del da de la
semana:
switch (dayOfWeek) {
case 1: Serial.println(" Lunes"); break;
case 2: Serial.println(" Martes"); break;
case 3: Serial.println(" Miercoles"); break;
case 4: Serial.println(" Jueves"); break;
case 5: Serial.println(" Viernes"); break;
case 6: Serial.println(" Sabado"); break;
case 7: Serial.println(" Domingo"); break;
}

delay(1000); // espera 1 segundo.
}

void setup() {
Wire.begin();
Serial.begin(57600);
pinMode(ledpin, OUTPUT); // para el LED
}

void loop() {
if (Serial.available()) // busca carcter en serie y
procesa si se encuentra
{
command = Serial.read();
if (command == 84 or command == 116) // Si command = "T" o
"t" xa establecer fecha
{
setDateDs1307();
getDateDs1307();
Serial.println(" ");
}
else if (command == 81 or command == 113) //Si command =
"Q" o "q" funciones de memoria
{
delay(50);
if (Serial.available())
{
command = Serial.read();
if (command == 49) // Si command = "1" RTC1307
Inicializa Memoria -
{ // Todos los datos se establecen en
255 (0xff).
// Por lo tanto 255 o 0 ser un
valor no vlido.
//255 ser el valor de inicio y 0 ser
considerado un error
Wire.beginTransmission(DS1307_I2C_ADDRESS);
// que se produce cuando el RTC estn
modo de batera.
Wire.send(0x08);// Ajusta el registro puntero un poco
ms all los registros de fecha/hora.
for (i = 1; i <= 27; i++)
{ Wire.send(0xff);
delay(60); // Al poner 50 reduce tiempo respuesta.
Ajusta el reloj??
} // las lneas comentadas que siguen, no parecen
necesarias, descomentar si procede.
Wire.endTransmission();
getDateDs1307();
// Serial.println(": RTC1307 Initialized Memory");
}
else if (command == 50) // Si command = "2" Volcado
de Memoria RTC1307
{ getDateDs1307();
// Serial.println(": RTC 1307 Dump Begin");
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.send(0x00);
Wire.endTransmission();
Wire.requestFrom(DS1307_I2C_ADDRESS, 64);
for (i = 1; i <= 64; i++)
{ test = Wire.receive();
Serial.print(i);
Serial.print(":");
Serial.println(test, DEC);
}
// Serial.println(" RTC1307 Dump end");
}
}
}
// rutina para, leer fecha actual
else if (command == 76 or command ==108) //Si command
= L o l
{
lectura();
}
}

command = 0; // reset command
delay(70);

}
//*****************************************************The
End***********************/

Que hace el cdigo.
A pesar de que est muy comentado el cdigo, conviene describir un poco, algunas
rutinas del cdigo, para recalcar su importancia. La siguiente lnea, se hace la llamada a
las libreras implicadas en el desarrollo del proyecto, este paso no siempre es necesario,
sin embargo, es conveniente acostumbrarse a utilizarlo para evitar sorpresas al
interpretar los mensajes de error que puedan producirse al procesar el cdigo.
#include
"Wire.h"
La siguiente lnea (en este caso), le indica al compilador la direccin donde debe
empezar la lectura de datos del DS1307A que es, 104 en decimal, en hex 68h y en
binario b1101000. El lector, debe tener muy en cuenta, lo que recomienda el fabricante
en sus Hojas de Datos, evitando as quebraderos de cabeza.
#define
DS1307_I2C_A
DDRESS 0x68
// Esta es
la address
I2C
A partir de aqu se presentan las declaraciones de variables generales
//
Variables
Globales
int
command = 0;
// Es el
comando de
carcter, en
formato
ASCII,
enviados
desde el
puerto serie
int i;
long
previousMill
is = 0; //
almacenar
la ltima
vez que Temp
se ha
actualizado
byte
second,
minute,
hour,
dayOfWeek,
dayOfMonth,
month, year;
byte test;
Es una buena prctica, distribuir las rutinas, despus de las declaraciones de variables,
antes de la configuracin de estados o setup();.
Se deben resaltar, las subrutinas de conversin de decimal a binario y viceversa,
ambas las podemos ver en:
//
Convierte
nmeros
decimales
normales a
binario
codificado
decimal
byte
decToBcd(byt
e val)
{
return (
(val/10*16)
+ (val%10)
);
}
//
Convierte
binario
codificado
decimal a
nmeros
decimales
normales
byte
bcdToDec(byt
e val)
{
return (
(val/16*10)
+ (val%16)
);
}
No menos importante es la subrutina matemtica de (byte) tipo de conversin ASCII
(que interpretar los datos ledos a dgitos caractersticos de presentacin de la fecha),
presente en el cdigo como:
second =
(byte)
((Serial.rea
d() - 48) *
10 +
(Serial.read
() - 48));
minute
= (byte)
((Serial.rea
d() - 48) *
10 +
(Serial.read
() - 48));
hour
= (byte)
((Serial.rea
d() - 48) *
10 +
(Serial.read
() - 48));

dayOfWeek =
(byte)
(Serial.read
() - 48);

dayOfMonth =
(byte)
((Serial.rea
d() - 48) *
10 +
(Serial.read
() - 48));
month
= (byte)
((Serial.rea
d() - 48) *
10 +
(Serial.read
() - 48));
year
= (byte)
((Serial.rea
d() - 48) *
10 +
(Serial.read
() - 48));

Wire.beginTr
ansmission(D
S1307_I2C_AD
DRESS); //
Empieza
transmisin.

Wire.send(0x
00);

Wire.send(de
cToBcd(secon
d)); // 0
a bit 7
Inicia el
reloj

Wire.send(de
cToBcd(minut
e));

Wire.send(de
cToBcd(hour)
); // Si
quiere 12
horas am/pm
tiene que
poner

// bit 6
(tambin
tiene que
cambiar
readDateDs13
07)

Wire.send(de
cToBcd(dayOf
Week));

Wire.send(de
cToBcd(dayOf
Month));

Wire.send(de
cToBcd(month
));

Wire.send(de
cToBcd(year)
);

Wire.endTran
smission();
// Termina
transmisin
Por cierto, observemos que, para leer de un dispositivo, se inicia con un comando
como:

Wire.beginTransmission(DS1307_I2C_ADDRESS)
...
...
y debe terminar con el correspondiente:
Wire.endTransmission(); para cerrar la transmisin. Esto es muy importante.
Otra rutina interesante en este proyecto es la que se encarga de extraer la fecha y el
tiempo del registro interno del ds1307 y que nos permite imprimir el resultado, se trata
de la rutina siguiente:
void getDateDs1307(){
// Primero resetea el registro puntero
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.send(0x00); // pone todo a cero.
Wire.endTransmission();
// luego requiere la lectura de los primeros 7bytes, donde
estn los datos que necesitamos.
Wire.requestFrom(DS1307_I2C_ADDRESS, 7);

// Alguna orden necesitar enmascarar porque ciertos bits
son bits de control
second = bcdToDec(Wire.receive() & 0x7f);
minute = bcdToDec(Wire.receive());
hour = bcdToDec(Wire.receive() & 0x3f); // Tiene que
cambiar esto para 12 hora am/pm.
dayOfWeek = bcdToDec(Wire.receive());
dayOfMonth = bcdToDec(Wire.receive());
month = bcdToDec(Wire.receive());
year = bcdToDec(Wire.receive());
...
}
A este cdigo, le sigue una forma de presentacin de los datos extrados y que cada
cual puede mostrar como mejor le parezca, siempre respetando las reglas de cdigo.
Entre los datos se pueden mostrar los segundos, minutos, horas, da de la semana y la
forma de fecha tradicional de cada zona horaria. A este respecto, debo indicar que
aunque en principio no se aprecie, el modo que se deber utilizar, por sus ventajas es el
de AA-MM-DD, en lugar de dd-mm-aa. A la hora de ordenar una lista de fechas,
viene a demostrar su importancia.
Quiero resaltar que he dado nombre a los meses y los das de la semana en espaol y
otra particularidad es el hecho de mostrar el mensaje de la festividad del da o la
atencin recordatoria de la onomstica de alguna persona afn, cuando pongo:
// Algunas fiestas
Serial.print ("HOLA, hoy es: ");
if (month == XX && dayOfMonth == XX){ Serial.print ("Pon el
cumple de tu pareja "); }
Observar la variante de la orden Serial.print(" "); que muestra el contenido que hay
entre las comillas y/o el valor de la variable y sigue en la misma lnea, en cambio la
orden Serial.println(" "); que muestra el contenido que hay entre las comillas y/o el
valor de la variable y sigue con un fin de lnea y un salto de lnea (CR/CL).
Por Ej. de Serial.print():
int b = 79;
Serial.print(b, DEC) // muestra o enva el valor de b como un nmero decimal en
caracteres ASCII. Mostrar la cadena "79"
Serial.print(b, HEX) // muestra o enva el valor de b como un nmero nmero (79)
decimal, en valor hexadecimal "4F".
Serial.print(b, OCT) // muestra o enva el valor de b como un nmero nmero (79)
decimal, en valor octal "117".
Serial.print(b, BIN) // muestra o enva el valor de b como un nmero nmero (79)
decimal, en valor binario "1001111".
Sentencia SWITCH / case.
El principiante, debe fijarse en la estructura de la sentencia SWITCH / case y en la
forma que aqu se ha empleado. SWITCH, puede tomarse como interruptor o mejor,
conmutador, ya que depende de la entrada, optar por dar una nica salida para esa
entrada, si cambia el valor de la entrada as har la salida. Aqu, se aplica dos veces
sucesivas, una para determinar el nombre del mes que corresponde y en segundo lugar
para el nombre del da de la semana. En al primer caso el valor que adquiera la variable
"month", determinar el nombre del mes, as mismo el valor que tome "dayOfWeek"
determinar a su vez el nombre del da de la semana, parece fcil.
La novedad.
Hasta este punto, podemos decir que ya estaba claro el listado del cdigo, la
"novedad", reside en este punto que, hasta ahora, no podamos consultar la fecha y hora
actuales, salvo que aplicramos un nuevo tiempoT en la entrada (que, por otra parte se
antoja compleja). Aqu empieza la parte ms amigable de este reloj en tiempo real, ya
que cada vez que deseemos conocer la hora actual, bastar con introducir el carcter
"L" o en minsculas "l" de lectura y el programa responder mostrando en el monitor la
fecha, hora y si lo hemos previsto la fiesta que le corresponde, ah esta la novedad.
De esto se encarga la subrutina lectura();, el interesado puede revisar el cdigo para
comprender los pasos que se siguen para lograr este resultado.

Aunque, para ser exactos, debe realizar unos pequeos 'retoques' al cdigo, para
lograr el mismo resultado o incluso mejorarlo. En un prximo artculo, veremos cmo
mejorar el cdigo. Se atreve alguien?.
A tener en cuenta (nota del fabricante).
Cuando el sistema se enciende, la posicin de RAM 0x3f ser comparada con el valor
0x20. Si ste existe, entonces, esto quiere decir que la batera de reserva ha salvado el
contenido de la RAM y todos los registros, por lo tanto, han sido inicializados.
Entonces el software se salta la secuencia inicializacin.
Si no se encuentra el valor 0x20 en dicha direccin, entonces el dispositivo Real Time
Clock es inicializado a los valores siguientes:
Address
Valor
Inicializacin
0 Seconds
0x59 (bit 7
cleared).
1 Minutes
0x59
2 Hours
0x24 (bit 6
cleared).
3 Day
0x07
4 Date
0x31
5 Month
0x12
6
Year 0x99
Estos son todos los nmeros de cdigo binario decimal con
que trabaja el dispositivo reloj de tiempo real. Tenga en cuenta que los valores de
inicializacin se han elegido para que pueda entender lo que la pantalla est mostrando.
Como siempre, comentarios, criticas y sugerencias para mejorar este artculo, son
bienvenidos y apreciados.
Esto es todo, por este simple tutorial, los que quieran leer ms sobre el tema Arduino,
revele esta seccin. ( Mostrar/Ocultar)

Das könnte Ihnen auch gefallen