├── Diagrams └── WiFi Car.png ├── README.md ├── LICENSE └── WiFi_Car └── WiFi_Car.ino /Diagrams/WiFi Car.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/un0038998/WiFiCar/HEAD/Diagrams/WiFi Car.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # WiFiCar 2 | This repository contains the code and diagram for WiFi car using esp32 and programmed using Arduino IDE 3 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Ujwal Nandanwar 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /WiFi_Car/WiFi_Car.ino: -------------------------------------------------------------------------------- 1 | #include 2 | #ifdef ESP32 3 | #include 4 | #include 5 | #elif defined(ESP8266) 6 | #include 7 | #include 8 | #endif 9 | #include 10 | 11 | #define UP 1 12 | #define DOWN 2 13 | #define LEFT 3 14 | #define RIGHT 4 15 | #define UP_LEFT 5 16 | #define UP_RIGHT 6 17 | #define DOWN_LEFT 7 18 | #define DOWN_RIGHT 8 19 | #define TURN_LEFT 9 20 | #define TURN_RIGHT 10 21 | #define STOP 0 22 | 23 | #define FRONT_RIGHT_MOTOR 0 24 | #define BACK_RIGHT_MOTOR 1 25 | #define FRONT_LEFT_MOTOR 2 26 | #define BACK_LEFT_MOTOR 3 27 | 28 | #define FORWARD 1 29 | #define BACKWARD -1 30 | 31 | struct MOTOR_PINS 32 | { 33 | int pinIN1; 34 | int pinIN2; 35 | }; 36 | 37 | std::vector motorPins = 38 | { 39 | {16, 17}, //FRONT_RIGHT_MOTOR 40 | {18, 19}, //BACK_RIGHT_MOTOR 41 | {27, 26}, //FRONT_LEFT_MOTOR 42 | {25, 33}, //BACK_LEFT_MOTOR 43 | }; 44 | 45 | const char* ssid = "MyWiFiCar"; 46 | const char* password = "12345678"; 47 | 48 | AsyncWebServer server(80); 49 | AsyncWebSocket ws("/ws"); 50 | 51 | 52 | const char* htmlHomePage PROGMEM = R"HTMLHOMEPAGE( 53 | 54 | 55 | 56 | 57 | 86 | 87 | 88 | 89 |

Hash Include Electronics

90 |

Wi-Fi 🚗 Control

91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 |
117 | 118 | 140 | 141 | 142 | 143 | 144 | )HTMLHOMEPAGE"; 145 | 146 | 147 | void rotateMotor(int motorNumber, int motorDirection) 148 | { 149 | if (motorDirection == FORWARD) 150 | { 151 | digitalWrite(motorPins[motorNumber].pinIN1, HIGH); 152 | digitalWrite(motorPins[motorNumber].pinIN2, LOW); 153 | } 154 | else if (motorDirection == BACKWARD) 155 | { 156 | digitalWrite(motorPins[motorNumber].pinIN1, LOW); 157 | digitalWrite(motorPins[motorNumber].pinIN2, HIGH); 158 | } 159 | else 160 | { 161 | digitalWrite(motorPins[motorNumber].pinIN1, LOW); 162 | digitalWrite(motorPins[motorNumber].pinIN2, LOW); 163 | } 164 | } 165 | 166 | void processCarMovement(String inputValue) 167 | { 168 | Serial.printf("Got value as %s %d\n", inputValue.c_str(), inputValue.toInt()); 169 | switch(inputValue.toInt()) 170 | { 171 | 172 | case UP: 173 | rotateMotor(FRONT_RIGHT_MOTOR, FORWARD); 174 | rotateMotor(BACK_RIGHT_MOTOR, FORWARD); 175 | rotateMotor(FRONT_LEFT_MOTOR, FORWARD); 176 | rotateMotor(BACK_LEFT_MOTOR, FORWARD); 177 | break; 178 | 179 | case DOWN: 180 | rotateMotor(FRONT_RIGHT_MOTOR, BACKWARD); 181 | rotateMotor(BACK_RIGHT_MOTOR, BACKWARD); 182 | rotateMotor(FRONT_LEFT_MOTOR, BACKWARD); 183 | rotateMotor(BACK_LEFT_MOTOR, BACKWARD); 184 | break; 185 | 186 | case LEFT: 187 | rotateMotor(FRONT_RIGHT_MOTOR, FORWARD); 188 | rotateMotor(BACK_RIGHT_MOTOR, BACKWARD); 189 | rotateMotor(FRONT_LEFT_MOTOR, BACKWARD); 190 | rotateMotor(BACK_LEFT_MOTOR, FORWARD); 191 | break; 192 | 193 | case RIGHT: 194 | rotateMotor(FRONT_RIGHT_MOTOR, BACKWARD); 195 | rotateMotor(BACK_RIGHT_MOTOR, FORWARD); 196 | rotateMotor(FRONT_LEFT_MOTOR, FORWARD); 197 | rotateMotor(BACK_LEFT_MOTOR, BACKWARD); 198 | break; 199 | 200 | case UP_LEFT: 201 | rotateMotor(FRONT_RIGHT_MOTOR, FORWARD); 202 | rotateMotor(BACK_RIGHT_MOTOR, STOP); 203 | rotateMotor(FRONT_LEFT_MOTOR, STOP); 204 | rotateMotor(BACK_LEFT_MOTOR, FORWARD); 205 | break; 206 | 207 | case UP_RIGHT: 208 | rotateMotor(FRONT_RIGHT_MOTOR, STOP); 209 | rotateMotor(BACK_RIGHT_MOTOR, FORWARD); 210 | rotateMotor(FRONT_LEFT_MOTOR, FORWARD); 211 | rotateMotor(BACK_LEFT_MOTOR, STOP); 212 | break; 213 | 214 | case DOWN_LEFT: 215 | rotateMotor(FRONT_RIGHT_MOTOR, STOP); 216 | rotateMotor(BACK_RIGHT_MOTOR, BACKWARD); 217 | rotateMotor(FRONT_LEFT_MOTOR, BACKWARD); 218 | rotateMotor(BACK_LEFT_MOTOR, STOP); 219 | break; 220 | 221 | case DOWN_RIGHT: 222 | rotateMotor(FRONT_RIGHT_MOTOR, BACKWARD); 223 | rotateMotor(BACK_RIGHT_MOTOR, STOP); 224 | rotateMotor(FRONT_LEFT_MOTOR, STOP); 225 | rotateMotor(BACK_LEFT_MOTOR, BACKWARD); 226 | break; 227 | 228 | case TURN_LEFT: 229 | rotateMotor(FRONT_RIGHT_MOTOR, FORWARD); 230 | rotateMotor(BACK_RIGHT_MOTOR, FORWARD); 231 | rotateMotor(FRONT_LEFT_MOTOR, BACKWARD); 232 | rotateMotor(BACK_LEFT_MOTOR, BACKWARD); 233 | break; 234 | 235 | case TURN_RIGHT: 236 | rotateMotor(FRONT_RIGHT_MOTOR, BACKWARD); 237 | rotateMotor(BACK_RIGHT_MOTOR, BACKWARD); 238 | rotateMotor(FRONT_LEFT_MOTOR, FORWARD); 239 | rotateMotor(BACK_LEFT_MOTOR, FORWARD); 240 | break; 241 | 242 | case STOP: 243 | rotateMotor(FRONT_RIGHT_MOTOR, STOP); 244 | rotateMotor(BACK_RIGHT_MOTOR, STOP); 245 | rotateMotor(FRONT_LEFT_MOTOR, STOP); 246 | rotateMotor(BACK_LEFT_MOTOR, STOP); 247 | break; 248 | 249 | default: 250 | rotateMotor(FRONT_RIGHT_MOTOR, STOP); 251 | rotateMotor(BACK_RIGHT_MOTOR, STOP); 252 | rotateMotor(FRONT_LEFT_MOTOR, STOP); 253 | rotateMotor(BACK_LEFT_MOTOR, STOP); 254 | break; 255 | } 256 | } 257 | 258 | void handleRoot(AsyncWebServerRequest *request) 259 | { 260 | request->send_P(200, "text/html", htmlHomePage); 261 | } 262 | 263 | void handleNotFound(AsyncWebServerRequest *request) 264 | { 265 | request->send(404, "text/plain", "File Not Found"); 266 | } 267 | 268 | 269 | void onWebSocketEvent(AsyncWebSocket *server, 270 | AsyncWebSocketClient *client, 271 | AwsEventType type, 272 | void *arg, 273 | uint8_t *data, 274 | size_t len) 275 | { 276 | switch (type) 277 | { 278 | case WS_EVT_CONNECT: 279 | Serial.printf("WebSocket client #%u connected from %s\n", client->id(), client->remoteIP().toString().c_str()); 280 | //client->text(getRelayPinsStatusJson(ALL_RELAY_PINS_INDEX)); 281 | break; 282 | case WS_EVT_DISCONNECT: 283 | Serial.printf("WebSocket client #%u disconnected\n", client->id()); 284 | processCarMovement("0"); 285 | break; 286 | case WS_EVT_DATA: 287 | AwsFrameInfo *info; 288 | info = (AwsFrameInfo*)arg; 289 | if (info->final && info->index == 0 && info->len == len && info->opcode == WS_TEXT) 290 | { 291 | std::string myData = ""; 292 | myData.assign((char *)data, len); 293 | processCarMovement(myData.c_str()); 294 | } 295 | break; 296 | case WS_EVT_PONG: 297 | case WS_EVT_ERROR: 298 | break; 299 | default: 300 | break; 301 | } 302 | } 303 | 304 | void setUpPinModes() 305 | { 306 | for (int i = 0; i < motorPins.size(); i++) 307 | { 308 | pinMode(motorPins[i].pinIN1, OUTPUT); 309 | pinMode(motorPins[i].pinIN2, OUTPUT); 310 | rotateMotor(i, STOP); 311 | } 312 | } 313 | 314 | 315 | void setup(void) 316 | { 317 | setUpPinModes(); 318 | Serial.begin(115200); 319 | 320 | WiFi.softAP(ssid, password); 321 | IPAddress IP = WiFi.softAPIP(); 322 | Serial.print("AP IP address: "); 323 | Serial.println(IP); 324 | 325 | server.on("/", HTTP_GET, handleRoot); 326 | server.onNotFound(handleNotFound); 327 | 328 | ws.onEvent(onWebSocketEvent); 329 | server.addHandler(&ws); 330 | 331 | server.begin(); 332 | Serial.println("HTTP server started"); 333 | } 334 | 335 | void loop() 336 | { 337 | ws.cleanupClients(); 338 | } 339 | --------------------------------------------------------------------------------