Telnet Port 2323
Visual Status via Board LEDs:
-ETH Start -> Green LED blink for 1 sec
+ETH Start -> Green LED blink once
Telnet work -> Green LED on
ETH Disconnected/stopped -> Orange LED on
*/
#include <ETH.h>
#include <Wire.h>
+//Display
+#include <Adafruit_SSD1306.h>
+#define SCREEN_ADDRESS 0x3C //< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
+Adafruit_SSD1306 display(128, 32, &Wire, -1);
+
+#define imageWidth 106
+#define imageHeight 32
+const unsigned char logo_bmp[] PROGMEM = {
+ 0xfc, 0x0f, 0xc0, 0x03, 0xf8, 0x3f, 0xff, 0xfc, 0x0f, 0xff, 0xff, 0xff,
+ 0xff, 0x80, 0xfc, 0x0f, 0xc0, 0x07, 0xf8, 0x3f, 0xff, 0xfc, 0x0f, 0xff,
+ 0xff, 0xff, 0xff, 0x00, 0xfc, 0x0f, 0xc0, 0x0f, 0xf0, 0x3f, 0xff, 0xfc,
+ 0x0f, 0xff, 0xff, 0xff, 0xfe, 0x40, 0xfc, 0x0f, 0xc0, 0x1f, 0xe0, 0x3f,
+ 0xff, 0xfc, 0x0f, 0xff, 0xff, 0xff, 0xfc, 0xc0, 0xfc, 0x0f, 0xc0, 0x3f,
+ 0xc0, 0x3f, 0xff, 0xfc, 0x0f, 0xff, 0xff, 0xff, 0xf1, 0xc0, 0xfc, 0x0f,
+ 0xc0, 0x3f, 0x80, 0x3f, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xe7, 0xc0,
+ 0xfc, 0x0f, 0xc0, 0x7f, 0x00, 0x3f, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff,
+ 0x8f, 0xc0, 0xfc, 0x0f, 0xc0, 0xfe, 0x00, 0x3f, 0x00, 0x00, 0x0f, 0xff,
+ 0xff, 0xff, 0x3f, 0xc0, 0xfc, 0x0f, 0xc1, 0xfc, 0x00, 0x3f, 0x00, 0x00,
+ 0x0f, 0xff, 0xff, 0xfc, 0xff, 0xc0, 0xfc, 0x0f, 0xc3, 0xf8, 0x00, 0x3f,
+ 0x00, 0x00, 0x0f, 0xff, 0xff, 0xf1, 0xff, 0xc0, 0xfc, 0x0f, 0xc7, 0xf8,
+ 0x00, 0x3f, 0x00, 0x00, 0x0f, 0xff, 0xff, 0x8f, 0xff, 0xc0, 0xfc, 0x0f,
+ 0xcf, 0xf0, 0x00, 0x3f, 0x00, 0x00, 0x0f, 0xff, 0xfc, 0x3f, 0xff, 0xc0,
+ 0xfc, 0x0f, 0xcf, 0xe0, 0x00, 0x3f, 0x00, 0x00, 0x0f, 0xff, 0xe0, 0xff,
+ 0xff, 0xc0, 0xfc, 0x0f, 0xdf, 0xe0, 0x00, 0x3f, 0xff, 0xf0, 0x0f, 0xfe,
+ 0x0f, 0xff, 0xff, 0xc0, 0xfc, 0x0f, 0xff, 0xf0, 0x00, 0x3f, 0xff, 0xf0,
+ 0x0f, 0x80, 0xff, 0xff, 0xff, 0xc0, 0xfc, 0x0f, 0xff, 0xf8, 0x00, 0x3f,
+ 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x0f, 0xff, 0xf8,
+ 0x00, 0x3f, 0xff, 0xf0, 0x00, 0x00, 0xff, 0xff, 0xff, 0xc0, 0xfc, 0x0f,
+ 0xfd, 0xfc, 0x00, 0x3f, 0xff, 0xf0, 0x0f, 0xf8, 0x1f, 0xff, 0xff, 0xc0,
+ 0xfc, 0x0f, 0xf8, 0xfc, 0x00, 0x3f, 0x00, 0x00, 0x0f, 0xff, 0xc1, 0xff,
+ 0xff, 0xc0, 0xfc, 0x0f, 0xf0, 0xfe, 0x00, 0x3f, 0x00, 0x00, 0x0f, 0xff,
+ 0xf8, 0x7f, 0xff, 0xc0, 0xfc, 0x0f, 0xe0, 0x7f, 0x00, 0x3f, 0x00, 0x00,
+ 0x0f, 0xff, 0xff, 0x0f, 0xff, 0xc0, 0xfc, 0x0f, 0xe0, 0x7f, 0x00, 0x3f,
+ 0x00, 0x00, 0x0f, 0xff, 0xff, 0xe3, 0xff, 0xc0, 0xfc, 0x0f, 0xc0, 0x3f,
+ 0x80, 0x3f, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xf8, 0xff, 0xc0, 0xfc, 0x0f,
+ 0xc0, 0x3f, 0x80, 0x3f, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xfe, 0x3f, 0xc0,
+ 0xfc, 0x0f, 0xc0, 0x1f, 0xc0, 0x3f, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff,
+ 0x9f, 0xc0, 0xfc, 0x0f, 0xc0, 0x0f, 0xe0, 0x3f, 0x00, 0x00, 0x0f, 0xff,
+ 0xff, 0xff, 0xc7, 0xc0, 0xfc, 0x0f, 0xc0, 0x0f, 0xe0, 0x3f, 0x00, 0x00,
+ 0x0f, 0xff, 0xff, 0xff, 0xf3, 0xc0, 0xfc, 0x0f, 0xc0, 0x07, 0xf0, 0x3f,
+ 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xf9, 0xc0, 0xfc, 0x0f, 0xc0, 0x07,
+ 0xf0, 0x3f, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xfc, 0xc0, 0xfc, 0x0f,
+ 0xc0, 0x03, 0xf8, 0x3f, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xfe, 0x40,
+ 0xfc, 0x0f, 0xc0, 0x03, 0xfc, 0x3f, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff,
+ 0xff, 0x00, 0xfc, 0x0f, 0xc0, 0x01, 0xfc, 0x3f, 0x00, 0x00, 0x0f, 0xff,
+ 0xff, 0xff, 0xff, 0x80};
//number of clients for this telnet server
#define MAX_SRV_CLIENTS 5
#define CB1 33
#define CB2 14
#define CB3 32
-
+#define LED_GREEN 15
+#define LED_YELLOW 2
WiFiServer server(2323);
WiFiClient serverClients[MAX_SRV_CLIENTS];
volatile static bool eth_connected = false;
static unsigned long lastTemperatureRead = 0;
-uint16_t MEAS_temperature = 0xab12;
+uint16_t MEAS_temperature = 0;
uint8_t CONF_GPIO = 0;
uint8_t rxcnt = 0, txpoint = 0;
uint8_t rxbuf[15];
uint8_t txbuf[12];
+uint8_t firstrun = 0;
void WiFiEvent(WiFiEvent_t event) {
switch (event){
case ARDUINO_EVENT_ETH_START:
-// Serial.println("ETH Started");
//set eth hostname here
- digitalWrite(2,LOW);
- digitalWrite(15,HIGH);
+ digitalWrite(LED_YELLOW,LOW);
+ digitalWrite(LED_GREEN,HIGH);
delay(500);
- digitalWrite(15, LOW);
+ digitalWrite(LED_GREEN, LOW);
ETH.setHostname("esp32-ethernet");
break;
case ARDUINO_EVENT_ETH_CONNECTED:
-// Serial.println("ETH Connected");
- digitalWrite(2,LOW);
- digitalWrite(15,HIGH);
+ digitalWrite(LED_YELLOW,LOW);
+ digitalWrite(LED_GREEN,HIGH);
break;
case ARDUINO_EVENT_ETH_GOT_IP:
-// Serial.print("ETH MAC: ");
-// Serial.print(ETH.macAddress());
-// Serial.print(", IPv4: ");
-// Serial.print(ETH.localIP());
-// if (ETH.fullDuplex()) {
-// Serial.print(", FULL_DUPLEX");
-// }
-// Serial.print(", ");
-// Serial.print(ETH.linkSpeed());
-// Serial.println("Mbps");
eth_connected = true;
break;
case ARDUINO_EVENT_ETH_DISCONNECTED:
-// Serial.println("ETH Disconnected");
- digitalWrite(15,LOW);
- digitalWrite(2,HIGH);
+ digitalWrite(LED_GREEN,LOW);
+ digitalWrite(LED_YELLOW,HIGH);
eth_connected = false;
break;
case ARDUINO_EVENT_ETH_STOP:
-// Serial.println("ETH Stopped");
- digitalWrite(15,LOW);
- digitalWrite(2,HIGH);
+ digitalWrite(LED_GREEN,LOW);
+ digitalWrite(LED_YELLOW,HIGH);
eth_connected = false;
break;
}
}
+void start_screen() {
+ display.clearDisplay();
+ display.ssd1306_command(SSD1306_SETCONTRAST);
+ display.ssd1306_command(0); // val=0 := 0% up to val = 255 := 100%
+ display.setTextSize(1); // Normal 1:1 pixel scale
+ display.setTextColor(SSD1306_WHITE); // Draw white text
+ display.cp437(true); // Use full 256 char 'Code Page 437' font
+
+ display.drawBitmap(0, 0, logo_bmp, imageWidth, imageHeight, SSD1306_WHITE);
+ display.setCursor(108, 0);
+ display.write("ETH");
+ display.setCursor(108, 8);
+ display.write("MDC");
+ display.setCursor(108, 16);
+ display.write("POW");
+ display.setCursor(108, 24);
+ display.write("JM");
+ display.display();
+ }
+
+void connection_screen() {
+ // show all connection relevant parameters
+ display.clearDisplay();
+ display.setTextSize(1); // Normal 1:1 pixel scale
+ display.setTextColor(SSD1306_WHITE); // Draw white text
+ display.cp437(true); // Use full 256 char 'Code Page 437' font
+
+ display.setCursor(0, 0);
+ display.write("ETH MAC / IP");
+ display.setCursor(25, 8);
+ display.print(ETH.macAddress());
+ display.setCursor(25, 16);
+ display.print(ETH.localIP());
+
+ display.setCursor(25, 24);
+ display.print((int8_t)(MEAS_temperature/100));
+ display.print('.');
+ display.print((uint8_t)(MEAS_temperature/10)%10);
+ display.print(" C");
+ display.display();
+}
+
void setup() {
- pinMode(2, OUTPUT); // yellow LED
- pinMode(15, OUTPUT); // green LED
+ pinMode(LED_YELLOW, OUTPUT); // yellow LED
+ pinMode(LED_GREEN, OUTPUT); // green LED
pinMode(CB0, OUTPUT);
pinMode(CB1, OUTPUT);
//init UART
Serial.begin(57600);
-// Serial.println("\nConnecting");
//init temperature sensor
Wire.begin(SDA,SCL);
Wire.write((uint8_t)0x00);
Wire.endTransmission();
+ //init display
+ display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS, false, false);
+ start_screen();
+ delay(1000);
//start the telnet server
WiFi.onEvent(WiFiEvent);
ETH.begin(1,17,23,18,ETH_PHY_LAN8720,ETH_CLOCK_GPIO0_IN);
server.begin();
server.setNoDelay(true);
+ connection_screen();
while (eth_connected == false);
+ connection_screen();
-// Serial.print("ready! Use 'telnet ");
-// Serial.print(ETH.localIP());
-// Serial.println(" 2323' to connect");
//visual status for telnet work
- digitalWrite(2,LOW);
- digitalWrite(15,HIGH);
+ digitalWrite(LED_YELLOW,LOW);
+ digitalWrite(LED_GREEN,HIGH);
}
void loop() {
if (!serverClients[i] || !serverClients[i].connected()) {
if(serverClients[i]) serverClients[i].stop();
serverClients[i] = server.available();
-// if (!serverClients[i]) Serial.println("available broken");
-// Serial.print("New client: ");
-// Serial.print(i); Serial.print(' ');
-// Serial.println(serverClients[i].remoteIP());
break;
}
}
byte MSB = Wire.read();
byte LSB = Wire.read();
MEAS_temperature = (((int32_t) MSB << 8) | (int32_t) LSB)*100/256;
+ if(firstrun) connection_screen();
+ firstrun = 1;
}
}
/******************************
* Helper functions
* ****************************/
+// convert integer or nibbles into hex value
uint8_t nib_to_hex(uint16_t in, uint8_t nib) {
- // convert integer or nibbles into hex value
uint8_t t = (in >> (nib * 4)) & 0xF;
if (t <= 9) {
return t + 0x30;
return t - 10 + 0x61;
}
-uint8_t hex_to_int(uint8_t h) {//assumes valid number
- // convert hex value to integer
+// convert hex value to integer, assumes valid number
+uint8_t hex_to_int(uint8_t h) {
if (h < 0x40) return h - 0x30;
if (h < 0x50) return h - 0x41 + 10;
return h - 0x61 + 10;
}
-
-
-
//Forward message to UART
void forward_msg(uint8_t i) {
Serial.write(rxbuf,i);
}
-
+//accepts address or forward message
uint8_t is_my_address(uint8_t s) {
if ((rxbuf[1] == 'F' || rxbuf[1] == 'f') && (rxbuf[2] == 'F' || rxbuf[2] == 'f')) {
return 1;
forward_msg(rxcnt);
}
else if (rxcnt == 11 && is_my_address(11)) {// message with correct length is for this uC
+ uint8_t regnumber = hex_to_int(rxbuf[5]);
if (rxbuf[0] == 'R') {
- if (hex_to_int(rxbuf[5]) == 4) { //Register 4: Temperature in 1/100 °C
+ if (regnumber == 4) { //Register 4: Temperature in 1/100 °C
send_answer_hex(&rxbuf[0], MEAS_temperature);
}
- if (hex_to_int(rxbuf[5]) == 5) { //Register 5: Information
+ if (regnumber == 5) { //Register 5: Information
send_answer_hex(&rxbuf[0], FIRMWARE_VERSION << 4);
}
- if (hex_to_int(rxbuf[5]) == 0xa) { //Register A: 4 GPIO pins
+ if (regnumber == 0xa) { //Register A: 4 GPIO pins
send_answer_hex(&rxbuf[0], CONF_GPIO);
}
}
if (rxbuf[0] == 'W') {
- if (hex_to_int(rxbuf[5]) == 0xa) { //Register A: 4 GPIO pins
+ if (regnumber == 0xa) { //Register A: 4 GPIO pins
CONF_GPIO = hex_to_int(rxbuf[9]);
send_answer_hex(&rxbuf[0], CONF_GPIO);
(CONF_GPIO & 1) ? digitalWrite(CB0,HIGH):digitalWrite(CB0,LOW);