开心比较堵 2022-01-08 10:49 采纳率: 72.7%
浏览 42
已结题

Arduino控制程序?

要求:

img

问题:
把第3个要求单独弄成一个函数,在用的时候如果我把它放在setup里面,一旦一开始的距离<50,它就会执行但调到>50,就不会执行>50的要求。但是如果把这个函数放在loop里面,又会无限的循坏。请问该如何解决这个问题?
电路图和源代码:

img

#include <LiquidCrystal.h>
//lcd显示屏库
#include <Servo.h>//
Servo myservo;  // 定义Servo对象来控制
int pos = 0;    // 角度存储变量

const int RS=7,E=6,DB4=5,DB5=4,DB6=3,DB7=2;
LiquidCrystal lcd(RS,E,DB4,DB5,DB6,DB7);

int TrigPin=A0;
int EcoPin=A1;
float a;//距离传感器

int buzzer=8;//蜂鸣器引脚

int k=9;
int m=11;//电机引脚

void xiaoyu(){
  lcd.setCursor(0,0);
  lcd.print("Distance is");
  lcd.setCursor(0,1);
  lcd.print(a);//lcd屏显示
  
  if(a<50){
   myservo.attach(10);  // 控制线连接数字9
   myservo.write(90);              // 舵机角度写入
   delay(1000);
  for(int i=90;i>=0;i--){
    myservo.write(i);
    delay(15);
    pinMode(10,LOW);
  }
    digitalWrite(k,LOW);
    digitalWrite(m,HIGH);
    delay(500);
    digitalWrite(k,LOW);
    digitalWrite(m,LOW);//电机反转 
    delay(1000);//电机1秒停止
    
    unsigned char i,j;
    while(1){
      for(i=0;i<80;i++){//输出一个频率声音
        digitalWrite(buzzer,HIGH);//发声音
        delay(1);//延时1ms
        digitalWrite(buzzer,LOW);//不发声音
        delay(1);
      }
    } 
}
}//


void setup()
{
  lcd.begin(16,2);//设置lcd要显示的2行16列
  lcd.clear();//lcd
  
  pinMode(TrigPin, OUTPUT);
  pinMode(EcoPin,INPUT);
  Serial.begin(9600);//距离
  
  pinMode(buzzer, OUTPUT);//蜂鸣器
  
  pinMode(k, OUTPUT);
  pinMode(m, OUTPUT);//电机输出
  
 
  
  digitalWrite(TrigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(TrigPin,HIGH);
  delayMicroseconds(10);
  digitalWrite(TrigPin, LOW);
  a=float(pulseIn(EcoPin,HIGH)*17)/1000+2-0.3;//距离计算公式
  delay(200);//速度
  
  
  if(a<50){
    xiaoyu();
  }
  
}

void loop()
{
  digitalWrite(TrigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(TrigPin,HIGH);
  delayMicroseconds(10);
  digitalWrite(TrigPin, LOW);
  a=float(pulseIn(EcoPin,HIGH)*17)/1000+2-0.3;//距离计算公式
  delay(200);//速度
  
   lcd.setCursor(0,0);
  lcd.print("Distance is");
  lcd.setCursor(0,1);
  lcd.print(a);//lcd屏显示
  
  if(a>50){
    digitalWrite(k,HIGH);
    digitalWrite(m,LOW);
    delay(500);
    digitalWrite(k,LOW);
    digitalWrite(m,LOW);//电机  
    
   // Serial.print("Servo motor in standby");
  
  }else {
   // xiaoyu();
  }
  
}

  • 写回答

1条回答 默认 最新

  • qllaoda 2022-01-08 11:18
    关注

    肯定应该放在loop里,这个显然是需要一直运行的,不可能只运行一次。
    loop的流程很简单啊,就是先测距,然后根据距离做处理。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 1月10日
  • 已采纳回答 1月8日
  • 创建了问题 1月8日

悬赏问题

  • ¥15 乘性高斯噪声在深度学习网络中的应用
  • ¥15 运筹学排序问题中的在线排序
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥30 求一段fortran代码用IVF编译运行的结果
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥30 python代码,帮调试,帮帮忙吧