Entradas y salidas: digitales y analógicas Sensores tipo apagado-encendido Interruptores (switches) Termostatos Interruptores magnéticos Interruptores de presión Interruptores de inclinación Sensor de infrarrojos, PIR, (Passive Infrared Sensor) Controlar la luz (u otros inputs) con pulsos modulados PWM (Pulse Width Modulation): reguladores de intensidad.
Salidas analógicas: regulación de intensidad con PWM La idea es jugar con los tiempos de encendido y apagado. Esto lo podemos hacer colocando retardos en el código, pero es incómodo y poco eficiente. Con Arduino podemos modular la intensidad usando los pines analógicos 3, 5, 6, 9, 10 y 11. Se controlan con la función analogwrite(pin, valor) valor: un nº entre 0 y 255
Entradas y sensores analógicos Los sensores analógicos necesitan un tipo diferente de pin a los de los sensores de respuesta si-no. en la placa Arduino hay 6 pines marcados como ANALOG IN (A0 a A5). la función para leer la información de este tipo de entradas es analogread(pin). analogread() devuelve un valor entre 0 y 1023 para voltajes entre 0 y 5 voltios. Vamos a practicar con nuestros sensores analógicos.
Sketch para aumentar y disminuir la intensidad del LED Salidas analógicas /* Disminuir y aumentar la intensidad del LED */ const int LED = 9; // the pin for the LED int i = 0; // usamos este contador para contar hacia arriba y // hacia abajo void setup() { pinmode(led, OUTPUT); // tell Arduino LED is an output void loop() { for (i = 0; i < 255; i++) { // bucle de 0 a 254 (intensidad //aumenta) analogwrite(led, i); // establecer el brillo del LED delay(10); // esperar 10ms: analogwrite es instantáneo // y podríamos no ver el cambio for (i = 255; i > 0; i--) { // loop from 255 to 1 (fade out) analogwrite(led, i); // establecemos el brillo del LED delay(10); // esperar 10ms
Vamos a juntar ahora el circuito que acabamos de hacer con el del botón: la idea es que según el tiempo que apretemos el botón, la luz sea más o menos intensa. Montar el circuito correspondiente y ejecutar el siguiente sketch // Mantener encendido el LED tras la pulsación y cambiar el brillo mientras el botón esté pulsado. const int LED = 9; const int BUTTON = 7; int val = 0; int old_val = 0; int state = 0; int brightness = 128; unsigned long starttime = 0; void setup() { pinmode(led, OUTPUT); pinmode(button, INPUT); // the pin for the LED // input pin of the pushbutton // stores the state of the input pin // stores the previous value of "val" // 0 = LED off while 1 = LED on // almacena el valor de la intensidad // when did we begin pressing? // el LED es una salida // y el botón una entrada
void loop() { continuación val = digitalread(button); // lee el valor de entrada y lo guarda // comprobamos si ha habido una transición if ((val == HIGH) && (old_val == LOW)) { state = 1 - state; // cambiar el estado de apagado a // encendido o vice-versa starttime = millis(); // millis() es el reloj de Arduino //devuelve las milésimas de seg. transcurridas desde que //se restableció la placa delay(10); // comprobamos si el botón se ha mantenido pulsado if ((val == HIGH) && (old_val == HIGH)) { // If the button is held for more than 500 ms. if (state == 1 && (millis() - starttime) > 500) { brightness++; // increment brightness by 1 delay(10); // retardo para evitar que el brillo pase demasiado deprisa if (brightness > 255) { // 255 is the max brightness brightness = 0; // if we go over 255 let s go back to 0
old_val = val; if (state == 1) { analogwrite(led, brightness); else { analogwrite(led, 0); // val es ahora antiguo y lo almacenamos // encender el LED al nivel actual de brillo // turn LED OFF fin Esto funciona! Si pulsamos y soltamos, el LED se enciende y apaga. Si lo mantenemos pulsado, el brillo cambia hasta que lo soltemos.
Entradas analógicas: un sensor electrónico en lugar del botón Montamos una nueva versión del circuito del botón y el LED. Cambiamos el botón por una fotorresistencia o LDR (resistencia dependiente de la luz). Si tapamos la LDR con las manos, el LED se apaga y si las quitamos, el LED se enciende de nuevo. Este tipo de sensores nos pueden decir no sólo si hay o no luz, sino, además y muy importante, la cantidad de luz que hay.
montamos el circuito de la figura (o uno mejorado), y ejecutamos el siguiente código: // LED que parpadea a la velocidad especificada por el valor de la entrada analógica const int LED = 13; int val = 0; // el pin del LED // variable usada para almacenar el valor //que proviene del sensor void setup() { pinmode(led, OUTPUT); void loop() { val = analogread(0); // LED es una salida // leer el valor del sensor digitalwrite(led, HIGH); // encender el LED delay(val); // detener el programa durante un tiempo digitalwrite(led, LOW); // apagar el LED En la placa de montajes colocamos el fotorresistor y una resistencia de 10 k Ω delay(val);
Ahora, vamos a juntar el sensor (LDR) y el actuador (LED) en un mismo circuito. Modificamos el circuito. Cargamos y ejecutamos el siguiente sketch. // Establecer el brillo del LED según el valor de una entrada analógica const int LED = 9; int val = 0; // the pin for the LED // variable used to store the value coming from the sensor void setup() { pinmode(led, OUTPUT); // LED is as an OUTPUT void loop() { val = analogread(0); // read the value from the sensor analogwrite(led, val/4); // encender el LED con el brillo obtenido del sensor delay(10); // stop the program for some time
MEDIDOR DE TEMPERATURA (amorímetro) Descripción del proyecto Vamos a usar un sensor de temperatura (datos analógicos) para medir nuestra temperatura. El voltaje de salida es directamente proporcional a la temperatura en grados centígrados. MATERIAL NECESARIO - 3 LED s rojos - 1 sensor de temperatura TMP36-3 resistencias de 220 Ω - Cables, placa de montajes -1 placa Arduino A destacar - entrada analógica - uso del monitor serie
corriente y toma de tierra MEDIDOR DE TEMPERATURA la pata corta del LED, cátodo, a tierra a través de la resistencia patilla izquierda a la corriente y derecha a tierra; la central a A0 La conexión USB se puede utilizar para mandar datos al equipo o recibirlos desde el ordenador. Después de cargar el sketch, hacer clic en el icono del monitor serie (arriba, derecha). Hay que especificar la velocidad de la comunicación: 9600 bps.
MEDIDOR DE TEMPERATURA // medidor de temperatura // nombramos al pin donde está conectado el sensor const int sensorpin = A0; // room temperature in Celcius (la medimos o estimamos) const float baselinetemp = 20.0; void setup() { // abrimos el puerto serie para ver los datos en pantalla Serial.begin(9600); // declaramos los LED s como salidas y los apagamos for (int pinnumber = 2; pinnumber < 5; pinnumber++) { pinmode(pinnumber, OUTPUT); digitalwrite(pinnumber, LOW);
MEDIDOR DE TEMPERATURA void loop() { // leer el valor en el pin A0 y almacenarlo en una variable local // el valor está entre 0 y 1023 int sensorval = analogread(sensorpin); Serial.print( lectura del sensor: "); Serial.print(sensorVal); // convert the ADC reading to voltage float voltaje = (sensorval / 1024.0) * 5.0; // Send the voltage level out the Serial port Serial.print(", Volts: "); Serial.print(voltaje); // convert the voltage to temperature in degrees C // tenemos en cuenta las especificaciones // del sensor (10mV equivale a 1 ºC) Serial.print(", grados (C): "); float temperature = (voltaje -.5) * 100; Serial.println(temperature);
// if the current temperature is lower than the baseline MEDIDOR DE TEMPERATURA // turn off all LEDs if (temperature < baselinetemp) { digitalwrite(2, LOW); digitalwrite(3, LOW); digitalwrite(4, LOW); // if the temperature rises 2-4 degrees, turn an LED on else if (temperature >= baselinetemp + 2 && temperature < baselinetemp + 4) { digitalwrite(2, HIGH); digitalwrite(3, LOW); digitalwrite(4, LOW); // if the temperature rises 4-6 degrees, turn a second LED on else if (temperature >= baselinetemp + 4 && temperature < baselinetemp + 6) { digitalwrite(2, HIGH); digitalwrite(3, HIGH); digitalwrite(4, LOW); // if the temperature rises more than 6 degrees, turn all LEDs on else if (temperature >= baselinetemp + 6) { digitalwrite(2, HIGH); digitalwrite(3, HIGH); digitalwrite(4, HIGH); delay(50);
LÁMPARA DE VARIOS COLORES MATERIAL NECESARIO - 1 LED rgb - 3 fotocélulas o fotorresistores - 3 resistencias de 10 kω - 3 resistencias de 220 Ω - Cables, placa de montajes -1 placa Arduino A destacar - Salidas analógicas - Mapear (cambiar de escala) valores Descripción del proyecto Vamos a hacer una lámpara que cambia de color en función de las condiciones externas
LÁMPARA DE VARIOS COLORES La terminal más larga es el cátodo Rojo A0 Verde A1 Azul A2
LÁMPARA DE VARIOS COLORES // Lámpara multicolor const int greenledpin = 9; // LED connected to digital pin 9 const int redledpin = 10; // LED connected to digital pin 10 const int blueledpin = 11; // LED connected to digital pin 11 const int redsensorpin = A0; const int greensensorpin = A1; const int bluesensorpin = A2; // pin with the photoresistor with the red gel // pin with the photoresistor with the green gel // pin with the photoresistor with the blue gel int redvalue = 0; int greenvalue = 0; int bluevalue = 0; // valores iniciales int redsensorvalue = 0; int greensensorvalue = 0; int bluesensorvalue = 0; void setup() { // inicializamos la comunicación serie Serial.begin(9600); // set the digital pins as outputs pinmode(greenledpin, OUTPUT); pinmode(redledpin, OUTPUT); pinmode(blueledpin, OUTPUT);
LÁMPARA DE VARIOS COLORES void loop() { // leer los valores de los sensores y almacenarlos en las variables correspondientes redsensorvalue = analogread(redsensorpin); delay(25); // esperar a que el ADC termine greensensorvalue = analogread(greensensorpin); delay(25); bluesensorvalue = analogread(bluesensorpin); // escribir los valores en el monitor serie tabulados Serial.print("raw sensor Values \t red: "); Serial.print(redSensorValue); Serial.print("\t green: "); Serial.print(greenSensorValue); Serial.print("\t blue: "); Serial.println(blueSensorValue);
LÁMPARA DE VARIOS COLORES /* El ADC proporciona un valor entre 0 y 1023 (10 bits) pero analogwrite() usa 8 bits, valores entre 0 y 255. Por lo tanto, dividimos la lectura del sensor entre 4. */ redvalue = redsensorvalue / 4; greenvalue = greensensorvalue / 4; bluevalue = bluesensorvalue / 4; // print out the mapped values Serial.print( valores sensores corregidos \t red: "); Serial.print(redValue); Serial.print("\t green: "); Serial.print(greenValue); Serial.print("\t Blue: "); Serial.println(blueValue); // ajustamos los niveles de luz del LED analogwrite(redledpin, redvalue); analogwrite(greenledpin, greenvalue); analogwrite(blueledpin, bluevalue);