web-dev-qa-db-fra.com

Comment puis-je lire une broche numérique qui est dans pinMode OUTPUT?

J'ai un test très simple sketch dans lequel j'essaie de définir une broche sur HIGH puis de lire son état avec digitalRead. Voici mon croquis.

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

void loop()
{
    delay(1000);

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

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

Résultat du moniteur série:

0
0
0
0

J'en suis venu à comprendre que changer le pinMode l'empêchera d'être HIGH. Donc, définir une broche sur HIGH en mode OUTPUT puis passer en mode INPUT le changera en LOW. Ainsi, le digitalRead retournera toujours 0. Si je ne change pas le pinMode, il ne pourra pas lire le pin. Alors, comment puis-je lire le paramètre actuel d'une broche qui est en mode OUTPUT sans perdre la valeur?

29
Bazzz

Dans ce cas, vous souhaitez simplement accéder au registre de données lui-même.

Les registres PORTB et PORTD contiennent les données PIN que vous recherchez. J'ai finalement eu accès à un Arduino pour le comprendre. Vous souhaitez utiliser bitRead(PORTD, pin).

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

Référence Bit Read Operation pour plus d'informations.

32
MikeRags

Votre croquis doit être

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

C'est tout. Ensuite, il lit l'état de la broche qui, dans votre cas, est "HIGH". Si vous définissez le pinMode sur entrée, il lira l'entrée en fonction de ce qui est connecté. Si vous écrivez "HIGH" sur une broche d'entrée, le pullup interne sera activé. Peu importe que vous écriviez HIGH avant de le mettre en mode d'entrée ou après l'avoir mis en mode d'entrée. À moins bien sûr que vous conduisiez une charge trop élevée pour la broche de sortie (par exemple, un interrupteur à la masse). Ensuite, cela tuerait probablement la broche.

Si vous avez écrit un minimum et réglé la broche à un niveau bas, elle peut flotter, ce qui peut entraîner tout type de comportement imprévisible.

32
Udo Klein
digitalWrite(3,HIGH);
digitalRead(3);
4
msj003

N'a aimé aucune des réponses précédentes, car elles ne seraient pas compatibles avec plusieurs plates-formes Arduino. Vous devez accéder via les tableaux de référence des broches. L'expression suivante fait l'affaire.

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

Permettez-moi de décomposer cela pour une meilleure compréhension

digitalPinToPort(pin) recherchez la banque gpio [port] à laquelle la broche est affectée sur votre matériel sélectionné

portOutputRegister(...) vous donne un pointeur sur le port contenant la valeur que vous recherchez. * déréférence le pointeur et donne la valeur totale des 8 broches affectées à ce port. Ce n'est pas encore particulièrement utile, mais le morceau que vous recherchez est là.

&digitalPinToBitMask(pin) sélectionne uniquement le bit qui vous intéresse pour la broche, tous les autres bits seront nuls.

0! = Teste pour voir si l'expression résultante est nulle ou autre chose. Si elle est nulle, votre sortie est nulle sur cette broche. Sinon, la sortie est un.

3
user2825128

Conservez votre sélection pinMode() dans la fonction setup() et essayez les fonctions digitalWrite() et digitalRead().

setup() sera exécutée au démarrage du contrôleur et loop() sera la fonction qui continue de s'exécuter.

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

void loop()
{
  digitalWrite(pin22,HIGH);
  digitalRead(pin22);
  digitalWrite(pin22,LOW);
  digitalRead(pin22);
}
2
AMPS

Pourquoi est ce que tu veux faire ça? Si vous faites cela pour valider que la broche est vraiment haute, cela ne vous le confirmera pas, car il y a peut-être un court-circuit sur la broche haute du circuit externe, le meilleur moyen est de créer un retour via une autre broche; configurez une autre broche comme entrée, connectez la broche de sortie à la nouvelle broche d'entrée et lisez sa valeur. La lecture du registre interne renverra toujours pour vous ce que le contrôleur essaie de mettre sur la broche, pas la valeur réelle de la broche.

2
Karim

J'ai écrit une routine pour faire clignoter quatre LED différentes à des fins différentes, mais je voulais également conserver leur état initial avant de les faire clignoter, car leur état stable me dit également que quelque chose se produit dans mon code, alors voici mon code Flash, vous l'appelez en envoyant le numéro de broche, le nombre de fois où le flasher et la durée du flashage.

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
KeyWizard

Conservez une carte booléenne distincte des états des broches de sortie.

Si une broche GPIO de microcontrôleur est définie comme entrée, sa valeur, lorsqu'elle est lue, dépend de ce à quoi elle est connectée en externe. C'est un peu le point.

0
Martin James

Essayez-vous de régler l'entrée par défaut sur HIGH?
Si c'est le cas, vous souhaitez activer le registre de traction:

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

Extrait de DigitalWrite :

Si la broche est configurée comme ENTRÉE, l'écriture d'une valeur ÉLEVÉE avec digitalWrite () activera une résistance de rappel interne de 20K.

0
ssapkota