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?
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.
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.
digitalWrite(3,HIGH);
digitalRead(3);
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.
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);
}
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.
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
}
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.
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.