极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10125|回复: 4

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

[复制链接]
发表于 2013-6-28 23:33:36 | 显示全部楼层 |阅读模式
本帖最后由 A050705072000 于 2013-6-30 17:10 编辑

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

  27.     void setup(){
  28.       Serial.begin(9600);
  29.       pinMode(seg_pin[0],OUTPUT);
  30.       pinMode(seg_pin[1],OUTPUT);
  31.       pinMode(seg_pin[2],OUTPUT);
  32.       pinMode(seg_pin[3],OUTPUT);
  33.       pinMode(seg_pin[4],OUTPUT);
  34.       pinMode(seg_pin[5],OUTPUT);
  35.       pinMode(seg_pin[6],OUTPUT);
  36.       pinMode(seg_pin[7],OUTPUT);
  37.       pinMode(com_pin[0],OUTPUT);
  38.       pinMode(com_pin[1],OUTPUT);
  39.       pinMode(com_pin[2],OUTPUT);
  40.       pinMode(com_pin[3],OUTPUT);
  41.       pinMode(buttom1,INPUT);
  42.       pinMode(buttom2,INPUT);
  43.       pinMode(vr_pin,INPUT);
  44.       pinMode(relay,OUTPUT);
  45.       for(int i=0;i<4;i++){
  46.         digitalWrite(com_pin[i],HIGH);
  47.       }
  48.       delay(1500);
  49.     }

  50.     void loop(){/*
  51.       if(digitalRead(buttom2) == HIGH){
  52.         if(digitalRead(relay) == LOW){
  53.           digitalWrite(relay,HIGH);
  54.           setuptime = num[0]*600+num[1]*60+num[2]*10+num[3];
  55.           START();
  56.         }
  57.       }*/
  58.     //找到上面那段出错,所以把他拉出来看看,结果发现它会自动变成1
  59.       Serial.print(digitalRead(buttom2));
  60.       Serial.print(",");
  61.       Serial.print(digitalRead(vr_pin));
  62.       Serial.print(",");
  63.       Serial.println(digitalRead(buttom1));
  64.       VR();
  65.       SEG_LOOP(num[0],num[1],num[2],num[3]);
  66.     }

  67.     void START(){
  68.       do{
  69.         int time = millis();  //ms
  70.         int nowtime = (millis() - time)/1000; //s
  71.         //Serial.println(setuptime);
  72.         if(nowtime == setuptime || digitalRead(buttom1) == HIGH){
  73.           STOP();
  74.           break;
  75.         }
  76.         SEG_LOOP(num[0],num[1],num[2],num[3]);
  77.       }while(1);
  78.     }

  79.     void STOP(){
  80.       digitalWrite(relay,LOW);
  81.     }

  82.     void VR(){
  83.       int val = analogRead(vr_pin)/10;
  84.       int time = map(val,0,102,0,MaxTime);
  85.       num[0] = (time/60)/10;
  86.       num[1] = (time/60)-(((time/60)/10)*10);
  87.       num[2] = (time%60)/10;
  88.       num[3] = (time%60)-(((time%60)/10)*10);
  89.       if(num[0]==0){num[0]=10;}
  90.       if(num[1]==0){if(num[0]==10){num[1]=10;}}
  91.       if(num[2]==0){if(num[1]==10){num[2]=10;}}
  92.     }

  93.     void SEG_LOOP(int number1,int number2,int number3,int number4){
  94.       THOUSAND(number1);
  95.       delay(delay_time);
  96.       HUNDRED(number2);
  97.       delay(delay_time);
  98.       TEN(number3);
  99.       delay(delay_time);
  100.       BITS(number4);
  101.       delay(delay_time);
  102.     }

  103.     void BITS(int number){
  104.       int run = 0;
  105.       digitalWrite(com_pin[0],HIGH);
  106.       digitalWrite(com_pin[1],LOW);
  107.       digitalWrite(com_pin[2],LOW);
  108.       digitalWrite(com_pin[3],LOW);
  109.       (num[3]==0 && num[2]==10)? digitalWrite(seg_pin[7],LOW):digitalWrite(seg_pin[7],HIGH);
  110.       for(int i=0;i<7;i++){
  111.         digitalWrite(seg_pin[i],seven_seg[number][i]);
  112.       }
  113.     }

  114.     void TEN(int number){
  115.       digitalWrite(com_pin[0],LOW);
  116.       digitalWrite(com_pin[1],HIGH);
  117.       digitalWrite(com_pin[2],LOW);
  118.       digitalWrite(com_pin[3],LOW);
  119.       digitalWrite(seg_pin[7],HIGH);
  120.       for(int i=0;i<7;i++){
  121.         digitalWrite(seg_pin[i],seven_seg[number][i]);
  122.       }
  123.     }

  124.     void HUNDRED(int number){
  125.       digitalWrite(com_pin[0],LOW);
  126.       digitalWrite(com_pin[1],LOW);
  127.       digitalWrite(com_pin[2],HIGH);
  128.       digitalWrite(com_pin[3],LOW);
  129.       if(num[1]==10){digitalWrite(seg_pin[7],HIGH);}else{digitalWrite(seg_pin[7],LOW);}
  130.       for(int i=0;i<7;i++){
  131.         digitalWrite(seg_pin[i],seven_seg[number][i]);
  132.       }
  133.     }

  134.     void THOUSAND(int number){
  135.       digitalWrite(com_pin[0],LOW);
  136.       digitalWrite(com_pin[1],LOW);
  137.       digitalWrite(com_pin[2],LOW);
  138.       digitalWrite(com_pin[3],HIGH);
  139.       digitalWrite(seg_pin[7],HIGH);
  140.       for(int i=0;i<7;i++){
  141.         digitalWrite(seg_pin[i],seven_seg[number][i]);
  142.       }
  143.     }
复制代码
麻烦各位帮我抓看看问题在哪,可变电阻换了两三个了一样会出现在个问题(10K,100K,2M)
回复

使用道具 举报

发表于 2013-6-29 04:31:39 | 显示全部楼层
电路有问题吗?
回复 支持 反对

使用道具 举报

发表于 2013-6-29 05:43:59 | 显示全部楼层
按键有上拉或下拉电阻吗?软件中按键好像没有防抖处理。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-30 17:04:57 | 显示全部楼层
把两个按钮上拉后就好了......明明没插线出去ARDUINO版还是会一直跳真奇怪...
回复 支持 反对

使用道具 举报

发表于 2013-7-1 08:57:28 | 显示全部楼层
呵呵,端口设为输入端,在按钮没按时就等于开路状态,端口就会因为感应而发生变化,接个电阻就降低了端口阻抗,避免了感应.
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-7 05:25 , Processed in 0.156164 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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