【发布时间】:2019-05-13 13:30:42
【问题描述】:
我正在学习 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;
}
}
}
【问题讨论】:
-
您应该避免使用 32 位算术。这是一个老式的 8 位 MCU,而不是 PC。
-
感谢您的评论,但您的确切意思是什么?
-
Offopic:阅读“神奇数字”
-
当您让 8 位 AVR 处理 32 位数字时,它必须在机器代码中内联大量软件库,从而使程序非常缓慢。在某些情况下,没有办法绕过它,但在这里你的传感器不可能有 32 位精度,所以你只是让 CPU 无缘无故地咀嚼空气。问题的根源在于编写“irremote.h”的爱好者,从github判断它看起来像一个菜鸟PC程序员。他们还每 50us 触发一次中断。如果 AVR 甚至可以在 50us 内自行处理 ISR 代码,我会感到惊讶……反汇编!
-
@Lundin:但是,
results.value是 32 位整数,c++ 编译器将优化处理该数字大小。通常,以十六进制格式编写时更易于人类阅读,但这是一个不同的主题。