Super169 发表于 2014-5-6 16:28:17

本帖最后由 Super169 于 2014-5-6 16:32 编辑

在這裡卡死是早預料到的, 因為程式中只有三個 while loop 可以卡死, 而你放的地方把三個 while loop 也包了, 卡死在這裡也很正常.

嘗試看看 IR 是否可接收到 HIGH / LOW, 以及 max_high 的值吧, 這都是決定程式進行的路徑的元素.


    while(!exit)                                                               
    {
      Serial.println("loop for IR LOW");
      while( digitalRead(IR_LED) == LOW )
      delayMicroseconds(MICRO_STEP);
      unsigned long start = micros();
      int max_high = 0;

      Serial.println("loop for IR HIGH");
      while( digitalRead(IR_LED) == HIGH )
      {
      delayMicroseconds(MICRO_STEP);
      max_high += MICRO_STEP;
      Serial.println(max_high);
      if( max_high > IDLE_PULSE )
      {
          exit = 1;
          break;
      }
      }
      unsigned long duration = micros() - start;
      pulses = duration;
    }

raydead 发表于 2014-5-6 16:37:46

Super169 发表于 2014-5-6 16:28 static/image/common/back.gif
在這裡卡死是早預料到的, 因為程式中只有三個 while loop 可以卡死, 而你放的地方把三個 while loop 也包了 ...

这部分代码被完全跳过了,在上一个判断IR是不是LOW的那个地方,看着是做判断,然后就跳过了这一段。

raydead 发表于 2014-5-6 16:47:45

Super169 发表于 2014-5-6 16:28 static/image/common/back.gif
在這裡卡死是早預料到的, 因為程式中只有三個 while loop 可以卡死, 而你放的地方把三個 while loop 也包了 ...

理论上这个地方的红外线接收IR_LED应该是低电平的,但是这里一直是高电平。难道是硬件上的问题了?我一直担心的就是温度传感器和这个红外线的通信会不会冲突

raydead 发表于 2014-5-6 18:27:34

Super169 发表于 2014-5-6 16:28 static/image/common/back.gif
在這裡卡死是早預料到的, 因為程式中只有三個 while loop 可以卡死, 而你放的地方把三個 while loop 也包了 ...

我换了另一套代码,不检测输入口的电平,直接解码。现在做出来了。就是感觉没有这个那么灵敏

raydead 发表于 2014-5-6 18:31:19

解决方案,换了一套红外接收代码,如下#include <Adafruit_ssd1306syp.h>
#define SDA_PIN 8
#define SCL_PIN 9
Adafruit_ssd1306syp display(SDA_PIN,SCL_PIN);
#include <IRremote.h>// 使用IRRemote函数库
const int irReceiverPin = 2;// 红外接收器的 OUTPUT 引脚接在 PIN2 接口 定义irReceiverPin变量为PIN2接口
IRrecv irrecv(irReceiverPin); // 设置irReceiverPin定义的端口为红外信号接收端口
decode_results results;    // 定义results变量为红外结果存放位置
int n;                                                //整形变量n遥控器键位
int level;                        //转速等级
int mspeed;                         //电机转速
void setup()
{
delay(1000);
display.initialize();
level=0;//assignment speed level
mspeed=0;
pinMode(5,OUTPUT);
irrecv.enableIRIn();   // 启动红外解码
Serial.begin(9600);   // 开启串口,波特率为9600
}
void loop()
{
int mode;
double T;
T=(analogRead(A5)*0.488);//assignment temperature
mode=1;//Mode number
if (irrecv.decode(&results))
{   // 解码成功,把数据放入results变量中
    // 把数据输入到串口
    n=int(results.value);   
    irrecv.resume();    // 继续等待接收下一组信号
}
mspeed=map(level,1,50,35,255);

        if(n==-23971)
                {
                        Serial.println("CH-");
                        level--;
                        n=0;
                }
        else if(n==25245)
                {
                        Serial.println("CH");
                        level=0;
                        n=0;
                }
        else if(n==-7651)
                {
                        Serial.println("CH+");
                        level++;
                        n=0;
                }
      if(((level)==(0)))
                {
                        mspeed=0;
                }
      analogWrite(5,mspeed);
      Serial.println(level);
          display.clear();
display.setTextSize(1);
display.setCursor(0,0);
display.println("Temperature:");
display.setTextSize(2);
display.print(T);
display.setTextSize(1);
display.print("o");
display.setTextSize(2);
display.println("C");
display.println("");
display.setTextSize(1);
display.print("Speed Level:");
display.print(level);
display.println("");
display.setTextSize(1);
display.println("");
display.print("Mode:");
display.print(mode);
display.update();
}
页: 1 [2]
查看完整版本: 新人求教,中断方面