first commit

This commit is contained in:
编码猿
2024-09-27 01:22:07 +08:00
commit 1360daaab0
931 changed files with 131068 additions and 0 deletions

View File

@@ -0,0 +1,321 @@
#include <ESP8266WiFi.h>
#include <WebSocketsClient.h>
const String ssid = "AutoWiFiManager";
const String passwd = "123456789";
String remoteHost = "192.168.4.1";
// 超声波传感器引脚
#define trigPin 14 // D5 引脚 蓝色 trig
#define echoPin 12 // D6 引脚 褐色 echo
#define LED1 4 // D2
#define LED2 0 // D3
#define leftPin 13 // 左边红外 传感器 D7
#define rightPin 5 // 右边红外 传感器 D1
bool isAuto = false;
bool isHand = false;
WebSocketsClient wsClient;
//静态地址、网关、子网掩码
IPAddress local_IP(192, 168, 4, 2);
IPAddress gateway(192, 168, 4, 1);
IPAddress subnet(255, 255, 255, 0);
void setup()
{
Serial.begin(9600);
WiFi.config(local_IP, gateway, subnet); //设置静态IP
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, passwd);
// 判断是否连接成功
while (WiFi.status() != WL_CONNECTED)
{
Serial.print('.');
delay(100);
}
Serial.println("");
Serial.println("Connected to " + ssid);
Serial.print("Current ip address is ");
Serial.println(WiFi.localIP());
pinMode(leftPin, INPUT);
pinMode(rightPin, INPUT);
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, HIGH);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
analogWrite(LED1, 0);
analogWrite(LED2, 0);
pinMode(trigPin, OUTPUT); // 将trigPin设置为输出
pinMode(echoPin, INPUT); // 将echoPin设置为输入
// 启动WebSocket客户端
wsClient.begin(remoteHost, 81);
// 指定事件处理函数
wsClient.onEvent([](WStype_t type, uint8_t *payload, size_t length)
{
if (type == WStype_TEXT)
{
// 接收来自服务端的信息服务端FLASH按键状态并控制LED的工作
String data = (char *)payload;
Serial.print("wsClient ======== ");
Serial.println(data);
String type = getValue(data, '|', 0);
if (type == "client")
{
String status = getValue(data, '|', 1);
if (status == "Automatic")
{
String val = getValue(data, '|', 2);
val == "1" ? isAuto = true : isAuto = false;
}
else if (status == "fronLamp")
{
String LampStatus = getValue(data, '|', 2);
LampStatus == "1" ? oftenOpen() : close();
}
else if (status == "doubleFlash")
{
String flashStatus = getValue(data, '|', 2);
flashStatus == "1" ? open() : close();
}
else if (status == "AutoHand")
{
String handStatus = getValue(data, '|', 2);
handStatus == "1" ? isHand = true : isHand = false;
}
}
}
});
}
void loop()
{
// Serial.println("loop...");
if (isAuto)
{
Serial.println("Automatic...");
Automatic();
delay(800);
}
if (isHand)
{
Serial.println("follow...");
follow();
delay(300);
}
wsClient.loop();
}
// 自动跟随的代码
void follow()
{
int Right_Value = digitalRead(rightPin);
int Left_Value = digitalRead(leftPin);
Serial.print("RIGHT");
Serial.println(Right_Value);
Serial.print("LEFT");
Serial.println(Left_Value);
// Serial.print("getDistance(): ========");
// Serial.println(getDistance());
// Serial.println(getDistance() <= 30);
Serial.println(
(Right_Value == 1 && Left_Value == 1) && (getDistance() <= 30));
// 1 没有检测到障碍物0 检测到障碍物
// 左右都没有检测到障碍物 直行
if ((Right_Value == 1 && Left_Value == 1) && (getDistance() <= 30))
{
Serial.println("straight..");
// 直行
digitalWrite(LED_BUILTIN, LOW); // 开
String straightForwardPos = String("sensor|motor|straight");
wsClient.sendTXT(straightForwardPos);
}
// 右边 有 障碍物, 左边 没有 障碍物 右行
else if ((Right_Value == 0) && (Left_Value == 1))
{
Serial.println("right..");
String rightPos = String("sensor|servo|140");
wsClient.sendTXT(rightPos);
delay(200);
String rightForwardPos = String("sensor|motor|right");
wsClient.sendTXT(rightForwardPos);
}
// 右边 没有 障碍物, 左边 有 障碍物 左行
else if ((Right_Value == 1) && (Left_Value == 0))
{
Serial.println("left..");
String leftPos = String("sensor|servo|40");
wsClient.sendTXT(leftPos);
delay(200);
String leftForwardPos = String("sensor|motor|left");
wsClient.sendTXT(leftForwardPos);
}
// 左右 没有 障碍物 停车
else if ((Right_Value == 1) && (Left_Value == 1))
{
Serial.println("stop1..");
// 停车
digitalWrite(LED_BUILTIN, HIGH); // 关
String instructions = String("sensor|ultrasonic|stop");
wsClient.sendTXT(instructions);
delay(1000);
}
}
// 自动寻路
void Automatic()
{
Serial.print("getDistance(): ========");
Serial.println(getDistance());
Serial.println(getDistance() <= 50);
// 如果距离小于30cm那么停车
if (getDistance() <= 50)
{
Serial.println("stop car ========");
digitalWrite(LED_BUILTIN, LOW);
// 停车
String instructions = String("sensor|ultrasonic|stop");
wsClient.sendTXT(instructions);
delay(500);
Serial.println("left car ========");
// 左转舵机
String leftPos = String("sensor|servo|40");
wsClient.sendTXT(leftPos);
delay(800);
if (getDistance() <= 50)
{
Serial.println("right car ========");
// 右转舵机
String rightPos = String("sensor|servo|140");
wsClient.sendTXT(rightPos);
delay(1200);
if (getDistance() <= 50)
{
Serial.println("center car ========");
// 向中间转动舵机
String centerPos = String("sensor|servo|90");
wsClient.sendTXT(centerPos);
delay(800);
Serial.println("back car ========");
// 后退
String backForwardPos = String("sensor|motor|back");
wsClient.sendTXT(backForwardPos);
// 如果右边没有障碍物
}
else
{
Serial.println("right car run ========");
String rightForwardPos = String("sensor|motor|right");
wsClient.sendTXT(rightForwardPos);
}
// 如果左转没有障碍物
}
else
{
Serial.println("left car run ========");
String leftForwardPos = String("sensor|motor|left");
wsClient.sendTXT(leftForwardPos);
}
// 如果前面没有障碍物
}
else
{
Serial.println("run car ========");
digitalWrite(LED_BUILTIN, HIGH);
String straightForwardPos = String("sensor|motor|straight");
wsClient.sendTXT(straightForwardPos);
}
}
// 一直打开大灯
void oftenOpen()
{
analogWrite(LED1, 255);
analogWrite(LED2, 255);
}
void open()
{
analogWrite(LED1, 255);
analogWrite(LED2, 255);
delay(300);
analogWrite(LED1, 0);
analogWrite(LED2, 0);
delay(300);
}
void close()
{
analogWrite(LED1, 0);
analogWrite(LED2, 0);
}
// 返回距离
int getDistance()
{
long duration;
int distance;
// Clears the trigPin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
//将trigPin设置为HIGH状态10微秒
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// 读取echoPin以微秒为单位返回声波传播时间
duration = pulseIn(echoPin, HIGH);
// 计算距离
distance = duration * 0.034 / 2;
return distance;
}
String getValue(String data, char separator, int index)
{
int found = 0;
int strIndex[] = {0, -1};
int maxIndex = data.length() - 1;
for (int i = 0; i <= maxIndex && found <= index; i++)
{
if (data.charAt(i) == separator || i == maxIndex)
{
found++;
strIndex[0] = strIndex[1] + 1;
strIndex[1] = (i == maxIndex) ? i + 1 : i;
}
}
return found > index ? data.substring(strIndex[0], strIndex[1]) : "";
}