Skip to content

Commit

Permalink
initial add
Browse files Browse the repository at this point in the history
  • Loading branch information
arkypita committed Jul 5, 2017
1 parent 7785e04 commit 0b1316c
Show file tree
Hide file tree
Showing 3 changed files with 211 additions and 0 deletions.
26 changes: 26 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@

`1.` Download and install Arduino IDE 1.6.x from https://www.arduino.cc/en/Main/Software

`2.` Install ESP8266 Arduino support https://github.com/esp8266/Arduino#installing-with-boards-manager

`3.` Install the following libraries:

`3.1:` WifiManager: https://github.com/tzapu/WiFiManager#install-through-library-manager

`3.2:` arduinoWebSockets: https://github.com/Links2004/arduinoWebSockets

`4.` Configure your ESP8266 for sketch upload (GIPOs pulled up and down accordingly, USB to serial connected, reset and ready for upload)

`5.` Upload the Sketch contained in `websocketserver` folder

`6.` Connect the TX of the ESP8266 to RX of grbl arduino board, and RX of the ESP8266 to TX. Power up the ESP and engraver

`7.` Connect to the ESP8266 WiFi network and go to "http:\\192.168.4.1". Configure connection to your AP, set password, then switch back to your local wifi (Animation below shows the details)

`8.` In LaserGRBL open menu "grbl-settings" and configure for `LaserWebESP8266` protocol and connect to the address of the ESP (usually ws://192.168.x.y:81/ where "x" is your subnet and "y" assigned by DHCP)

NOTE: I will add an IP scanner soon. For now, check on your DHCP server which IP was dished out

![Setting Up Wifi](wifibridge.gif)

NOTE: To reset the Wifi settings you can send `WIFIRESET` via websocket
185 changes: 185 additions & 0 deletions websocketserver/websocketserver.ino
Original file line number Diff line number Diff line change
@@ -0,0 +1,185 @@
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <WebSocketsServer.h> //https://github.com/Links2004/arduinoWebSockets/issues/61
#include <Hash.h>
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <ESP8266HTTPUpdateServer.h>
#include <WiFiManager.h> //https://github.com/tzapu/WiFiManager


// Transparent Serial Bridge code from Marcus https://github.com/Links2004/arduinoWebSockets/issues/61

ESP8266WebServer httpServer(80);
ESP8266HTTPUpdateServer httpUpdater;
const char* update_path = "/firmware";
const char* update_username = "admin";
const char* update_password = "admin";


WebSocketsServer webSocket = WebSocketsServer(81);


WiFiManager wifiManager;
int RESET_PIN = 0; // = GPIO0 on nodeMCU
bool socketConnected = false;

#define SEND_SERIAL_TIME (50)

class SerialTerminal {
public:
void setup() {
_lastRX = 0;
resetBuffer();
Serial.begin(115200);
}

void loop() {
unsigned long t = millis();
bool forceSend = false;

size_t len = (_bufferWritePtr - &_buffer[0]);
int free = (sizeof(_buffer) - len);

int available = Serial.available();
if(available > 0 && free > 0) {
int readBytes = available;
if(readBytes > free) {
readBytes = free;
}
readBytes = Serial.readBytes(_bufferWritePtr, readBytes);
_bufferWritePtr += readBytes;
_lastRX = t;
}

// check for data in buffer
len = (_bufferWritePtr - &_buffer[0]);
if(len >= sizeof(_buffer)) {
forceSend = true;
}
if(len > (WEBSOCKETS_MAX_HEADER_SIZE + 1)) {
if(((t - _lastRX) > SEND_SERIAL_TIME) || forceSend) {
webSocket.broadcastTXT(&_buffer[0], (len - WEBSOCKETS_MAX_HEADER_SIZE), true);
resetBuffer();
}
}
}


protected:
uint8_t _buffer[1460];
uint8_t * _bufferWritePtr;
unsigned long _lastRX;

void resetBuffer() {
// offset for adding Websocket header
_bufferWritePtr = &_buffer[WEBSOCKETS_MAX_HEADER_SIZE];
// addChar('T');
}

inline void addChar(char c) {
*_bufferWritePtr = (uint8_t) c; // message type for Webinterface
_bufferWritePtr++;
}
};

SerialTerminal term;

void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght)
{
if (type == WStype_DISCONNECTED)
{
socketConnected = false;
}
else if (type == WStype_CONNECTED)
{
socketConnected = true;
webSocket.sendTXT(num, "Connected\n");
}
else if (type == WStype_TEXT)
{
if(lenght > 0)
{
String command = String((const char *)payload);
command.toUpperCase();
if (command == "WIFIRESET\n")
{
webSocket.sendTXT(num, "ok\n");
webSocket.sendTXT(num, "Resetting WiFi settings!\n");
delay(500);
wifiManager.resetSettings();
delay(100);
ESP.restart();
}
else if (command == "WIFISTATUS\n")
{
webSocket.sendTXT(num, "ok\n");

char buffer[100]; //declare array
IPAddress local = WiFi.localIP();
IPAddress gatew = WiFi.gatewayIP();

SendFormat(num, "Connected to: %s\n", WiFi.SSID().c_str());
SendFormat(num, "Signal strength: %ddBm\n", WiFi.RSSI());
SendFormat(num, "Local IP: %d.%d.%d.%d\n", local[0], local[1], local[2], local[3]);
SendFormat(num, "Gateway IP: %d.%d.%d.%d\n", gatew[0], gatew[1], gatew[2], gatew[3]);
}
else if (command == "CHIPSTATUS\n")
{
webSocket.sendTXT(num, "ok\n");
uint32_t realSize = ESP.getFlashChipRealSize();
uint32_t ideSize = ESP.getFlashChipSize();
FlashMode_t ideMode = ESP.getFlashChipMode();

SendFormat(num,"CPU Freq: %uMHz\n", ESP.getCpuFreqMHz());
SendFormat(num,"Flash speed: %uMHz\n", ESP.getFlashChipSpeed()/1000000);
SendFormat(num,"Flash real size: %uKB\n", realSize/1024);
SendFormat(num,"Flash ide size: %uKB\n", ideSize/1024);
SendFormat(num,"Flash ide mode: %s\n", (ideMode == FM_QIO ? "QIO" : ideMode == FM_QOUT ? "QOUT" : ideMode == FM_DIO ? "DIO" : ideMode == FM_DOUT ? "DOUT" : "UNKNOWN"));
SendFormat(num,"Flash ID: %08X\n", ESP.getFlashChipId());
}
else
{
Serial.write((const char *) (payload), (lenght));
}
}
}

}

void SendFormat (uint8_t num, char * format, ...)
{
char buffer[100];
va_list args;
va_start (args, format);
vsnprintf (buffer, 100, format, args);
va_end (args);
webSocket.sendTXT(num, buffer);
}

void setup()
{
delay(5000); //BOOT WAIT
pinMode(RESET_PIN, INPUT_PULLUP);
wifiManager.autoConnect("ESP8266");

webSocket.begin();
webSocket.onEvent(webSocketEvent);

httpUpdater.setup(&httpServer, update_path, update_username, update_password);
httpServer.begin();

term.setup();

WiFi.setSleepMode(WIFI_NONE_SLEEP); // disable WiFi sleep for more performance
}


void loop()
{
term.loop();
webSocket.loop();
httpServer.handleClient();
}


Binary file added wifibridge.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 0b1316c

Please sign in to comment.