A050705072000 发表于 2013-6-28 23:33:36

DIY曝光机程式出错,请大家帮忙抓虫

本帖最后由 A050705072000 于 2013-6-30 17:10 编辑

最近在用ARDUINO做曝光机,但是测试程式时一直出错,想请大家抓一下原因
下面是我的想法,我在面包版测试时用了一个七段显示器(4格的),两个按钮,一个可变电阻,七段显示器显示时间,按钮一个绿色开始一个红色紧急停止,可变电阻调整时间
现在发现问题出在转可变电阻到一个量时两个按钮的脚会自己变成HIGH,很诡异...
然后有时按一个按钮另外一个也会通,试过把线拔掉还是这样...下面是我的代码:    /******7_seg******/
    int seg_pin = {2,3,4,5,6,7,8,9};
    //a=,b=,c=,d=,e=,f=,g=,dp,=
    int com_pin = {10,11,12,13};
    //com1=,com2=,com3=,com4=
    byte seven_seg = { {0,0,0,0,0,0,1},   //0
                              {1,0,0,1,1,1,1},   //1
                              {0,0,1,0,0,1,0},   //2
                              {0,0,0,0,1,1,0},   //3
                              {1,0,0,1,1,0,0},   //4
                              {0,1,0,0,1,0,0},   //5
                              {1,1,0,0,0,0,0},   //6
                              {0,0,0,1,1,1,1},   //7
                              {0,0,0,0,0,0,0},   //8
                              {0,0,0,1,1,0,0},   //9
                              {1,1,1,1,1,1,1},   //no
                            };
    int delay_time = 5;//ms
    int num = {10,10,10,0};
    /******7_seg******/
    int buttom1=A0;//red
    int buttom2=A1;//green
    int vr_pin=A2;
    int relay=A3;
    int MaxTime=1200; //s
    int setuptime;//s

    void setup(){
      Serial.begin(9600);
      pinMode(seg_pin,OUTPUT);
      pinMode(seg_pin,OUTPUT);
      pinMode(seg_pin,OUTPUT);
      pinMode(seg_pin,OUTPUT);
      pinMode(seg_pin,OUTPUT);
      pinMode(seg_pin,OUTPUT);
      pinMode(seg_pin,OUTPUT);
      pinMode(seg_pin,OUTPUT);
      pinMode(com_pin,OUTPUT);
      pinMode(com_pin,OUTPUT);
      pinMode(com_pin,OUTPUT);
      pinMode(com_pin,OUTPUT);
      pinMode(buttom1,INPUT);
      pinMode(buttom2,INPUT);
      pinMode(vr_pin,INPUT);
      pinMode(relay,OUTPUT);
      for(int i=0;i<4;i++){
      digitalWrite(com_pin,HIGH);
      }
      delay(1500);
    }

    void loop(){/*
      if(digitalRead(buttom2) == HIGH){
      if(digitalRead(relay) == LOW){
          digitalWrite(relay,HIGH);
          setuptime = num*600+num*60+num*10+num;
          START();
      }
      }*/
    //找到上面那段出错,所以把他拉出来看看,结果发现它会自动变成1
      Serial.print(digitalRead(buttom2));
      Serial.print(",");
      Serial.print(digitalRead(vr_pin));
      Serial.print(",");
      Serial.println(digitalRead(buttom1));
      VR();
      SEG_LOOP(num,num,num,num);
    }

    void START(){
      do{
      int time = millis();//ms
      int nowtime = (millis() - time)/1000; //s
      //Serial.println(setuptime);
      if(nowtime == setuptime || digitalRead(buttom1) == HIGH){
          STOP();
          break;
      }
      SEG_LOOP(num,num,num,num);
      }while(1);
    }

    void STOP(){
      digitalWrite(relay,LOW);
    }

    void VR(){
      int val = analogRead(vr_pin)/10;
      int time = map(val,0,102,0,MaxTime);
      num = (time/60)/10;
      num = (time/60)-(((time/60)/10)*10);
      num = (time%60)/10;
      num = (time%60)-(((time%60)/10)*10);
      if(num==0){num=10;}
      if(num==0){if(num==10){num=10;}}
      if(num==0){if(num==10){num=10;}}
    }

    void SEG_LOOP(int number1,int number2,int number3,int number4){
      THOUSAND(number1);
      delay(delay_time);
      HUNDRED(number2);
      delay(delay_time);
      TEN(number3);
      delay(delay_time);
      BITS(number4);
      delay(delay_time);
    }

    void BITS(int number){
      int run = 0;
      digitalWrite(com_pin,HIGH);
      digitalWrite(com_pin,LOW);
      digitalWrite(com_pin,LOW);
      digitalWrite(com_pin,LOW);
      (num==0 && num==10)? digitalWrite(seg_pin,LOW):digitalWrite(seg_pin,HIGH);
      for(int i=0;i<7;i++){
      digitalWrite(seg_pin,seven_seg);
      }
    }

    void TEN(int number){
      digitalWrite(com_pin,LOW);
      digitalWrite(com_pin,HIGH);
      digitalWrite(com_pin,LOW);
      digitalWrite(com_pin,LOW);
      digitalWrite(seg_pin,HIGH);
      for(int i=0;i<7;i++){
      digitalWrite(seg_pin,seven_seg);
      }
    }

    void HUNDRED(int number){
      digitalWrite(com_pin,LOW);
      digitalWrite(com_pin,LOW);
      digitalWrite(com_pin,HIGH);
      digitalWrite(com_pin,LOW);
      if(num==10){digitalWrite(seg_pin,HIGH);}else{digitalWrite(seg_pin,LOW);}
      for(int i=0;i<7;i++){
      digitalWrite(seg_pin,seven_seg);
      }
    }

    void THOUSAND(int number){
      digitalWrite(com_pin,LOW);
      digitalWrite(com_pin,LOW);
      digitalWrite(com_pin,LOW);
      digitalWrite(com_pin,HIGH);
      digitalWrite(seg_pin,HIGH);
      for(int i=0;i<7;i++){
      digitalWrite(seg_pin,seven_seg);
      }
    }麻烦各位帮我抓看看问题在哪,可变电阻换了两三个了一样会出现在个问题(10K,100K,2M)

林定祥 发表于 2013-6-29 04:31:39

电路有问题吗?

林定祥 发表于 2013-6-29 05:43:59

按键有上拉或下拉电阻吗?软件中按键好像没有防抖处理。

A050705072000 发表于 2013-6-30 17:04:57

把两个按钮上拉后就好了......明明没插线出去ARDUINO版还是会一直跳真奇怪...

林定祥 发表于 2013-7-1 08:57:28

呵呵,端口设为输入端,在按钮没按时就等于开路状态,端口就会因为感应而发生变化,接个电阻就降低了端口阻抗,避免了感应.
页: [1]
查看完整版本: DIY曝光机程式出错,请大家帮忙抓虫