From 68aafd179d054f9a2d2815dee9dc4f50c5bd2ddb Mon Sep 17 00:00:00 2001 From: Pawel Spychalski Date: Fri, 18 May 2018 12:55:20 +0200 Subject: [PATCH 1/6] initial try with U8x8 --- crossbow/tx_oled.cpp | 156 +++++++++++++++++++++++++++------------------------ crossbow/tx_oled.h | 4 +- 2 files changed, 84 insertions(+), 76 deletions(-) diff --git a/crossbow/tx_oled.cpp b/crossbow/tx_oled.cpp index 40037e4..c10b44d 100644 --- a/crossbow/tx_oled.cpp +++ b/crossbow/tx_oled.cpp @@ -1,15 +1,14 @@ #include "tx_oled.h" TxOled::TxOled(void) { - Adafruit_SSD1306 _display(-1); + U8X8_SSD1306_128X64_NONAME_HW_I2C _display(U8X8_PIN_NONE); } void TxOled::init() { - _display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3C (for the 128x32) - _display.setTextSize(1); - _display.setTextColor(WHITE); - _display.clearDisplay(); - _display.display(); + _display.begin(); + _display.clear(); + _display.setFont(u8x8_font_chroma48medium8_r); + _display.drawString(0,0,"Hello World!"); } void TxOled::loop() { @@ -78,107 +77,116 @@ void TxOled::page(uint8_t page) { } void TxOled::renderPagePwr() { - _display.clearDisplay(); - _display.setTextColor(WHITE, BLACK); + // _display.clearDisplay(); + // _display.setTextColor(WHITE, BLACK); - _display.setCursor(0, 0); - _display.setTextSize(2); - _display.print("PWR"); + // _display.setCursor(0, 0); + // _display.setTextSize(2); + // _display.print("PWR"); - //TODO content - _display.setCursor(0, 25); - _display.setTextSize(3); - _display.print(radioNode.loraTxPower); - _display.print("dBm"); + // //TODO content + // _display.setCursor(0, 25); + // _display.setTextSize(3); + // _display.print(radioNode.loraTxPower); + // _display.print("dBm"); - _display.display(); + // _display.display(); } void TxOled::renderPageBind() { - _display.clearDisplay(); - _display.setTextColor(WHITE, BLACK); + // _display.clearDisplay(); + // _display.setTextColor(WHITE, BLACK); - _display.setCursor(0, 0); - _display.setTextSize(2); - _display.print("Bind"); + // _display.setCursor(0, 0); + // _display.setTextSize(2); + // _display.print("Bind"); - //TODO content + // //TODO content - _display.display(); + // _display.display(); } void TxOled::renderPageMode() { - _display.clearDisplay(); - _display.setTextColor(WHITE, BLACK); + // _display.clearDisplay(); + // _display.setTextColor(WHITE, BLACK); - _display.setCursor(0, 0); - _display.setTextSize(2); - _display.print("Mode"); + // _display.setCursor(0, 0); + // _display.setTextSize(2); + // _display.print("Mode"); - _display.setCursor(0, 25); - _display.setTextSize(3); - _display.print("Full"); + // _display.setCursor(0, 25); + // _display.setTextSize(3); + // _display.print("Full"); - _display.display(); + // _display.display(); } void TxOled::renderPageStats() { - _display.clearDisplay(); - _display.setTextColor(WHITE, BLACK); + // _display.clearDisplay(); + // _display.setTextColor(WHITE, BLACK); - _display.setCursor(0, 0); - _display.setTextSize(3); - _display.print(radioNode.rssi); + // _display.setCursor(0, 0); + // _display.setTextSize(3); + // _display.print(radioNode.rssi); - _display.setCursor(18, 28); - _display.setTextSize(2); - _display.print(radioNode.snr); + // _display.setCursor(18, 28); + // _display.setTextSize(2); + // _display.print(radioNode.snr); - _display.setCursor(74, 0); - _display.setTextSize(3); - _display.print(rxDeviceState.rssi); + // _display.setCursor(74, 0); + // _display.setTextSize(3); + // _display.print(rxDeviceState.rssi); - _display.setCursor(92, 28); - _display.setTextSize(2); - _display.print(rxDeviceState.snr); + // _display.setCursor(92, 28); + // _display.setTextSize(2); + // _display.print(rxDeviceState.snr); - _display.setCursor(54, 48); - _display.setTextSize(2); - _display.print(txDeviceState.roundtrip); + // _display.setCursor(54, 48); + // _display.setTextSize(2); + // _display.print(txDeviceState.roundtrip); - _display.display(); + // _display.display(); } void TxOled::renderPageInit() { - _display.clearDisplay(); - _display.setTextColor(WHITE, BLACK); - _display.setTextSize(2); - _display.setCursor(0, 0); - _display.print("Rdy "); - _display.print(radioNode.loraTxPower); - _display.print("dBm"); + _display.clear(); - _display.setTextSize(1); - _display.setCursor(0, 32); - _display.print("Bandwitdh: "); - _display.print(radioNode.loraBandwidth / 1000); - _display.print("kHz"); + char buf[128]; + snprintf(buf, "%s %d %s", "Rdy", radioNode.loraTxPower, "dBm"); - _display.setCursor(0, 42); - _display.print("SF: "); - _display.print(radioNode.loraSpreadingFactor); + _display.drawString(0, 0, buf); - _display.setCursor(64, 42); - _display.print("CR: "); - _display.print(radioNode.loraCodingRate); - _display.setCursor(0, 52); - _display.print("Rate: "); - _display.print(1000 / TX_TRANSMIT_SLOT_RATE); - _display.print("Hz"); + // _display.clearDisplay(); + // _display.setTextColor(WHITE, BLACK); + // _display.setTextSize(2); - _display.display(); + // _display.setCursor(0, 0); + // _display.print("Rdy "); + // _display.print(radioNode.loraTxPower); + // _display.print("dBm"); + + // _display.setTextSize(1); + // _display.setCursor(0, 32); + // _display.print("Bandwitdh: "); + // _display.print(radioNode.loraBandwidth / 1000); + // _display.print("kHz"); + + // _display.setCursor(0, 42); + // _display.print("SF: "); + // _display.print(radioNode.loraSpreadingFactor); + + // _display.setCursor(64, 42); + // _display.print("CR: "); + // _display.print(radioNode.loraCodingRate); + + // _display.setCursor(0, 52); + // _display.print("Rate: "); + // _display.print(1000 / TX_TRANSMIT_SLOT_RATE); + // _display.print("Hz"); + + // _display.display(); } diff --git a/crossbow/tx_oled.h b/crossbow/tx_oled.h index 799a739..7a4191f 100644 --- a/crossbow/tx_oled.h +++ b/crossbow/tx_oled.h @@ -3,8 +3,8 @@ #ifndef TX_OLED_H #define TX_OLED_H -#include #include "Wire.h" +#include #include "variables.h" #include "tactile.h" #include "radio_node.h" @@ -41,7 +41,7 @@ class TxOled { void loop(); void page(uint8_t page); private: - Adafruit_SSD1306 _display; + U8X8_SSD1306_128X64_NONAME_HW_I2C _display; void renderPageInit(); void renderPageStats(); void renderPagePwr(); From 7259286a3abd41d2d8d59202eb654b0ed430ce65 Mon Sep 17 00:00:00 2001 From: "Pawel Spychalski (DzikuVx)" Date: Sat, 19 May 2018 11:34:51 +0200 Subject: [PATCH 2/6] U8x8 seems to be working much better. Smaller memory and flash requirements --- .vscode/arduino.json | 2 +- crossbow/config.h | 2 +- crossbow/tx_oled.cpp | 44 +++++++++++++++----------------------------- 3 files changed, 17 insertions(+), 31 deletions(-) diff --git a/.vscode/arduino.json b/.vscode/arduino.json index e8e6b14..0ca9fe3 100644 --- a/.vscode/arduino.json +++ b/.vscode/arduino.json @@ -1,6 +1,6 @@ { "board": "bsfrance:avr:lora32u4", "sketch": "crossbow/crossbow.ino", - "port": "COM7", + "port": "COM5", "output": "../build" } \ No newline at end of file diff --git a/crossbow/config.h b/crossbow/config.h index 9dc179b..44c13d4 100644 --- a/crossbow/config.h +++ b/crossbow/config.h @@ -29,7 +29,7 @@ */ #define FEATURE_TX_INPUT_SBUS -// #define DEBUG_SERIAL +#define DEBUG_SERIAL // #define DEBUG_PING_PONG // #define DEBUG_LED diff --git a/crossbow/tx_oled.cpp b/crossbow/tx_oled.cpp index c10b44d..f2b4d06 100644 --- a/crossbow/tx_oled.cpp +++ b/crossbow/tx_oled.cpp @@ -1,5 +1,7 @@ #include "tx_oled.h" +#define OLED_COL_COUNT 16 + TxOled::TxOled(void) { U8X8_SSD1306_128X64_NONAME_HW_I2C _display(U8X8_PIN_NONE); } @@ -7,8 +9,6 @@ TxOled::TxOled(void) { void TxOled::init() { _display.begin(); _display.clear(); - _display.setFont(u8x8_font_chroma48medium8_r); - _display.drawString(0,0,"Hello World!"); } void TxOled::loop() { @@ -150,43 +150,29 @@ void TxOled::renderPageStats() { void TxOled::renderPageInit() { + char buf[OLED_COL_COUNT]; + _display.clear(); - char buf[128]; - snprintf(buf, "%s %d %s", "Rdy", radioNode.loraTxPower, "dBm"); + _display.setFont(u8x8_font_pxplustandynewtv_f); + snprintf(buf, OLED_COL_COUNT, "Rdy %d %s", radioNode.loraTxPower, "dBm"); _display.drawString(0, 0, buf); + _display.setFont(u8x8_font_chroma48medium8_r); - // _display.clearDisplay(); - // _display.setTextColor(WHITE, BLACK); - // _display.setTextSize(2); + snprintf(buf, OLED_COL_COUNT, "BW %dkHz", radioNode.loraBandwidth / 1000); + _display.drawString(0, 3, buf); - // _display.setCursor(0, 0); - // _display.print("Rdy "); - // _display.print(radioNode.loraTxPower); - // _display.print("dBm"); + snprintf(buf, OLED_COL_COUNT, "SF %d", radioNode.loraSpreadingFactor); + _display.drawString(0, 4, buf); - // _display.setTextSize(1); - // _display.setCursor(0, 32); - // _display.print("Bandwitdh: "); - // _display.print(radioNode.loraBandwidth / 1000); - // _display.print("kHz"); + snprintf(buf, OLED_COL_COUNT, "CR %d", radioNode.loraCodingRate); + _display.drawString(8, 4, buf); - // _display.setCursor(0, 42); - // _display.print("SF: "); - // _display.print(radioNode.loraSpreadingFactor); - // _display.setCursor(64, 42); - // _display.print("CR: "); - // _display.print(radioNode.loraCodingRate); - - // _display.setCursor(0, 52); - // _display.print("Rate: "); - // _display.print(1000 / TX_TRANSMIT_SLOT_RATE); - // _display.print("Hz"); - - // _display.display(); + snprintf(buf, OLED_COL_COUNT, "Rate: %dHz", 1000 / TX_TRANSMIT_SLOT_RATE); + _display.drawString(0, 6, buf); } From ea44a45de9e6fed91e1d5703298529c733db0f58 Mon Sep 17 00:00:00 2001 From: "Pawel Spychalski (DzikuVx)" Date: Sat, 19 May 2018 16:37:23 +0200 Subject: [PATCH 3/6] Next pages converted --- crossbow/tx_oled.cpp | 53 ++++++++++++++++++++++++++-------------------------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/crossbow/tx_oled.cpp b/crossbow/tx_oled.cpp index f2b4d06..7197717 100644 --- a/crossbow/tx_oled.cpp +++ b/crossbow/tx_oled.cpp @@ -122,30 +122,31 @@ void TxOled::renderPageMode() { } void TxOled::renderPageStats() { - // _display.clearDisplay(); - // _display.setTextColor(WHITE, BLACK); + + char buf[OLED_COL_COUNT]; + + _display.clear(); + _display.setFont(u8x8_font_pxplustandynewtv_f); + _display.draw1x2String(0, 0, "Stats"); + + _display.setFont(u8x8_font_chroma48medium8_r); + _display.drawString(0, 3, "RSSI"); + _display.drawString(0, 5, "SNR"); - // _display.setCursor(0, 0); - // _display.setTextSize(3); - // _display.print(radioNode.rssi); + _display.setFont(u8x8_font_pxplustandynewtv_f); - // _display.setCursor(18, 28); - // _display.setTextSize(2); - // _display.print(radioNode.snr); + snprintf(buf, OLED_COL_COUNT, "%d", radioNode.rssi); + _display.drawString(6, 3, buf); + snprintf(buf, OLED_COL_COUNT, "%d", rxDeviceState.rssi); + _display.drawString(11, 3, buf); - // _display.setCursor(74, 0); - // _display.setTextSize(3); - // _display.print(rxDeviceState.rssi); + snprintf(buf, OLED_COL_COUNT, "%d", radioNode.snr); + _display.drawString(6, 5, buf); + snprintf(buf, OLED_COL_COUNT, "%d", rxDeviceState.snr); + _display.drawString(11, 5, buf); - // _display.setCursor(92, 28); - // _display.setTextSize(2); - // _display.print(rxDeviceState.snr); - - // _display.setCursor(54, 48); - // _display.setTextSize(2); - // _display.print(txDeviceState.roundtrip); - - // _display.display(); + snprintf(buf, OLED_COL_COUNT, "Trip: %d", txDeviceState.roundtrip); + _display.drawString(0, 7, buf); } void TxOled::renderPageInit() { @@ -157,22 +158,22 @@ void TxOled::renderPageInit() { _display.setFont(u8x8_font_pxplustandynewtv_f); snprintf(buf, OLED_COL_COUNT, "Rdy %d %s", radioNode.loraTxPower, "dBm"); - _display.drawString(0, 0, buf); + _display.draw1x2String(0, 0, buf); _display.setFont(u8x8_font_chroma48medium8_r); snprintf(buf, OLED_COL_COUNT, "BW %dkHz", radioNode.loraBandwidth / 1000); - _display.drawString(0, 3, buf); - - snprintf(buf, OLED_COL_COUNT, "SF %d", radioNode.loraSpreadingFactor); _display.drawString(0, 4, buf); + snprintf(buf, OLED_COL_COUNT, "SF %d", radioNode.loraSpreadingFactor); + _display.drawString(0, 5, buf); + snprintf(buf, OLED_COL_COUNT, "CR %d", radioNode.loraCodingRate); - _display.drawString(8, 4, buf); + _display.drawString(8, 5, buf); snprintf(buf, OLED_COL_COUNT, "Rate: %dHz", 1000 / TX_TRANSMIT_SLOT_RATE); - _display.drawString(0, 6, buf); + _display.drawString(0, 7, buf); } From 62e3c79116a9d69d68118a596586ee70574aea78 Mon Sep 17 00:00:00 2001 From: "Pawel Spychalski (DzikuVx)" Date: Sun, 20 May 2018 21:27:11 +0200 Subject: [PATCH 4/6] Travis update --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 6a3b878..97f3609 100644 --- a/.travis.yml +++ b/.travis.yml @@ -23,7 +23,7 @@ before_install: fi - arduino --pref "boardsmanager.additional.urls=" --save-prefs install: - - arduino --install-library "Adafruit SSD1306","Adafruit GFX Library" + - arduino --install-library "U8g2" script: - cp -f $PWD/crossbow/configurations/config_${CONFIG}.h $PWD/crossbow/config.h && arduino --verify --board $BOARD $PWD/crossbow/crossbow.ino From f884b5e70c4c4b6735cdb8991ea8637ae6e835f2 Mon Sep 17 00:00:00 2001 From: "Pawel Spychalski (DzikuVx)" Date: Mon, 21 May 2018 15:16:28 +0200 Subject: [PATCH 5/6] All other static OLED pages --- README.md | 6 ++++++ crossbow/tx_oled.cpp | 51 +++++++++++++++++++++------------------------------ 2 files changed, 27 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index fe9b093..76099d6 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,12 @@ Needs implementation: * RX configuration from TX module * Sending telemetry from TX to OpenTX radio +# Dependencies + +To compile, following libraries have to be installed: + +* [U8g2](https://github.com/olikraus/u8g2) for OLED support in TX module + # Protocol | Byte | Description | Notes | diff --git a/crossbow/tx_oled.cpp b/crossbow/tx_oled.cpp index 7197717..5dc9a57 100644 --- a/crossbow/tx_oled.cpp +++ b/crossbow/tx_oled.cpp @@ -77,48 +77,39 @@ void TxOled::page(uint8_t page) { } void TxOled::renderPagePwr() { - // _display.clearDisplay(); - // _display.setTextColor(WHITE, BLACK); + char buf[OLED_COL_COUNT]; - // _display.setCursor(0, 0); - // _display.setTextSize(2); - // _display.print("PWR"); + _display.clear(); + _display.setFont(u8x8_font_pxplustandynewtv_f); + _display.draw1x2String(0, 0, "Power"); - // //TODO content - // _display.setCursor(0, 25); - // _display.setTextSize(3); - // _display.print(radioNode.loraTxPower); - // _display.print("dBm"); - - // _display.display(); + _display.setFont(u8x8_font_chroma48medium8_r); + snprintf(buf, OLED_COL_COUNT, "%d%s", radioNode.loraTxPower, "dBm"); + _display.draw1x2String(0, 4, buf); } void TxOled::renderPageBind() { - // _display.clearDisplay(); - // _display.setTextColor(WHITE, BLACK); + char buf[OLED_COL_COUNT]; - // _display.setCursor(0, 0); - // _display.setTextSize(2); - // _display.print("Bind"); + _display.clear(); + _display.setFont(u8x8_font_pxplustandynewtv_f); + _display.draw1x2String(0, 0, "Bind"); - // //TODO content - - // _display.display(); + _display.setFont(u8x8_font_chroma48medium8_r); + snprintf(buf, OLED_COL_COUNT, "Bind?"); + _display.draw1x2String(0, 4, buf); } void TxOled::renderPageMode() { - // _display.clearDisplay(); - // _display.setTextColor(WHITE, BLACK); + char buf[OLED_COL_COUNT]; - // _display.setCursor(0, 0); - // _display.setTextSize(2); - // _display.print("Mode"); + _display.clear(); + _display.setFont(u8x8_font_pxplustandynewtv_f); + _display.draw1x2String(0, 0, "Mode"); - // _display.setCursor(0, 25); - // _display.setTextSize(3); - // _display.print("Full"); - - // _display.display(); + _display.setFont(u8x8_font_chroma48medium8_r); + snprintf(buf, OLED_COL_COUNT, "Full"); + _display.draw1x2String(0, 4, buf); } void TxOled::renderPageStats() { From d42534f41bca992ec07980f10efdde553e8841c1 Mon Sep 17 00:00:00 2001 From: "Pawel Spychalski (DzikuVx)" Date: Mon, 21 May 2018 15:21:57 +0200 Subject: [PATCH 6/6] Only one font used to limit flash usage --- crossbow/tx_oled.cpp | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/crossbow/tx_oled.cpp b/crossbow/tx_oled.cpp index 5dc9a57..dbbf784 100644 --- a/crossbow/tx_oled.cpp +++ b/crossbow/tx_oled.cpp @@ -8,6 +8,7 @@ TxOled::TxOled(void) { void TxOled::init() { _display.begin(); + _display.setFont(u8x8_font_pxplustandynewtv_f); _display.clear(); } @@ -80,10 +81,8 @@ void TxOled::renderPagePwr() { char buf[OLED_COL_COUNT]; _display.clear(); - _display.setFont(u8x8_font_pxplustandynewtv_f); _display.draw1x2String(0, 0, "Power"); - _display.setFont(u8x8_font_chroma48medium8_r); snprintf(buf, OLED_COL_COUNT, "%d%s", radioNode.loraTxPower, "dBm"); _display.draw1x2String(0, 4, buf); } @@ -92,10 +91,8 @@ void TxOled::renderPageBind() { char buf[OLED_COL_COUNT]; _display.clear(); - _display.setFont(u8x8_font_pxplustandynewtv_f); _display.draw1x2String(0, 0, "Bind"); - _display.setFont(u8x8_font_chroma48medium8_r); snprintf(buf, OLED_COL_COUNT, "Bind?"); _display.draw1x2String(0, 4, buf); } @@ -104,10 +101,8 @@ void TxOled::renderPageMode() { char buf[OLED_COL_COUNT]; _display.clear(); - _display.setFont(u8x8_font_pxplustandynewtv_f); _display.draw1x2String(0, 0, "Mode"); - _display.setFont(u8x8_font_chroma48medium8_r); snprintf(buf, OLED_COL_COUNT, "Full"); _display.draw1x2String(0, 4, buf); } @@ -117,15 +112,11 @@ void TxOled::renderPageStats() { char buf[OLED_COL_COUNT]; _display.clear(); - _display.setFont(u8x8_font_pxplustandynewtv_f); _display.draw1x2String(0, 0, "Stats"); - _display.setFont(u8x8_font_chroma48medium8_r); _display.drawString(0, 3, "RSSI"); _display.drawString(0, 5, "SNR"); - _display.setFont(u8x8_font_pxplustandynewtv_f); - snprintf(buf, OLED_COL_COUNT, "%d", radioNode.rssi); _display.drawString(6, 3, buf); snprintf(buf, OLED_COL_COUNT, "%d", rxDeviceState.rssi); @@ -146,13 +137,9 @@ void TxOled::renderPageInit() { _display.clear(); - _display.setFont(u8x8_font_pxplustandynewtv_f); - snprintf(buf, OLED_COL_COUNT, "Rdy %d %s", radioNode.loraTxPower, "dBm"); _display.draw1x2String(0, 0, buf); - _display.setFont(u8x8_font_chroma48medium8_r); - snprintf(buf, OLED_COL_COUNT, "BW %dkHz", radioNode.loraBandwidth / 1000); _display.drawString(0, 4, buf); @@ -162,7 +149,6 @@ void TxOled::renderPageInit() { snprintf(buf, OLED_COL_COUNT, "CR %d", radioNode.loraCodingRate); _display.drawString(8, 5, buf); - snprintf(buf, OLED_COL_COUNT, "Rate: %dHz", 1000 / TX_TRANSMIT_SLOT_RATE); _display.drawString(0, 7, buf); }