开心比较堵 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 我的代码无法在vc++中运行呀,错误很多
  • ¥50 求一个win系统下运行的可自动抓取arm64架构deb安装包和其依赖包的软件。
  • ¥60 fail to initialize keyboard hotkeys through kernel.0000000000
  • ¥30 ppOCRLabel导出识别结果失败
  • ¥15 Centos7 / PETGEM
  • ¥15 csmar数据进行spss描述性统计分析
  • ¥15 各位请问平行检验趋势图这样要怎么调整?说标准差差异太大了
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 wpf界面一直接收PLC给过来的信号,导致UI界面操作起来会卡顿
  • ¥15 init i2c:2 freq:100000[MAIXPY]: find ov2640[MAIXPY]: find ov sensor是main文件哪里有问题吗