红外按键0-9控制步进电机的转动圈数(0-9)圈,并且数码管显示0-9!
各位大神帮忙看看啊,用红外按键0-9控制步进电机的转动圈数(0-9)圈,并且数码管显示0-9!现在的问题是,遥控器按键0-9按键要按下很多次,数码管才会显示,但是步进电机不转,只是在嗡嗡作响!#include<IRremote.h>#include <Stepper.h>
#define STEPS 400
//为了适应变化,定义变量stepPin1,stepPin2,stepPin3,stepPin4作为控制步进电机的端口变量
int stepPin1=1;
int stepPin2=3;
int stepPin3=12;
int stepPin4=13;
Stepper stepper(STEPS,stepPin1,stepPin2,stepPin3,stepPin4);
int intstep=2000;//对于这个步进电机,这正好是1圈
byte seven_seg_digits = { //二维数组的用法,好好理解啊
{ 0,1,1,1,1,0,1,1 },// = 0
{ 0,1,1,0,0,0,0,0 },// = 1
{ 0,0,1,1,0,1,1,1 },// = 2
{ 0,1,1,1,0,1,0,1 },// = 3
{ 0,1,1,0,1,1,0,0 },// = 4
{ 0,1,0,1,1,1,0,1 },// = 5
{ 0,1,0,1,1,1,1,1 },// = 6
{ 0,1,1,1,0,0,0,0 },// = 7
{ 0,1,1,1,1,1,1,1 },// = 8
{ 0,1,1,1,1,1,0,1 } // = 9
};
//int RECV_PIN = 11; //红外线接收器OUTPUT端接在pin 11
//此处的11脚已近被数码管占用,改为pin2脚
int RECV_PIN = 2;
IRrecv irrecv(RECV_PIN); // 定义IRrecv 对象来接收红外线信号
decode_results results; //解码结果放在decode_results构造的对象results里
void irdisplay(unsigned long value)//按下按键后,显示本人遥控对应的按键
{
switch(value){ //判定按下的是哪个按键
// case 0x97483BFB:Serial.println("-");break;
// case 0xF0C41643:Serial.println("C");break;
// case 0xD7E84B1B:Serial.println("+");break;
// case 0xF076C13B:Serial.println("PREV");break;
// case 0xE5CFBD7F:Serial.println("NEXT");break;
// case 0xA3C8EDDB:Serial.println("PLAY/PAUSE");break;
// case 0xEE886D7F:Serial.println("MENU");break;
// case 0x52A3D41F:Serial.println("TEST");break;
// case 0x20FE4DBB:Serial.println("return");break;
// case 0xE318261B:Serial.println("close");break;//注意此处有中文串口监视时有乱码
case 0xC101E57B:Serial.println("0");sevenSegWrite(0);stepper.step(0*intstep);break; //0
case 0x9716BE3F:Serial.println("1");sevenSegWrite(1);stepper.step(1*intstep);break; //1
case 0x3D9AE3F7:Serial.println("2");sevenSegWrite(2);stepper.step(2*intstep);break; //2
case 0x6182021B:Serial.println("3");sevenSegWrite(3);stepper.step(3*intstep);break; //3
case 0x8C22657B:Serial.println("4");sevenSegWrite(4);stepper.step(4*intstep);break; //4
case 0x488F3CBB:Serial.println("5");sevenSegWrite(5);stepper.step(5*intstep);break; //5
case 0x449E79F :Serial.println("6");sevenSegWrite(6);stepper.step(6*intstep);break; //6
case 0x32C6FDF7:Serial.println("7");sevenSegWrite(7);stepper.step(7*intstep);break; //7
case 0x1BC0157B:Serial.println("8");sevenSegWrite(8);stepper.step(8*intstep);break; //8
case 0x3EC3FC1B:Serial.println("9");sevenSegWrite(9);stepper.step(9*intstep);break; //9
}
}
void setup()
{
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
Serial.begin(9600);
irrecv.enableIRIn(); //启动红外解码
stepper.setSpeed(60);
}
void sevenSegWrite(byte digit) //数码管显示代码
{//设置通过数组控制引脚开关,顺序为4-11号端口26 , seven_seg_digits
byte pin = 4;
for (byte segCount = 0; segCount < 8; ++segCount)
{
digitalWrite(pin, seven_seg_digits);
++pin;//数码管的段码与引脚一一对应
}
}
void loop() {
if (irrecv.decode(&results))
{
//解码成功,收到一组红外线信号
irdisplay(results.value);
irrecv.resume();
}
delay(600);
} 电机不转可能是接线不对,
红外可能是重复码的问题,要加个if (results.value!=(-1))来过滤。 fish6823 发表于 2014-4-12 09:44 static/image/common/back.gif
电机不转可能是接线不对,
红外可能是重复码的问题,要加个if (results.value!=(-1))来过滤。
if (results.value!=(-1))这句语句加到哪呢 宁静以致远 发表于 2014-4-12 18:01 static/image/common/back.gif
if (results.value!=(-1))这句语句加到哪呢
加在if (irrecv.decode(&results))后面,也就是不等于"FFFFFFFF"才斌值.
页:
[1]