宁静以致远 发表于 2014-4-11 19:16:40

红外按键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);
}

fish6823 发表于 2014-4-12 09:44:35

电机不转可能是接线不对,
红外可能是重复码的问题,要加个if (results.value!=(-1))来过滤。

宁静以致远 发表于 2014-4-12 18:01:35

fish6823 发表于 2014-4-12 09:44 static/image/common/back.gif
电机不转可能是接线不对,
红外可能是重复码的问题,要加个if (results.value!=(-1))来过滤。

if (results.value!=(-1))这句语句加到哪呢

fish6823 发表于 2014-4-12 20:21:33

宁静以致远 发表于 2014-4-12 18:01 static/image/common/back.gif
if (results.value!=(-1))这句语句加到哪呢

加在if (irrecv.decode(&results))后面,也就是不等于"FFFFFFFF"才斌值.
页: [1]
查看完整版本: 红外按键0-9控制步进电机的转动圈数(0-9)圈,并且数码管显示0-9!