首页 > 解决方案 > 关于定时器和水位传感器激活的两个伺服项目的问题

问题描述

我正在使用 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);
  }
}

标签: arduino

解决方案


你真的超级亲密!

您只需要创建第二个变量来分别跟踪角度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)。基本上,这会产生轻微的反弹。通过分离水打开和关闭的水平,它可以防止系统在极限处抖动(不断打开和关闭)。话虽如此,根据传感器的精度以及精确电平控制在您的应用程序中的重要性,您可能需要稍微收紧或移动这些值。


推荐阅读