You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用模拟引脚控制Arduino继电器时水泵无法关闭的问题求助

水泵无法关闭的原因分析与解决方案

核心原因1:代码结构错误,初始化逻辑未执行

你提供的代码中,pinMode和初始digitalWrite的代码直接写在全局作用域,没有包裹在setup()函数内。Arduino程序的初始化逻辑必须放在setup()中执行——全局区域的代码会在硬件初始化完成前运行,导致引脚根本没被设置为输出模式,后续的digitalWrite指令完全无效。此时引脚处于默认的输入状态,若继电器是低电平触发,引脚的高阻态可能被内部上拉电阻拉成高电平,导致继电器一直吸合,水泵无法关闭。

核心原因2:触摸检测逻辑存在重复触发风险

你的两个触摸判断是独立的if语句(而非else if),且触摸事件未做释放处理。如果触摸屏幕的时间超过3秒,delay(3000)结束后,ts.touched()仍会返回true,导致loop循环再次进入触发逻辑,水泵被反复启动,看起来像是无法关闭。

次要原因:模拟引脚的硬件兼容性验证不足

虽然多数Arduino(如Uno)的A0-A3支持数字输出,但需确认:

  • 继电器的触发电平(高/低电平触发)是否与你代码中的逻辑匹配;
  • 模拟引脚是否存在默认上拉电阻导致的误触发。

修正后的代码示例

#define pumpPin1 A0
#define pumpPin2 A1
#define pumpPin3 A2
#define pumpPin4 A3

void setup() {
  // 将初始化逻辑移入setup函数,确保硬件就绪后执行
  pinMode(pumpPin1, OUTPUT);
  pinMode(pumpPin2, OUTPUT);
  pinMode(pumpPin3, OUTPUT);
  pinMode(pumpPin4, OUTPUT);
  
  // 根据继电器触发电平调整初始状态:若为低电平触发,此处应设为HIGH
  digitalWrite(pumpPin1, LOW);
  digitalWrite(pumpPin2, LOW);
  digitalWrite(pumpPin3, LOW);
  digitalWrite(pumpPin4, LOW);
  
  Serial.begin(9600); // 开启串口用于调试
}

void loop() {
  if (ts.touched()) {
    TS_Point p = ts.getPoint();
    Serial.print("触摸坐标: x=");
    Serial.print(p.x);
    Serial.print(", y=");
    Serial.println(p.y);

    // 用else if避免逻辑重叠,确保同一时间只执行一个分支
    if (p.x < 3800 && p.x > 2400 && p.y < 3100){
      Serial.println("Mische Vodka");
      digitalWrite(pumpPin1, HIGH);
      digitalWrite(pumpPin2, HIGH);
      digitalWrite(pumpPin3, HIGH);
      digitalWrite(pumpPin4, HIGH);
      delay(3000);
      digitalWrite(pumpPin1, LOW);
      digitalWrite(pumpPin2, LOW);
      digitalWrite(pumpPin3, LOW);
      digitalWrite(pumpPin4, LOW);
    }
    else if (p.x < 2400 && p.y < 3100) {
      Serial.println("Mische Gin");
      digitalWrite(pumpPin1, HIGH);
      digitalWrite(pumpPin2, HIGH);
      digitalWrite(pumpPin3, HIGH);
      digitalWrite(pumpPin4, HIGH);
      delay(3000);
      digitalWrite(pumpPin1, LOW);
      digitalWrite(pumpPin2, LOW);
      digitalWrite(pumpPin3, LOW);
      digitalWrite(pumpPin4, LOW);
    }

    // 等待触摸释放,避免重复触发
    while(ts.touched()) {
      delay(50);
    }
  }
}

额外排查步骤

  1. 单独测试引脚输出:写一段简单代码,让模拟引脚交替输出HIGH和LOW,用万用表测量电平,确认输出正常;
  2. 验证继电器触发逻辑:直接给继电器输入高/低电平,看是否能正常吸合/释放,调整代码中的电平逻辑;
  3. 检查接线:确认模拟引脚到继电器的信号线、继电器的电源和地线连接牢固。

内容的提问来源于stack exchange,提问作者Inuri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 14:18:11