Diferencia entre revisiones de «digitalRead()»

De ArduWiki
Saltar a: navegación, buscar
(Vease también)
(Referencias externas)
 
(No se muestran 31 ediciones intermedias del mismo usuario)
Línea 1: Línea 1:
 
== Descripción ==
 
== Descripción ==
 
Lee el valor del pin digital dando un resultado. Los valores pueden ser [[HIGH / LOW]].
 
Lee el valor del pin digital dando un resultado. Los valores pueden ser [[HIGH / LOW]].
 +
 +
{{Tip|Los pines tanto analógicos como digitales de '''entrada''' no necesitan ser definidos con [[pinMode()]].}}
  
 
== Sintaxis ==
 
== Sintaxis ==
Línea 12: Línea 14:
 
== Retorno ==
 
== Retorno ==
 
Devuelve el valor del pin: [[HIGH / LOW]].
 
Devuelve el valor del pin: [[HIGH / LOW]].
 +
 +
== Comentarios ==
 +
{{Tip|Este comando tarda 58 ciclos de CPU en salidas digitales sin PWM y 72 ciclos en salidas digitales con PWM.}}
  
 
== Advertencias ==
 
== 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:
+
En muchos ejemplo se ve que usan 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 bosquejo, pero normalmente en los pines esto nunca ocurre, por lo que es preferible usar [[const]] que es almacenada en [[flash]].
+
# La 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.
 
# El tipo [[int]] ocupa 2 byte. Es suficiente usar el tipo [[byte]] (0~255) que solo ocupa 1 byte.
  
== Ejemplo ==
+
== Ejemplo 1 ==
 
Cuando presionamos el pulsador el LED a bordo se prende, soltamos y se apaga. Poner un pulsador entre pin digital 3 y GND.
 
Cuando presionamos el pulsador el LED a bordo se prende, soltamos y se apaga. Poner un pulsador entre pin digital 3 y GND.
  
Línea 35: Línea 40:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
{{Nota|digitalRead() retorna un verdadero mientas no estas pulsando el botón gracias a su configuración INPUT_PULLUP, asi que es exactamente lo mismo si pones '''!digitalRead(3)''' como condición.}}
+
{{Nota|digitalRead() retorna un verdadero mientas no estas pulsando el botón gracias a su configuración INPUT_PULLUP, asi que es exactamente lo mismo si pones '''!digitalRead(3)''' como condición. Ver Ejemplo 1a.}}
 +
 
 +
== Ejemplo 1a ==
 +
Cuando presionamos el pulsador el LED a bordo se prende, soltamos y se apaga. Poner un pulsador entre pin digital 3 y GND.
  
 
<syntaxhighlight lang="c++">
 
<syntaxhighlight lang="c++">
Línea 51: Línea 59:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== Vease también ==
+
== Ejemplo 1b ==
* [[pinMode()]]
+
Cuando presionamos el pulsador el LED a bordo se prende, soltamos y se apaga. Poner un pulsador entre pin digital 3 y GND.
* [[digitalWrite()]]
+
 
* [[analogRead()]]
+
<syntaxhighlight lang="c++">
* [[analogWrite()]]
+
void setup(){
* [[Programacion avanzada]]
+
  pinMode(LED_BUILTIN, OUTPUT);
 +
  pinMode(3, INPUT_PULLUP);
 +
}
 +
void loop(){
 +
  if (!digitalRead(3)){
 +
      digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));  //Conmuta LED
 +
  }
 +
}
 +
</syntaxhighlight>
 +
 
 +
== Ejemplo 2 ==
 +
Cuando presionamos una vez el pulsador el LED a bordo se prende. Pulsamos nuevamente y se apaga. Poner un pulsador entre pin digital 2 y GND.
 +
 
 +
<syntaxhighlight lang="c++">
 +
bool valor,anterior;
 +
void setup(){
 +
  pinMode(LED_BUILTIN, OUTPUT);
 +
  pinMode(2, INPUT_PULLUP);
 +
}
 +
void loop(){
 +
  valor = digitalRead(2);
 +
  if (!valor && anterior){
 +
      digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));  //Conmuta LED
 +
  }
 +
  anterior = valor;
 +
}
 +
</syntaxhighlight>
 +
 
 +
== Ejemplo 3 ==
 +
Cada vez que presionamos el pulsador cuenta una mas en binario. Poner un pulsador entre pin digital 2 y GND, mas 8 LED en pines 3 al 10 con su respectiva resistencia de 330 ohms.
 +
 
 +
<syntaxhighlight lang="c++">
 +
bool valor,anterior;
 +
byte n;
 +
void setup(){
 +
  pinMode(2, INPUT_PULLUP);
 +
  for (byte i=3; i<11; i++){
 +
      pinMode(i, OUTPUT);
 +
  }
 +
}
 +
void loop(){
 +
  valor = digitalRead(2);
 +
  if (!valor && anterior){
 +
      n++;
 +
  }
 +
  anterior = valor;
 +
  for (byte i=3; i<11; i++){
 +
      digitalWrite(i, bitRead(n, i-3));
 +
  }
 +
}
 +
</syntaxhighlight>
 +
 
 +
== Vea también ==
 +
<categorytree mode=all>Funciones pines</categorytree>
  
== Referencias ==
+
== Referencias externas ==
 +
* [https://www.arduino.cc/reference/es/language/variables/constants/constants/ Niveles lógicos en Arduino]
 +
* [https://playground.arduino.cc/ArduinoNotebookTraduccion/DigitalIO Playground]
 +
* [https://programarfacil.com/podcast/26-arduino-entradas-y-salidas/ Entradas y salidas] - Luis del Valle
 +
* [https://www.luisllamas.es/salidas-digitales-en-arduino/ Salidas digitales en Arduino] - Luis Llamas
 +
* [https://naylampmechatronics.com/blog/39_Resistencias-Pull-Up-y-Pull-Down.html Pull-Up y Pull-Down] - Laylamp
 +
* [https://itp.nyu.edu/physcomp/lessons/microcontrollers/digital-input-output/ Digital input/output] - ITP Informatica Fisica
 +
* [http://arduino.perut.org/Arduino_17.htm Puertos Arduino] - Kike_GL
  
[[Category:Funciones]]
+
[[Category:Funciones pines]]

Revisión actual del 18:02 7 oct 2019

Descripción

Lee el valor del pin digital dando un resultado. Los valores pueden ser HIGH / LOW.

Tip: Los pines tanto analógicos como digitales de entrada no necesitan ser definidos con pinMode().


Sintaxis

digitalRead(pin);

Parámetros

pin
es el numero del pin digital a usar (0~13 + 14~19). Puedes usar const byte para de definir el numero de pin.

Retorno

Devuelve el valor del pin: HIGH / LOW.

Comentarios

Tip: Este comando tarda 58 ciclos de CPU en salidas digitales sin PWM y 72 ciclos en salidas digitales con PWM.


Advertencias

En muchos ejemplo se ve que usan una variable de tipo int para definir el pin a usar. Esto es un grave error por dos motivos:

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

Cuando presionamos el pulsador el LED a bordo se prende, soltamos y se apaga. Poner un pulsador entre pin digital 3 y GND.

void setup(){
   pinMode(LED_BUILTIN, OUTPUT);
   pinMode(3, INPUT_PULLUP);
}
void loop(){
   if (digitalRead(3) == LOW){
       digitalWrite(LED_BUILTIN, HIGH);  //Prende LED
   }else{
       digitalWrite(LED_BUILTIN, LOW);   //Apaga LED
   }
}

Nota: digitalRead() retorna un verdadero mientas no estas pulsando el botón gracias a su configuración INPUT_PULLUP, asi que es exactamente lo mismo si pones !digitalRead(3) como condición. Ver Ejemplo 1a.


Ejemplo 1a

Cuando presionamos el pulsador el LED a bordo se prende, soltamos y se apaga. Poner un pulsador entre pin digital 3 y GND.

void setup(){
   pinMode(LED_BUILTIN, OUTPUT);
   pinMode(3, INPUT_PULLUP);
}
void loop(){
   if (!digitalRead(3)){
       digitalWrite(LED_BUILTIN, HIGH);  //Prende LED
   }else{
       digitalWrite(LED_BUILTIN, LOW);   //Apaga LED
   }
}

Ejemplo 1b

Cuando presionamos el pulsador el LED a bordo se prende, soltamos y se apaga. Poner un pulsador entre pin digital 3 y GND.

void setup(){
   pinMode(LED_BUILTIN, OUTPUT);
   pinMode(3, INPUT_PULLUP);
}
void loop(){
   if (!digitalRead(3)){
       digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));  //Conmuta LED
   }
}

Ejemplo 2

Cuando presionamos una vez el pulsador el LED a bordo se prende. Pulsamos nuevamente y se apaga. Poner un pulsador entre pin digital 2 y GND.

bool valor,anterior;
void setup(){
   pinMode(LED_BUILTIN, OUTPUT);
   pinMode(2, INPUT_PULLUP);
}
void loop(){
   valor = digitalRead(2);
   if (!valor && anterior){
       digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));  //Conmuta LED
   }
   anterior = valor;
}

Ejemplo 3

Cada vez que presionamos el pulsador cuenta una mas en binario. Poner un pulsador entre pin digital 2 y GND, mas 8 LED en pines 3 al 10 con su respectiva resistencia de 330 ohms.

bool valor,anterior;
byte n;
void setup(){
   pinMode(2, INPUT_PULLUP);
   for (byte i=3; i<11; i++){
      pinMode(i, OUTPUT);
   }
}
void loop(){
   valor = digitalRead(2);
   if (!valor && anterior){
      n++;
   }
   anterior = valor;
   for (byte i=3; i<11; i++){
      digitalWrite(i, bitRead(n, i-3));
   }
}

Vea también


Referencias externas