From 715e23ceecc1c1b92622fa57d97e51b252a76640 Mon Sep 17 00:00:00 2001 From: Joshua Perry <45966243+jpez-development@users.noreply.github.com> Date: Mon, 23 Jan 2023 20:01:23 +0000 Subject: [PATCH] first commit --- .gitignore | 1 + README.md | 7 + Wifi.cpp | 413 +++++++++++++++++++++++++++++++++++++++++++++++++++++ Wifi.h | 40 ++++++ server.py | 11 ++ test.ino | 31 ++++ 6 files changed, 503 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 Wifi.cpp create mode 100644 Wifi.h create mode 100644 server.py create mode 100644 test.ino diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f391642 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/.vscode/ \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..4b9437b --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ +I have included some test code so you can see if you have setup the Arduino and transceiver correctly. + +1)Connect the ESP-01S to the Arduino (pin out can be found online) +2)Go into test.ino and change the placeholder wifi name and password with same network details your laptop or PC is connected to. +2)Flash Arduino with test.ino +3)Run server.py on laptop or PC +4)Startup Arduino and wait to see if you receive message in python program output \ No newline at end of file diff --git a/Wifi.cpp b/Wifi.cpp new file mode 100644 index 0000000..e158abf --- /dev/null +++ b/Wifi.cpp @@ -0,0 +1,413 @@ +#include "Arduino.h" +#include "Wifi.h" +#include "SoftwareSerial.h" + +SoftwareSerial *ESPSerial; + + +Wifi::Wifi() { + ESPSerial = new SoftwareSerial(2,3); + ESPSerial -> begin(9600); + delay(2000); +} + +//Basic commands + +String Wifi::checkStartup() { + ESPSerial -> flush(); + ESPSerial -> print("AT\r\n"); + ESPSerial -> setTimeout(5000); + if (ESPSerial -> find("OK") == 1) { + return "Startup Successful"; + } + else { + return "Startup Unsuccessful"; + } +} + +String Wifi::restart() { + ESPSerial -> print("AT+RST\r\n"); + ESPSerial -> setTimeout(5000); + if (ESPSerial -> find("OK") == 1) { + return "Successfully Restarted"; + } + else { + return "Restart Unsuccessful"; + } +} + +String Wifi::checkVersion() { + ESPSerial -> print("AT+GMR\r\n"); + ESPSerial -> setTimeout(5000); + String output = ESPSerial -> readString(); + if (output.indexOf("OK") > 0) { + return output.substring(9,output.indexOf("OK")); + } + else { + return "Version check Unsuccessful"; + } +} + +//Wifi Commands + +String Wifi::checkMode() { + ESPSerial -> print("AT+CWMODE?\r\n"); + ESPSerial -> setTimeout(5000); + String output = ESPSerial -> readString(); + int temp = 0; + if (output.indexOf("OK") > 0) { + if (output.substring(21,22) == "E") { + temp = 2; + } + else { + temp = 0; + } + switch(output.substring(21+temp, 22+temp).toInt()) { + case 1: + return "Currently set to Station Mode"; + case 2: + return "Currently set to AP Mode"; + case 3: + return "Currently set to Dual Mode"; + } + } + else { + return "Mode check was Unsuccessful"; + } + +} + +String Wifi::changeMode(int mode) { + String temp = "AT+CWMODE="; + temp += mode; + temp += "\r\n"; + ESPSerial -> print(temp); + ESPSerial -> setTimeout(5000); + if(ESPSerial -> find("OK") == 1) { + return "Mode Change Successful"; + } + else { + return "Mode Change Unsuccessful"; + } +} + +String Wifi::scanNetworks() { + ESPSerial -> print("AT+CWLAP\r\n"); + ESPSerial -> setTimeout(5000); + String output = ESPSerial -> readString(); + if (output.indexOf("OK") > 0) { + String temp = "Enc, SSID, SS, MAC Address, Chn, Freq Off, Freq Cali, Pairwise Cipher\n"; + temp += output.substring(11,output.indexOf("OK")); + temp.replace("+CWLAP:(0", "Open"); + temp.replace("+CWLAP:(1", "WEP"); + temp.replace("+CWLAP:(2", "WPA_PSK"); + temp.replace("+CWLAP:(3", "WPA2_PSK"); + temp.replace("+CWLAP:(4", "WPA_WPA2_PSK"); + temp.replace("+CWLAP:(5", "WPA2_Enterprise"); + temp.replace("\"", ""); + temp.replace(",", ", "); + temp.replace("0)", "None"); + temp.replace("1)", "WEP40"); + temp.replace("2)", "WEP104"); + temp.replace("3)", "TKIP"); + temp.replace("4)", "CCMP"); + temp.replace("5)", "TKIP_CCMP"); + temp.replace("6)", "Unknown"); + return temp; + } +} + +String Wifi::connect(String ssid, String pass) { + ESPSerial -> print("AT+CWJAP=\"" + ssid + "\",\"" + pass + "\"\r\n"); + ESPSerial -> setTimeout(5000); + String output = ESPSerial -> readString(); + if(output.indexOf("WIFI CONNECTED") > 0) { + return "Connected Successfully"; + } + else { + return "Connection Unsuccessful"; + } + +} + +String Wifi::connectedNetwork() { + ESPSerial -> print("AT+CWJAP?\r\n"); + ESPSerial -> setTimeout(5000); + String output = ESPSerial -> readString(); + if (output.indexOf("OK") > 0) { + String temp = "SSID, MAC, Chn, SS\n"; + temp += output.substring(19, output.indexOf("OK")-1); + temp.replace("\"", ""); + return temp; + } + else { + return "Unsuccessful connection query"; + } +} + +String Wifi::disconnect() { + ESPSerial -> print("AT+CWQAP\r\n"); + ESPSerial -> setTimeout(5000); + if (ESPSerial -> find("WIFI DISCONNECT") == 1) { + return "Disconnected Successfully"; + } + else { + return "Unsuccessful disconnect"; + } +} + +String Wifi::setStaticIP(String ip, String gate, String mask) { + ESPSerial -> print("AT+CIPSTA=\"" + ip + "\"\r\n"); + ESPSerial -> setTimeout(5000); + if (ESPSerial -> find("OK") == 1) { + return "IP Successfully Set"; + } + else { + return "IP was Unsuccessfuly Set"; + } +} + +String Wifi::checkStaticIP() { + ESPSerial -> print("AT+CIPSTA?\r\n"); + ESPSerial -> setTimeout(5000); + String output = ESPSerial -> readString(); + if (output.indexOf("OK") > 0) { + String temp = output.substring(12, output.indexOf("OK")-1); + temp.replace("+CIPSTA:", ""); + temp.replace("\"", " "); + return temp; + } + else { + return "IP Check was Unsuccessful"; + } +} + +String Wifi::checkAPConfig() { + ESPSerial -> print("AT+CWSAP?\r\n"); + ESPSerial -> setTimeout(5000); + String output = ESPSerial -> readString(); + if(output.indexOf("OK") > 0) { + String temp = "SSID, PWD, Chn, Enc, Max Users, SSID status\n"; + temp += output.substring(14, output.indexOf("OK")-1); + temp.replace("WSAP:", ""); + return temp; + } + else { + return "AP Config Check Unsuccessful"; + } +} + +String Wifi::setAPConfig(String ssid, String pass, int channel, int encryption) { + String temp = "AT+CWSAP=\""; + temp += ssid; + temp += "\",\""; + temp += pass; + temp += "\","; + temp += channel; + temp += ","; + temp += encryption; + temp += "\r\n"; + ESPSerial -> print(temp); + ESPSerial -> setTimeout(5000); + if(ESPSerial -> find("OK") == 1) { + return "AP Configuration Successful"; + } + else { + return "AP Config Unsuccessful"; + } +} + +String Wifi::connectedDevices() { + ESPSerial -> print("AT+CWLIF\r\n"); + ESPSerial -> setTimeout(5000); + String output = ESPSerial -> readString(); + if(output.indexOf("OK") > 0) { + return output.substring(11, output.indexOf("OK")); + } + else { + return "Connected device query Unsuccessful"; + } +} + +//TCP/IP Commands + +String Wifi::connectionStatus() { + ESPSerial -> print("AT+CIPSTATUS\r\n"); + ESPSerial -> setTimeout(5000); + String output = ESPSerial -> readString(); + if(output.indexOf("OK") > 0) { + String temp = output.substring(15, output.indexOf("OK")); + temp.replace("STATUS:2", "Connected to AP with IP"); + temp.replace("STATUS:3", "Created TCP or UDP transmission"); + temp.replace("STATUS:4", "Disconnected"); + temp.replace("STATUS:5", "Does not connect"); + return temp; + } +} + +String Wifi::startConnection(String type, String ip, int port) { + String temp = "AT+CIPSTART=\""; + temp += type; + temp += "\",\""; + temp += ip; + temp += "\","; + temp += port; + temp += "\r\n"; + ESPSerial -> print(temp); + ESPSerial -> setTimeout(5000); + String output = ESPSerial -> readString(); + if(output.indexOf("OK") > 0 || output.indexOf("ALREADY CONNECTED") > 0) { + return "Connection Successful"; + } + else { + return "Connection Unsuccessful"; + } +} + +String Wifi::startConnection(String type, String ip, int port, int linkid) { + String temp = "AT+CIPSTART="; + temp += linkid; + temp += ",\""; + temp += type; + temp += "\",\""; + temp += ip; + temp += "\","; + temp += port; + temp += "\r\n"; + ESPSerial -> print(temp); + ESPSerial -> setTimeout(5000); + return ESPSerial -> readString(); + if(ESPSerial -> find("OK") == 1) { + return "Connection Successful"; + } + else { + return "Connection Unsuccessful"; + } +} + +String Wifi::send(String data) { + String temp = "AT+CIPSEND="; + temp += String(data.length()); + temp += "\r\n"; + ESPSerial -> print(temp); + ESPSerial -> setTimeout(5000); + if(ESPSerial -> find(">") == 1) { + ESPSerial -> print(data); + ESPSerial -> setTimeout(5000); + if(ESPSerial -> find("SEND OK") == 1) { + return "Data send succcessful"; + } + } + else { + return "Data send unsuccessful"; + } + +} + +String Wifi::stopConnection() { + ESPSerial -> print("AT+CIPCLOSE"); + ESPSerial -> setTimeout(5000); + return ESPSerial -> readString(); +} + +String Wifi::getIP() { + ESPSerial -> print("AT+CIFSR\r\n"); + ESPSerial -> setTimeout(5000); + String output = ESPSerial -> readString(); + if(output.indexOf("OK") > 0) { + String temp = output.substring(11, output.indexOf("OK")-1); + temp.replace("+CIFSR:STA", ""); + return temp; + } + else { + return "IP query Unsuccessful"; + } +} + +String Wifi::setAutoConnect(int mode) { + String temp = "AT+CWAUTOCONN="; + temp += mode; + ESPSerial -> print(temp); + ESPSerial -> setTimeout(5000); + String output = ESPSerial -> readString(); + if(output.indexOf("OK") && mode == 0) { + return "Auto Connect turned off successfully"; + } + else if (output.indexOf("OK") && mode == 1) { + return "Auto Connect turned on successfully"; + } + else { + return "Auto Connect change unsuccessful"; + } + +} + +String Wifi::checkMultiConnect() { + ESPSerial -> print("AT+CIPMUX?\r\n"); + ESPSerial -> setTimeout(5000); + String output = ESPSerial -> readString(); + if(output.indexOf("OK") > 0 && output.indexOf("0") > 0) { + return "Multiconnect is turned off"; + } + if(output.indexOf("OK") > 0 && output.indexOf("1") > 0) { + return "Multiconnect is turned on"; + } + else { + return "Multiconnect query unsuccessful"; + } +} + +String Wifi::setMultiConnect(int mode) { + String temp = "AT+CIPMUX="; + temp += mode; + temp += "\r\n"; + ESPSerial -> print(temp); + ESPSerial -> setTimeout(5000); + if(ESPSerial -> find("OK") == 1) { + return "Multiconnect mode changed successfully"; + } + else { + return "Multiconnect mode changed unsuccessfully"; + } +} + +String Wifi::setServer(int mode) { + String temp = "AT+CIPSERVER="; + temp += mode; + temp += "\r\n"; + ESPSerial -> print(temp); + ESPSerial -> setTimeout(5000); + String output = ESPSerial -> readString(); + if(output.indexOf("OK") > 0 && mode == 0) { + return "Server deleted successfully"; + } + else if(output.indexOf("OK") > 0 && mode == 1) { + return "Server created successfully"; + } + else { + return "Server mode changed unsuccessfully"; + } +} + + + +String Wifi::setDHCP(int mode, int setting) { + String temp = "AT+CWDHCP="; + temp += mode; + temp += ","; + temp += setting; + temp += "\r\n"; + ESPSerial -> print(temp); + ESPSerial -> setTimeout(5000); + if(ESPSerial -> find("OK") == 1) { + return "DHCP set successfully"; + } + else { + return "DHCP set unsuccessfully"; + } +} + +//Modifying this method causes a lot of errors? +void updateSoftware() { + ESPSerial -> print("AT+CIUPDATE"); +} \ No newline at end of file diff --git a/Wifi.h b/Wifi.h new file mode 100644 index 0000000..e8e5bd6 --- /dev/null +++ b/Wifi.h @@ -0,0 +1,40 @@ +#ifndef Wifi_h +#define Wifi_h + +#include "Arduino.h" +#include "SoftwareSerial.h" + +class Wifi { + +public: + Wifi(); + String checkStartup(); + String restart(); + String checkVersion(); + String checkMode(); + String changeMode(int mode); + String scanNetworks(); + String connect(String ssid, String pass); + String connectedNetwork(); + String disconnect(); + String setStaticIP(String ip, String gate, String mask); + String checkStaticIP(); + String checkAPConfig(); + String setAPConfig(String ssid, String pass, int channel, int encryption); + String connectedDevices(); + String connectionStatus(); + String startConnection(String type, String ip, int port); + String startConnection(String type, String ip, int port, int linkid); + String send(String data); + String stopConnection(); + String getIP(); + String setAutoConnect(int mode); + String checkMultiConnect(); + String setMultiConnect(int mode); + String setServer(int mode); + String setDHCP(int mode, int setting); + +private: + SoftwareSerial *ESPSerial; +}; +#endif \ No newline at end of file diff --git a/server.py b/server.py new file mode 100644 index 0000000..02c9b16 --- /dev/null +++ b/server.py @@ -0,0 +1,11 @@ +import socket + +port = 420 + +sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) +sock.bind(("", port)) + +while True: + print("Running") + data, addr = sock.recvfrom(1024) + print(f"Message recieved: {data.decode()}") \ No newline at end of file diff --git a/test.ino b/test.ino new file mode 100644 index 0000000..7ce1a15 --- /dev/null +++ b/test.ino @@ -0,0 +1,31 @@ +#include "SoftwareSerial.h" +#include "Wifi.h" + +Wifi* wifi; +String msg; + +const int buttonPin = 7; +int buttonState = 0; +String wifiName = 'WIFINAME'; +String wifiPass = 'WIFIPASS'; + +void setup() +{ + pinMode(buttonPin, INPUT); + Serial.begin(9600); + wifi = new Wifi(); + Serial.println(wifi -> checkStartup()); + Serial.println(wifi -> restart()); + Serial.println(wifi -> connect(wifiName, wifiPass)); +} + +void loop() +{ + buttonState = digitalRead(buttonPin); + + if(buttonState == HIGH) { + Serial.println(wifi -> startConnection("UDP", "192.168.1.70", 5000)); + Serial.println(wifi -> send("hello")); + Serial.println(wifi -> stopConnection()); + } +} \ No newline at end of file