兄弟,如果你看到这篇,只能说明你A测也挂了,没办法,哥们太菜了,抄的太假过不了你电有些老师的慧眼
这坨🐕⑩我先吃为敬
环境搭建可以参考这个兄弟的博客
一、题目要求
实现功能:使用 Arduino UNO 微控制器,搭建一个 PC 上位机远程气压检测控制
系统。
功能:Arduino UNO(Atmega328P)通过串行接口组件与上位机 PC 进行双向
通信,PC 机用串口调试助手软件向 Arduino UNO 发送学生自己的学号,Arduino
UNO 收到后在 LCD 上显示学生的学号,并且向 PC 机发送当前的气压值。PC
机上的串口调试助手软件接收窗口显示收到的气压值。
Arduino UNO 控制驱动直流电机,当环境气压等于或高于预定的气压((860+
学号末位数)hPa)时,启动直流电机转动;当环境气压低于预定的气压((860+
学号末位数)hPa)时,直流电机停止转动。同时,实时环境气压在 LCD 和 PC
机的串口调试助手软件接收窗口显示。如:学生学号末位数为 5,手动增加气压
等于或超过设定的气压值 865 hPa(860+5=865)时,驱动直流电机开始转动。
LCD 第一行显示 ID:学号,第二行显示 PRESS:气压值
PC 机串口调试助手软件发送窗口显示学号
PC 机串口调试助手软件接收窗口显示 Pressure:气压值
二、设计思路
此电路可以在一个密封环境中维持低于865hPa的气压值,当BMP180检测到气压高于或者等于此值时电机开始转动,往外抽气,当气压低于此值时电机停止转动抽气
可以考虑应用于维持稳压的环境比如低压进行的化学反应
放拟🐎什么够皮呢
三、仿真结果展示
我的学号是20009101015,最后一位是5,那么使电机转动的气压阈值是865,也就是说气压大于等于865时电机转动,气压小于865时停止转动
计算预定值,放上你软件仿真结果截图,包含直流电机停止时和启动时的LCD和PC机串口调试助手软件发送和接收窗口的显示结果,传感器数值、电机转速等;简单地说明和分析仿真结果,证明自己的测试过程。
我实验使用串口调试软件为XCOM,其发送和接收位于同一窗口中
最初Atmega328P启动时,在com口打印了我自定义的调试信息,表明bmp传感器已经注册,此时传感器设置初始压强为860,液晶显示器无显示,电机不转动,程序会阻塞等待com的消息
于com口发送学号20009101015后,串口接到Pressure:860信息,液晶显示器第一行打印ID:20009101015,第二行打印压强PRESS:860,由于压强没有超过865,电机不会转动
手动上调bmp传感器的压强数值到865,达到阈值,电机开始转动,转速从0开始增大
四、参考文献
Adafruit_BMP085.h
西电A测:串口通信仿真-CSDN博客
五、程序设计
#include <Wire.h>
#include <Adafruit_BMP085.h>
#include <LiquidCrystal.h> // LCD控制相关库
#define EMPIN 7 //电机使用io7口
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // 初始化LCD
Adafruit_BMP085 bmp; //这位更是重量级
String str1 = "ID:";
String str2 = "";
String str3 = "";
String PRE = "PRESS:";
String Pre = "Pressure:";
String id;
int len;
int last = 0;
int pressure_limit;
int pressure_real;
int pressure_real_last;
int one_time_flag = false;
void setup() {//setup只会在最开始执行一次,因此各种初始化,获取学号适合放在这里
Serial.begin(9600); // 初始化串口,设置波特率为9600
lcd.begin(16, 2); //初始化1液晶显示器有6列2行
pinMode(EMPIN, OUTPUT); // 设置连接直流电机引脚工作模式
id = getInput();
str1 += id;
lcd.setCursor(0, 0);
lcd.println(str1);
len = id.length();
last = id.substring(len - 3, len - 2).toInt();
// Serial.println(last);
pressure_limit = 860 + last;
pressure_real_last = 0;
}
String getInput() {
Serial.flush();
while (Serial.available() == 0);
delay(100);
return Serial.readString();
}
void loop() {//loop会一直循环执行,适合启动后执行重复的操作,可以在其中定义并检查flag避免重复
pressure_real=bmp.readPressure()/100;
if (pressure_real != pressure_real_last) {//pressure_real_last是个flag,只有实时温度变化时才会刷新液晶屏和com口
pressure_real_last = pressure_real;
str2 = PRE + String(pressure_real);
str3 = Pre + String(pressure_real);
lcd.setCursor(0, 1);
lcd.print(str2);
Serial.println(str3);
if (pressure_real >= pressure_limit) {
digitalWrite(EMPIN, HIGH);
} else {
digitalWrite(EMPIN, LOW);
}
}
delay(100);
}