- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我已经为我的 Remote 解码了我的 IR 代码,并让它们在草图中运行时工作,请参阅 IR 代码。
我的 RFID 猫喂食器草图也运行良好,请参阅 RFID 代码。
然而,我在将红外 Remote 与任何其他阻止功能一起使用时遇到了麻烦,特别是这个 RFID 阅读器草图……每个草图似乎都需要一直等待才能为信号做好准备。我想要做的是让 RFID 阅读器正常运行,但能够通过红外 Remote 将其置于手动模式。任何帮助或指示将不胜感激。我有尝试将两者集成的代码,但它从来没有正常工作,请告诉我是否有帮助,谢谢!
IR 代码
#include <IRremote.h>
int RECV_PIN = 4;
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup(){
irrecv.enableIRIn(); // Start the receiver
Serial.begin(2400);
}
// Compare two tick values, returning 0 if newval is shorter,
// 1 if newval is equal, and 2 if newval is longer
// Use a tolerance of 20%
int compare(unsigned int oldval, unsigned int newval) {
if (newval < oldval * .8) {
return 0;
}
else if (oldval < newval * .8) {
return 2;
}
else {
return 1;
}
}
// Use FNV hash algorithm: http://isthe.com/chongo/tech/comp/fnv/#FNV-param
#define FNV_PRIME_32 16777619
#define FNV_BASIS_32 2166136261
/* Converts the raw code values into a 32-bit hash code.
* Hopefully this code is unique for each button.
*/
unsigned long decodeHash(decode_results *results) {
unsigned long hash = FNV_BASIS_32;
for (int i = 1; i+2 < results->rawlen; i++) {
int value = compare(results->rawbuf[i], results->rawbuf[i+2]);
// Add value into the hash
hash = (hash * FNV_PRIME_32) ^ value;
}
return hash;
}
void loop() {
if (irrecv.decode(&results)) {
unsigned long hash = decodeHash(&results);
switch (hash) {
case 0x4AB0F7B6: // any button held down
Serial.println("Button Repeat");
break;
case 0x2D4AFCCE: // Power
Serial.println("Power");
break;
case 0xE8187BAA: // EQ
Serial.println("EQ");
break;
case 0x95D01E65: // CD/Tuner
Serial.println("CD/Tuner");
break;
case 0xE20BA29: // Mute
Serial.println("Mute");
break;
default:
Serial.print("Unknown ");
Serial.println(hash, HEX);
}
irrecv.resume(); // Resume decoding (necessary!)
}
}
RFID 代码
/*** Cord Slatton
* date 12-13-2012 **/
#include <IRremote.h>
#define RFID_ENABLE 2 //to RFID ENABLE
#define CODE_LEN 10 //Max length of RFID tag
#define START_BYTE 0x0A
#define STOP_BYTE 0x0D
#define MOTOR_RUN_LENGTH 1000 //time, in ms, to run door motor
char tag[CODE_LEN];
int pwm_b = 11; //PWM control for motor outputs 3 and 4 is on digital pin 11
int dir_b = 13; //direction control for motor outputs 3 and 4 is on digital pin 13
int door_status = 1; // 1 == closed, 0 == open
//PIR sensor
const int sensorPIR = A0;
unsigned long rfidHitTime = 0; //when did we get last rfid hit?
unsigned long pirHitTime = 0; //when did we get last PIR hit?
unsigned int pirClose = 0;
unsigned int rfidClose = 0;
void setup() {
Serial.begin(2400); //parallax rfid reader seems to only like serial 2400
Serial.println("RoboFeeder Online");
//rfid
pinMode(RFID_ENABLE,OUTPUT);
//motor
pinMode(pwm_b, OUTPUT);
pinMode(dir_b, OUTPUT);
//PIR
pinMode(sensorPIR, INPUT);
digitalWrite(sensorPIR, LOW);
Serial.println("Warming up PIR...");
delay(10000);
Serial.println("PIR ready");
Serial.println("RoboFeeder startup test: Door");
openDoor();
delay(2500);
closeDoor();
Serial.println("RoboFeeder door test complete");
}
void loop() {
delay(1500);
enableRFID();
getRFIDTag(); //waiting function, till gets any tag
disableRFID();
openDoor();
sendCode();
Serial.flush();
clearCode();
}
/*** Clears out the memory space for the tag to 0s. */
void clearCode() {
for(int i=0; i<CODE_LEN; i++) {
tag[i] = 0;
}
}
/*** Sends the tag to the computer. */
void sendCode() {
Serial.print("TAG:");
for(int i=0; i<CODE_LEN; i++) {
Serial.print(tag[i]);
}
Serial.println("\r");
}
/**************************************************************/
/******************** RFID Functions ***********************/
/**************************************************************/
void enableRFID() {
digitalWrite(RFID_ENABLE, LOW);
}
void disableRFID() {
digitalWrite(RFID_ENABLE, HIGH);
}
/*** Blocking function, waits for and gets the RFID tag. */
void getRFIDTag() {
byte next_byte;
while(Serial.available() <= 0) {
if(door_status == 0){ //open
pirDetection();
rfidClose = millis() - rfidHitTime;
pirClose = millis() - pirHitTime;
Serial.print("RFID Close: ");
Serial.print(rfidClose);
Serial.print(" - PIR Close: ");
Serial.println(pirClose);
//if door has been open for more than a certain amount of time with no rfid hit and PIR no hit for certain time
if( (rfidClose > 30000) && (pirClose > 10000) ){
closeDoor();
}
}
}
pirHitTime = 0;
if((next_byte = Serial.read()) == START_BYTE) {
byte bytesread = 0;
while(bytesread < CODE_LEN) {
if(Serial.available() > 0) { //wait for the next byte
if((next_byte = Serial.read()) == STOP_BYTE) break;
tag[bytesread++] = next_byte;
}
}
rfidHitTime = millis(); //keep track of when last rfid hit was
}
}
/******************** Motor Functions ***********************/
void openDoor() {
if(door_status == 1){
motorRun(150);
digitalWrite(dir_b, HIGH); //Set motor direction, 1 low, 2 high
Serial.println("Door opening");
delay(MOTOR_RUN_LENGTH);
motorStop();
door_status = 1 - door_status;
}
}
void closeDoor() {
if(door_status == 0){
motorRun(150);
digitalWrite(dir_b, LOW); //Reverse motor direction, 1 high, 2 low
Serial.println("Door closing");
delay(MOTOR_RUN_LENGTH);
motorStop();
door_status = 1 - door_status;
}
}
void motorRun(int speed) {
analogWrite(pwm_b, speed); //set motor to run at speed variable value
}
void motorStop() {
analogWrite(pwm_b, 0); //set motor to run at 0
}
/******************** PIR Functions ***********************/
boolean pirDetection() {
//returns true if PIR analog reading has been rising for more than 10 cycles, false if has been falling
int counter = 0;
int pirSensorReading[10];
int avgReading = 0;
while(counter < 10){
pirSensorReading[counter] = analogRead(sensorPIR);
avgReading += pirSensorReading[counter];
counter++;
delay(300);
}
avgReading = avgReading/10;
Serial.print("Avg. PIR: ");
Serial.print(avgReading);
Serial.print(" - Last PIR: ");
Serial.println( pirSensorReading[9] );
if( (pirSensorReading[9] > avgReading+1) || (analogRead(sensorPIR) > 700) ){
pirHitTime = millis(); //keep track of when last PIR hit was
return true;
}
else if(pirSensorReading[9] <= avgReading){
return false;
}
}
最佳答案
我能够使用 AttachInterrupt() 成功解决这个问题。
具体来说,我找到了一个 library for IR Remotes that is interrupt based而不是像我以前尝试使用的那样基于轮询。
如果有人感兴趣,成品 RFID IR 遥控猫喂食器代码是:
/*** Cord Slatton
* date 12-28-2012 **/
//IR includes
//info: http://www.zbotic.com/index.php/download/
//download: http://www.zbotic.com/index.php/download_file/view/12/118/
#include "PCInterrupt.h"
#include "Device.h"
#include "irController.h"
#define RFID_ENABLE 8 //to RFID ENABLE
#define CODE_LEN 10 //Max length of RFID tag
#define START_BYTE 0x0A
#define STOP_BYTE 0x0D
#define MOTOR_RUN_LENGTH 1000 //time, in ms, to run door motor
char tag[CODE_LEN];
int pwm_b = 11; //PWM control for motor outputs 3 and 4 is on digital pin 11
int dir_b = 13; //direction control for motor outputs 3 and 4 is on digital pin 13
int door_status = 1; // 1 == closed, 0 == open
int manual_mode = 1; // 1 == auto, 0 == manual
//PIR sensor
const int sensorPIR = A0;
//IR init
int manualModePin = 10; //led pin for indication of manual mode
IRController irController;
unsigned long rfidHitTime = 0; //when did we get last rfid hit?
unsigned long pirHitTime = 0; //when did we get last PIR hit?
unsigned long pirClose = 0;
unsigned long rfidClose = 0;
void setup() {
Serial.begin(2400); //parallax rfid reader seems to only like serial 2400
Serial.println("RoboFeeder Online");
//rfid
pinMode(RFID_ENABLE,OUTPUT);
//motor
pinMode(pwm_b, OUTPUT);
pinMode(dir_b, OUTPUT);
//PIR
pinMode(sensorPIR, INPUT);
digitalWrite(sensorPIR, LOW);
Serial.println("Warming up PIR...");
delay(10000);
Serial.println("PIR ready");
//IR remote
pinMode(manualModePin, OUTPUT);
digitalWrite(manualModePin, LOW);
int res = irController.begin(IR_PIN, OTHER_DEVICE);
if (res != SUCCESS) {
Serial.println("error=");
Serial.println(res);
}
Serial.println("IR Remote enabled");
Serial.println("RoboFeeder startup test: Door");
openDoor();
delay(2500);
closeDoor();
Serial.println("RoboFeeder door test complete");
}
void loop() {
delay(1500);
enableRFID();
getRFIDTag(); //waiting function, till gets any tag
disableRFID();
openDoor();
sendCode();
Serial.flush();
clearCode();
}
/*** Clears out the memory space for the tag to 0s. */
void clearCode() {
for(int i=0; i<CODE_LEN; i++) {
tag[i] = 0;
}
}
/*** Sends the tag to the computer. */
void sendCode() {
Serial.print("TAG:");
for(int i=0; i<CODE_LEN; i++) {
Serial.print(tag[i]);
}
Serial.println("\r");
}
/**************************************************************/
/******************** RFID Functions ***********************/
/**************************************************************/
void enableRFID() {
digitalWrite(RFID_ENABLE, LOW);
}
void disableRFID() {
digitalWrite(RFID_ENABLE, HIGH);
}
/*** Blocking function, waits for and gets the RFID tag. */
void getRFIDTag() {
byte next_byte;
while(Serial.available() <= 0) {
if(door_status == 0){ //open
pirDetection();
rfidClose = millis() - rfidHitTime;
pirClose = millis() - pirHitTime;
Serial.print("RFID Close: ");
Serial.print(rfidClose);
Serial.print(" - PIR Close: ");
Serial.println(pirClose);
//if door has been open for more than a certain amount of time with no rfid hit and PIR no hit for certain time
if( (rfidClose > 40000) && (pirClose > 15000) ){
closeDoor();
}
}
IRRemote();
if(manual_mode == 0)
manualMode();
}
//PIR set to current loop time to keep it from freaking out
pirHitTime = millis();
if((next_byte = Serial.read()) == START_BYTE) {
byte bytesread = 0;
while(bytesread < CODE_LEN) {
if(Serial.available() > 0) { //wait for the next byte
if((next_byte = Serial.read()) == STOP_BYTE) break;
tag[bytesread++] = next_byte;
}
}
rfidHitTime = millis(); //keep track of when last rfid hit was
}
}
/**************************************************************/
/******************** Motor Functions ***********************/
/**************************************************************/
void openDoor() {
if(door_status == 1){
motorRun(150);
digitalWrite(dir_b, HIGH); //Set motor direction, 1 low, 2 high
Serial.println("Door opening");
delay(MOTOR_RUN_LENGTH);
motorStop();
door_status = 1 - door_status;
}
}
void closeDoor() {
if(door_status == 0){
motorRun(150);
digitalWrite(dir_b, LOW); //Reverse motor direction, 1 high, 2 low
Serial.println("Door closing");
delay(MOTOR_RUN_LENGTH);
motorStop();
door_status = 1 - door_status;
}
}
void motorRun(int speed) {
analogWrite(pwm_b, speed); //set motor to run at speed variable value
}
void motorStop() {
analogWrite(pwm_b, 0); //set motor to run at 0
}
/**************************************************************/
/******************** PIR Functions ***********************/
/**************************************************************/
boolean pirDetection() {
//returns true if PIR analog reading has been rising for more than 10 cycles,
//false if has been falling
int counter = 0;
int pirSensorReading[10];
int avgReading = 0;
while(counter < 10){
pirSensorReading[counter] = analogRead(sensorPIR);
avgReading += pirSensorReading[counter];
counter++;
delay(300);
}
avgReading = avgReading/10;
Serial.print("Avg. PIR: ");
Serial.print(avgReading);
Serial.print(" - Last PIR: ");
Serial.println( pirSensorReading[9] );
if( (pirSensorReading[9] > avgReading+1) || (analogRead(sensorPIR) > 700) ){
pirHitTime = millis(); //keep track of when last PIR hit was
return true;
}
else if(pirSensorReading[9] <= avgReading){
return false;
}
}
/**************************************************************/
/******************** IR Remote Functions ***********************/
/**************************************************************/
void IRRemote(){
int val = irController.read(); // Returns negative value if no new command rcvd
if (val >=0){
Serial.print("Key: ");
Serial.println(val);
if(val == 100){
manual_mode = 1 - manual_mode;
}
else if( (val >= 0) && (manual_mode == 0) ){
if(door_status == 1)
openDoor();
else
closeDoor();
}
}
delay(500);
}
//blocking function that won't let you leave till you turn off manual mode
void manualMode(){
disableRFID();
Serial.println("Manual Mode on");
digitalWrite(manualModePin, HIGH);
while(manual_mode == 0){
IRRemote();
}
Serial.println("Manual Mode exiting");
digitalWrite(manualModePin, LOW);
//set sensors to count from now, esentially zero them out
pirHitTime = millis();
rfidHitTime = millis();
enableRFID();
}
关于c - Arduino 红外 Remote 与其他阻挡功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13904268/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!