Documentos de Académico
Documentos de Profesional
Documentos de Cultura
EJERCICIOS NIVEL I
EJERCICIO 1.
Programa que enciende y apaga un led conectado al pin 13 con una pausa de 1000
milisegundos.
PROGRAMA
int led = 13;
void setup()
{
pinMode(led, OUTPUT);
}
void loop()
{
digitalWrite(led, HIGH);
delay(1000);
digitalWrite(led, LOW);
delay(1000);
}
Sistemas Digitales
EJERCICIO 2.
Programa que hace oscilar un led conectado al pin 13, solo si se mantiene
presionado un pulsador conectado al pin 5.
PROGRAMA
void setup()
{
pinMode(13,OUTPUT);
pinMode(5,INPUT);
}
// Configuracin
void loop()
{
if(digitalRead(5)==LOW)
{
digitalWrite(13,HIGH);
delay(300);
digitalWrite(13,LOW);
delay(300);
}
else
{
digitalWrite(13,LOW);
}
}
// Bucle
Sistemas Digitales
EJERCICIO 3.
Programa que enciende 3 leds en forma secuencial cada 200ms. Los leds se
conectan a los pines 6,7 y 8.
PROGRAMA
int led1=6;
int led2=7;
int led3=8;
void setup()
// Configura pines como E/S
{
pinMode(led1,OUTPUT);
pinMode(led2,OUTPUT);
pinMode(led3,OUTPUT);
}
void loop()
// Repeticion
{
digitalWrite(led1,HIGH);
digitalWrite(led2,LOW);
digitalWrite(led3,LOW);
delay(200);
digitalWrite(led1,LOW);
digitalWrite(led2,HIGH);
digitalWrite(led3,LOW);
delay(200);
digitalWrite(led1,LOW);
digitalWrite(led2,LOW);
digitalWrite(led3,HIGH);
delay(200);
}
Sistemas Digitales
EJERCICIO 4.
Programa que lee un voltaje analgico por el pin A2 y hace oscilar un led con una
pausa igual al valor del conversor analgico digital. (de 0 a 1023)
PROGRAMA
int adc;
int led=13;
// Declara variables
void setup()
{
pinMode(13,OUTPUT);
}
// Configura pines
void loop()
{
adc=analogRead(A2);
// Repeticion
digitalWrite(led,HIGH);
delay(adc);
digitalWrite(led,LOW);
delay(adc);
}
Sistemas Digitales
EJERCICIO 5.
Programa que cuenta las veces que
se presiona un pulsador conectado al
pin 7 y dicha cuenta se visualiza en el
terminal virtual. Cada vez que se
presiona el pulsador se enciende un
led indicador conectado al pin 13.
PROGRAMA
int conteo=0;
void setup()
{
pinMode(13,OUTPUT);
pinMode(7,INPUT);
Serial.begin(9600);
Serial.println("Presione el Pulsador");
}
void loop()
{
if(digitalRead(7)==LOW)
{
delay(80);
if(digitalRead(7)==LOW)
{
conteo=conteo+1;
digitalWrite(13,HIGH);
Serial.println(conteo);
delay(100);
while(digitalRead(7)==LOW){}
digitalWrite(13,LOW);
}
}
}
// Bucle
// Lee pin 7 (con rebotes)
// Espera 80ms para eliminar rebotes
// Vuelve a leer pin 7 sin rebotes
// Incrementa en uno la variable conteo
// Enciende led indicador
// Muestra resultado en monitor serial
// Pausa de 300ms para visualizar el conteo
// Espera a que deje de oprimir el pulsador
// Apaga led indicador
Sistemas Digitales
EJERCICIO 6.
Programa que lee el voltaje analgico que entra por el pin A5 y lo visualiza en el
monitor serial cada 300ms.
PROGRAMA
int adc;
float vol;
void setup()
{
Serial.begin(9600);
// Abre puerto serial y fija velocidad a 9600 Baudios
Serial.println("Lectura de voltaje analgico");
//Mensaje para el usuario
}
void loop()
{
adc=analogRead(A5);
vol=adc*0.00488759;
Serial.print("Voltaje= ");
Serial.println(vol);
delay(300);
}
Sistemas Digitales
EJERCICIO 7.
Programa que enciende y apaga un led con un solo pulsador (Interruptor digital). El
pulsador se conecta al pin 5 y el led al pin 4.
PROGRAMA
int estado=0;
void setup()
{
pinMode(4,OUTPUT);
pinMode(5,INPUT);
}
void loop()
{
if(digitalRead(5)==0)
{
delay(100);
if(digitalRead(5)==0)
{
if(digitalRead(5)==LOW)
{
estado=!estado;
digitalWrite(4,estado);
}
while(digitalRead(5)==LOW){}
//Operacin NOT
//Se queda aqu hasta que suelte el pulsador
Sistemas Digitales
EJERCICIO 8.
Programa que permite encender y apagar 2 leds mediante dos pulsadores en forma
independiente, adems se muestra un led indicador que oscila.
PROGRAMA
void setup()
{
pinMode(12,OUTPUT);
pinMode(10,OUTPUT);
pinMode(4,INPUT);
pinMode(2,INPUT);
pinMode(8,OUTPUT);
digitalWrite(2,HIGH);
//Activa resistencia interna del pin 2
digitalWrite(4,HIGH);
//Activa resistencia interna del pin 4
}
unsigned long tactual;
//Declaracion de variables
unsigned long ttranscurrido;
boolean estado=false;
void loop()
{
//----------------------------------------------------------//Interruptor 1
//----------------------------------------------------------if(digitalRead(2)==LOW)
{
delay(50);
if(digitalRead(2)==LOW)
{
Ing. Flavio Condor De La Cruz
Sistemas Digitales
digitalWrite(12,!digitalRead(12));
}
while(digitalRead(2)==LOW){}
}
//----------------------------------------------------------//Interruptor 2
//----------------------------------------------------------if(digitalRead(4)==LOW)
{
delay(50);
if(digitalRead(4)==LOW)
{
digitalWrite(10,!digitalRead(10));
}
while(digitalRead(4)==LOW){}
}
//----------------------------------------------------------//Hace oscilar el led cada 600ms
//----------------------------------------------------------if(pausa(600)==HIGH)
{
digitalWrite(8,!digitalRead(8));
}
}
//---------------------------------------------------------//Funcion creada por usurio.Hace una pausa en milisegundos
//---------------------------------------------------------boolean pausa(unsigned long tiempo_ms)
{
tactual=millis();
if((tactual-ttranscurrido)>tiempo_ms)
{
estado=true;
ttranscurrido=tactual;
return estado;
}
}
//----------------------------------------------------------
Sistemas Digitales
EJERCICIO 9.
Programa que enciende y paga un led conectado al pin 13, mediante mensajes
enviados por el monitor serial.
PROGRAMA
String orden;
char caracter;
int pin=13;
void setup()
{
pinMode(pin,OUTPUT);
Serial.begin(9600);
Serial.println("Para Activar la salida escriba: on");
Serial.println("Para Desactivar la salida escriba: off");
}
void loop(){
//orden="";
delay(50);
if(Serial.available())
//verifica si PC a enviado a arduino informacin
{
caracter=Serial.read(); //Almacena el mensaje en incomming caracter por caracter
if(caracter=='\n')
//verifica si has presionado tecla enter
{
if(orden=="on"){
digitalWrite(pin,HIGH);
Serial.println("Salida Activada");
}
if(orden=="off"){
digitalWrite(pin,LOW);
Serial.println("Salida Desactivada");
}
if((orden!="on")&&(orden!="off")){
Serial.println("Codigo incorrecto");
}
orden="";
}
else {
orden=orden+caracter;
// Se forma el mensaje completo carcter por carcter
}
10
Sistemas Digitales
EJERCICIOS NIVEL II
EJERCICIO 10.
Lectura analgica y visualizacin en LCD
Programa que visualiza en un LCD la tensin proveniente de un potencimetro y su
respectivo valor entero (ADC). Se utiliza el pin A0.
16
Descripcin
Ground
VDD
+5V
VO
4
5
RS
R/W
Register Select
Read/Write
Clock Enable
D0
Data Bit 0
D1
Data Bit 1
D2
Data Bit 2
10
D3
Data Bit 3
11
D4
Data Bit 4
12
D5
Data Bit 5
13
D6
Data Bit 6
14
D7
Data Bit 7
15 BLA (+)
16 BLK (-)
11
Sistemas Digitales
void loop( )
{
adc=analogRead(A0);
//lee voltaje y lo convierte a numero entero de 0 a 1023
float voltaje=(0.004887586)*adc; // Transforma 0-1023 a 0-5V (0.00488=5/1023)
lcd.setCursor(0,0);
//Ubica cursor en la columna 0 y fila 0
lcd.print("Volt= ");
//Imprime texto en el LCD
lcd.setCursor(5,0);
//Ubica cursor en la columna 5 y fila 0
lcd.print(voltaje);
//Muestra en LCD el voltaje
lcd.setCursor(0,1);
//Ubica cursor en la columna 0 y fila 1
lcd.print("adc= ");
//Imprime texto en el LCD
lcd.setCursor(4,1);
//Ubica cursor en la columna 4 y fila 1
lcd.print(" ");
//Imprime 4 espacios en blanco para borrar LCD
lcd.setCursor(4,1);
//Ubica cursor en la columna 4 y fila 1
lcd.print(adc);
//Muestra valor del convertidor analgico digital en el LCD
delay(50);
//Pausa de 50ms
}
12
Sistemas Digitales
EJERCICIO 11.
Medidor de Temperatura con LM35 y LCD
Programa que muestra la temperatura del ambiente en un LCD utilizando en sensor
LM35. Se utiliza el pin A0.
LM35. Es un sensor de temperatura con una precisin calibrada de 1C. Su rango de medicin
abarca desde -55C hasta 150C. La salida es lineal y cada grado centgrado equivale a 10mV es
decir su resolucin es 10mV/C.
Sus caractersticas ms relevantes son:
13
Sistemas Digitales
void loop( )
{
analogReference(INTERNAL);
//Toma voltaje interno de 1.1voltios como referencia
adc=analogRead(A0);
//Lee voltaje y lo convierte a numero entero de 0 a 1023
float temp=(0.107526881)*adc; // Transforma 0-1023 en grados Celsius(0.10752..=1.1*100/1023)
lcd.setCursor(0,0);
// Ubica cursor en la columna 0 y fila 0
lcd.print("Temp= ");
// Imprime texto en el LCD
lcd.setCursor(5,0);
// Ubica cursor en la columna 5 y fila 0
lcd.print(temp);
// Muestra en LCD la temperatura
lcd.setCursor(0,1);
// Ubica cursor en la columna 0 y fila 1
lcd.print("adc= ");
// Imprime texto en el LCD
lcd.setCursor(4,1);
// Ubica cursor en la columna 4 y fila 1
lcd.print(" ");
// Imprime 4 espacios en blanco para borrar LCD
lcd.setCursor(4,1);
// Ubica cursor en la columna 4 y fila 1
lcd.print(adc);
// Muestra valor del convertidor analgico digital en LCD
delay(50);
// Pausa de 50ms
}
14
Sistemas Digitales
EJERCICIO 12.
Control de 4 cargas con una sola entrada
Programa que utiliza una sola entrada para controlar 4 salidas digitales.
Pin A0 es la entrada y los pines 6, 7, 8 y 9 las salidas digitales.
void setup( )
{
pinMode(9,OUTPUT);
pinMode(8,OUTPUT);
pinMode(7,OUTPUT);
pinMode(6,OUTPUT);
lcd.begin(16,2);
//Configura tipo de LCD
lcd.print(" Sistema Activo ");
delay(1000);
lcd.setCursor(0,0);
lcd.print("
");
//16 espacios en blanco
lcd.setCursor(0,0);
lcd.print("L1:OFF");
lcd.setCursor(8,0);
lcd.print("L2:OFF");
lcd.setCursor(0,1);
lcd.print("L3:OFF");
15
Sistemas Digitales
lcd.setCursor(8,1);
lcd.print("L4:OFF");
}
int adc;
//Variable de 16 bits
float temp;
//Variable con decimales
void loop( )
{
adc=analogRead(A0);
if(adc>210)
{
if(adc>251 && adc<261){
digitalWrite(9,!digitalRead(9));
lcd.setCursor(0,0);
lcd.print("L1:");
if(digitalRead(9)==HIGH){
lcd.setCursor(3,0);
lcd.print("ON ");
}
else{
lcd.setCursor(3,0);
lcd.print("OFF");
}
delay(200);
}
if(adc>339 && adc<346){
digitalWrite(8,!digitalRead(8));
lcd.setCursor(8,0);
lcd.print("L2:");
if(digitalRead(8)==HIGH){
lcd.setCursor(11,0);
lcd.print("ON ");
}
else{
lcd.setCursor(11,0);
lcd.print("OFF");
}
delay(200);
}
if(adc>506 && adc<518){
digitalWrite(7,!digitalRead(7));
lcd.setCursor(0,1);
lcd.print("L3:");
if(digitalRead(7)==HIGH){
lcd.setCursor(3,1);
lcd.print("ON ");
}
else{
lcd.setCursor(3,1);
lcd.print("OFF");
}
delay(200);
}
if(adc>1017){
digitalWrite(6,!digitalRead(6));
Ing. Flavio Condor De La Cruz
16
Sistemas Digitales
lcd.setCursor(8,1);
lcd.print("L4:");
if(digitalRead(6)==HIGH){
lcd.setCursor(11,1);
lcd.print("ON ");
}
else{
lcd.setCursor(11,1);
lcd.print("OFF");
}
delay(200);
}
17
Sistemas Digitales
Caractersticas:
Transceptor nRF24L01+
Aplicaciones:
Perifricos inalmbricos de PC
Mouse, teclados y mandos a distancia
Controles remoto Advanced Media Center
Auriculares VoIP
Control de juegos y juguetes
Relojes y sensores deportivos
Mandos a distancia RF para la electrnica de consumo
Automatizacin comercial y del hogar
Redes de sensores que operan a muy baja potencia
Sistemas de seguimiento de activos
18
Sistemas Digitales
TRANSMISOR RF ( TX )
RECEPTOR RF ( RX )
19
Sistemas Digitales
TRANSMISOR
//********************************************************************************************
//TRANSMISOR
//Perimite enviar datos a otro terminal (LM35)
//utilizando el Arduino UNO R3 y el nRF24L01+
//********************************************************************************************
#include <SPI.h>//Libreria para comunicar Arduino con el TX-RX
#include <nRF24L01p.h>//Libreria para el TX-RX
nRF24L01p transmitter(7,8);//asignar pines (CSN,CE)
//********************************************************************************************
void setup( )
{
pinMode(3,OUTPUT);
Serial.begin(115200);
//Fija velocidad de comunicacion PC-ARDUINO
SPI.begin();
//Inicia Comunicacin SPI con Dispositivo nRF24L01+
SPI.setBitOrder(MSBFIRST);
//Configura orden de los bits
transmitter.channel(92);
//Canal de transmisin
transmitter.RXaddress("oveja");
//Direccin RX a TX
transmitter.TXaddress("sapo");
//Direccion TX a RX
transmitter.init();
//Activa Dispositivo nRF24L01+
Serial.println("TRANSMISOR");
//Visualiza texto en Monitor arduino
}
int dato_a_enviar=0;
int dato_recibido=0;
int tempLM35;
float temp_tx;
unsigned long tiempoactual=0;
unsigned long tiempoprevio=0;
void loop( )
{
//********************************************************************************************
//Codigo para leer valor entero del LM35 y lo envia al receptor
//********************************************************************************************
analogReference(INTERNAL);
tempLM35=analogRead(A0);
transmitter.txPL(tempLM35);
transmitter.send(SLOW);
tiempoprevio=tiempoactual;
Serial.print("Temp enviada: ");
temp_tx=tempLM35*0.107526881;
Serial.print(temp_tx);
Serial.println(" oC");
delay(300);
}
20
Sistemas Digitales
RECEPTOR
//*******************************************************************************************
//RECEPTOR
//Permite recibir datos de otro terminal
//utilizando el Arduino UNO R3 y el nRF24L01+
//*******************************************************************************************
#include <SPI.h>
//Libreria para comunicar Arduino con el TX-RX
#include <nRF24L01p.h> //Libreria para el TX-RX
nRF24L01p transmitter(7,8); //asignar pines (CSN,CE)
#include <LiquidCrystal.h> //Libreria para el LCD
LiquidCrystal lcd(10, 9, 5, 4, 3, 2);//pines para LCD
//*******************************************************************************************
void setup( ){
pinMode(3,OUTPUT);
Serial.begin(115200);
//Fija velocidad de comunicacion PC-ARDUINO
SPI.begin();
//Inicia Comunicacion SPI con Dispositivo nRF24L01+
SPI.setBitOrder(MSBFIRST);
//Configura orden de los bits
transmitter.channel(92);
//Canal de transmision
transmitter.RXaddress("oveja");
//Direcion RX a TX
transmitter.TXaddress("sapo");
//Direccion TX a RX
transmitter.init();
//Activa Dispositivo nRF24L01+
Serial.println("RECEPTOR");
//Visualiza texto en Monitor arduino
}
int dato_recibido=0;
unsigned long tiempoactual=0;
unsigned long tiempoprevio=0;
float temp_c;
void loop( ){
//********************************************************************************************
//Cdigo para Recibir datos del otro dispositivo
//********************************************************************************************
if(transmitter.available()){
//verifica si ha llegado datos del otro transmisor
transmitter.read();
//Lee todos los datos
transmitter.rxPL(dato_recibido);
//carga datos que ingresaron en dato_recibido
lcd.setCursor(0,1);
lcd.print("Temp: ");
lcd.setCursor(5,1);
temp_c=0.107526881*dato_recibido;
lcd.print(temp_c,2);
delay(1);
Serial.print("Temp recibida: ");
//Muestra texto en monitor local
Serial.print(temp_c);
//Muestra en el monitor serial local los datos
Serial.println(" oC");
dato_recibido=0;
}
//Recetea variable
21
Sistemas Digitales
EJERCICIO 14.
Chat bidireccional (Full Duplex)
Programa que permite conversar (Chatear) con otra persona en forma inalmbrica
utilizando el monitor del Arduino y 2 mdulos nRF24L01+
PROGRAMA: Chat Bidireccional
//********************************************************************************************
//Permite chatear en con otro terminal
//utilizando el Arduino UNO R3 y el nRF24L01+
//Grabar este cdigo en ambos dispositivos
//********************************************************************************************
#include <SPI.h>
//Libreria para comunicar Arduino con el TX-RX
#include <nRF24L01p.h>
//Libreria para el TX-RX
nRF24L01p transmitter(7,8);
//asignar pines (CSN,CE)
//********************************************************************************************
void setup( ){
delay(150);
Serial.begin(115200);
//Fija velocidad de comunicacion PC-ARDUINO
SPI.begin();
//Inicia Comunicacin SPI con Dispositivo nRF24L01+
SPI.setBitOrder(MSBFIRST);
//Configura orden de los bits
transmitter.channel(90);
//Canal de transmision
transmitter.RXaddress("oveja");
//Direcion RX a TX
transmitter.TXaddress("sapo");
//Direccion TX a RX
transmitter.init();
//Activa Dispositivo nRF24L01+
Serial.println("Hola soy el otro TX-RX");
//Visualiza texto en Monitor arduino
String mensaje;
String PRXsays;
void loop( ){
//********************************************************************************************
//Codigo para Transmitir Mensaje
//********************************************************************************************
if(Serial.available( )>0){
//verifica si hay mensaje que enviar
char incomming=Serial.read();
//Almacena el mensaje en incomming caracter por caracter
if(incomming=='\n'){
//verifica si has presionado tecla enter
transmitter.txPL(mensaje);
//carga mensaje completo
transmitter.send(SLOW);
//Envia el mensaje completo al receptor
Serial.print("Eviaste: ");
Serial.println(mensaje);
//Muestra en tu monitor el Mensaje que enviaste
mensaje="";
//Borra variable mensaje
}
else{
mensaje=mensaje+incomming; // Se forma el mensaje completo caracter por caracter
}
}
22
Sistemas Digitales
//********************************************************************************************
//Codigo para Recibir mensaje del otro dispositivo
//********************************************************************************************
//verifica si ha llegado datos(caracteres)del otro transmisor
if(transmitter.available( )){
//Si hay datos en el buffer de entrada ejecuta la instruccin
transmitter.read( );
// Lee byte por byte
transmitter.rxPL(PRXsays);
//carga datos que ingresaron en PRXsays
Serial.print("Te envio: ");
//Muestra texto en monitor local
Serial.print(PRXsays);
//Muestra en el monitor serial local los datos
Serial.println();
PRXsays="";
}
//********************************************************************************************
}
23
Sistemas Digitales
EJERCICIO 15.
CONTROL DE CARGA POR RAYOS INFRAROJOS (IR)
Programa que controla el encendido y apagado de 3 leds a travs de luz infrarroja y
un mdulo sensor Infrarrojo.
Mdulo Receptor IR TSOP4838
Es un sensor de infrarrojos empleado para
recibir las seales infrarrojas de los mandos a
distancia empleados normalmente en los
electrodomsticos. El sensor tiene un su interior
un circuito amplificador y un oscilador a 38 Khz
que permiten la recepcin de las seales
incluso en presencia de fuentes de luz intensas.
Este sensor se conecta a un microcontrolador
permitiendo recibir las seales de control de la mayora de los mandos a distancias y
hacer mediante software que el circuito ejecute diferentes instrucciones en funcin de
las rdenes recibidas.
Caractersticas
Diagrama de Bloques
24
Sistemas Digitales
Sensores similares
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup()
{
Serial.begin(9600);
irrecv.enableIRIn();
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
}
void loop() {
Ing. Flavio Condor De La Cruz
25
Sistemas Digitales
if (irrecv.decode(&results))
// Verifica si hay seal IR
{
unsigned int valor = results.value;
//Almecena codigo en valor
switch(valor)
{
case code1:
digitalWrite(led1,!digitalRead(led1));
//Invierte estado de la salida 1
break;
case code2:
digitalWrite(led2,!digitalRead(led2));
//Invierte estado de la salida 2
break;
case code3:
digitalWrite(led3,!digitalRead(led3));
//Invierte estado de la salida 3
break;
}
Serial.println(valor);
// Muestra codigo en monitor de arduino
irrecv.resume();
// Inicia nueva recepcion
}
26