0% encontró este documento útil (0 votos)
49 vistas24 páginas

Apunte de Arduino Hecho Por Ronald Parte 5

Cargado por

Ronald Kopp
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
49 vistas24 páginas

Apunte de Arduino Hecho Por Ronald Parte 5

Cargado por

Ronald Kopp
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 24

Arduino

5.Control Structures
 If Statement (Conditional): How to use an if statement to change output conditions based on
changing input conditions.
 For Loop: Controlling multiple LEDs with a for loop and.
 Array: A variation on the For Loop example that demonstrates how to use an array.
 While Loop: How to use a while loop to calibrate a sensor while a button is being read.
 Switch Case: How to choose between a discrete number of values. Equivalent to multiple If
statements. This example shows how to divide a sensor's range into a set of four bands and to
take four different actions depending on which band the result is in.
 Switch Case 2: A second switch-case example, showing how to take different actions based in
characters received in the serial port.

Ing. Ronald N. Kopp Página 1


Arduino
34. If Statement (Conditional): como utilizar una sentencia if para cambiar las condiciones de salida en
base a las condiciones de entrada que varían.

La declaración if() es la más básica de todas las estructuras de control de programación. Se le permite
hacer que algo suceda o no en función de sí una determinada condición es verdadera o no. De ésta
forma:
if (someCondition) {
// hacer tal cosa si la condición es verdadera
}

Hay una combinación común llamada if-else, de ésta forma:


if (someCondition) {
// hacer tal cosa sí la condición es verdadera
} else {
// de otro modo sí la condición es falsa hacer tal cosa
}

También está el caso de else-if, donde se puede comprobar una segunda condición si la primera es
falsa:
if (someCondition) {
// hacer tal cosa sí la condición es verdadera
} else if (anotherCondition) {
// hacer tal cosa sólo si la primera condición es falsa
// y si la segunda condición es verdadera
}

Vamos a usar la sentencia if todo el tiempo. En el ejemplo de abajo se enciende un LED en el pin 13 sí
el valor leído en una entrada analógica pasa por encima de un determinado umbral.

Hardware Required
 Arduino Board
 (1) Potentiometer or variable resistor
 (1) 220 ohm resistor
 (1) LED
 hook-up wire

Ing. Ronald N. Kopp Página 2


Arduino
Circuit

Schematic

Ing. Ronald N. Kopp Página 3


Arduino
Code

En el siguiente código, una variable llamada analogValue se utiliza para almacenar los datos recogidos
de un potenciómetro conectado a la placa Arduino en analogPin 0. Estos datos se comparan entonces
con un valor umbral. Si el valor analógico se encuentra por encima del umbral establecido el LED
conectado al pin digital 13 se encenderá. Si analogValue se encuentra por debajo del umbral, el LED
permanece apagado.

// variables que no cambiarán:


const int analogPin = A0; // pin en el que el sensor está conectado
const int ledPin = 13; // pin en el que el LED está conectado
const int threshold = 400; // un nivel de umbral arbitrario
// que esté dentro del rango de valores de la entrada analógica

void setup() {
pinMode(ledPin, OUTPUT); // inicializamos el LED pin como una salida
Serial.begin(9600); // inicializamos la comunicación serial
}

void loop() {
int analogValue = analogRead(analogPin); // leemos el valor del potenciómetro
if (analogValue > threshold) { // sí el valor analógico es mayor que el umbral (threshold)
digitalWrite(ledPin, HIGH); // encendemos el LED
}
else {
digitalWrite(ledPin, LOW); // de otra forma apagamos el LED
}

Serial.println(analogValue); // imprimimos el valor analógico:


delay(1); // retraso entre lecturas para la estabilidad
}

Ing. Ronald N. Kopp Página 4


Arduino
35. ForLoop: Controlar múltiples LEDs con un lazo for.

A menudo se desea iterar sobre una serie de pines y hacer algo en cada uno de ellos. En este ejemplo
haremos parpadea 6 LEDs conectados a la placa Arduino utilizando un bucle for () para desplazarse
hacia adelante y hacia atrás, a través de los pines digitales 2-7. Los LED se encenderán y se apagarán,
en secuencia, utilizando tanto las funciones digitalWrite() y delay().

También hacemos un comentario en este ejemplo al "auto fantástico" en memoria de la serie de TV


los años 80 donde David Hasselhoff tenía una computadora con inteligencia artificial llamada KITT
conduciendo su Pontiac.

Hardware Required
 Arduino Board
 (6) 220 ohm resistors
 (6) LEDs
 hook-up wire
 breadboard

Ing. Ronald N. Kopp Página 5


Arduino
Circuit
Conecte seis LEDS, con resistencias de 220 ohm en serie, a los pines digitales 2-7 en su Arduino

Schematic

Ing. Ronald N. Kopp Página 6


Arduino
Código

int timer = 100; // cuanto mayor sea el número, más lenta será la sincronización

void setup() {
for (int thisPin = 2; thisPin < 8; thisPin++) { // utilizamos un bucle para inicializar
// cada pin como una salida
pinMode(thisPin, OUTPUT);
}
}

void loop() {
for (int thisPin = 2; thisPin < 8; thisPin++) { //bucle desde el pin más bajo hasta el más alto
digitalWrite(thisPin, HIGH); // encendemos el pin correspondiente
delay(timer);
digitalWrite(thisPin, LOW); // apagamos el pin correspondiente
}

for (int thisPin = 7; thisPin >= 2; thisPin--) { // bucle desde el pin más alto hasta el más bajo
digitalWrite(thisPin, HIGH); // encendemos el pin correspondiente
delay(timer);
digitalWrite(thisPin, LOW); // apagamos el pin correspondiente
}
}

Ing. Ronald N. Kopp Página 7


Arduino
36. Array: Una variación sobre el ejemplo anterior (forloop) para demostrar el uso del Array.

Esta variación sobre el ejemplo anterior muestra cómo utilizar una matriz (array). Una matriz es una
variable con múltiples partes. Si pensamos en una variable como un vaso que contiene valores, es
posible pensar en una matriz como una bandeja de cubitos de hielo. Es como una serie de tazas
relacionadas, las cuales todas pueden contener el mismo valor máximo.

En ejemplo anterior se muestra cómo se enciende una serie de LEDs conectados a los pines del
Arduino, desde el 2 al 7, con ciertas limitaciones (los pines han sido enumerados de forma consecutiva,
y los LED se encienden en forma secuencia).

Este ejemplo muestra cómo se puede activar una secuencia de pines cuyos números no son ni
consecutivos ni necesariamente secuencial. Para ello vamos a poner los números de pin en una matriz
y luego usar bucles for para iterar sobre la matriz.

En este ejemplo haremos uso de 6 LEDs conectados a los pines 2-7 en el tablero utilizando resistencias
220 Ohm, al igual que en el ejemplo anterior. Sin embargo, aquí el orden de los LEDs se determina por
su orden en la matriz, no por su orden físico.

Esta técnica de poner los pines en una matriz es muy práctico. Ya que no es necesario tener los pines
en forma secuencial, e incluso en el mismo orden. Además, podemos cambiar la posición según nos
parezca conveniente.

Hardware Required
 Arduino Board
 (6) 220 ohm resistors
 (6) LEDs
 hook-up wire
 breadboard

Ing. Ronald N. Kopp Página 8


Arduino
Circuit
Conecte seis LEDS, con resistencias de 220 ohm en serie, a los pines digitales 2-7 en su Arduino

Schematic

Ing. Ronald N. Kopp Página 9


Arduino
Código

int timer = 100; // cuanto mayor sea el número, más lenta será la sincronización.
int ledPins[] = {
2, 7, 4, 6, 5, 3 }; // matriz de números de pines que están conectados a los LEDs
int pinCount = 6; // El número de pines (es decir, la longitud de la matriz)

void setup() {
// Los elementos de la matriz se numeran desde 0 a (pinCount - 1).

for (int thisPin = 2; thisPin < 8; thisPin++) { // Utilizamos un bucle for para
pinMode(thisPin, OUTPUT); // inicializar cada pin como salida
}
}

void loop() {
for (int thisPin = 0; thisPin < pinCount; thisPin++) { //bucle desde el pin más bajo hasta el más alto
digitalWrite(ledPins[thisPin], HIGH); // encendemos el pin correspondiente
delay(timer);
digitalWrite(ledPins[thisPin], LOW); // apagamos el pin correspondiente
}

for (int thisPin = pinCount - 1; thisPin >= 0; thisPin--) { // bucle desde el pin más alto
// hasta el más bajo
digitalWrite(ledPins[thisPin], HIGH); // encendemos el pin correspondiente
delay(timer);
digitalWrite(ledPins[thisPin], LOW); // apagamos el pin correspondiente
}
}

Ing. Ronald N. Kopp Página 10


Arduino
37. While Loop: Cómo utilizar un bucle while () para calibrar un sensor mientras se está leyendo un
pulsador.

A veces todo lo que queremos en un programa es que se detenga mientras una condición dada es
verdadera. Podemos hacer esto mediante un bucle while (). Este ejemplo muestra cómo utilizar un
bucle while () para calibrar el valor de un sensor analógico.

En el bucle principal, el sketch de abajo lee el valor de una fotorresistencia en el pin analógico 0 y lo
utiliza para desvanecer un LED en el pin 9. Pero cuando se pulsa el pulsador conectado al pin digital 2,
el programa ejecuta una función llamada de calibración(), que busca los valores más altos y más bajos
del sensor analógico, para luego realizar la calibración. Al soltar el botón, el sketch continúa con el
bucle principal.

Esta técnica le permite actualizar los valores máximos y mínimos para la fotorresistencia cuando las
condiciones de iluminación cambian.

Hardware Required
 Arduino Board
 (1) digital pushbutton or switch
 (1) photocell, or analog sensor
 (2) 10k ohm resistors
 breadboard

Circuit
Conectamos un sensor analógico (por ej. un potenciómetro, o un fotosensor) en la entrada analógica
0 con una resistencia de 10K pull-down a tierra. luego conectamos un LED al pin 9, a través de una
resistencia de 220 ohm en serie. y por último conectamos el pulsador a la entrada digital 2 con una
resistencia de 10K pull-down a tierra.

Ing. Ronald N. Kopp Página 11


Arduino
Schematic

Ing. Ronald N. Kopp Página 12


Arduino
Code

// Estas variables no cambiarán:


const int sensorPin = A0; // pin al que el sensor está conectado
const int ledPin = 9; // pin al que el LED está conectado
const int indicatorLedPin = 13; // pin al que el LED incorporado en la placa está conectado
const int buttonPin = 2; // pin al que el pulsador está conectado

// Estas variables cambiarán:


int sensorMin = 1023; // mínimo valor del sensor
int sensorMax = 0; // máximo valor del sensor
int sensorValue = 0; // el valor del sensor

void setup() {
pinMode(indicatorLedPin, OUTPUT); // configuramos el pin del LED 9 como una salida
pinMode (ledPin, OUTPUT); // configuramos el pin del LED 13 como una salida
pinMode (buttonPin, INPUT); // configuramos el pin del pulsador como una entrada
}

void loop() {
// mientras (while) el pulsador es presionado, realizamos la calibración:
while (digitalRead(buttonPin) == HIGH) {
calibrate();
}

// indicamos el final del periodo de calibración mediante el LED interno conectado en 13


digitalWrite(indicatorLedPin, LOW);

sensorValue = analogRead(sensorPin); // leemos el valor del sensor en bruto

// mapeamos el valor bruto a valores dentro del rango de 0-255:


sensorValue = map(sensorValue, sensorMin, sensorMax, 0, 255);

// en caso de que el valor del sensor está fuera del rango visto durante la calibración lo acotamos
sensorValue = constrain(sensorValue, 0, 255);

analogWrite(ledPin, sensorValue); // desvanecemos el LED con el valor calibrado

void calibrate() {
// Encendemos el LED interno conectado en 13 para indicar que la calibración está ocurriendo:
digitalWrite(indicatorLedPin, HIGH);

Ing. Ronald N. Kopp Página 13


Arduino

sensorValue = analogRead(sensorPin); // leemos el sensor

if (sensorValue > sensorMax) { // Registramos el valor máximo del sensor


sensorMax = sensorValue;
}
if (sensorValue < sensorMin) { // Registrar el valor mínimo del sensor
sensorMin = sensorValue;
}
}

sensorValue > sensorMax sensorMax = sensorValue


0 0 0
5 0 5
6 5 6
2 6 6
1023 6 1023

sensorValue < sensorMin sensorMin = sensorValue


1023 1023 1023
1000 1023 1000
500 1000 500
800 500 500
0 500 0

Ing. Ronald N. Kopp Página 14


Arduino
38. Switch Case: Como elegir entre un número discreto de valores. Equivalente a múltiples
declaraciones if. Este ejemplo muestra cómo dividir el rango de un sensor, en un conjunto de cuatro
bandas, y luego elegir entre cuatro bandas de medidas diferentes dependiendo del resultado obtenido
del sensor.

Una sentencia if () nos permite elegir entre dos opciones discretas, verdadero o falso. Cuando hay más
de dos opciones, podemos utilizar múltiples sentencias if (), o podemos utilizar la sentencia switch().
Switch() nos permite elegir entre varias opciones discretas. Este tutorial nos muestra cómo la utilizar
la sentencia switch() para cambiar entre cuatro estados deseados que posea el fotoresistor: muy
oscuro, oscuro, medio y brillante.

Este programa primero lee la fotorresistencia. A continuación, utiliza la función de map() para mapear
su salida a uno de cuatro valores: 0, 1, 2, o 3. Y por último, se utiliza la instrucción switch() para imprimir
uno de los cuatro mensajes que se envían de vuelta a la computadora, dependiendo de cuál de los
cuatro valores se devuelve.

Hardware Required
 Arduino Board
 (1) photocell, or analog sensor
 (1) 10k ohm resistors
 breadboard
 hook-up wire

Circuit
La fotorresistencia está conectada al pin analógico 0 formando un circuito divisor de corriente con una
resistencia 10K Ohm. La función analogRead() devuelve un valor entre 0 a 600 aproximadamente 0 a
600 en un espacio interior razonablemente iluminado.

Ing. Ronald N. Kopp Página 15


Arduino
Schematic

Ing. Ronald N. Kopp Página 16


Arduino

Code

// variables que no cambiarán


// son los valores de lecturas más bajo y más alto que recibe del sensor:
const int sensorMin = 0; // mínimo valor del sensor. Descubierto a través de experimento
const int sensorMax = 600; // máximo valor del sensor. Descubierto a través de experimento

void setup() {
Serial.begin(9600); // iniciamos la comunicación serial
}

void loop() {
int sensorReading = analogRead(A0); // leemos los datos del sensor

// Mapeamos el rango del sensor en una gama de cuatro opciones 0,1,2,3:


int range = map(sensorReading, sensorMin, sensorMax, 0, 3);

// Hacemos algo diferente en función del valor de rango:


switch (range) {
case 0: // nuestra mano está en el sensor
Serial.println("dark");
break;
case 1: // nuestra mano está cerca del sensor
Serial.println("dim");
break;
case 2: // nuestra mano está a unas pulgadas del sensor
Serial.println("medium");
break;
case 3: // nuestra mano no está cerca del sensor
Serial.println("bright");
break;
}
delay(1); // demora entre lecturas para la estabilidad
}

Ing. Ronald N. Kopp Página 17


Arduino

Nombre switch ()
Ejemplo int num = 1;
switch (num) {
case 0:
Serial.println("Zero"); // No se ejecuta
break;
case 1:
Serial.println("One"); // Imprime "One"
break;
}

char letter = 'N';


switch (letter) {
case 'A':
Serial.println("Alpha"); // No se ejecuta
break;
case 'B':
Serial.println("Bravo"); // No se ejecuta
break;
default: // Ejecución por defecto si la etiqueta case
Serial.println("None"); // no coincide con los parámetros de switch
break;
}

// Removiendo un "break" permite preguntar


// por más de uno a la vez
char letter = 'b';
switch (letter) {
case 'a':
case 'A':
Serial.println("Alpha"); // No se ejecuta
break;
case 'b':
case 'B':
Serial.println("Bravo"); // Imprime "Bravo"
break;
}
Descripción Trabaja como una estructura if(), else(), pero switch() es más conveniente cuando se
necesita seleccionar entre tres o más alternativas. Los controles del programa saltan
al caso con el mismo valor como expresión. Todas las declaraciones en el
switch() son ejecutadas hasta que sean redireccionadas por un break. Solo datos
primitivos que pueden ser convertidos en enteros (byte, char y int) pueden ser
usados como parámetro de expresión. El default es opcional.
Sintaxis Switch (expresión)
{

Ing. Ronald N. Kopp Página 18


Arduino
case etiqueta:
declaraciones
case etiqueta: // Opcional
declaraciones // Opcional
default: // Opcional
declaraciones // Opcional
}
Parámetros Expresión byte, char, o int
Etiqueta byte, char, o int
Declaraciones una o más declaraciones que serán ejecutadas

Nombre case
Ejemplo char letter = 'B';

switch (letter) {
case 'A':
Serial.println("Alpha"); // No se ejecuta
break;
case 'B':
Serial.println("Bravo"); // Imprime Bravo
break;
default:
Serial.println("Zulu"); // No se ejecuta
break;
}
Descripción Denota las etiquetas principales a ser evaluadas con el parámetro en la
estructura switch().
Sintaxis case Etiqueta: Declaración
Parámetros Etiqueta byte, char, o int
Declaraciones una o más instrucciones válidas

Nombre break
Ejemplo char letter = 'B';
switch (letter) {
case 'A':
Serial.println("Alpha"); // No se ejecuta
break;
case 'B':
Serial.println("Bravo"); // Imprime Bravo
break;
default:
Serial.println("Zulu"); // No se ejecuta
break;
}
Ing. Ronald N. Kopp Página 19
Arduino
Descripción Finaliza la ejecución de estructuras como switch(), for(), o wile() y continua a la
siguiente instrucción
Sintaxis break

Ing. Ronald N. Kopp Página 20


Arduino
39. Switch Case2: Un segundo ejemplo de switch-case, que muestra cómo tomar diferentes acciones
basadas en caracteres recibidos desde el puerto serie.

Una sentencia if () nos permite elegir entre dos opciones discretas, VERDADERO o FALSO. Cuando hay
más de dos opciones, se puede utilizar múltiples sentencias if (), o se puede utilizar la sentencia
switch(). Switch() permite elegir entre varias opciones discretas.

Este tutorial muestra cómo utilizar switch() para encender un LED diferentes de varios, basado en un
byte de dato recibidos a través del puerto serie. El sketch lee la entrada a través del puerto serie, y
enciende un LED diferente en función del carácter recibido a, b, c, d, y e.

Hardware Required
 Arduino Board
 (5) LEDs
 (5) 220 ohm resistors
 breadboard
 hook-up wire

Circuit
Cinco LEDs están asociadas a los pines digitales 2, 3, 4, 5, y 6 en serie a través de una resistencia de
220 ohmios.

Para hacer este Sketch, nuestro Arduino debe estar conectado a nuestro ordenador. Abrimos el
monitor serial, y enviamos los caracteres a, b, c, d y e.

Ing. Ronald N. Kopp Página 21


Arduino
Schematic

Ing. Ronald N. Kopp Página 22


Arduino
Code

void setup() { // Iniciamos la comunicación serial


Serial.begin(9600);

for (int thisPin = 2; thisPin < 7; thisPin++) { // Iniciamos los pines conectados los LED como salidas

pinMode(thisPin, OUTPUT);
}
}

void loop() {
if (Serial.available() > 0) { // leemos los datos del sensor
int inByte = Serial.read();

// Hacemos algo diferente en función del carácter recibido.


// La sentencia switch espera valores de números individuales para cada caso;
// En este ejemplo, sin embargo, estamos utilizando comillas simples, para decirle
// al controlador que obtenga el valor ASCII del carácter.
// Por ejemplo 'a' = 97, 'b' = 98, y así sucesivamente:

switch (inByte) {
case 'a':
digitalWrite(2, HIGH);
break;
case 'b':
digitalWrite(3, HIGH);
break;
case 'c':
digitalWrite(4, HIGH);
break;
case 'd':
digitalWrite(5, HIGH);
break;
case 'e':
digitalWrite(6, HIGH);
break;
default:
for (int thisPin = 2; thisPin < 7; thisPin++) { // apagamos todos los LEDs
digitalWrite(thisPin, LOW);
}
}
}
}

Ing. Ronald N. Kopp Página 23


Arduino
Nombre default
Ejemplo char letter = 'F';

switch (letter) {
case 'A':
Serial.println("Alpha"); // No se ejecuta
break;
case 'B':
Serial.println("Bravo"); // No se ejecuta
break;
default:
Serial.println("Zulu"); // Imprime Zulu
break;
}
Descripción Palabra reservada para definir la condición por defecto de un switch(). Si no se
cumple ninguna de las etiquetas de los casos que corresponden con el parámetro
del switch(), se ejecutan las instrucciones después del default. La estructura switch()
no requiere un caso default
Sintaxis default: Declaración
Parámetros Etiqueta byte, char, o int
Declaraciones una o más instrucciones válidas a ser ejecutadas

Ing. Ronald N. Kopp Página 24

También podría gustarte