Diferencia entre revisiones de «digitalWrite()»
(→Vea también) |
(→Ejemplo 3) |
||
Línea 79: | Línea 79: | ||
PORTB = PORTB ^ 32; //Invertido estado del bit 5 (pin digital 13), no altera el resto. | PORTB = PORTB ^ 32; //Invertido estado del bit 5 (pin digital 13), no altera el resto. | ||
delay(500); | delay(500); | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | == Ejemplo 4 == | ||
+ | Tenemos 2 pulsadores, una para prender (boton1) y otro para apagar LED (boton2). Pero si pulsamos 3 veces seguidos el boton1 se aoaga el LED y se prende el LED a bordo indicando un bloqueo durante 15 segundos. | ||
+ | |||
+ | <syntaxhighlight lang="c++"> | ||
+ | const byte boton1 = 2; | ||
+ | const byte boton2 = 3; | ||
+ | const byte LED = 5; | ||
+ | |||
+ | bool val1, anterior1, val2, anterior2, estado, parar; | ||
+ | byte n; | ||
+ | unsigned long t; | ||
+ | |||
+ | void setup(){ | ||
+ | Serial.begin(9600); | ||
+ | pinMode(boton1, INPUT); | ||
+ | pinMode(boton2, INPUT); | ||
+ | pinMode(LED, OUTPUT); | ||
+ | pinMode(LED_BUILTIN, OUTPUT); | ||
+ | } | ||
+ | |||
+ | void loop() { | ||
+ | //Boton 1 | ||
+ | val1 = digitalRead(boton1); | ||
+ | if (val1 && !anterior1){ | ||
+ | estado = true; | ||
+ | n++; | ||
+ | Serial.print(estado); | ||
+ | Serial.print(", "); | ||
+ | Serial.println(n); | ||
+ | } | ||
+ | anterior1 = val1; | ||
+ | //Boton 2 | ||
+ | val2 = digitalRead(boton2); | ||
+ | if (val2 && !anterior2){ | ||
+ | estado = false; | ||
+ | n=0; | ||
+ | Serial.print(estado); | ||
+ | Serial.print(", "); | ||
+ | Serial.println(n); | ||
+ | } | ||
+ | anterior2 = val2; | ||
+ | //Pulsaste 5 veces seguidas boton 1 | ||
+ | if (n == 3){ | ||
+ | t = millis(); | ||
+ | parar = true; | ||
+ | n = 0; | ||
+ | } | ||
+ | //Bloquea 15 segundos | ||
+ | if (millis()-t < 15000 && parar){ | ||
+ | estado = false; | ||
+ | digitalWrite(LED_BUILTIN, HIGH); | ||
+ | }else{ | ||
+ | parar = false; | ||
+ | digitalWrite(LED_BUILTIN, LOW); | ||
+ | } | ||
+ | //Maneja LED | ||
+ | if (estado){ | ||
+ | digitalWrite(LED, HIGH); | ||
+ | }else{ | ||
+ | digitalWrite(LED, LOW); | ||
+ | } | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> |
Revisión del 00:05 28 jun 2019
Contenido
Descripción
Envía al puerto digital 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 + 14~19).
Nota: Debes usar pinMode() para hacer la definición previamente.
Sintaxis
digitalWrite(pin, valor);
Parámetros
- pin
- es el numero del pin digital a usar (0~13 + 14~19). Puedes usar const byte para de definirla.
- valor
- por lo general se usa las palabras reservadas HIGH o LOW, pero puedes usar 0, 1, false o true. Puedes usar una variable byte para definirla.
Retorno
Nada.
Comentarios
- Los terminales de Arduino, por defecto, están configurados como entradas, por lo tanto no es necesario definirlos en el caso de que vayan a trabajar como entradas.
- Los pines configurados como INPUT (entrada) quedan, bajo el punto de vista eléctrico, como entradas en alta impedancia.
- Los pines configurado como OUTPUT (salida) se dice que están en un estado de baja impedancia y pueden proporcionar 40 mA de corriente a otros dispositivos y circuitos. Esta corriente es suficiente para alimentar un LED (no olvides poner una resistencia en serie de 220 ohms o mas), pero no es lo suficiente grande como para alimentar cargas de mayor consumo como relés o motores.
- Un cortocircuito en las patillas Arduino provocará una corriente elevada que puede dañar o destruir el chip ATmega.
Tip: Este comando tarda 63 ciclos de CPU en salidas digitales sin PWM y 77 ciclos en salidas digitales con PWM.
Advertencias
En muchos ejemplo se ve que usa una variable de tipo int para definir el pin a usar. Esto es un grave error por dos motivos:
- Una variable sera almacenada en memoria SRAM porque se espera que su valor cambie durante la ejecución del boceto, pero normalmente en los pines esto nunca ocurre, por lo que es preferible usar const que es almacenada en flash.
- El tipo int ocupa 2 byte. Es suficiente usar el tipo byte (0~255) que solo ocupa 1 byte.
Ejemplo 1
Estos comando se ejecuta una sola vez al estar en setup().
void setup(){
for (byte n=2; n<=7; n++){
pinMode(n, OUTPUT);
}
pinMode(17, OUTPUT);
digitalWrite(2, HIGH);
digitalWrite(3, LOW);
digitalWrite(4, 1);
digitalWrite(5, 0);
digitalWrite(6, true);
digitalWrite(7, false);
digitalWrite(17, HIGH); //Pone en HIGH el pin analogico A3
}
void loop(){
//nada
}
Ejemplo 2
Primero se preparan los pines digitales 6~10 como salidas. Luego se conmutan (se prende si esta apagado y viceversa) cada medio segundo alternativamente cada LED. Debes conectar 5 LED con sus respectivas resistencias de 220 ohms.
void setup(){
for (byte i=6; i<=10; i++){
pínMode(i, OUTPUT);
digitalWrite(i, LOW);
}
}
void loop(){
for (byte i=6; i<=10; i++){
digitalWrite(i, !digitalRead(i));
delay(500);
}
}
Ejemplo 3
Parpadea el LED a bordo.
void setup() {
DDRB = DDRB | 32; //Configura el pin digital 13 como OUTPUT, no altera el resto. 32=B00100000;
}
void loop() {
PORTB = PORTB ^ 32; //Invertido estado del bit 5 (pin digital 13), no altera el resto.
delay(500);
}
Ejemplo 4
Tenemos 2 pulsadores, una para prender (boton1) y otro para apagar LED (boton2). Pero si pulsamos 3 veces seguidos el boton1 se aoaga el LED y se prende el LED a bordo indicando un bloqueo durante 15 segundos.
const byte boton1 = 2;
const byte boton2 = 3;
const byte LED = 5;
bool val1, anterior1, val2, anterior2, estado, parar;
byte n;
unsigned long t;
void setup(){
Serial.begin(9600);
pinMode(boton1, INPUT);
pinMode(boton2, INPUT);
pinMode(LED, OUTPUT);
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
//Boton 1
val1 = digitalRead(boton1);
if (val1 && !anterior1){
estado = true;
n++;
Serial.print(estado);
Serial.print(", ");
Serial.println(n);
}
anterior1 = val1;
//Boton 2
val2 = digitalRead(boton2);
if (val2 && !anterior2){
estado = false;
n=0;
Serial.print(estado);
Serial.print(", ");
Serial.println(n);
}
anterior2 = val2;
//Pulsaste 5 veces seguidas boton 1
if (n == 3){
t = millis();
parar = true;
n = 0;
}
//Bloquea 15 segundos
if (millis()-t < 15000 && parar){
estado = false;
digitalWrite(LED_BUILTIN, HIGH);
}else{
parar = false;
digitalWrite(LED_BUILTIN, LOW);
}
//Maneja LED
if (estado){
digitalWrite(LED, HIGH);
}else{
digitalWrite(LED, LOW);
}
}
Vea también
Referencias externas
- Niveles lógicos en Arduino
- Playground
- Entradas y salidas - Luis del Valle