Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arduino 如何读取处于pin模式输出的pin?_Arduino - Fatal编程技术网

Arduino 如何读取处于pin模式输出的pin?

Arduino 如何读取处于pin模式输出的pin?,arduino,Arduino,我有一个非常简单的测试,我试图将一个pin设置为高,然后用digitalRead读取其状态。这是我的素描 void setup() { Serial.begin(9600); } void loop() { delay(1000); pinMode(3, OUTPUT); digitalWrite(3, HIGH); delay(1000); pinMode(3, INPUT); Serial.println(digitalRead(

我有一个非常简单的测试,我试图将一个pin设置为
,然后用
digitalRead
读取其状态。这是我的素描

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

void loop()
{
    delay(1000);

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

    pinMode(3, INPUT);
    Serial.println(digitalRead(3));
}
串行监控结果:

0
0
0
0

我逐渐了解到,更改pinMode将使其不再处于
高位
。因此,在
输出
模式中将引脚设置为
,然后更改为
输入
模式将使其更改为
。因此,digitalRead将始终返回0。如果我不改变pin模式,它将无法读取pin。因此,如何读取处于
输出
模式的管脚的当前设置而不丢失值?

保留输出管脚状态的单独布尔映射


如果将微控制器GPIO引脚设置为输入,则其读取值取决于外部连接的内容。这就是重点。

您是否试图将默认输入设置为高?
如果是这样,您希望激活上拉寄存器:

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));
}
摘录自:

如果引脚配置为输入,则使用digitalWrite()写入高值将启用内部20K上拉电阻器


在这种情况下,您只需要访问数据寄存器本身

PORTB和PORTD寄存器包含您正在查找的pin数据。我终于找到了一个Arduino来解决这个问题。您想使用
位读取(端口D,pin)


有关详细信息,请参阅。

为什么要这样做?如果您这样做是为了验证管脚是否真的很高,这不会向您确认,因为可能外部电路的高管脚上存在短路,最好的方法是通过另一个管脚创建反馈;将另一个管脚配置为输入,将输出管脚连接到新的输入管脚,并读取其值。读取内部寄存器将始终为您返回控制器试图输入管脚的内容,而不是实际管脚值。

您可以尝试:

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)

}
你的素描应该是

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));
}
就这些。然后它读取pin的状态,在您的情况下为“高”。如果您将pinMode设置为input,它将根据连接的内容读取输入。如果向输入引脚写入“高”,则会激活内部上拉。无论是在将其设置为输入模式之前还是设置为输入模式之后写入高位,这都无关紧要。当然,除非您驾驶的负载对输出引脚过高(例如开关接地)。那么这可能会杀死大头针

如果已写入low并将pin设置为low,则可能会浮动,从而导致任何不可预测的行为。

将您的
pinMode()
选择保留在
setup()
函数中,然后尝试
digitalWrite()
digitalRead()
函数

setup()
将在控制器启动时执行,
loop()
将是持续执行的函数

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

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

永远记住。如果您试图配置任何东西,只需将其保存在安装文件中即可。由于安装文件只执行一次,所以若您在循环中设置。它执行连续。并尝试保持它的启动状态。这是活动低状态

不喜欢前面的任何答案,因为它们不会与arduino平台兼容。您需要通过pin参考表进行访问。下面的表达式实现了这一点

digitalWrite(3,HIGH);
digitalRead(3);
bool value = (0!=(*portOutputRegister( digitalPinToPort(pin) ) & digitalPinToBitMask(pin)));
为了更好地理解,让我把它分解一下

digitalPinToPort(pin)
在所选硬件上查找该pin分配给的gpio库[端口]

portOutputRegister(…)
为您提供一个指向包含您要查找的值的端口的指针。*取消对指针的引用,并给出分配给该端口的所有8个管脚的完整值。它还不是唯一有用的,但是你正在寻找的东西就在那里

&digitalPinToBitMask(pin)
仅为pin选择您感兴趣的位,所有其他位将为零


0!=测试结果表达式是否为零或其他值。如果它是零,那么该引脚上的输出为零。否则,输出为一。

我编写了一个例程,用于闪烁四个不同的LED,用于不同的目的,但我还希望在闪烁它们之前保持它们的初始状态,因为它们的稳态也告诉我代码中发生了什么,所以这是我的闪烁代码,您可以通过发送pin码来调用它,闪烁的次数和闪烁的时间

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
  }
inline void Flash(字节峰值、字节时间、字节flashSpeed)
{
bool state;//pin状态的本地变量
state=digitalRead(pinNum);//读取在别处设置的当前状态
int x;//重复闪存的本地变量
对于(x=0;x<次;x++)
{
数码写入(羽状,高);//打开LED
延迟(闪速);
数码写入(羽状,低);//关闭LED
延迟(flashSpeed*2);//关闭时间是打开时间的两倍
}//由于视觉的持续性
digitalWrite(羽状,状态);//恢复LED的原始状态
}

布尔映射确实是一个可行的想法,但我觉得它可能会与现实脱节。还假设我在引脚3处有一个led,我使用
digitalWrite(3,高)指示灯永远亮起。我假设Arduino有一个每个管脚的内部设置阵列,以知道是否保持led亮起。如果可能的话,我想引用那个内部数组,而不是保留我自己的数组。谢谢你的回答,但我没有尝试将默认输入设置为高,对不起。我正在尝试读取处于输出模式的pin的当前状态。无论如何,为什么需要读取输出pin?在输出模式下,您需要在其上写字。假设我的引脚3上有一个led,我想问Arduino led是亮还是灭。在这种情况下,我想您已经有了
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
  }