本帖最后由 tsaiwn 于 2015-4-18 12:50 编辑
奶妃 发表于 2015-4-18 11:03
感谢前辈们的指导,我下次写程序前一定先想好问题>.
你看看这样写法是不是就不需要画 flowchart 流程图 ?
只要一直往下看,
先假设函数有照宣称的功能做事, 需要时再去看看或检查函数内容
记住一个原则: 尽量把事情写成函数, 每个函数尽量少于 35行甚至30行 !- /// 每个函数尽量不要超过 35 行, 这意人比较容易看懂
- // 用以下 lightTime = 5000; 表示 5 秒方便修改
- const int lightTime = 5000; // 5 秒亮灯时间 for LED 7
- const int T2 = 6;
- const int E2 = 7;
- float distance2;
- int led1 = 4;
- int led2 = 8;
- int led6 = 9;
- int led7 = 10;
- int b = 0; // 1 表示距离在 [8, 15] cm 内
- unsigned long t71;
- unsigned long t72; // 这其实没用到
- int flag = 0; // 0 表示还没亮; 1 表示亮灯中, 3 表示已经亮过且又灭了
- ///
- void setup()
- {
- //超声波测距模块2
- //初始化串口通信及连接SR04的引脚
- Serial.begin(9600);
- pinMode(T2, OUTPUT);
- //设置输入状态
- pinMode(E2, INPUT);
- pinMode(led2,OUTPUT);
- pinMode(led6,OUTPUT);
- pinMode(led7,OUTPUT);
- digitalWrite(led2,LOW);
- digitalWrite(led6,LOW);
- digitalWrite(led7,LOW);
- } // setup(
- void loop()
- {
- //超声波测距模块2, 取得距离 distance2
- distance2 = getDist(T2, E2); // trigger pin 是 T2; E2 是 Echo pin
- Serial.println(String("distance2=") + distance2 + " cm");
- delay(500);
- //第二部分过程控制LED1,LED2,LED6,LED7
- b = 0; // 假设距离不在 [8, 15] 内
- if((distance2 >= 8)&&(distance2 <= 15)) b = 1; // 发现在 [8, 15] 内 !
- Serial.println( String("b=") + b);
- if(b == 1) tryLight( ); // 8 cm <= distance2 <= 15 cm
- check7( ); // b 不是 1 也要检查 LED 7; 如果有亮灯, 则时间到了要灭灯
- } // loop(
- void tryLight( ) {
- digitalWrite(led1,LOW);
- digitalWrite(led2,HIGH);
- digitalWrite(led6,HIGH);
- light7( ); // see below, 如果还没亮过, 点亮 LED7 并开始计时 t71
- }
- ////////
- void light7( ) {
- if(flag == 3) return; // Led 7 已经打开又关闭, 立即返回, 不再往下
- if(flag == 0) { // Led 7 还没亮灯过
- digitalWrite(led7,HIGH);
- flag = 1; // 改为 1 表示亮灯
- t71 = millis( ); // 记住亮灯时间
- return;
- }
- // 会到这, 表示 flag 一定是 1, 所以不必检查了
- // 当然要写 if(flag == 1 ) {... } 也可以啦
- check7( ); // 查看亮灯时间是否已经超过 lightTime (5秒)
- } // light7(
- void check7( ) {
- if(flag != 1) return; // LED7 灯没亮, 直接返回
- if( millis( ) - t71 < lightTime) return; // 时间还没到 ! lightTime 是 5000 表示 5 秒
- // 到这表示 millis( ) - t71 已经 大于 or 等于 lightTime
- flag = 3; // 表示已经点亮且又亮灯超过 5 秒
- digitalWrite(led7, LOW); // 关闭 LED7
- Serial.print("t72=");
- Serial.println( millis( ) - t71 ); // 实际上根本用不到 t72 :-)
- } // check7(
- float getDist(int pinTrig, int ePin) { // trigger pin, echo pin
- //产生一个10us的高脉冲去触发 trigger pin (pinTrig)
- digitalWrite(pinTrig, LOW);
- delayMicroseconds(2);
- digitalWrite(pinTrig, HIGH);
- delayMicroseconds(10);
- digitalWrite(pinTrig, LOW);
- //检测脉冲宽度,并计算出距离
- float ans = pulseIn(ePin, HIGH) / 58.00;
- return ans;
- } // getDist
复制代码 |