极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12398|回复: 2

求助!arduino红外遥控和超声波数码管显示测距两段程序合在一起上传无法运行

[复制链接]
发表于 2016-11-24 18:11:20 | 显示全部楼层 |阅读模式
求助大神,两段程序分别上传运行良好,但是把代码合在一起,loop函数中的内容合在一起后上传功能却无法正常实现,是为什么?


代码如下:
超声波测距
void setup() {
  // put your setup code here, to run once:
  
  pinMode(ECHO,INPUT);
  pinMode(TRIG,OUTPUT);
  pinMode(d1, OUTPUT);
  pinMode(d2, OUTPUT);
  pinMode(d3, OUTPUT);
  pinMode(d4, OUTPUT);
  pinMode(a, OUTPUT);
  pinMode(b, OUTPUT);
  pinMode(c, OUTPUT);
  pinMode(d, OUTPUT);
  pinMode(e, OUTPUT);
  pinMode(f, OUTPUT);
  pinMode(g, OUTPUT);
  pinMode(p, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  
  float a;
  a = getLength();
  Serial.print(a);
  Serial.println("cm");
  cmbig = (int) (a * 10);
  w1 = cmbig/1000;  //百位上的数字
  w2 = (cmbig)%1000/100;   //十位上的数字
  w3 = (cmbig)%100/10;       //个位上的数字
  w4 = cmbig%10;       //小数点后一位上的数字
  for(i=0;i<50;i++)
  SHOW();
  }

//测距函数
float getLength()
{
  float distance;
  digitalWrite(TRIG,LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG,HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG,LOW);
  distance = pulseIn(ECHO,HIGH);
  distance /= 58.0;
  distance=(int (distance*10))/10.0;  
  return distance;
}

void pickDigit(int x)  //定义pickDigit(x),其作用是开启dx端口
{
  digitalWrite(d1, LOW);
  digitalWrite(d2, LOW);
  digitalWrite(d3, LOW);
  digitalWrite(d4, LOW);
  switch(x)
  {
  case 1:
    digitalWrite(d1, HIGH);
    break;
  case 2:
    digitalWrite(d2, HIGH);
    break;
  case 3:
    digitalWrite(d3, HIGH);
    break;
  default:
    digitalWrite(d4, HIGH);
    break;
  }
}

void clearLEDs()  //清屏
{
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
  digitalWrite(p, HIGH);
}

void show(int x)  //展示数字、
{
  clearLEDs();
  if(x==0)
  {
    digitalWrite(a,LOW);
    digitalWrite(f,LOW);
    digitalWrite(e,LOW);
    digitalWrite(d,LOW);
    digitalWrite(c,LOW);
    digitalWrite(b,LOW);
  }
  if(x==1)
  {
    digitalWrite(f,LOW);
    digitalWrite(e,LOW);
  }
  if(x==2)
  {
    digitalWrite(a,LOW);
    digitalWrite(b,LOW);
    digitalWrite(g,LOW);
    digitalWrite(e,LOW);
    digitalWrite(d,LOW);
  }
  if(x==3)
  {
    digitalWrite(a,LOW);
    digitalWrite(b,LOW);
    digitalWrite(c,LOW);
    digitalWrite(d,LOW);
    digitalWrite(g,LOW);
  }
  if(x==4)
  {
    digitalWrite(f,LOW);
    digitalWrite(g,LOW);
    digitalWrite(b,LOW);
    digitalWrite(c,LOW);
  }
  if(x==5)
  {
    digitalWrite(a,LOW);
    digitalWrite(f,LOW);
    digitalWrite(g,LOW);
    digitalWrite(c,LOW);
    digitalWrite(d,LOW);
  }
  if(x==6)
  {
    digitalWrite(a,LOW);
    digitalWrite(f,LOW);
    digitalWrite(g,LOW);
    digitalWrite(c,LOW);
    digitalWrite(d,LOW);
  }
  if(x==7)
  {
    digitalWrite(a,LOW);
    digitalWrite(b,LOW);
    digitalWrite(c,LOW);
  }
  if(x==8)
  {
    digitalWrite(a,LOW);
    digitalWrite(b,LOW);
    digitalWrite(c,LOW);
    digitalWrite(d,LOW);
    digitalWrite(e,LOW);
    digitalWrite(f,LOW);
    digitalWrite(g,LOW);
  }
  if(x==9)
  {
    digitalWrite(a,LOW);
    digitalWrite(f,LOW);
    digitalWrite(g,LOW);
    digitalWrite(b,LOW);
    digitalWrite(c,LOW);
    digitalWrite(d,LOW);
  }
}

void SHOW()
{
  digitalWrite(d1, LOW);
  digitalWrite(d2, LOW);
  digitalWrite(d3, LOW);
  digitalWrite(d4, LOW);
  show(w1);
  if (w1!=0) pickDigit(1);
  delay(5);
  show(w2);
  if((w2!=0)||((w1!=0)&&(w2==0)))pickDigit(2);
  delay(5);
  show(w3);
  pickDigit(3);
  delay(5);
  show(w4);
  pickDigit(4);
  delay(5);
  clearLEDs();
  digitalWrite(p,LOW);
  pickDigit(3);
  delay(5);
}


红外遥控:
#include <IRremote.h>
int pin11=12;//定义I1接口
int pin12=13;//定义I2接口
int speedpin1=6;//定义EA(PWM调速)接口
int pin21=12;//定义I3接口
int pin22=2;//定义I4接口
int speedpin2=5;//定义EB(PWM调速)接口
int RECV_PIN = 7;     //红外接收信号引脚

//红外遥控逻辑代码
#define ADVAN 0xFF18E7   //我的遥控器2键
#define LEF 0xFF5AA5   //我的遥控器4键
#define BAC 0xFF4AB5  //我的遥控器8键
#define LEF2 0xFF42BD //我的遥控器7键
#define RIG2 0xFF52AD//我的遥控器9键
#define RIG 0xFF10EF    //我的遥控器6键
#define STO 0xFF38C7    //我的遥控器5键
#define INC 0xFF30CF   //我的遥控器1键
#define DECR 0xFF7A85   //我的遥控器3键

IRrecv irrecv(RECV_PIN);//初始化
decode_results results;//定义结构体类型
int N=150;

void setup()
{
   pinMode(pin11,OUTPUT);//定义该接口为接口为输出接口
   pinMode(pin12,OUTPUT);
   pinMode(speedpin1,OUTPUT);
   pinMode(pin21,OUTPUT);//定义该接口为接口为输出接口
   pinMode(pin22,OUTPUT);
   pinMode(speedpin2,OUTPUT);
   pinMode(RECV_PIN,INPUT);
   Serial.begin(9600);
   irrecv.enableIRIn();// 开始接收
}

void loop() {
   int N;
   if (irrecv.decode(&results))
   {
      Serial.println(results.value, HEX);
     switch(results.value)
     {
     case ADVAN://2键前进
       advance();
       break;
     case LEF://4键左转
       turnleft();
       break;
     case LEF2://7键连续左转
     turnleft2();
     break;
     case RIG2://9键连续右转
     turnright2();
     break;
     case BAC://8键后退
       backup();
       break;
     case RIG://6键右转
       turnright();
       break;
     case STO://5键制动
       stopa();
       break;
     case INC://1键加速
       increase();
       break;
     case DECR://3键减速
       decrease();
       break;         
     default:
       delay(600);
     }
     irrecv.resume(); // Receive the next value
   }
   delay(600);
}

void advance()//前进
{     
   analogWrite(speedpin1,N);//输入模拟值进行设定速度     
   analogWrite(speedpin2,N);  
   digitalWrite(pin11,HIGH);//使直流电机(左)顺时针转     
   digitalWrite(pin12, LOW);  
   digitalWrite(pin21,HIGH);//使直流电机(右)逆时针转     
   digitalWrite(pin22,LOW);     
}
  void turnleft2()//左转
{
   int a,b;
   if(N>170)
   {
   a=N-130;
   b=N;   
   analogWrite(speedpin1,a);//输入模拟值进行设定速度     
   analogWrite(speedpin2,b);  
   digitalWrite(pin11,HIGH);//使直流电机(左)顺时针转     
   digitalWrite(pin12,LOW);  
   digitalWrite(pin21,HIGH);//使直流电机(右)顺时针转     
   digitalWrite(pin22,LOW);     
   delay(600);}
   else if (N>100)
    {
    a=N-90;
    b=N+80;
    analogWrite(speedpin1,a);//输入模拟值进行设定速度     
    analogWrite(speedpin2,b);  
    digitalWrite(pin11,HIGH);//使直流电机(左)顺时针转     
    digitalWrite(pin12,LOW);  
    digitalWrite(pin21,HIGH);//使直流电机(右)顺时针转     
    digitalWrite(pin22,LOW);     
    delay(600);}
   else if (N>40)
    {
    a=N-30;
    b=N+30;
    analogWrite(speedpin1,a);//输入模拟值进行设定速度     
    analogWrite(speedpin2,b);  
    digitalWrite(pin11,HIGH);//使直流电机(左)顺时针转     
    digitalWrite(pin12,LOW);  
    digitalWrite(pin21,HIGH);//使直流电机(右)顺时针转     
    digitalWrite(pin22,LOW);     
    delay(600);}
   else
   {
    a=0;
    b=20;
    analogWrite(speedpin1,a);//输入模拟值进行设定速度     
    analogWrite(speedpin2,b);  
    digitalWrite(pin11,HIGH);//使直流电机(左)顺时针转     
    digitalWrite(pin12,LOW);  
    digitalWrite(pin21,HIGH);//使直流电机(右)顺时针转     
    digitalWrite(pin22,LOW);     
    delay(600);
    }
}
void turnright2()//右转
{  
   int a,b;
   if(N>170)
   {
   a=N;
   b=N-130;   
   analogWrite(speedpin1,a);//输入模拟值进行设定速度     
   analogWrite(speedpin2,b);  
   digitalWrite(pin11,HIGH);//使直流电机(左)顺时针转     
   digitalWrite(pin12,LOW);  
   digitalWrite(pin21,HIGH);//使直流电机(右)顺时针转     
   digitalWrite(pin22,LOW);     
   delay(600);}
   else if (N>100)
    {
    a=N+80;
    b=N-90;
    analogWrite(speedpin1,a);//输入模拟值进行设定速度     
    analogWrite(speedpin2,b);  
    digitalWrite(pin11,HIGH);//使直流电机(左)顺时针转     
    digitalWrite(pin12,LOW);  
    digitalWrite(pin21,HIGH);//使直流电机(右)顺时针转     
    digitalWrite(pin22,LOW);     
    delay(600);}
   else if (N>40)
    {
    a=N+30;
    b=N-30;
    analogWrite(speedpin1,a);//输入模拟值进行设定速度     
    analogWrite(speedpin2,b);  
    digitalWrite(pin11,HIGH);//使直流电机(左)顺时针转     
    digitalWrite(pin12,LOW);  
    digitalWrite(pin21,HIGH);//使直流电机(右)顺时针转     
    digitalWrite(pin22,LOW);     
    delay(600);}
   else
   {
    a=10;
    b=0;
    analogWrite(speedpin1,a);//输入模拟值进行设定速度     
    analogWrite(speedpin2,b);  
    digitalWrite(pin11,HIGH);//使直流电机(左)顺时针转     
    digitalWrite(pin12,LOW);  
    digitalWrite(pin21,HIGH);//使直流电机(右)顺时针转     
    digitalWrite(pin22,LOW);     
    delay(600);
    }
      

}


void backup()//后退
{     
   analogWrite(speedpin1,N);//输入模拟值进行设定速度
   analogWrite(speedpin2,N);   
   digitalWrite(pin11,LOW);//使直流电机(左)逆时针转
   digitalWrite(pin12,HIGH);  
   digitalWrite(pin21,LOW);//使直流电机(右)顺时针转     
   digitalWrite(pin22,HIGH);     
   delay(600);
}

void turnleft()//左转
{
  int a,b;
   a=20;
   b=200;
   analogWrite(speedpin1,a);//输入模拟值进行设定速度     
   analogWrite(speedpin2,b);
   digitalWrite(pin11,HIGH);//使直流电机(左)逆时针转     
   digitalWrite(pin12,LOW);  
   digitalWrite(pin21,HIGH);//使直流电机(右)逆时针转   
   digitalWrite(pin22,LOW);   
   delay(1200);
   advance();
}
void turnright()//右转
{  
   int a,b;
   a=200;
   b=20;   
   analogWrite(speedpin1,a);//输入模拟值进行设定速度     
   analogWrite(speedpin2,b);  
   digitalWrite(pin11,HIGH);//使直流电机(左)顺时针转     
   digitalWrite(pin12,LOW);  
   digitalWrite(pin21,HIGH);//使直流电机(右)顺时针转     
   digitalWrite(pin22,LOW);     
   delay(1200);
   advance();
}
void stopa()//停止
{   
   digitalWrite(pin11,HIGH);//使直流电机(左)制动  
   digitalWrite(pin12,HIGH);
   digitalWrite(pin22,HIGH);//使直流电机(右)制动
   digitalWrite(pin21,HIGH);   
   delay(600);
}
void increase()//加速
{
   if(N<=225) //最大速度为225
   {
     N=N+20;
     analogWrite(speedpin1,N); //将a 的值赋给speedin1
     analogWrite(speedpin2,N); //将a 的值赋给speedin2
     delay(1000); //延时1 秒
   }
   else {
     analogWrite(speedpin1,225); //将a 的值赋给speedin1
     analogWrite(speedpin2,225); //将a 的值赋给speedin2
     delay(1000);  
   }
}
void decrease()//减速
{
   if(N>=0) //最小速度为0
   {
     N=N-20;
     analogWrite(speedpin1,N); //将a 的值赋给speedin1
     analogWrite(speedpin2,N); //将a 的值赋给speedin2
     delay(1000); //延时1 秒
   }
   else {
     analogWrite(speedpin1,0); //将a 的值赋给speedin1
     analogWrite(speedpin2,0); //将a 的值赋给speedin2   
     delay(1000);
   }
}
回复

使用道具 举报

 楼主| 发表于 2016-11-24 18:13:04 | 显示全部楼层
请问是不是上面两个分开的程序loop函数中内容合起来顺序安排不合适,如果是,该怎么做呢?
回复 支持 反对

使用道具 举报

发表于 2017-3-9 21:30:19 | 显示全部楼层
哪有那么简单,整合程序比单独的难多了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-19 15:27 , Processed in 0.056532 second(s), 19 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表