arduino - 关于定时器和水位传感器激活的两个伺服项目的问题
问题描述
我正在使用 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)。基本上,这会产生轻微的反弹。通过分离水打开和关闭的水平,它可以防止系统在极限处抖动(不断打开和关闭)。话虽如此,根据传感器的精度以及精确电平控制在您的应用程序中的重要性,您可能需要稍微收紧或移动这些值。
推荐阅读
- android - Tamplate Navigation Drawer Activity 模板中的片段问题
- c++ - 如何将定点数的理论与其实际实现联系起来?
- python - 如何在导入模块中模拟 pytest 全局变量?
- pandas - 如何按来自不同 DF 的日期时间范围在 Pandas 中分组
- java - 张量流字节缓冲区
- ansible - 如何使用 Ansible 将命令的输出读入两列
- javascript - 如何用 JS 播放动画
- autocomplete - 如何使用 Antd Autocomplete 更改显示建议的数量?
- kotlin - Google Calendar API v3 未保存活动地点和与会者
- java - 无法在华为设备上多次播放音乐文件