Está en la página 1de 72

Electrnica avanzada

PROGRAMACIN C
CON ARDUINO

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

ESTRUCTURA DE UN PROGRAMA
La estructura bsica del lenguaje de programacin de Arduino es bastante simple y se
compone de al menos dos partes. Estas dos partes necesarias, o funciones, encierran
bloques que contienen declaraciones, estamentos o instrucciones.
void setup()
{
estamentos;
}
void loop()
{
estamentos;
}
En donde setup() es la parte encargada de recoger la configuracin.

loop() es la que contienen el programa que se ejecutar cclicamente.


Ambas funciones son necesarias para que el programa trabaje.

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

Funcin setup()
Se invoca una sola vez cuando el programa empieza. Se utiliza para inicializar los
modos de trabajo de los pins, o el puerto serie. Debe ser incluido en un programa
aunque no haya declaracin que ejecutar.
void setup()
{
pinMode(pin, OUTPUT); // configura el pin como salida
}
Despus de llamar a setup(), la funcin loop() se ejecuta de forma cclica, lo que
posibilita que el programa este respondiendo continuamente ante los eventos que se
produzcan en la tarjeta
void loop()
{
digitalWrite(pin, HIGH);
delay(1000);
digitalWrite(pin, LOW);
delay(1000);
}

// pone en uno (on, 5v) el pin


// espera un segundo (1000 ms)
// pone en cero (off, 0v.) el pin

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

FUNCIONES
Una funcin es un bloque de cdigo que tiene un nombre y un conjunto de
parametros que son ejecutados cuando se llama a la funcin.
Las funciones de usuario pueden ser escritas para realizar tareas repetitivas y para
reducir el tamao de un programa.
Las funciones se declaran asociadas a un tipo de valor type. Este valor ser el que
devolver la funcin, por ejemplo:
int se utilizar cuando la funcin devuelva un dato numrico de tipo entero. Si la
funcin no devuelve ningn valor entonces se colocar delante la palabra void, que
significa funcin vaca.
type nombreFuncin(parmetros)
{
estamentos;
}
Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

Las llaves {}
sirven para definir el principio y el final de un bloque de instrucciones. Se utilizan para
los bloques de programacin setup(), loop(), if.., etc.

type funcion()
{
estamentos;
}
Una llave de apertura { siempre debe ir seguida de una llave de cierre }, si no es as
el programa dar errores.
El entorno de programacin de Arduino incluye una herramienta de gran utilidad para
comprobar el total de llaves. Slo tienes que hacer click en el punto de insercin de una
llave abierta e inmediatamente se marca el correspondiente cierre de ese bloque (llave
cerrada).

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

El punto y coma ;
se utiliza para separar instrucciones en el lenguaje de programacin de Arduino. Tambin
se utiliza para separar elementos en una instruccin de tipo bucle for.
int x = 13; // declara la variable 'x' como tipo entero de valor 13
Nota: Olvidarse de poner fin a una lnea con un punto y coma se traducir en un error de
compilacin

Los bloques de comentarios, o multi-lnea de comentarios /**/


Son reas de texto ignorados por el programa que se utilizan para las descripciones del
cdigo o comentarios que ayudan a comprender el programa. Comienzan con / * y
terminan con * / y pueden abarcar varias lneas.
/* esto es un bloque de comentario no se debe
olvidar cerrar los
*/
Los comentarios son ignorados por el programa y no ocupan espacio en la memoria
de Arduino. Pueden ser utilizados con generosidad y tambin pueden utilizarse
para "comentar" bloques de cdigo con el propsito de anotar informaciones para
depuracin.
Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

Lnea de comentario //
Empieza con // y terminan con la siguiente lnea de cdigo. Al igual que los comentarios
de bloque, los de lnea son ignoradas por el programa y no ocupan espacio en la
memoria.
// esto es un comentario
Una lnea de comentario se utiliza a menudo despus de una instruccin, para
proporcionar ms informacin acerca de lo que hace esta o para recordarla ms
adelante.

Variables
Una variable es una manera de nombrar y almacenar un valor numrico para su uso
posterior por el programa. Como su nombre indica, las variables son nmeros que se
pueden variar continuamente en contra de lo que ocurre con las constantes cuyo valor
nunca cambia. Una variable debe ser declarada y, opcionalmente, asignarle un valor.
El siguiente cdigo de ejemplo declara una variable llamada variableEntrada y luego le
asigna el valor obtenido en la entrada analgica del PIN2:
int variableEntrada = 0; // declara una variable y le asigna el valor 0
variableEntrada = analogRead(2); // la variable recoge el valor analgico del PIN2
Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

Contina Variables
Una vez que una variable ha sido asignada, o re-asignada, se puede probar su valor para
ver si cumple ciertas condiciones (instrucciones if..), o puede utilizar directamente su
valor.

Ejemplo :
el siguiente cdigo prueba si la variable entradaVariable es inferior a 100, si es cierto se
asigna el valor 100 a entradaVariable y, a continuacin, establece un retardo (delay)
utilizando como valor entradaVariable que ahora ser como mnimo de valor 100:

if (entradaVariable < 100) // pregunta si la variable es menor de 100


{
entradaVariable = 100; // si es cierto asigna el valor 100 a esta
}
delay(entradaVariable); // usa el valor como retardo

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

Declaracion de variables
Todas las variables tienen que declararse antes de que puedan ser utilizadas.
Para declarar una variable se comienza por definir su tipo como:
int (entero), long (largo), float (coma flotante), etc, asignndoles siempre un
nombre, y opcionalmente, un valor inicial.
Esto slo debe hacerse una vez en un programa, pero el valor se puede cambiar en
cualquier momento usando aritmtica y reasignaciones diversas.
El siguiente ejemplo declara la variable entradaVariable como una variable de tipo entero
int, y asignndole un valor inicial igual a cero.
int entradaVariable = 0;
Una variable puede ser declarada en una serie de lugares del programa y en funcin
del lugar en donde se lleve a cabo la definicin esto determinar en que partes del
programa se podr hacer uso de ella.

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

Utilizacin de una variable


Una variable puede ser declarada:
Al inicio del programa
Antes de la parte de configuracin setup(),

A nivel local dentro de las funciones,


A veces, dentro de un bloque, como para los bucles del tipo if.. for.., etc.

Una variable global es aquella que puede ser vista y utilizada por cualquier funcin y
estamento de un programa. Esta variable se declara al comienzo del programa, antes de
setup().
Una variable local es aquella que se define dentro de una funcin o como parte de un
bucle. Slo es visible y slo puede utilizarse dentro de la funcin en la que se declar.

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

Ejemplo de declaracin de unos tipos diferentes de variables y la visibilidad de


cada variable:
int value;
// 'value' es visible para cualquier funcin
void setup()
{
// no es necesario configurar
}
void loop()
{
for (int i=0; i<20;) // 'i' solo es visible
{
// dentro del bucle for
i++;
}
float f;
// 'f' es visible solo
}
// dentro del bucle

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

Byte
Byte almacena un valor numrico de 8 bits sin decimales. Tienen un rango entre 0 y
255
byte unaVariable = 180; // declara 'unaVariable' como tipo byte

Int
Enteros son un tipo de datos primarios que almacenan valores numricos de 16 bits sin
decimales comprendidos en el rango 32,767 to -32,768.
int unaVariable = 1500; // declara 'unaVariable' como una variable de tipo entero
Nota:

Las variables de tipo entero int pueden sobrepasar su valor mximo o mnimo como consecuencia de una
operacin. Por ejemplo, si x = 32767 y una posterior declaracin agrega 1 a x, x = x + 1 entonces el valor se x pasar a
ser -32.768. (algo como que el valor da la vuelta)

Long
El formato de variable numrica de tipo extendido long se refiere a nmeros enteros
(tipo 32 bits) sin decimales que se encuentran dentro del rango -2147483648 a
2147483647.
long unaVariable = 90000; // declara 'unaVariable' como tipo long

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

float
El formato de dato del tipo punto flotante float se aplica a los nmeros con
decimales. Los nmeros de punto flotante tienen una mayor resolucin que los de 32 bits
con un rango comprendido 3.4028235E +38 a +38-3.4028235E.
float unaVariable = 3.14; // declara 'unaVariable' como tipo flotante

arrays
Un array es un conjunto de valores a los que se accede con un nmero ndice. Cualquier
valor puede ser recogido haciendo uso del nombre de la matriz y el nmero del ndice. El
primer valor de la matriz es el que est indicado con el ndice 0. Un array tiene que ser
declarado y opcionalmente asignados valores a cada posicin antes de ser utilizado.

int miArray[] = {valor0, valor1, valor2...}


Del mismo modo es posible declarar una matriz indicando el tipo de datos y el tamao y
posteriormente, asignar valores a una posicin especifica:

int miArray[5]; // declara un array de enteros de 6 posiciones


miArray[3] = 10; // asigna l valor 10 a la posicin 4

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

Para leer de un array basta con escribir el nombre y la posicin a leer:


x = miArray[3]; // x ahora es igual a 10 que est en la posicin 3 del array
Ejemplo:
int ledPin = 10; // Salida LED en el PIN 10
byte parpadeo[] = {180, 30, 255, 200, 10, 90, 150, 60}; // array de 8 valores
diferentes
void setup()
{
pinMode(ledPin, OUTPUT); //configura la salida PIN 10
}
void loop() // bucle del programa
{
for(int i=0; i<8; i++) // crea un bucle tipo for utilizando la variable i de 0 a 7
{
// escribe en la salida PIN 10 (PWM) el valor al que apunta i dentro del array parpadeo[]
analogWrite(ledPin, parpadeo[i]);
delay(200); // espera 200ms
}
}

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

Aritmtica
Los operadores aritmticos que se incluyen en el entorno de programacin son suma,
resta, multiplicacin y divisin. Estos devuelven la suma, diferencia, producto, o cociente
(respectivamente) de dos operandos.
y = y + 3;
x = x - 7;
i = j * 6;
r = r / 5;
La operaciones se efecta teniendo en cuanta el tipo de datos que hemos definido para
los operandos (int, dbl, float, etc..),

Ejemplo: si definimos 9 y 4 como enteros int, 9 / 4 devuelve de resultado 2 en lugar de


2,25 ya que el 9 y 4 se valores de tipo entero int (enteros) y no se reconocen los
decimales con este tipo de datos.

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

Asignaciones compuestas
Las asignaciones compuestas combinan una operacin aritmtica con una variable
asignada. Estas son comnmente utilizadas en los bucles tal como se describe ms
adelante. Estas asignaciones compuestas pueden ser:

x ++
x -x += y
x -= y
x *= y
x /= y

// igual que x = x + 1, o incrementar x en + 1


// igual que x = x - 1, o decrementar x en -1
// igual que x = x + y, o incrementra x en +y
// igual que x = x - y, o decrementar x en -y
// igual que x = x * y, o multiplicar x por y
// igual que x = x / y, o dividir x por y

Nota: Por ejemplo, x * = 3 hace que x se convierta en el triple del antiguo valor x y por lo
tanto x es reasignada al nuevo valor .

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

Operadores de comparacion
Las comparaciones de una variable o constante con otra se utilizan con frecuencia en las
estructuras condicionales del tipo if.. para testear si una condicin es verdadera.
x == y
x != y
x<y
x>y
x <= y
x >= y

// x es igual a y
// x no es igual a y
// x es menor que y
// x es mayor que y
// x es menor o igual que y
// x es mayor o igual que y

Operadores logicos
Los operadores lgicos son usualmente una forma de comparar dos expresiones y
devolver un VERDADERO o FALSO dependiendo del operador. Existen tres operadores
lgicos, AND (&&), OR (||) y NOT (!), que a menudo se utilizan en estamentos de tipo if..:
Logical AND:
if (x > 0 && x < 5) // cierto slo si las dos expresiones son ciertas
Logical OR:
if (x > 0 || y > 0) // cierto si una cualquiera de las expresiones
es cierta
Logical NOT:
if (!x > 0) // cierto solo si la expresin es falsa
Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

Constantes
El lenguaje de programacin de Arduino tiene unos valores predeterminados,
que son llamados constantes. Se utilizan para hacer los programas ms
fciles de leer. Las constantes se clasifican en grupos.

cierto/falso (true/false)
Estas son constantes booleanas que definen los niveles HIGH (alto) y LOW
(bajo) cuando estos se refieren al estado de las salidas digitales. FALSE se
asocia con 0 (cero), mientras que TRUE se asocia con 1, pero TRUE tambin
puede ser cualquier otra cosa excepto cero. Por lo tanto, en sentido
booleano, -1, 2 y -200 son todos tambin se define como TRUE. (esto es
importante tenerlo en cuanta)
if (b == TRUE);
{
ejecutar las instrucciones;
}

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

HIGH/LOW
Estas constantes definen los niveles de salida altos o bajos y se utilizan
para la lectura o la escritura digital para las patillas.
ALTO se define como en la lgica de nivel 1, ON, 5 voltios, mientras que
BAJO es lgica nivel 0, OFF, o 0 voltios.
digitalWrite(13, HIGH); // activa la salida 13 con un nivel alto (5v)

INPUT/OUTPUT
Estas constantes son utilizadas para definir, al comienzo del programa, el
modo de funcionamiento de los pines mediante la instruccin pinMode de tal
manera que el pin puede ser una entrada INPUT o una salida OUTPUT.
pinMode(13, OUTPUT); // designamos que el PIN 13 es una salida

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

IF
if es un parametro que se utiliza para probar si una determinada condicin
se ha alcanzado, y ejecutar una serie de declaraciones (operaciones) que
se escriben dentro de llaves, si es verdad.
Si es falso (la condicin no se cumple) el programa salta y no ejecuta las
operaciones que estn dentro de las llaves, El formato para if es el
siguiente:

if (unaVariable ?? valor)
{
ejecutaInstrucciones;
}
Se puede comparar una variable con un valor, el cual puede ser una
variable o constante.
Tener en cuenta el smbolo '=', poner dentro de if (x = 10), podra parecer valido. Sin
embargo, no lo es ya que esa expresin asigna el valor 10 a la variable x, por eso
dentro de la estructura if se utilizara X==10 que en este caso lo que hace el
programa es comprobar si el valor de x es 10..

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

if else
if else viene a ser un estructura que se ejecuta en respuesta a la idea si
esto no se cumple haz esto otro. Por ejemplo, si se desea probar una
entrada digital, y hacer una cosa si la entrada fue alto o hacer otra cosa si
la entrada es baja, usted escribira que de esta manera:
if (inputPin == HIGH) // si el valor de la entrada inputPin es alto
{
instruccionesA; //ejecuta si se cumple la condicin
}
else
{
instruccionesB; //ejecuta si no se cumple la condicin
}
Else puede ir precedido de otra condicin de manera que se pueden
establecer varias estructuras condicionales de tipo unas dentro de las otras
(anidamiento) de forma que sean mutuamente excluyentes pudindose
ejecutar a la vez. Es incluso posible tener un nmero ilimitado de estos
condicionales.

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada
Ejemplo:

un conjunto de declaraciones se llevar a cabo dependiendo de la condicin


probada:

if (inputPin < 500)


{
instruccionesA; // ejecuta las operaciones A
}
else if (inputPin >= 1000)
{
instruccionesB; // ejecuta las operacione B
}
else
{
instruccionesC; // ejecuta las operaciones C
}

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

for
La declaracin for se usa para repetir un bloque de sentencias
encerradas entre llaves un nmero determinado de veces.

Cada vez que se ejecutan las instrucciones del bucle se vuelve a testear la
condicin.
La declaracin
sintaxis:

for

tiene tres partes separadas por (;). Ejemplo de su

for (inicializacin; condicin; expresin)


{
ejecutaInstrucciones;
}

La inicializacin de una variable local se produce una sola vez y la


condicin se verifica cada vez que se termina la ejecucin de las
instrucciones dentro del bucle. Si la condicin sigue cumplindose, las
instrucciones del bucle se vuelven a ejecutar. Cuando la condicin no se
cumple, el bucle termina.

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

Continua for
Ejemplo:
El siguiente ejemplo inicia el entero i en el 0, y la condicin es probar que el
valor es inferior a 20 y si es cierto i se incrementa en 1 y se vuelven a
ejecutar las instrucciones que hay dentro de las llaves:

for (int i=0; i<20; i++) // declara i, prueba que es menor que
20, incrementa i en 1
{
digitalWrite(13, HIGH); // enva un 1 al pin 13
delay(250); // espera seg.
digitalWrite(13, LOW); // enva un 0 al pin 13
delay(250); // espera de seg.
}

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

While
Un bucle del tipo while es un bucle de ejecucin continua mientras se
cumpla la expresin colocada entre parntesis en la cabecera del bucle. La
variable de prueba tendr que cambiar para salir del bucle. La situacin
podr cambiar a expensas de una expresin dentro el cdigo del bucle o
tambin por el cambio de un valor en una entrada de un sensor
while (unaVariable ?? valor)
{
ejecutarSentencias;
}
El siguiente ejemplo testea si la variable "unaVariable es inferior a 200 y,
si es verdad, ejecuta las declaraciones dentro de los corchetes y
continuar ejecutando el bucle hasta que 'unaVariable' no sea inferior a
200.
While (unaVariable < 200) // verifica si es menor que 200
{
instrucciones; // ejecuta las instrucciones entre llaves
unaVariable++; // incrementa la variable en 1
}
Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

Do while
El bucle do while funciona de la misma manera que el bucle while, con la
salvedad de que la condicin se prueba al final del bucle, por lo que el bucle
siempre se ejecutar al menos una vez.
do
{
Instrucciones;
} while (unaVariable ?? valor);
El siguiente ejemplo asigna el valor ledo leeSensor() a la variable 'x', espera
50 milisegundos, y luego continua mientras que el valor de la 'x' sea inferior a
100:
do
{
x = leeSensor();
delay(50);
} while (x < 100);

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

pinMode(pin, mode)
Esta instruccin es utilizada en la parte de configuracin setup () y sirve
para configurar el modo de trabajo de un PIN pudiendo ser INPUT (entrada) u
OUTPUT (salida).

pinMode(pin, OUTPUT); // configura pin como salida

Los terminales de Arduino, por defecto, estn configurados como entradas,


por lo tanto no es necesario definirlos en el caso de que vayan a trabajar
como entradas.
Los pines configurados como entrada quedan, bajo el punto de vista
elctrico, como entradas en estado de alta impedancia.

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

Continua pinMode(pin, mode)


Estos pines tienen a nivel interno una resistencia de 20 K a las que se
puede acceder mediante software. Estas resistencias se accede de la
siguiente manera:
pinMode(pin, INPUT); // configura el pin como entrada
digitalWrite(pin, HIGH); // activa las resistencias internas
Las resistencias internas normalmente se utilizan para conectar las
entradas a interruptores.

Los pins configurado como OUTPUT (salida) se dice que estn en un


estado de baja impedancia y pueden proporcionar 40 mA a otros
dispositivos. Esta corriente es suficiente para alimentar un diodo LED, pero
no es lo suficiente grande como para alimentar cargas de mayor consumo
como rels, solenoides, o motores.

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

digitalRead(pin)
Lee el valor de un pin (definido como digital) dando un resultado HIGH (alto)
o LOW (bajo). El pin se puede especificar ya sea como una variable o una
constante (0-13).
valor = digitalRead(Pin); // hace que 'valor sea igual al estado ledo en Pin

digitalWrite(pin, value)
Enva al pin definido previamente como OUTPUT el valor HIGH o LOW
(poniendo en 1 o 0 la salida). El pin se puede especificar ya sea como una
variable o como una constante (0-13).
digitalWrite(pin, HIGH); // deposita en el 'pin' un valor HIGH (alto o 1)

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada
El siguiente ejemplo lee el estado de un pulsador conectado a una entrada
digital y lo escribe en el pin de salida LED:

int led = 13; // asigna a LED el valor 13


int boton = 7; // asigna a botn el valor 7
int valor = 0; // define el valor y le asigna el valor 0
void setup()
{
pinMode(led, OUTPUT); // configura el led (pin13) como salida
pinMode(boton, INPUT); // configura botn (pin7) como entrada
}
void loop()
{
valor = digitalRead(boton); //lee el estado de la entrada botn
digitalWrite(led, valor); // enva a la salida ledel valor ledo
}

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

analogRead(pin)
Lee el valor de un determinado pin definido como entrada analgica con una
resolucin de 10 bits. Esta instruccin slo funciona en los pines (0-5). El
rango de valor que podemos leer oscila de 0 a 1023.
valor = analogRead(pin); // asigna a valor lo que lee en la entrada pin
Nota: Los pins analgicos (0-5) a diferencia de los pines digitales, no
necesitan ser declarados como INPUT u OUPUT ya que son siempre INPUTs.

analogWrite(pin, value)
Esta instruccin sirve para escribir un pseudo-valor analgico utilizando el
procedimiento de modulacin por ancho de pulso (PWM) a uno de los pins
de Arduino marcados como pin PWM.

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

Contina analogWrite(pin, value)


El valor que se puede enviar a estos pines de salida analgica puede
darse en forma de variable o constante, pero siempre con un margen de
0-255.
analogWrite(pin, valor); // escribe 'valor' en el 'pin' definido como Analgico
Si enviamos el valor 0 genera una salida de 0 voltios en el pin
especificado; un valor de 255 genera una salida de 5 voltios de salida en
el pin especificado. Para valores de entre 0 y 255, el pin saca tensiones
entre 0 y 5 voltios - el valor HIGH de salida equivale a 5v.

Debido a que esta es una funcin de hardware, en el pin de salida analgica


(PWM) se generar una onda constante despus de ejecutada la instruccin
analogWrite hasta que se llegue a ejecutar otra instruccin analogWrite (o
una llamada a digitalRead o digitalWrite en el mismo pin).

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada
El siguiente ejemplo lee un valor analgico de un pin de entrada analgica,
convierte el valor dividindolo por 4, y enva el nuevo valor convertido a una
salida del tipo PWM o salida analgica:

int led = 10; // define el pin 10 como led


int analog = 0; // define el pin 0 como analog
int valor; // define la variable valor
void setup(){} // no es necesario configurar entradas y salidas
void loop()
{
valor = analogRead(analog); // lee el pin 0 y lo asocia a la variable valor
valor /= 4; / /divide valor entre 4 y lo reasigna a valor
analogWrite(led, value); // escribe en el pin 10 valor
}

delay(ms)
Detiene la ejecucin del programa la cantidad de tiempo en ms que se
indica en la propia instruccin. De tal manera que 1000 equivale a 1seg.
delay(1000); // espera 1 segundo
Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

millis()
Devuelve el nmero de milisegundos transcurrido desde el inicio del programa
en Arduino hasta el momento actual. Normalmente ser un valor grande
(dependiendo del tiempo que este en marcha la aplicacin despus de cargada
o despus de la ltima vez que se puls el botn reset de la tarjeta)..
valor = millis(); // valor recoge el nmero de milisegundos

min(x,y)
Calcula el mnimo de dos nmeros para cualquier tipo de datos devolviendo el
nmero ms pequeo.
valor = min(valor, 100); // asigna a valor el ms pequeos de los dos nmeros
especificados.
Si 'valor' es menor que 100 valor recoger su propio valor si valor es mayor
que 100 valor pasara a valer 100.

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

max(x,y)
Calcula el mximo de dos nmeros para cualquier tipo de datos devolviendo
el nmero mayor de los dos.
valor = max(valor, 100); // asigna a valor el mayor de los dos nmeros 'valor' y
100.

Serial.begin(rate)
Abre el puerto serie y fija la velocidad en baudios para la transmisin de
datos en serie. El valor tpico de velocidad para comunicarse con el
ordenador es 9600, aunque otras velocidades pueden ser soportadas.
void setup()
{
Serial.begin(9600); // abre el Puerto serie
} // configurando la velocidad en 9600 bps

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

Serial.println(data)
Imprime los datos en el puerto serie, seguido por un retorno de carro
automtico y salto de lnea. Este comando toma la misma forma que
Serial.print (), pero es ms fcil para la lectura de los datos en el Monitor
Serie del software.
Serial.println(analogValue); // enva el valor 'analogValue' al puerto
El siguiente ejemplo toma de una lectura analgica pin0 y enva estos
datos al ordenador cada 1 segundo.

void setup()
{
Serial.begin(9600); // configura el puerto serie a 9600bps
}
void loop()
{
Serial.println(analogRead(0)); // enva valor analgico
delay(1000); // espera 1 segundo
}
Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

Serial.printnl(data, data type)


Enva un nmero o una cadena de carateres al puerto serie, seguido de un
caracter de retorno de carro "CR" (ASCII 13, or '\r')y un caracter de salto de
lnea "LF"(ASCII 10, or '\n'). Toma la misma forma que el comando
Serial.print()
Serial.println(b) vuelca o enva el valor de b como un nmero decimal en
caracteres ASCII seguido de "CR" y "LF".
Serial.println(b, DEC) vuelca o enva el valor de b como un nmero decimal
en caracteres ASCII seguido de "CR" y "LF".
Serial.println(b, HEX) vuelca o enva el valor de b como un nmero
hexdecimal en caracteres ASCII seguido de "CR" y "LF".

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada
Serial.println(b, OCT) vuelca o enva el valor de b como un nmero Octal en
caracteres ASCII seguido de "CR" y "LF".
Serial.println(b, BIN) vuelca o enva el valor de b como un nmero binario en
caracteres ASCII seguido de "CR" y "LF".
Serial.print(b, BYTE) vuelca o enva el valor de b como un byte seguido de
"CR" y"LF".
Serial.println(str) vuelca o enva la cadena de caracteres como una cadena
ASCII seguido de "CR" y "LF".
Serial.println() slo vuelca o enva "CR" y "LF". Equivaldra a printNewline().

Serial.print(data, data type)


Enva un nmero o una cadena de carateres, al puerto serie. Dicho comando
puede tomar diferentes formas, dependiendo de los parmetros que
utilicemos para definir el formato de volcado de los nmeros.

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

Parmetros:
data: el nmero o la cadena de caracteres a volcar o enviar.
data type: determina el formato de salida de los valores numricos (decimal,
octal, binario, etc...) DEC, OCT, BIN, HEX, BYTE , si no se pe nada vuelva
ASCII
Ejemplos
Serial.print(b)
Vuelca o enva el valor de b como un nmero decimal en caracteres ASCII.
Equivaldraa printInteger().
int b = 79; Serial.print(b); // prints the string "79".
Serial.print(b, DEC)
Vuelca o enva el valor de b como un nmero decimal en caracteres ASCII.
Equivaldra a printInteger().
int b = 79;
Serial.print(b, DEC); // prints the string "79".

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

Serial.Read()
int Serial.Read() Lee o captura un byte (un carcter) desde el puerto serie.
Equivaldra a la funcin serialRead().
Devuelve :El siguiente byte (carcter) desde el puerto serie, o -1 si no hay ninguno.
Ejemplo:
int incomingByte = 0; // almacenar el dato serie
void setup() {
Serial.begin(9600); // abre el puerto serie,y le asigna la velocidad de 9600 bps
}
void loop() {
// enva datos slo si los recibe:
if (Serial.available() > 0) {
// lee el byte de entrada:
incomingByte = Serial.read();
//lo vuelca a pantalla
Serial.print("I received: ");
Serial.println(incomingByte, DEC);
}
}

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

Tipo de datos

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

Los nombres de las variables validas pueden contener:


1.- Caracteres de a hasta z y de A hasta Z
2.- Carcter de subrayado ( _ )
3.- Caracteres numricos del 0 al 9 siempre y cuando no sean usados como primer carcter

Nombres de variables vlidos pueden ser:


juan

Juan ohm

ampere

volt dinero day1 Week50

_system XfXf

Utilizando las mismas reglas, lo siguiente no sera nombres vlidos:


^carat

4Julio -negativeo @URL

%porcentaje not-Good This&That

what?

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

ENCENDIDO Y APAGADO DE UN LED


/*
Enciende y apaga un led 1 seg.
*/
// El Pin 13 tiene un LED conectado en la mayora de las tarjetas de Arduino
// Asignando un nombre al pin:
int led = 13;
// La rutina de setup se ejecuta al pulsar el reset
void setup() {
// Inicializando el pin digital como salida.
pinMode(led, OUTPUT);
}
// La rutina se ejecuta en un bucle infinito:
void loop() {
digitalWrite(led, HIGH); // Enciende LED
delay(1000);
// Retardo de 1 seg.
digitalWrite(led, LOW); // Apagar LED
delay(1000);
// Retardo de 1 seg.
}

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

ENCENDIDO Y APAGADO DE UN LED


Formas de establecer los comentarios:
/*
Enciende y apaga un led 1 seg.
*/
// El Pin 13 tiene un LED conectado en la mayora de las tarjetas de Arduino
// Asignando un nombre al pin:

Observar que ninguna de las lneas termina en punto y coma.


Es decir, ninguna de estas lneas forma parte de las declaraciones del programa C
Todas las declaraciones del programa en C deben terminar en punto y coma

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

ENCENDIDO Y APAGADO DE UN LED


La sentencia define una variable led de tipo entero.
El operador de asignacin establece que el programa inicializa el valor dado de 13.
Terminal No 13 donde esta el led regularmente
int led = 13;

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada
La Funcin setup( )

El segmento de programa hace referencia a la funcin setup () que es llamada


cuando se reinicia el programa, esto es caracterstico de los programas en C
para Arduino.
El setup ( ) marca el punto de partida para todos los programas de Arduino;
aunque el estndar de C siempre inicia los programas con la funcin main ( ).

void setup() {
// Inicializando el pin digital como salida.
pinMode(led, OUTPUT);
}

pinMode () establece el modo de operacin, dndole la informacin que la funcin


necesita para realizar su trabajo como argumentos de la funcin (led, OUTPUT).
Argumento 1: pin a seleccionar (13 = Led)
Argumento 2: Entrada o salida (salida = OUTPUT). Debe estar en maysculas
Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

La Funcin Loop ( )
Despus que la funcin setup () completa su trabajo, los programas de C de
Arduino llaman automticamente a la funcin Loop ()

void loop() {
digitalWrite(led, HIGH); // Enciende LED
delay(1000);
// Retardo de 1 seg.
digitalWrite(led, LOW); // Apagar LED
delay(1000);
// Retardo de 1 seg.
}

Dentro de la funcin, el programa llama a la funcin preescrita digitalWrite ( )


requiriendo dos argumentos:
Argumento 1: Nmero de pin E/S a escribir
Argumento 2: El estado en el cual se desea colocar el pin de E/S

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

Enciende y apaga un led con un interruptor


int ledPin= 13;
int inPin= 5;
int val= 0;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(inPin, INPUT);
}
void loop(){
val= digitalRead(inPin);
if(val== HIGH) {
digitalWrite(ledPin, LOW);
}
else{
digitalWrite(ledPin, LOW);
delay(200);
digitalWrite(ledPin, HIGH);
delay(200);
}
}

// choose the pin for the LED


// choose the input pin (for a pushbutton)
// variable for reading the pin status
// declare LED as output
// declare pushbutton as input

// lee valor de entrada


// chequea si el valor ledo es 1 (botn presionado)
// pone el LED en OFF

// parpadea el LED

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

Secuencia de encendido de leds


int ledPin0 = 0; // Define las salidas de los LEDs
int ledPin1 = 1;
int ledPin2 = 2;
int ledPin3 = 3;
int ledPin4 = 4;
int ledPin5 = 5;
int ledPin6 = 6;
int ledPin7 = 7;
void setup() { // Configura las SALIDAS
pinMode(ledPin0, OUTPUT); // declarar LEDs como SALIDAS
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(ledPin3, OUTPUT);
pinMode(ledPin4, OUTPUT);
pinMode(ledPin5, OUTPUT);
pinMode(ledPin6, OUTPUT);
pinMode(ledPin7, OUTPUT);
}
// Apaga y enciende los leds
void loop(){
digitalWrite(ledPin0, HIGH); //cada 200 ms
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, LOW);
digitalWrite(ledPin3, LOW);
digitalWrite(ledPin4, LOW);
digitalWrite(ledPin5, LOW);
digitalWrite(ledPin6, LOW);
digitalWrite(ledPin7, LOW);
delay(200);

digitalWrite(ledPin0, LOW);
digitalWrite(ledPin1, HIGH);
digitalWrite(ledPin2, LOW);
digitalWrite(ledPin3, LOW);
digitalWrite(ledPin4, LOW);
digitalWrite(ledPin5, LOW);
digitalWrite(ledPin6, LOW);
digitalWrite(ledPin7, LOW);
delay(200);
digitalWrite(ledPin0, LOW);
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, HIGH);
digitalWrite(ledPin3, LOW);
digitalWrite(ledPin4, LOW);
digitalWrite(ledPin5, LOW);
digitalWrite(ledPin6, LOW);
digitalWrite(ledPin7, LOW);
delay(200);
digitalWrite(ledPin0, LOW);
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, LOW);
digitalWrite(ledPin3, HIGH);
digitalWrite(ledPin4, LOW);
digitalWrite(ledPin5, LOW);
digitalWrite(ledPin6, LOW);
digitalWrite(ledPin7, LOW);
delay(200);
digitalWrite(ledPin0, LOW);
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, LOW);
digitalWrite(ledPin3, LOW);

digitalWrite(ledPin4, HIGH);
digitalWrite(ledPin5, LOW);
digitalWrite(ledPin6, LOW);
digitalWrite(ledPin7, LOW);
delay(200);
digitalWrite(ledPin0, LOW);
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, LOW);
digitalWrite(ledPin3, LOW);
digitalWrite(ledPin4, LOW);
digitalWrite(ledPin5, HIGH);
digitalWrite(ledPin6, LOW);
digitalWrite(ledPin7, LOW);
delay(200);
digitalWrite(ledPin0, LOW);
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, LOW);
digitalWrite(ledPin3, LOW);
digitalWrite(ledPin4, LOW);
digitalWrite(ledPin5, LOW);
digitalWrite(ledPin6, HIGH);
digitalWrite(ledPin7, LOW);
delay(200);
digitalWrite(ledPin0, LOW);
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, LOW);
digitalWrite(ledPin3, LOW);
digitalWrite(ledPin4, LOW);
digitalWrite(ledPin5, LOW);
digitalWrite(ledPin6, LOW);
digitalWrite(ledPin7, HIGH);
delay(200);
}
Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

Secuencia de encendido de leds


SIM1

AREF

RP1
1
2
3
4
5
6
7
8
9

7
~6
~5

4
~3
2
TX > 1
RX < 0

10
9
8
7
6
5
4
3
2
1

ATMEL

www.arduino.cc
blogembarcado.blogspot.com

DIGITAL (PWM~)

ANALOG IN

SIMULINO

POWER

A0
A1
A2
A3
A4
A5

ATMEGA328P

5V
GND

13
12
~11
~10
~9
8

ARDUINO

RESET

RESPACK-8

SIMULINO UNO

U1

11
12
13
14
15
16
17
18
19
20

LED-BARGRAPH-RED

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

Secuencia de encendido de leds usando FOR


int pinArray[] = {0, 1, 2, 3, 4, 5, 6, 7}; // PINES
int count = 0; // Contador
int timer = 100; // Temporizador
void setup(){
SIM1

AREF

RP1
1
2
3
4
5
6
7
8
9

7
~6
~5

4
~3
2
TX > 1
RX < 0

10
9
8
7
6
5
4
3
2
1

ATMEL

www.arduino.cc
blogembarcado.blogspot.com

DIGITAL (PWM~)

SIMULINO

ANALOG IN

A0
A1
A2
A3
A4
A5

ATMEGA328P

5V
GND

13
12
~11
~10
~9
8

ARDUINO

RESET

POWER

RESPACK-8

SIMULINO UNO

U1
LED-BARGRAPH-RED

11
12
13
14
15
16
17
18
19
20

// Configuracin de todos los pines


for (count=0;count<8;count++) {
pinMode(pinArray[count], OUTPUT);
}
}
void loop() {
// Enciende los LED creando una estela visual
for (count=0;count<8;count++) {
digitalWrite(pinArray[count], HIGH);
delay(timer);
}
for (count=8;count>0;count--) {
digitalWrite(pinArray[count], LOW);
delay(timer);
}
}

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada
void setup() { // Configura las SALIDAS
DDRD=0B11111111;//Configuracin de puerto D como salida
PORTD=0B00000000;
}
void loop(){ //Bucle de Funcionamiento
PORTD=0B00000000;
while(1) {
PORTD=0B00000001;
delay(200);
PORTD=0B00000010;
delay(200);
PORTD=0B00000100;
delay(200);
PORTD=0B00001000;
delay(200);
PORTD=0B00010000;
delay (200);
PORTD=0B00100000;
delay (200);
PORTD=0B01000000;
delay (200);
PORTD=0B10000000;
delay (200);
PORTD=0B01000000;
delay (200);
PORTD=0B00100000;
delay (200);
PORTD=0B00010000;
delay (200);
PORTD=0B00001000;
delay(200);
PORTD=0B00000100;
delay(200);
PORTD=0B00000010;
delay(200);
}
}
Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

Uso de interruptor para activar una carga


int ledPin = 2; // PIN del LED
int inPin = 10; // PIN del pulsador
int value = 0; // Valor del pulsador
void setup() {
pinMode(ledPin, OUTPUT); // Inicializa el pin 13 como salida digital
pinMode(inPin, INPUT); // Inicializa el pin 10 como entrada digital
}
void loop() {
value = digitalRead(inPin); // Lee el valor de la entrada digital SIM1
digitalWrite(ledPin, value);
}

AREF

ATMEL

www.arduino.cc
blogembarcado.blogspot.com

SIMULINO UNO

R2
330R

DIGITAL (PWM~)

ANALOG IN

SIMULINO

POWER

A0
A1
A2
A3
A4
A5

ATMEGA328P

5V
GND

13
12
~11
~10
~9
8

ARDUINO

RESET

7
~6
~5

4
~3
2
TX > 1
RX < 0

R1
330R

D1
LED-RED

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

Uso de push button para activar una carga


//Estas constantes no cambian
const int PBpin = 10;
// Asignacin de nombre a pin donde se conecta el Push Button
const int ledPin = 2;
// Asignacin de nombre a pin donde se
int on=0;
//conecta el LED

AREF

www.arduino.cc
blogembarcado.blogspot.com

SIMULINO UNO

R2
330R

DIGITAL (PWM~)

SIMULINO

ANALOG IN

A0
A1
A2
A3
A4
A5

ATMEGA328P

5V
GND

13
12
~11
~10
~9
8

ARDUINO

RESET

POWER

void loop() {
// Lee el estado del valor del push button
if (digitalRead(PBpin)==1) {
digitalWrite(ledPin, HIGH); // ON LED
OFF: if (digitalRead(PBpin)==1) goto OFF; // ENCLAVA
on++;
}
if (on==2){
on=0;
digitalWrite(ledPin, LOW); //OFF LED
}
}

SIM1

ATMEL

void setup() {
// Inicializa pin de salida donde se conecta el LED:
pinMode(ledPin, OUTPUT);
// Inicializa pin de entrada donde se conecta el Push button:
pinMode(PBpin, INPUT);
}

7
~6
~5

4
~3
2
TX > 1
RX < 0

R1
330R

D1
LED-RED

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

DESPLAZA UN LED ENCENDIDO CADA VEZ QUE SE OPRIME EL PUSH BOTTOM


int PBpin = 10; // Asignacin de nombre a pin donde se conecta el Push Button
short numero[8]={0x80,0x40,0x20,0X10,0X08,0X04,0X02,0X01}; //datos de salida
int pinArray[ ] = {0, 1, 2, 3, 4, 5, 6, 7}; //pines usados como salidas
short count=0, cuenta=0; //inicializa contadores
void setup() {
for (count=0;count<8;count++) { // Inicializa pines de salida
pinMode(pinArray[count], OUTPUT);
}
SIM1
pinMode(PBpin,HIGH); //Inicializa pines de entrada
}
AREF

R2
330R

RP1
1
2
3
4
5
6
7
8
9

7
~6
~5

4
~3
2
TX > 1
RX < 0

10
9
8
7
6
5
4
3
2
1

ATMEL

www.arduino.cc
blogembarcado.blogspot.com

DIGITAL (PWM~)

SIMULINO

ANALOG IN

A0
A1
A2
A3
A4
A5

ATMEGA328P

5V
GND

13
12
~11
~10
~9
8

ARDUINO

RESET

POWER

SIMULINO UNO

RESPACK-8

U1
LED-BARGRAPH-RED

11
12
13
14
15
16
17
18
19
20

void loop(){
if(digitalRead(PBpin)==1){ //sondea push button
PORTD=numero[cuenta];
cuenta++;
next: if(digitalRead(PBpin)==1) goto next;
}
if (cuenta==8){
cuenta=0;
}
}

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

Conteo con display de 7 segmentos


int pausa=1000; // Variable que define el intervalo
// de tiempo entre cada digito

void loop() //Funcion principal


// Dependiendo de cada dgito, se enva a la funcin display
// los estados (0 y 1) a cada uno de los segmentos
void setup()
{
{
display (1,1,1,1,1,1,0); //escribe 0
pinMode(7, OUTPUT); // Asignacin de las salidas digitales
delay(pausa);
pinMode(8, OUTPUT);
display (0,1,1,0,0,0,0); //escribe 1
pinMode(9, OUTPUT);
delay(pausa);
pinMode(10, OUTPUT);
display (1,1,0,1,1,0,1); //escribe 2
pinMode(11, OUTPUT);
delay(pausa);
pinMode(12, OUTPUT);
display (1,1,1,1,0,0,1); //escribe 3
pinMode(13, OUTPUT);
delay(pausa);
}
display (0,1,1,0,0,1,1); //escribe 4
delay(pausa);
void display (int a, int b, int c, int d, int e, int f, int g)
display (1,0,1,1,0,1,1); //escribe 5
// Funcion del display
delay(pausa);
{
display (1,0,1,1,1,1,1); //escribe 6
digitalWrite (7,a); //Se reciben 7 variables y se asignan
delay(pausa);
digitalWrite (8,b); //a cada una de las salidas
display (1,1,1,0,0,0,0); //escribe 7
digitalWrite (9,c);
delay(pausa);
digitalWrite (10,d);
display (1,1,1,1,1,1,1); //escribe 8
digitalWrite (11,e);
delay(pausa);
digitalWrite (12,f);
display (1,1,1,0,0,1,1); //escribe 9
digitalWrite (13,g);
delay(pausa);
}
}

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

Conteo con display de 7 segmentos


RP1
RESPACK-8

2
3
4
5
6
7
8
9

SIM1

AREF

ATMEL

DIGITAL (PWM~)

ANALOG IN

SIMULINO

POWER

A0
A1
A2
A3
A4
A5

ATMEGA328P

5V
GND

13
12
~11
~10
~9
8

ARDUINO

RESET

7
~6
~5

4
~3
2
TX > 1
RX < 0

www.arduino.cc
blogembarcado.blogspot.com

SIMULINO UNO

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

Conteo con display de 7 segmentos


int pinArray[ ] = {0, 1, 2, 3, 4, 5, 6}; //pines usados como salidas
short numero[10]={0x7E,0x30,0x6D,0X79,0X33,0X5B,0X5F,0X70,0X7F,0X73};
int count=0, cuenta=0;
void setup()
{
for (count=0;count<7;count++) { // Inicializa pines de salida
pinMode(pinArray[count], OUTPUT);
}
}
RP1
RESPACK-8

2
3
4
5
6
7
8
9

1
AREF

RESET

ATMEL

DIGITAL (PWM~)

SIMULINO

ANALOG IN

A0
A1
A2
A3
A4
A5

ATMEGA328P

5V
GND

13
12
~11
~10
~9
8

ARDUINO

SIM1

POWER

void loop(){
PORTD=numero[cuenta];
cuenta++;
delay(1000);
if (cuenta==10){
cuenta=0;
}

7
~6
~5

4
~3
2
TX > 1
RX < 0

www.arduino.cc
blogembarcado.blogspot.com

SIMULINO UNO

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

LCD
#include <LiquidCrystal.h>// librera del LCD

Configuracin de librera
* LCD RS pin to digital pin 12
* LCD Enable pin to digital pin 11
* LCD D4 pin to digital pin 5
* LCD D5 pin to digital pin 4
* LCD D6 pin to digital pin 3
* LCD D7 pin to digital pin 2
* 10K resistor:
* ends to +5V and ground
* wiper to LCD VO pin (pin 3)

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
lcd.begin(16, 2);
}
void loop() {
lcd.setCursor(0,0); //(columna,renglon)
lcd.write(" MAESTRIA EN ");
lcd.setCursor(0,1);
lcd.write(" ELECTRONICA ");
delay(1500);
lcd.setCursor(0,0); //(columna,renglon)
lcd.print(" ESTA FACIL ");
lcd.setCursor(0,1);
lcd.print(" ES PARA BEBES ");
delay(1500);
lcd.clear();
lcd.setCursor(4,0); //(columna,renglon)
lcd.print("PRACTICAR");
lcd.setCursor(3,1);
lcd.print("ES LA CLAVE");
delay(1500);
}

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

LCD
LCD1

LCD1

4
~3
2
TX > 1
RX < 0

ATMEGA328P

ATMEL

D0
D1
D2
D3
D4
D5
D6
D7

7
~6
~5

4
~3
2
TX > 1
RX < 0

www.arduino.cc
blogembarcado.blogspot.com

www.arduino.cc
blogembarcado.blogspot.com

SIMULINO UNO

SIMULINO UNO

LCD1

4
5
6

1
2
3

D0
D1
D2
D3
D4
D5
D6
D7

VSS
VDD
VEE

SIM1

RS
RW
E

LM016L

7
8
9
10
11
12
13
14

ATMEGA328P

DIGITAL (PWM~)

A0
A1
A2
A3
A4
A5

SIMULINO

7
~6
~5

ANALOG IN

ATMEL

5V
GND

13
12
~11
~10
~9
8

ARDUINO

RESET

POWER

DIGITAL (PWM~)

SIMULINO

ANALOG IN

A0
A1
A2
A3
A4
A5

POWER

GND

13
12
~11
~10
~9
8

ARDUINO

5V

7
8
9
10
11
12
13
14

AREF

AREF

RESET

4
5
6

VSS
VDD
VEE

7
8
9
10
11
12
13
14

4
5
6

1
2
3

1
2
3

D0
D1
D2
D3
D4
D5
D6
D7

VSS
VDD
VEE

RS
RW
E

SIM1

SIM1

RS
RW
E

LM016L

LM016L

AREF

ATMEL

DIGITAL (PWM~)

ANALOG IN

SIMULINO

POWER

A0
A1
A2
A3
A4
A5

ATMEGA328P

5V
GND

13
12
~11
~10
~9
8

ARDUINO

RESET

7
~6
~5

4
~3
2
TX > 1
RX < 0

www.arduino.cc
blogembarcado.blogspot.com

SIMULINO UNO

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

LECTURA DE DATOS ANALGICA Y ENVO A TX

RESET

50%

PC0/ADC0
PC1/ADC1
PC2/ADC2
PC3/ADC3
PC4/ADC4/SDA
PC5/ADC5/SCL

PB5/SCK
PB4/MISO
~PB3/MOSI/OC2A
~ PB2/SS/OC1B
~ PB1/OC1A
PB0/ICP1/CLKO

DIGITAL (~PWM)

ANALOG IN

RV1

A0
A1
A2
A3
A4
A5

AREF

1121
ATMEGA328P-PU

microcontrolandos.blogspot.com

int val = 0; // variable para almacenar el valor ledo por la entrada analgica
void setup() {
Serial.begin(9600);
}
void loop() {
val = analogRead(A5); // lee el valor del canal de ENTRADA analgica
Serial.print(val); // Enva al PC el valor analgico ledo y lo muestra en pantalla
Serial.write(10);
DUINO1
Serial.write(13);
delay(100);
}

PD7/AIN1

~ PD6/AIN0
PD5/T1
~
PD4/T0/XCK
~ PD3/INT1
PD2/INT0
TX PD1/TXD
RX PD0/RXD

13
12
11
10
9
8
7
6
5
4
3
2
1
0

RXD
VT52, VT100, ANSI

TXD
1k

ARDUINO UNO R3

RTS
Xmodem, Ymodem, Zmodem

CTS

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

LECTURA DE DATOS ANALGICA Y ENVO A TX MAS LCD


#include <LiquidCrystal.h>// librera del LCD
int val = 0; // variable para almacenar el valor ledo por la entrada analgica
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

100%

ARDUINO UNO R3

DIGITAL (~PWM)

ANALOG IN

1k

1121
ATMEGA328P-PU

microcontrolandos.blogspot.com

TX
RX

LCD1

7
8
9
10
11
12
13
14

D0
D1
D2
D3
D4
D5
D6
D7

RS
RW
E
4
5
6

VSS
VDD
VEE

LM016L

1
2
3

void setup() {
lcd.begin(16, 2);
Serial.begin(9600);
}
void loop() {
val = analogRead(A5); // lee el valor del canal de ENTRADA analgica
Serial.print(val,HEX); // Enva al PC el valor analgico ledo y lo muestra en pantalla
Serial.write(10);
Serial.write(13);
DUINO1
lcd.clear();
lcd.setCursor(0,0);
lcd.print("DECIMAL");
lcd.setCursor(9,0);
AREF
lcd.print(val);
PB5/SCK
PB4/MISO
RESET
lcd.setCursor(0,1);
~PB3/MOSI/OC2A
~ PB2/SS/OC1B
~ PB1/OC1A
lcd.print("HEX ");
PB0/ICP1/CLKO
lcd.setCursor(9,1);
PD7/AIN1
A0
~ PD6/AIN0
PC0/ADC0
PD5/T1
A1
~
lcd.print(val,HEX);
RV1
PC1/ADC1
PD4/T0/XCK
A2
PC2/ADC2
A3
~ PD3/INT1
delay(100);
PC3/ADC3
PD2/INT0
A4
PC4/ADC4/SDA
PD1/TXD
A5
PC5/ADC5/SCL
}
PD0/RXD

13
12
11
10
9
8
7
6
5
4
3
2
1
0

RXD
VT52, VT100, ANSI

TXD
RTS
Xmodem, Ymodem, Zmodem

CTS

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

VARIADOR DE FRECUENCIA DE SALIDA


int potPin = 0; // pin entrada para potencimetro A0
int ledPin = 13; // pin de salida para el LED
void setup()
{
pinMode(ledPin, OUTPUT); // declara ledPin como SALIDA
}
void loop()
{
digitalWrite(ledPin, HIGH); // pone ledPin en on
delay(analogRead(potPin)); // detiene la ejecucin un tiempo potPin
digitalWrite(ledPin, LOW); // pone ledPin en off
delay(analogRead(potPin)); // detiene la ejecucin un tiempo potPin
}

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

VARIADOR DE FRECUENCIA DE SALIDA


DUINO1
A

PC0/ADC0
PC1/ADC1
PC2/ADC2
PC3/ADC3
PC4/ADC4/SDA
PC5/ADC5/SCL

PB5/SCK
PB4/MISO
~PB3/MOSI/OC2A
~ PB2/SS/OC1B
~ PB1/OC1A
PB0/ICP1/CLKO

DIGITAL (~PWM)

1k

A0
A1
A2
A3
A4
A5

ANALOG IN

9%

RV1

C
AREF

1121
ATMEGA328P-PU

microcontrolandos.blogspot.com

RESET

PD7/AIN1

~ PD6/AIN0
PD5/T1
~
PD4/T0/XCK
~ PD3/INT1
PD2/INT0
TX PD1/TXD
RX PD0/RXD

13
12
11
10
9
8

7
6
5
4
3
2
1
0

ARDUINO UNO R3

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

SALIDA PWM
int ledPin = 9; // pin PWM para el LED
void setup(){} // no es necesario configurar nada
void loop()
{
for (int i=0; i<=255; i++) // el valor de i asciende
{
analogWrite(ledPin, i); // se escribe el valor de I en el PIN de salida del LED
delay(100); // pauses for 100ms
}
for (int i=255; i>=0; i--) // el valor de I desciendei
{
analogWrite(ledPin, i); // se escribe el valor de ii
delay(100); // pasusa durante 100ms
}
}

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

VARIACIN ANALGICA PARA CONTROLAR SALIDA CON PWM


int ledPin = 9; // Salida analgica PWM para conectar a LED
int analogPin = 0; // resistencia variable conectada a la entrada A0
analgica pin 0
void setup(){} // no es necesario configurar entradas y salidas
void loop()
{
for (int i=0; i<=255; i++) // incremento de valor de i
{
analogWrite(ledPin, i); // configura el nivel brillo con el valor de i
delay(delayVal()); // espera un tiempo
}
for (int i=255; i>=0; i--) // decrementa el valor de i
{
analogWrite(ledPin, i); // configura el nivel de brillo con el valor de i
delay(delayVal()); // espera un tiempo
}
}
int delayVal() // Mtodo para recoger el tiempo de retardo
{
int v; // crea una variable temporal (local)
v = analogRead(analogPin); // lee valor analgico
v /= 8; // convierte el valor ledo de 0-1024 a 0-128
return v; // devuelve el valor v
}
Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

VARIACIN ANALGICA PARA CONTROLAR SALIDA CON PWM


DUINO1
A

PC0/ADC0
PC1/ADC1
PC2/ADC2
PC3/ADC3
PC4/ADC4/SDA
PC5/ADC5/SCL

PB5/SCK
PB4/MISO
~PB3/MOSI/OC2A
~ PB2/SS/OC1B
~ PB1/OC1A
PB0/ICP1/CLKO

DIGITAL (~PWM)

1k

A0
A1
A2
A3
A4
A5

ANALOG IN

97%

RV1

C
AREF

1121
ATMEGA328P-PU

microcontrolandos.blogspot.com

RESET

PD7/AIN1
~ PD6/AIN0
PD5/T1
~
PD4/T0/XCK
~ PD3/INT1
PD2/INT0
TX PD1/TXD
RX PD0/RXD

13
12
11
10
9
8

7
6
5
4
3
2
1
0

ARDUINO UNO R3

LA RAPIDEZ D ESTA EN FUNCIN DEL VALOR ANALGICO


EL TIEMPO DE ENCENDIDO Y APAGADO

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

Medicin de temperatura solo valores positivos


#include <LiquidCrystal.h>// librera del LCD
float val = 0; // variable para almacenar el valor ledo por la entrada analgica
float vol;
float vol1;
int dato, temp;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup() {
lcd.begin(16, 2);
Serial.begin(9600);
}
void loop() {
val = analogRead(A0); // lee el valor del canal de ENTRADA analgica
dato=val;
//ajuste de voltaje y temperatura
temp = (1.5/3.08)*dato;
vol=5*val/308;
Serial.print(temp); // Enva al PC el valor analgico ledo y lo muestra en pantalla
Serial.write(10);
Serial.write(13);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("TEMP ");
lcd.setCursor(9,0);
lcd.print(temp);
lcd.setCursor(0,1);
lcd.print("VOLTAJE ");
lcd.setCursor(9,1);
lcd.print(vol);
delay(100);
}

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

Medicin de temperatura solo valores positivos

LCD2
LM016L

RESET

150.0

LM35

U1(VOUT)
V=1.50465
A0
A1
A2
A3
A4
A5

PC0/ADC0
PC1/ADC1
PC2/ADC2
PC3/ADC3
PC4/ADC4/SDA
PC5/ADC5/SCL

PD7/AIN1

~ PD6/AIN0
PD5/T1
~
PD4/T0/XCK
~ PD3/INT1
PD2/INT0
TX PD1/TXD
RX PD0/RXD

D0
D1
D2
D3
D4
D5
D6
D7
7
8
9
10
11
12
13
14

RS
RW
E
4
5
6

1
2
3

PB5/SCK
PB4/MISO
~PB3/MOSI/OC2A
~ PB2/SS/OC1B
~ PB1/OC1A
PB0/ICP1/CLKO

DIGITAL (~PWM)

ANALOG IN

VOUT

AREF

1121
ATMEGA328P-PU

microcontrolandos.blogspot.com

U1

VSS
VDD
VEE

DUINO1

13
12
11
10
9
8
7
6
5
4
3
2
1
0

ARDUINO UNO R3

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

Medicin de temperatura con valores negativos


#include <LiquidCrystal.h>// librera del LCD
float val = 0; // variable para almacenar el valor ledo por la entrada analgica
float vol; // Variable de conversin
float vol1;
int dato, temp;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup() {
lcd.begin(16, 2);
Serial.begin(9600);
}
void loop() {
val = analogRead(A0); // lee el valor del canal de ENTRADA analgica
dato=val;
vol=5000*val/1023; // Convertir el resultado en milivoltios 0..255 -> 0-5000mV
vol1= vol/1000; // Extraer voltios (miles de milivoltios) del resultado

temp=41*vol1-55;
Serial.print(temp); // Enva al PC el valor analgico ledo y lo muestra en pantalla
Serial.write(10);
Serial.write(13);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("TEMP ");
lcd.setCursor(9,0);
lcd.print(temp);
lcd.setCursor(0,1);
lcd.print("VOLTAJE ");
lcd.setCursor(9,1);
lcd.print(vol1);
delay(100);
}

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

Medicin de temperatura con valores negativos


BAT1
5V

U1

R4

-34.0

VOUT

R1

R2

100k

10k

U2

U3

R3

100k

4300R
OPAMP

OPAMP

LM35

R5

R6

37.5k

100k

BAT2
5V

LCD2
LM016L

PC0/ADC0
PC1/ADC1
PC2/ADC2
PC3/ADC3
PC4/ADC4/SDA
PC5/ADC5/SCL

PD7/AIN1

~ PD6/AIN0
PD5/T1
~
PD4/T0/XCK
~ PD3/INT1
PD2/INT0
TX PD1/TXD
RX PD0/RXD

D0
D1
D2
D3
D4
D5
D6
D7
7
8
9
10
11
12
13
14

RS
RW
E
4
5
6

1
2
3

PB5/SCK
PB4/MISO
~PB3/MOSI/OC2A
~ PB2/SS/OC1B
~ PB1/OC1A
PB0/ICP1/CLKO

DIGITAL (~PWM)

ANALOG IN

A0
A1
A2
A3
A4
A5

AREF

1121
ATMEGA328P-PU

microcontrolandos.blogspot.com

RESET

VSS
VDD
VEE

DUINO1

13
12
11
10
9
8
7
6
5
4
3
2
1
0

ARDUINO UNO R3

Dr. JOS DE JESS MORENO VZQUEZ

Electrnica avanzada

Medicin de temperatura con valores negativos


BAT1
5V

U1

R4

40.0

VOUT

R1

R2

100k

10k

U2

U3

R3

100k

4300R
OPAMP

OPAMP

LM35

R5

R6

37.5k

100k

BAT2
5V

LCD2
LM016L

PC0/ADC0
PC1/ADC1
PC2/ADC2
PC3/ADC3
PC4/ADC4/SDA
PC5/ADC5/SCL

PD7/AIN1

~ PD6/AIN0
PD5/T1
~
PD4/T0/XCK
~ PD3/INT1
PD2/INT0
TX PD1/TXD
RX PD0/RXD

D0
D1
D2
D3
D4
D5
D6
D7
7
8
9
10
11
12
13
14

RS
RW
E
4
5
6

1
2
3

PB5/SCK
PB4/MISO
~PB3/MOSI/OC2A
~ PB2/SS/OC1B
~ PB1/OC1A
PB0/ICP1/CLKO

DIGITAL (~PWM)

ANALOG IN

A0
A1
A2
A3
A4
A5

AREF

1121
ATMEGA328P-PU

microcontrolandos.blogspot.com

RESET

VSS
VDD
VEE

DUINO1

13
12
11
10
9
8
7
6
5
4
3
2
1
0

ARDUINO UNO R3

Dr. JOS DE JESS MORENO VZQUEZ