voltage pin outputs led_builtin inputs define and alto arduino

arduino - outputs - ¿Cómo puedo digitalRead un pin que está en pinMode OUTPUT?



define pin arduino (10)

Tengo un boceto de prueba muy simple en el que estoy tratando de establecer un pin en 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 de serie:

0 0 0 0

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


¿Estás tratando de establecer la entrada predeterminada en ALTO?
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 ENTRADA, escribir un valor ALTO con digitalWrite () habilitará una resistencia interna de 20K.


En este caso, solo quiere acceder al registro de datos.

Los registros PORTB y PORTD contienen los datos de pin que está buscando. Finalmente obtuve acceso a un Arduino para resolverlo. Desea usar bitRead(PORTD, pin) .

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

Operación de lectura de bits de referencia para más información.


Mantenga un mapa booleano separado de los estados de los pines de salida.

Si un microcontrolador pin GPIO se establece como una entrada, su valor, cuando se lee, depende de lo que está conectado externamente. Ese es el tipo de punto.


¿Por qué quieres hacer eso? Si está haciendo esto para validar que el pin es realmente alto, esto no lo confirmará, porque tal vez haya un cortocircuito en el pin alto del circuito externo, la mejor manera es crear un feedback a través de otro pin; configure otro pin como entrada, y conecte el pin de salida al nuevo pin de entrada, y lea su valor. Leer el registro interno siempre devolverá para usted lo que el controlador está tratando de poner en el pin, no el valor real del pin.


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) }


Mantenga su selección PinMode en la función de configuración, e intente Digitalwrite y lea la función.

La configuración () se ejecutará b cuando el controlador se inicie y el bucle será una función que continuará 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); }


Siempre tenga en cuenta. Si está intentando configurar algo, solo guárdelo en el archivo de configuración. Como el archivo de configuración se ejecuta una vez, si está configurando In loop. se ejecuta de forma continua. Trate de mantenerlo como estado de inicio. Ese es el estado bajo activo


digitalWrite(3,HIGH); digitalRead(3);


Tu 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 modo pinMode, leerá la entrada dependiendo de lo que esté conectado. Si escribe "HIGH" en un pin de entrada, se activará el pullup interno. No importa si escribe HIGH antes de configurarlo en el modo de entrada o después de configurarlo en el modo de entrada. A menos, por supuesto, que esté impulsando una carga que sea demasiado alta para el pin de salida (por ejemplo, un interruptor a tierra). Entonces esto probablemente mataría al pin.

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


No me gustó ninguna de las respuestas anteriores, ya que no serían compatibles con plataformas cruzadas. 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) busca el gpio bank [puerto] al que está asignado el pin en el hardware seleccionado

portOutputRegister(...) le proporciona un puntero al puerto que contiene el valor que está buscando. * Desreferencia el puntero y da el valor completo de los 8 pines asignados a ese puerto. Todavía no es especialmente ú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! = Prueba 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 uno.