ship with detect

This commit is contained in:
clf3 2023-09-12 17:14:26 +08:00
parent 3510e3cd16
commit 05ce129d19
4 changed files with 353 additions and 7 deletions

View File

@ -38,10 +38,11 @@ void loop() {
sending_signal=0; sending_signal=0;
propeller=analogRead(Rp); propeller=analogRead(Rp);
rudder=analogRead(Rr); rudder=analogRead(Rr);
propeller=propeller*1.41; propeller=propeller*1.18;
rudder=rudder*1.41; rudder=rudder*1.18;
if(propeller>=1000)propeller=999; if(propeller>=1000)propeller=999;
if(rudder>=1000)rudder=999; if(rudder>=1000)rudder=999;
rudder=999-rudder;
sending_signal+=propeller; sending_signal+=propeller;
sending_signal+=rudder*1000; sending_signal+=rudder*1000;
sending_signal+=1000000; sending_signal+=1000000;

View File

@ -0,0 +1,110 @@
#include <SPI.h>
#include<SoftwareSerial.h>
#include "Ucglib.h"
#define interruptPin 2
SoftwareSerial sendingSerial(5,6);
int Ymax = 160; //屏幕的竖向像素数
int Xmax = 128; //屏幕的横向像素数
int Xcent = Xmax / 2; //x中位
int base = 100; //基线高度
int scanline = 105; //雷达扫描线长度
int outcircle=80;
int midcircle=60;
int midcircle2=40;
int incircle=20;
int x=90;
int distance=50;
bool rec=false;
bool clr=false;
bool ignoreClr=false;
String received="";//用来接受字符
Ucglib_ST7735_18x128x160_HWSPI ucg(/*cd=*/ 9, /*cs=*/ 10, /*reset=*/ 8);
void fix_font()
{
ucg.setColor(0, 180, 0);
ucg.setPrintPos(Xcent-10,26);
ucg.print("1.00");
ucg.setPrintPos(Xcent-10,46);
ucg.print("0.75");
ucg.setPrintPos(Xcent-10,66);
ucg.print("0.50");
ucg.setPrintPos(Xcent-10,86);
ucg.print("0.25");
}
void fix()
{
ucg.setColor(0, 40, 0);
//画基线圆盘
ucg.drawDisc(Xcent, base+1, 3, UCG_DRAW_ALL);
ucg.drawCircle(Xcent, base+1, outcircle, UCG_DRAW_UPPER_LEFT);
ucg.drawCircle(Xcent, base+1, outcircle, UCG_DRAW_UPPER_RIGHT);
ucg.drawCircle(Xcent, base+1, midcircle, UCG_DRAW_UPPER_LEFT);
ucg.drawCircle(Xcent, base+1, midcircle, UCG_DRAW_UPPER_RIGHT);
ucg.drawCircle(Xcent, base+1, midcircle2, UCG_DRAW_UPPER_LEFT);
ucg.drawCircle(Xcent, base+1, midcircle2, UCG_DRAW_UPPER_RIGHT);
ucg.drawCircle(Xcent, base+1, incircle, UCG_DRAW_UPPER_LEFT);
ucg.drawCircle(Xcent, base+1, incircle, UCG_DRAW_UPPER_RIGHT);
ucg.drawLine(0, base+1, Xmax,base+1);
ucg.setColor(0, 120, 0);
}
void setup() {
ucg.begin(UCG_FONT_MODE_SOLID); //初始化屏幕
ucg.setRotate180(); //设置成横屏 如果屏幕显示方向是反的,可以修改函数 setRotate90 或 setRotate270
Serial.begin(9600); //设置串口传输率
sendingSerial.begin(38400);
sendingSerial.listen();//必须要加
ucg.clearScreen();
//cls();
ucg.setFontMode(UCG_FONT_MODE_SOLID);
ucg.setFont(ucg_font_orgv01_hr);
}
void loop() {
while(sendingSerial.available()){
if(sendingSerial.peek()!='\n'){//peek()查看当前字节是不是换行
received+=(char)sendingSerial.read();
}
else{
rec=true;
sendingSerial.read();//把换行符读掉
Serial.println(received);
if(received[0]=='1'){
ignoreClr=false;
distance=received.substring(4).toInt();//个十百3位数
x=received.substring(1,4).toInt();//第456位 三位数
}
else if(received[0]=='2'){
if(!ignoreClr){
clr=true;
}
}
else{
rec=false;
}
received="";
}
}
if(rec){
if(clr){
ucg.clearScreen();
fix();
fix_font(); //重绘屏幕背景元素
clr=false;
ignoreClr=true;
return;
}
else if(ignoreClr){
return;
}
if (distance < 100){
ucg.setColor(255,0,0);
ucg.drawDisc(0.8*distance*cos(radians(x))+Xcent,-0.8*distance*sin(radians(x))+base, 1, UCG_DRAW_ALL);
}
else{ //超过1米以上的用黄色画在边缘区域示意
ucg.setColor(255,255,0);
ucg.drawDisc((outcircle-1)*cos(radians(x))+Xcent,-(outcircle-1)*sin(radians(x))+base, 1, UCG_DRAW_ALL);
}
rec=false;
}
}

View File

@ -57,12 +57,9 @@ void setup()
pinMode(PWM,OUTPUT); pinMode(PWM,OUTPUT);
pinMode(A1,INPUT); pinMode(A1,INPUT);
pinMode(A2,INPUT); pinMode(A2,INPUT);
MyServo.write(angle);
RadarServo.write(0);
delay(1000);
MyServo.write(45); MyServo.write(45);
RadarServo.write(0);
delay(1000);
} }
long confirm(long x){ long confirm(long x){
if(x>=1000000&&x<=2000000)return x%1000000; if(x>=1000000&&x<=2000000)return x%1000000;

View File

@ -0,0 +1,238 @@
#include<SPI.h>
#include "Arduino.h"
#include "HardwareSerial.h"
#include<SoftwareSerial.h>
#include<Servo.h>
#define trigPin 2 //超声波模块的Trig口 6#
#define echoPin 5 //超声波模块的echo口 5#
#define ServoPin 3 //底座舵机端口 3#
unsigned long time=0;
bool increasing=true;
bool clr=false;
//0: increase 1: decrease 2: clr
int status=0;
int clrtime=40;
int x=0;
const int interval=100;
String sending="",received="";
Servo MyServo;
Servo RadarServo;
SoftwareSerial bluetoothSerial(7,8);
int count =0;
int IN1 =9;
int IN2 =10;
int PWM=6;
int angle=90;
int period=25;
int attachwater;
int j;
// float dist;
long dj,z;//dj是舵机z是螺旋桨转速
//long propeller=0,rudder=0;//propeller为螺旋桨0-1023512为静止rudder为舵0-1023512为静止
//long s_propeller=0,s_rudder=0;//发送的信号
long propeller,rudder;//校验序列、读取内容和解码内容
long response=0;
const byte addresses[6] = "00001"; //创建一个数组,建立接收机地址,或者说两个模块将用于通信的“管道”
int calculateDistance()
{
long duration;
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
return duration*0.034/2;
}
void setup()
{
Serial.begin(9600);
bluetoothSerial.begin(57600);
bluetoothSerial.listen();
MyServo.attach(4);
RadarServo.attach(ServoPin);
pinMode(trigPin,OUTPUT);
pinMode(echoPin,INPUT);
pinMode(IN1,OUTPUT);
pinMode(IN2,OUTPUT);
pinMode(PWM,OUTPUT);
RadarServo.write(0);
MyServo.write(45);
delay(1000);
}
long confirm(long x){
if(x>=1000000&&x<=2000000)return x%1000000;
else return -1;
}
void loop() {
int distance=0;
attachwater=0;
for(j=1;j<=100;j++)
{
if(analogRead(A1)*5/1023!=4) break;
}
if(j>=100) attachwater=1;
Serial.println(attachwater);
// Serial.print("s: ");
// Serial.println(status);
if(status==0){
if(x<180){
x+=2;
}
else{
status=2;
}
RadarServo.write(x); //调整舵机角度
//测距
distance = calculateDistance();
//send distance
//response=1000000+x*1000+distance;
response=0;
response+=distance;
//Serial.println(response);
response+=(long)x*1000;
//Serial.println(response);
response+=1000000;
//Serial.println(response);
}
else if(status==1){
if(x>0){
x-=2;
}
else{
status=2;
}
RadarServo.write(x); //调整舵机角度
//测距
distance = calculateDistance();
//response=1000000+x*1000+distance;
response=0;
response+=distance;
//Serial.println(response);
response+=(long)x*1000;
//Serial.println(response);
response+=1000000;
//Serial.println(response);
//send distance
}
else if(status=2){
clrtime--;
if(clrtime<=0){
clrtime=4;
if(x>=180){
status=1;
}
else{
status=0;
}
}
//send clear
response=2000000;
}
sending=String(response);
// Serial.print("x: ");
// Serial.println(x);
// Serial.print("d: ");
// Serial.println(distance);
// Serial.println(response);
//Serial.println(sending);
bluetoothSerial.println(sending);
delay(interval);
//delay(20-distance/17);
//Serial.println(distance);
while(bluetoothSerial.available()>0){
//Serial.println("available!");
if(bluetoothSerial.peek()!='\n'){//peek()查看当前字节是不是换行
received+=(char)bluetoothSerial.read();
//Serial.println(received);
//Serial.println("no \n");
}
else{
bluetoothSerial.read();//把换行符读掉
Serial.println(received);
//Serial.println(received.length());
//content=toInt(received);
if(received[0]=='1'&&received.length()-1==7){
propeller=received.substring(4).toInt();
rudder=received.substring(1,4).toInt();
if(propeller>550||propeller<449){
if(propeller>550){
long zheng=0.568*propeller-312.4;
digitalWrite(IN2,HIGH);
digitalWrite(IN1,LOW);
if(attachwater==1)
{
analogWrite(PWM,zheng);
z=zheng;
}
else
{
analogWrite(PWM,0);
z=0;
}
//Serial.println("forward propelling");
//Serial.println(z);
}
else if(propeller<449){
long fan=255-0.568*propeller;
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);
if(attachwater==1)
{
analogWrite(PWM,fan);
z=fan;
}
else
{
analogWrite(PWM,0);
z=0;
}
//Serial.println("back propelling");
//Serial.println(z);
}
}
else if(propeller<=550||propeller>=449){
z=0;
analogWrite(PWM,0);
Serial.println("stop propelling");
Serial.println(z);
}
//Serial.println("inputing ruddering");
if(rudder>550||rudder<449)
{
if(rudder<449){
long fan1=0.1*rudder;
MyServo.write(fan1);
//Serial.println("turn left");
dj=2*fan1-90;
//Serial.println(dj);
}
else if(rudder>550){
long zheng1=0.1*rudder-10.122;
MyServo.write(zheng1);
dj=2*zheng1-90;
//Serial.println("turn right");
//Serial.println(dj);
}
}
else if(rudder<=550||rudder>=449){
dj=0;
MyServo.write(45);
//Serial.println("stop turing");
//Serial.println(dj);
}
}
received="";
}
}
}