Diferencia entre revisiones de «digitalWrite()»
(→Ejemplo 3) |
(→Comentarios) |
||
(No se muestran 7 ediciones intermedias del mismo usuario) | |||
Línea 23: | Línea 23: | ||
{{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 col3cen" | ||
+ | |+Velocidad de reacción | ||
+ | |- | ||
+ | ! Metodo !! KHz !! Ciclos | ||
+ | |- | ||
+ | | digitalWrite() || 142 || 56 | ||
+ | |- | ||
+ | | CLR() || 4000 || 2 | ||
+ | |- | ||
+ | | PORTB <nowiki>|=</nowiki> _BV() || 4000 || 2 | ||
+ | |} | ||
== Advertencias == | == Advertencias == | ||
Línea 83: | Línea 95: | ||
== Ejemplo 4 == | == Ejemplo 4 == | ||
− | Tenemos 2 pulsadores, | + | 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. |
<syntaxhighlight lang="c++"> | <syntaxhighlight lang="c++"> | ||
− | const byte boton1 = 2; | + | const byte boton1 = 2; //Boton prender y bloquear |
− | const byte boton2 = 3; | + | const byte boton2 = 3; //Bontos apagar |
− | const byte LED = 5; | + | const byte LED = 5; //LED |
bool val1, anterior1, val2, anterior2, estado, parar; | bool val1, anterior1, val2, anterior2, estado, parar; | ||
Línea 123: | Línea 135: | ||
} | } | ||
anterior2 = val2; | anterior2 = val2; | ||
− | //Pulsaste | + | //Pulsaste 3 veces seguidas boton 1 |
if (n == 3){ | if (n == 3){ | ||
t = millis(); | t = millis(); | ||
Línea 142: | Línea 154: | ||
}else{ | }else{ | ||
digitalWrite(LED, LOW); | digitalWrite(LED, LOW); | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | == 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. | ||
+ | |||
+ | <syntaxhighlight lang="c++"> | ||
+ | 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); | ||
} | } | ||
} | } | ||
Línea 153: | Línea 187: | ||
* [https://playground.arduino.cc/ArduinoNotebookTraduccion/DigitalIO Playground] | * [https://playground.arduino.cc/ArduinoNotebookTraduccion/DigitalIO Playground] | ||
* [https://programarfacil.com/podcast/26-arduino-entradas-y-salidas/ Entradas y salidas] - Luis del Valle | * [https://programarfacil.com/podcast/26-arduino-entradas-y-salidas/ Entradas y salidas] - Luis del Valle | ||
+ | * [http://manueldelgadocrespo.blogspot.com/p/digitalwrite.html digitalWrite()] de Manuel Delgado | ||
+ | * [https://aprendiendoarduino.wordpress.com/tag/digitalwrite/ digitalWrite] de Enrique Crespo | ||
+ | * [https://blog.bricogeek.com/noticias/arduino/arduino-funcion-digitalwrite-mas-rapida/ Funcion digitalWrite mas rapida] de BricoGeek | ||
[[Category:Funciones pines]] | [[Category:Funciones pines]] |
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