//**************************************************** // Android/fruitPhone Controlled WiFi Car //**************************************************** // ESP 8266 NodeMcu V1.0 PWM Servo Control Via WiFi UDP // Using Free Android or iOS App "RoboRemo" //****************************************************
// for Controlling LM298 module with 3 pins (one channel) //I have uploaded another sketch after this one see this link with LM298 pins included
//****************************************************
//*************************************************************** // PLEASE VISIT //**************************************************************** // My Blog : https://amkDiyProjects.BlogSpot.com // My youtube Channel: https://youtube.com/CrazyGuyOfficial //**************************************************************** //************************************************************ // Libraries Required for this to work //************************************************************ #include <ESP8266WiFi.h> #include <WiFiUdp.h> #include <Servo.h> //************************************************************ //************************************************************ // Settings for the WIFI: //************************************************************ const char* ssid = "mywifi"; // Set WiFi Name of WiFi Router/AP/HotSpot AND Esp8266 will connect TO it const char* password = "12345678"; // Set PassWord For WiFi unsigned int localPort = 9876; // Set port number // if it's not working first ensure the following things // to use it in Local network i.e. in the same wifi "client Isolation" should be turned off in the Wifi Router's settings // otherwise even if both the phone and the esp8266 are connected to the wifi they will not be able to "talk to each-other" // to use it from the Internet the port should be forwarded in the WiFi router's settings //************************************************************ // Settings for Servo using Servo library //************************************************************ const int chCount = 4; // 4 channels,total number of channels is 4 and 4 GPIOs will be used Servo servoCh[chCount]; int chPin[] = {5, 4, 14, 12}; // ESP8266 12E NODE MCU DevKit V1.0 pins: GPIO 5, 4, 14, 12 // on my NODE MCU board they are marked D1 D2 D5 D6 respectively // IN THE App first channel "ID" is Ch 0 = 5 ch 1 = 4 ch 2 = 14 ch 3 = 12 int chVal[] = {1600, 1600, 1600, 1600}; // default value in micro-seconds for PWM signals (middle) int usMin = 700; // min pulse micro seconds int usMax = 2600; // max pulse micro seconds //************************************************************ char cmd[40]; // Make a character array/C string to store the Contents Read from the received UDP Packet // Cmd is the name of the UDP packet Buffer in which the command which is received is stored unsigned long lastCmdTime = 60000; unsigned long aliveSentTime = 0; //************************************************************ WiFiUDP port; //************************************************************ // SETUP BEGINS //************************************************************ void setup() { delay(1000); Serial.begin(115200); Serial.println("Connecting to "); Serial.println(ssid); WiFi.mode(WIFI_STA); //Set Esp8266 in Station mode //it can work without this line but necessary for preventing Ap mode (happened in my case ) WiFi.begin(ssid, password); // Connect to WiFi network while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.println("trying to connect"); delay(500); // IF UNABLE TO CONNECT OR IF IT'S TAKING TOO LONG //first CHECK the SSID,PASSWORD in the SKETCH it should be your WIFI name/ssid and PASSWORD //second every-time after uploading a sketch reset esp8266 once or disconnect from power and connect again //and in the second case to view the serial data again //select the device port in Arduino IDE again and turn off/on Serial monitor } Serial.println(""); Serial.println("WiFi connected"); port.begin(localPort); Serial.print("Use this Ip and Port in RoboRemoApp to connect: "); //Print the IP address and port number Serial.print(WiFi.localIP()); Serial.print(":"); Serial.print(localPort); } void loop() { if (millis() - lastCmdTime > 500) { // All PWM values will Return to Default Values 500 milli seconds after the time of Last Received Command // So all PWM signals will return to default values if there is No New Command for (int i = 1; i <= 3; ) { // set i to 0,1,2 or 3 (if connected to servo and want it to stay at the last commanded position) // and rest of the pins PWM signals will return to default values if there is No New Command // Comment out these two lines if you just want to turn the Pwm signals off immediately // and Uncomment if you also want the servo to return to mid but then servo.detach below should be commented // because servo.detach turns the pins off immediately and does'nt give the servo enough time to return to mid // servoCh[i].attach(chPin[i]); // servoCh[i].writeMicroseconds(1600 ); servoCh[i].detach(); // Turns OFF the Pins // comment it out if want the servo to Return to it's mid Position Quickly // because this loop runs over and over again quickly and the servos need some time to //physically move and PWM should be ON during that period // because this line turns off the pin before moving to i++ and changing the pin number i++; } } int packetSize = port.parsePacket(); // Declaring an int for getting Packet Size if (packetSize > 0) { // if Packet Size is more than zero or if there is some command received then port.read(cmd, 40); // Read the Received UDP Packet //and Put the Contents,the channel number and value in the Cmd (array/C string) // Serial.println(cmd); // Print the recieved cmd if (cmd[0] == 'c' && cmd[1] == 'h') { // if the command starts with the caracter c and the second character is h exeCmd(); // Execute the execmd function which is at the end of the loop } if (millis() - aliveSentTime > 1000) { // an "alive" signal is sent periodically to the phone to know the connection state // in the RoboRemo app from "edit UI" option add an "led" or a "text log box" set the ID // to "alive" or can be changed but for the text box if left empty the received text will be shown exeReply(); // Execute exeReply function At the end of the loop } } } void exeCmd() { // exeCmd function when called from the loop Reads the channel number and value and sends PWM signals lastCmdTime = millis(); int ch = cmd[2] - '0' ; // Channel Number int chVl = 0; // Channel Value temporarily store it in this and then move to Array chVal[] which is already declared at the top int i = 4; while ( isdigit( cmd[i] ) ) { // if the 4th character in the Array is a Number //get the number and Calculate all the digits in to a single 4 digit number chVl = (chVl * 10) + (cmd[i] - '0'); chVal[ch] = chVl; i++; } if (ch >= 0 && ch <= 9 && cmd[3] == ' ') { //if channel value is between 0 and 9 send PWM Signals using Channel Value if (!servoCh[ch].attached()) { servoCh[ch].attach(chPin[ch], usMin, usMax); } servoCh[ch].writeMicroseconds(chVal[ch]); } Serial.print ("channel Number : "); Serial.println (ch); Serial.print ("channel Value : "); Serial.println (chVal[ch]); } void exeReply() { port.beginPacket(port.remoteIP(),localPort); // Send "Alive 1" back to the App to light up the "led" in the App GUI // Alive is the "id" for "LED" and "1" is the On command /n" will be ignored port.write("alive 1\n"); port.endPacket(); aliveSentTime = millis(); Serial.print("alive sent"); }
Do-it-yourself,DIY,How-To,Electronics,Arduino,Esp,Raspberry-Pi,Programming,Hacking Stuff,Gardening,Photography,Hobby,Fun
Control motors,Leds,Relays or Motor Driver like lm298 using ESP8266 NodeMcu WiFi UDP with RoboRemo App
Labels:
android,
arduino,
automation,
code,
controller,
humidity,
internet,
ios,
lights,
lm298,
motion sensor,
motor driver,
programming,
relays,
roboremo,
servo,
sketch,
temperature,
udp,
wifi