gpt4 book ai didi

c++ - Arduino 如何存储最后一个 IR 代码以检查它是否需要重复?

转载 作者:行者123 更新时间:2023-11-28 04:18:04 26 4
gpt4 key购买 nike

我刚刚开始学习 Arduino,并且连接了直流电机和红外接收器。如果我按下按钮一次,它工作正常,但如果我按住按钮,我无法弄清楚如何保持电机旋转,因为 REPEAT 命令是相同的数字。

我想我会存储最后发送的代码并检查重复命令和最后的代码是否匹配,但它似乎不起作用并且无法弄清楚原因。

#include <IRremote.h>

int IRpin = 11; // pin for the IR sensor
IRrecv irrecv(IRpin);
decode_results results;
int lastCode;

void setup() {
// put your setup code here, to run once:
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(13, OUTPUT);
Serial.begin(9600);
irrecv.enableIRIn(); // Enable IR Receiver.
}

void loop() {
// put your main code here, to run repeatedly:


if

(irrecv.decode(&results)) {
Serial.println(results.value);
irrecv.resume();
Serial.println("Last Code is set to: ");
Serial.write(lastCode);


if(results.value== 16748655 || (results.value== 4294967295 && lastCode== 16748655)) // Your ON button value
{
digitalWrite(8, HIGH);
digitalWrite(7, LOW);
analogWrite(9, 255);
delay(1000);
analogWrite(9, 0);
lastCode= 16748655;

}


else if(results.value == 16769055 || (results.value== 4294967295 && lastCode== 16769055)) // Your OFF button value
{
digitalWrite(8, LOW);
digitalWrite(7, HIGH);
analogWrite(9, 255);
delay(1000);
analogWrite(9, 0);
lastCode= 16769055;

}
}


}

最佳答案

在释放按钮之前运行电机的更可靠方法是使用“无代码”超时。也就是说,如果“无代码”状态持续的时间长于自动重复周期,则它已被释放。

在您的代码中不清楚 1 秒模拟脉冲的用途,但是在您的 loop() 函数中放置较长的延迟会使您的系统响应速度大大降低。最好轮询系统滴答声并在需要时“做事”。如果您希望任何人都能理解您的代码并避免维护错误,则应避免使用魔数(Magic Number)。

以下使用系统节拍轮询来实现“无代码”超时。我省略了电机开/关代码,因为不清楚 1 秒的延迟你在那里做什么。

#define NO_CODE        0xFFFFFFFFul
#define MOTOR_ON_CODE 0xFF906Ful
#define MOTOR_OFF_CODE 0xFFE01Ful
#define STOP_TIME_MS 250ul // stop after button release for 250ms

void loop( )
{
static unsigned long last_on_time = 0 ;

if( irrecv.decode( &results ) )
{
irrecv.resume() ;

unsigned long code = results.value ;

// If motor off code or no code timeout...
if( code == MOTOR_OFF_CODE ||
(code == NO_CODE && millis() - last_on_time > STOP_TIME_MS) )
{
// Motor off
...
}
else if( code == MOTOR_ON_CODE )
{
// Continuously update last on time while button is held
last_on_time = millis() ;

// Motor on
...
}
}
}

我已经包含了对电机关闭代码的响应,但这可能不是必需的,因为在任何情况下松开 ON 按钮后电机将关闭 250 毫秒(或您选择的任何时间)。您可能有一个前进/后退按钮并释放其中一个以停止:

#define NO_CODE        0xFFFFFFFFul
#define MOTOR_FWD_CODE 0xFF906Ful
#define MOTOR_REV_CODE 0xFFE01Ful
#define STOP_TIME_MS 250ul // stop after button release for 250ms

void loop( )
{
static unsigned long last_on_time = 0 ;

if( irrecv.decode( &results ) )
{
irrecv.resume() ;

unsigned long code = results.value ;
switch( code )
{
case NO_CODE :
{
if( millis() - last_on_time > STOP_TIME_MS )
{
// Motor off
...
}
}
break ;

case MOTOR_FWD_CODE :
{
// Continuously update last on time while button is held
last_on_time = millis() ;

// Motor forward
...
}
break ;

case MOTOR_FWD_CODE :
{
// Continuously update last on time while button is held
last_on_time = millis() ;

// Motor reverse
...
}
break ;
}
}
}

关于c++ - Arduino 如何存储最后一个 IR 代码以检查它是否需要重复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56113435/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com