I have a very simple test sketch in which I'm trying to set a pin to HIGH
and then read its state with digitalRead
. Here is my sketch.
void setup()
{
Serial.begin(9600);
}
void loop()
{
delay(1000);
pinMode(3, OUTPUT);
digitalWrite(3, HIGH);
delay(1000);
pinMode(3, INPUT);
Serial.println(digitalRead(3));
}
Serial monitor result:
0
0
0
0
I have come to understand that changing the pinMode will stop it from being HIGH
. So setting a pin to HIGH
in OUTPUT
mode and then changing to INPUT
mode will change it to LOW
. So the digitalRead will always return 0. If I don't change the pinMode it won't be able to read the pin. So how can I read the current setting of a pin that is in OUTPUT
mode without losing the value?
Your sketch should be
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));
}
That's all. Then it reads the pin's state which in your case is "HIGH". If you set the pinMode to input it will read the input depending on what is connected. If you are writing "HIGH" to an input pin the internal pullup will be activated. It does not matter if you write HIGH before setting it to input mode or after setting it to input mode. Unless of course you are driving a load that is to high for the output pin (e.g. a switch to ground). Then this would probably kill the pin.
If you have written a low and set the pin to low it might float which may lead to any kind of unpredictable behaviour.