开心比较堵 2022-01-08 10:49 采纳率: 71.9%
浏览 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 关于#极限编程#的问题,请各位专家解答!
  • ¥20 win11账户锁定时间设为0无法登录
  • ¥45 C#学生成绩管理系统
  • ¥15 VB.NET2022如何生成发布成exe文件
  • ¥30 matlab appdesigner私有函数嵌套整合
  • ¥15 vb6.0使用jmail接收smtp邮件并另存附件到D盘
  • ¥30 vb net 使用 sendMessage 如何输入鼠标坐标
  • ¥15 关于freesurfer使用freeview可视化的问题
  • ¥100 谁能在荣耀自带系统MagicOS版本下,隐藏手机桌面图标?
  • ¥15 求SC-LIWC词典!