¿Cómo puedo leer digitalmente un pin que está en la salida pinMode?


Tengo una prueba muy simple sketch en la que estoy tratando de establecer un pin a HIGH y luego leer su estado con digitalRead. Aquí está mi dibujo.

void setup()
{
    Serial.begin(9600);
}

void loop()
{
    delay(1000);

    pinMode(3, OUTPUT);
    digitalWrite(3, HIGH);
    delay(1000);

    pinMode(3, INPUT);
    Serial.println(digitalRead(3));
}

Resultado del monitor serial:

0
0
0
0

He llegado a entender que cambiar el pinMode evitará que sea HIGH. Por lo tanto, establecer un pin en HIGH en modo OUTPUT y luego cambiar a modo INPUT lo cambiará a LOW. Así que el digitalRead siempre devolverá 0. Si no cambio el pinMode no será capaz de leer el PIN. Entonces, ¿cómo puedo leer la configuración actual de un pin que está en modo OUTPUT sin perder el valor?

 29
Author: Peter Mortensen, 2011-05-28

11 answers

En este caso, solo desea acceder al registro de datos en sí.

Los registros PORTB y PORTD contienen los datos pin que está buscando. Finalmente tuve acceso a un Arduino para averiguarlo. Desea utilizar bitRead(PORTD, pin).

Serial.println(bitRead(PORTD,3)); //Reads bit 3 of register PORTD which contains the current state (high/low) of pin 3.

Referencia Bit Operación de lectura para más información.

 30
Author: MikeRags,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-07 19:31:55

Su boceto debe ser

void setup()
{
    Serial.begin(9600);
}

void loop()
{
    delay(1000);

    pinMode(3, OUTPUT);
    digitalWrite(3, HIGH);
    delay(1000);

    // pinMode(3, INPUT); // get rid of this line
    Serial.println(digitalRead(3));
}

Eso es todo. Luego lee el estado del pin que en su caso es "ALTO". Si configura el pinMode a input, leerá la entrada dependiendo de lo que esté conectado. Si está escribiendo "HIGH" en un pin de entrada, se activará el pullup interno. No importa si escribe ALTO antes de configurarlo en modo de entrada o después de configurarlo en modo de entrada. A menos que, por supuesto, esté conduciendo una carga que sea demasiado alta para el pin de salida (por ejemplo, un interruptor a tierra). Entonces esto probablemente mataría el alfiler.

Si ha escrito un valor bajo y ha establecido el pin en valor bajo, puede flotar, lo que puede conducir a cualquier tipo de comportamiento impredecible.

 30
Author: Udo Klein,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-23 08:04:30
digitalWrite(3,HIGH);
digitalRead(3);
 3
Author: msj003,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-14 04:24:30

¿por Qué quieres hacer eso? Si está haciendo esto para validar que el pin es realmente alto, esto no lo confirmará, porque tal vez hay un cortocircuito en el pin alto del circuito externo, la mejor manera es crear una retroalimentación a través de otro pin; configurar otro pin como entrada, y conectar el pin de salida al nuevo pin de entrada, y leer su valor. La lectura del registro interno siempre le devolverá lo que el controlador está tratando de poner en el pin, no el pin real valor.

 2
Author: Karim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-27 00:45:30

Mantenga su selección pinMode() en la función setup(), y pruebe las funciones digitalWrite() y digitalRead().

setup() se ejecutará cuando se inicie el controlador y loop() será la función que seguirá ejecutándose.

int pin22 = 22;
void setup()
{
  Serial.begin(9600);
  pinMode(pin22,output);
}

void loop()
{
  digitalWrite(pin22,HIGH);
  digitalRead(pin22);
  digitalWrite(pin22,LOW);
  digitalRead(pin22);
}
 2
Author: AMPS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-26 22:43:40

A

No le gustó ninguna de las respuestas anteriores, porque no serían compatibles con la plataforma arduino cruzada. Necesita acceder a través de las tablas de referencia de pin. La siguiente expresión hace el truco.

bool value = (0!=(*portOutputRegister( digitalPinToPort(pin) ) & digitalPinToBitMask(pin)));

Permítanme desglosar eso para una mejor comprensión

digitalPinToPort(pin) busque el banco gpio [puerto] al que está asignado el pin en el hardware seleccionado

portOutputRegister(...) le da un puntero al puerto que contiene el valor que están buscando. * desreferencias del puntero y da el valor completo de los 8 pines asignados a ese puerto. Todavía no es excepcionalmente útil, pero el bit que está buscando está ahí.

&digitalPinToBitMask(pin) selecciona solo el bit que le interesa para el pin, todos los demás bits serán cero.

0!= pruebas para ver si la expresión resultante es cero, o algo más. Si es cero, entonces su salida es cero en ese pin. De lo contrario, la salida es una.

 1
Author: user2825128,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-04 18:34:02

¿Está intentando establecer la entrada predeterminada en ALTA?
Si es así, está buscando activar el registro pull-up:

void setup() 
{
    Serial.begin(9600);
}

void loop() 
{
    delay(1000);

    pinMode(3,INPUT);         // default mode is INPUT  
    digitalWrite(3, HIGH);    // Turn on the internal pull-up resistor, default state is HIGH  

    delay(1000);
    Serial.println(digitalRead(3));
}

Extracto de DigitalWrite:

Si el pin está configurado como una ENTRADA, escribir un valor ALTO con digitalWrite() habilitará una resistencia pullup interna de 20K.

 0
Author: ssapkota,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-28 11:38:37

Mantenga un mapa booleano separado de los estados del pin de salida.

Si un pin GPIO de microcontrolador se establece como entrada, entonces su valor, cuando se lee, depende de a qué está conectado externamente. Ese es el punto.

 0
Author: Martin James,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-07 19:33:17

Siempre tenga en cuenta. Si está intentando Configurar algo ,Simplemente guárdelo en el archivo de configuración. Desde el archivo de configuración se ejecuta una vez, Si está configurando en bucle . lo cumplen continuo.y tratar de mantenerlo sigue siendo que el estado de inicio.Que es estado bajo activo

 0
Author: AMPS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-08 12:32:56

Escribí una rutina para flashear cuatro LEDs de diferentes para diferentes propósitos, pero yo también quería conservar su estado inicial antes de que me la flashea, como su estado estacionario también me dice que algo está ocurriendo en mi código, así que aquí está mi código Flash, que lo llame por enviar el número de pin, el número de veces que flashear y la duración del flash es para.

inline void Flash (byte pinNum, byte times, byte flashSpeed)
  {
    bool state;                     // Local var for State of pin
    state = digitalRead(pinNum);    // Read the current state as set elsewhere
    int x;                          // Local var for repeat flash
    for (x = 0; x < times; x++)
      {
        digitalWrite(pinNum, HIGH); // Turn on LED
        delay(flashSpeed);
        digitalWrite(pinNum, LOW);  // Turn off LED
        delay(flashSpeed * 2);      //  leave off twice as long as on
      }                             //  due to persistence of Vision   
    digitalWrite(pinNum, state);    // Restore the original state of the LED
  }
 0
Author: KeyWizard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-20 20:25:41

Puedes probar:

int Pin22 = 22;
int valuePin22 = 0;

void setup() {

    pinMode(Pin22, OUTPUT);
    digitalWrite(Pin22, LOW);

}

void loop() {

    digitalWrite(Pin22, HIGH)
    valuePin22 = 1;
    Serial.println(valuePin22);
    delay(100);

    digitalWrite(Pin22, LOW)
    valuePin22 = 0;
    Serial.println(valuePin22);
    delay(1000)

}
 -2
Author: novecapa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-02 18:26:03