关于定时器和水位传感器激活的两个伺服项目的问题

Question on Two servo project activated by timer and water level sensor

我正在使用 arduino uno 尝试为两个伺服系统供电。伺服 A 应每 24 小时打开几秒钟,或者如果按下按钮 A。如果水位传感器读数低于 300 或者按下按钮 B,伺服 B 应该打开几秒钟。当我只包含一个舵机时,下面的代码工作正常,但是添加舵机 B 的代码会破坏一切。

 #include <Servo.h>
Servo myservoA;
Servo myservoB;

const int BUTTONA_PIN = 8;
const int BUTTONB_PIN = 6;
const int SERVOA_PIN  = 9;
const int SERVOB_PIN  = 7;

unsigned long dayTimer_ms = 0;
unsigned long autoOpenDelay_ms = 86400000;

int angle = 0; 
int waterSensor = A0;
int waterLevel = 0;

void setup(){
  myservoA.attach(SERVOA_PIN);
  myservoB.attach(SERVOB_PIN);
  pinMode(BUTTONA_PIN, INPUT_PULLUP);
  pinMode(BUTTONB_PIN, INPUT_PULLUP);
  myservoA.write(0);
  myservoB.write(0);
}

void loop() {

  if(millis() - dayTimer_ms > autoOpenDelay_ms)
  {
    dayTimer_ms = millis();
    myservoA.write(180); //(open?)
    delay(8000);
    myservoA.write(0);
  }
  
  if(millis()<dayTimer_ms)//overflow handling (in case this runs for more than 50 days straight)
  {
    dayTimer_ms = millis();
  }
  
  if (!digitalRead(BUTTONA_PIN) && angle != 180)
  {
    angle = 180;
    myservoA.write(angle);
  }

  if (digitalRead(BUTTONA_PIN) && angle != 0)
  {
    angle = 0;
    myservoA.write(angle);
  }

  if (!digitalRead(BUTTONB_PIN) && angle != 180)
  {
    angle = 180;
    myservoB.write(angle);
  }

  if (digitalRead(BUTTONB_PIN) && angle != 0)
  {
    angle = 0;
    myservoB.write(angle);
  }
 
  int waterLevel = analogRead(waterSensor);

  if (waterLevel <= 300){
    myservoB.write(180);
    delay(8000);
    myservoB.write(0);
  }
}

你们真的超级亲近!

您只需要创建第二个变量来分别跟踪角度 A 和角度 B。所以你应该将顶部“angleB”的另一个变量初始化为零,然后在第 52 行以下的所有地方用这个新变量替换“angle”

#include <Servo.h>
Servo myservoA;
Servo myservoB;

const int BUTTONA_PIN = 8;
const int BUTTONB_PIN = 6;
const int SERVOA_PIN  = 9;
const int SERVOB_PIN  = 7;

unsigned long dayTimer_ms = 0;
unsigned long autoOpenDelay_ms = 86400000;

int angleA = 0; 
int angleB = 0; 

int waterSensor = A0;
int waterLevel = 0;

void setup(){
  myservoA.attach(SERVOA_PIN);
  myservoB.attach(SERVOB_PIN);
  pinMode(BUTTONA_PIN, INPUT_PULLUP);
  pinMode(BUTTONB_PIN, INPUT_PULLUP);
  myservoA.write(0);
  myservoB.write(0);
}

void loop() {

  if(millis() - dayTimer_ms > autoOpenDelay_ms)
  {
    dayTimer_ms = millis();
    myservoA.write(180); //(open?)
    delay(8000);
    myservoA.write(0);
    angleA = 0; 
  }
  
  if(millis()<dayTimer_ms)//overflow handling (in case this runs for more than 50 days straight)
  {
    dayTimer_ms = millis();
  }
  
  if (!digitalRead(BUTTONA_PIN) && angleA != 180)
  {
    angleA = 180;
    myservoA.write(angleA);
  }

  if (digitalRead(BUTTONA_PIN) && angleA != 0)
  {
    angleA = 0;
    myservoA.write(angleA);
  }

  if (!digitalRead(BUTTONB_PIN) && angleB != 180)
  {
    angleB = 180;
    myservoB.write(angleB);
  }

  if (digitalRead(BUTTONB_PIN) && angleB != 0)
  {
    angleB = 0;
    myservoB.write(angleB);
  }

 
  int waterLevel = analogRead(waterSensor);
  if (waterLevel > 300 && angleB != 0)
  {
    myservoB.write(0);
    angleB = 0;
  }
  else if (waterLevel < 200 && angleB != 180){
    myservoB.write(180);
    angleB = 180;
  }
}

底部的两个级别可能需要调整(200 和 300)。基本上这会产生轻微的反跳。通过将水打开和关闭的水平分开,它可以防止系统在极限处抖动(不断打开和关闭)。也就是说,根据传感器的精度以及精确电平控制在您的应用中的重要性,您可能需要稍微收紧或移动这些值。