#include #include 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]) : ""; }