digitalWrite()

De ArduWiki
Saltar a: navegación, buscar

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.


Velocidad de reacción
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:

  1. 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.
  2. 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