Diferencia entre revisiones de «digitalWrite()»
(→Comentarios) |
(→Comentarios) |
||
Línea 24: | Línea 24: | ||
{{Tip|Este comando tarda 63 ciclos de CPU en salidas digitales sin PWM y 77 ciclos en salidas digitales con PWM.}} | {{Tip|Este comando tarda 63 ciclos de CPU en salidas digitales sin PWM y 77 ciclos en salidas digitales con PWM.}} | ||
− | {| class="wikitable col2cen | + | {| class="wikitable col2cen col3cen" |
|+Velocidad de reacción | |+Velocidad de reacción | ||
|- | |- |
Revisión actual del 21:50 17 jul 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.
Metodo | KHz | Ciclos |
---|---|---|
digitalWrite() | 142 | 56 |
CLR() | 4000 | 2 |
PORTB |= _BV() | 4000 | 2 |
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, uno para prender (boton1) y otro para apagar (boton2) un LED . Pero si pulsamos 3 veces seguidos el boton1 se apaga el LED y se prende el LED a bordo indicando un bloqueo durante 15 segundos.
const byte boton1 = 2; //Boton prender y bloquear
const byte boton2 = 3; //Bontos apagar
const byte LED = 5; //LED
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 3 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);
}
}
Ejemplo 5
En este ejemplo conectamos un display 7 segmentos entre los pines digitales 2 al 8 (segmentos a-f) cada uno con su resistencia de 330 ohmos. Luego mostramos alternativamente cada letra de HOLA de manera secuencial.
const byte hola[]= {B1110110,B0111111,B0111000,B1110111}; //HOLA
void setup() {
for (byte n=2; n<9; n++){
pinMode(n, OUTPUT);
}
}
void loop(){
for (byte i=0; i<4; i++){
for (byte s=2; s<9; s++){
digitalWrite(s, bitRead(hola[i], s-2));
}
delay(1000);
}
}
Vea también
Referencias externas
- Niveles lógicos en Arduino
- Playground
- Entradas y salidas - Luis del Valle
- digitalWrite() de Manuel Delgado
- digitalWrite de Enrique Crespo
- Funcion digitalWrite mas rapida de BricoGeek