Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update to rtl_433_ESP 0.1.5 and support for LILYGO® LoRa32 V2.1_1.6.1 433 Mhz #1371

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ jobs:
- "esp32-m5atom-lite"
- "esp32dev-rtl_433"
- "heltec-rtl_433"
- "lilygo-rtl_433"
- "esp32dev-multi_receiver"
- "tinypico-ble"
- "ttgo-lora32-v1-868"
Expand Down
2 changes: 1 addition & 1 deletion docs/setitup/rf.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ With SRX882 some users reported that D3 is not working use D1 instead in this ca
## ESP32 Hardware setup
![Addon_RF](../img/OpenMQTTgateway_ESP32_Addon_RF.png)

## Heltec SX127X 433Mhz boards
## Heltec SX127X 433Mhz boards and LILYGO® LoRa32 V2.1_1.6.1 433 Mhz
Those boards don't require any hardware modifications.

## SONOFF RF Bridge Hardware setup
Expand Down
14 changes: 14 additions & 0 deletions docs/use/boards.md
Original file line number Diff line number Diff line change
Expand Up @@ -80,3 +80,17 @@ OpenMQTTGateway support a low power mode for ESP32, this mode can be set by MQTT

The low power mode can be changed also with a push to button B when the board is processing (top button on M5stickC, M5stickC Plus and middle button of M5stack).
If you are already in low power mode 1 or 2 with M5Stack you can wake up the board by pressing the red button.

## SSD1306 Display boards ( Heltec SX127X 433Mhz boards and LILYGO® LoRa32 V2.1_1.6.1 433 Mhz )

### Setting the log output

Per default the log of the SSD1306 Display boards is going to the LCD display with Errors and Warnings only, if you want to change the ouput at build time you can do it with the compiler directive `-DLOG_LEVEL_LCD=LOG_LEVEL_NOTICE`.

You can also change it by MQTT. For example if you want to set to LCD

`mosquitto_pub -t home/OpenMQTTGateway/commands/MQTTtoSSD1306 -m '{"log-lcd":true}'`

you can also revert it to the serial monitor:

`mosquitto_pub -t home/OpenMQTTGateway/commands/MQTTtoSSD1306 -m '{"log-lcd":false}'`
2 changes: 1 addition & 1 deletion main/User_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -565,7 +565,7 @@ CRGB leds[FASTLED_IND_NUM_LEDS];
#endif

/*-----------PLACEHOLDERS FOR OLED/LCD DISPLAY--------------*/
// The real definitions are in config_M5.h / config_HELTEC.h
// The real definitions are in config_M5.h / config_SSD1306.h
#define displayPrint(...) // only print if not in low power mode
#define lpDisplayPrint(...) // print in low power mode

Expand Down
200 changes: 115 additions & 85 deletions main/ZboardHeltec.ino → main/ZdisplaySSD1306.ino
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@
Act as a wifi or ethernet gateway between your 433mhz/infrared IR signal and a MQTT broker
Send and receiving command by MQTT

Supported boards with displays

HELTEC ESP32 LORA - SSD1306 / Onboard 0.96-inch 128*64 dot matrix OLED display
LILYGO® LoRa32 V2.1_1.6.1 433 Mhz / https://www.lilygo.cc/products/lora3?variant=42476923879605

Copyright: (c)Florian ROBERT

Expand All @@ -28,29 +31,34 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/

#include "User_config.h"
#if defined(ZboardHELTEC)
#if defined(ZdisplaySSD1306)

# include <ArduinoJson.h>

# include "ArduinoLog.h"
# include "config_HELTEC.h"
# include "User_config.h"
# include "config_SSD1306.h"

SemaphoreHandle_t semaphoreOLEDOperation;

void logToLCD(bool display) {
display ? Log.begin(LOG_LEVEL_LCD, &Oled) : Log.begin(LOG_LEVEL, &Serial); // Log on LCD following LOG_LEVEL_LCD
}

void setupHELTEC() {
Log.trace(F("Setup HELTEC Display" CR));
void setupSSD1306() {
Log.trace(F("Setup SSD1306 Display" CR));
Log.trace(F("ZdisplaySSD1306 command topic: %s" CR), subjectMQTTtoSSD1306set);
Oled.begin();
Log.notice(F("Setup HELTEC Display end" CR));
Log.notice(F("Setup SSD1306 Display end" CR));

# if LOG_TO_LCD
Log.begin(LOG_LEVEL_LCD, &Oled); // Log on LCD following LOG_LEVEL_LCD
# endif
}

void loopHELTEC() {
static int previousLogLevel;
static int previousLogLevel = 0;

void loopSSD1306() {
int currentLogLevel = Log.getLastMsgLevel();
if (previousLogLevel != currentLogLevel && lowpowermode != 2) {
switch (currentLogLevel) {
Expand All @@ -66,8 +74,7 @@ void loopHELTEC() {
// M5.Lcd.setTextColor(TFT_BLACK, TFT_ORANGE);
break;
default:
// wakeScreen(SLEEP_LCD_BRIGHTNESS);
// M5.Lcd.fillScreen(TFT_WHITE);
// TODO: Display splash screen x seconds after last message displayed on OLED
Oled.fillScreen(WHITE);
Oled.drawLogo((int)OLED_WIDTH * 0.24, (int)(OLED_WIDTH / 2) - OLED_WIDTH * 0.2, (int)(OLED_HEIGHT / 2) + OLED_HEIGHT * 0.2, true, true, true, true, true, true); // Name
break;
Expand All @@ -76,34 +83,42 @@ void loopHELTEC() {
previousLogLevel = currentLogLevel;
}

void MQTTtoHELTEC(char* topicOri, JsonObject& HELTECdata) { // json object decoding
if (cmpToMainTopic(topicOri, subjectMQTTtoHELTECset)) {
Log.trace(F("MQTTtoHELTEC json set" CR));
// Log display set between HELTEC lcd (true) and serial monitor (false)
if (HELTECdata.containsKey("log-lcd")) {
bool displayOnLCD = HELTECdata["log-lcd"];
void MQTTtoSSD1306(char* topicOri, JsonObject& SSD1306data) { // json object decoding
bool success = false;
if (cmpToMainTopic(topicOri, subjectMQTTtoSSD1306set)) {
Log.trace(F("MQTTtoSSD1306 json set" CR));
// Log display set between SSD1306 lcd (true) and serial monitor (false)
if (SSD1306data.containsKey("log-lcd")) {
bool displayOnLCD = SSD1306data["log-lcd"];
Log.notice(F("Set lcd log: %T" CR), displayOnLCD);
logToLCD(displayOnLCD);
success = true;
}
if (success) {
pub(subjectSSD1306toMQTTset, SSD1306data);
} else {
pub(subjectSSD1306toMQTTset, "{\"Status\": \"Error\"}"); // Fail feedback
Log.error(F("MQTTtoSSD1306 Fail json" CR), SSD1306data);
}
}
}

// Simple print methonds

void heltecPrint(char* line1, char* line2, char* line3) {
void ssd1306Print(char* line1, char* line2, char* line3) {
Oled.println(line1);
Oled.println(line2);
Oled.println(line3);
delay(2000);
}

void heltecPrint(char* line1, char* line2) {
void ssd1306Print(char* line1, char* line2) {
Oled.println(line1);
Oled.println(line2);
delay(2000);
}

void heltecPrint(char* line1) {
void ssd1306Print(char* line1) {
Oled.println(line1);
delay(2000);
}
Expand All @@ -112,20 +127,29 @@ void heltecPrint(char* line1) {

OledSerial Oled(0); // Not sure about this, came from Hardwareserial
OledSerial::OledSerial(int x) {
# if defined(WIFI_Kit_32) || defined(WIFI_LoRa_32) || defined(WIFI_LoRa_32_V2)
pinMode(RST_OLED, OUTPUT);
digitalWrite(RST_OLED, LOW);
delay(50);
digitalWrite(RST_OLED, HIGH);

# if defined(WIFI_Kit_32) || defined(WIFI_LoRa_32) || defined(WIFI_LoRa_32_V2)
display = new SSD1306Wire(0x3c, SDA_OLED, SCL_OLED, GEOMETRY_128_64);
# elif defined(Wireless_Stick)
pinMode(RST_OLED, OUTPUT);
digitalWrite(RST_OLED, LOW);
delay(50);
digitalWrite(RST_OLED, HIGH);
display = new SSD1306Wire(0x3c, SDA_OLED, SCL_OLED, GEOMETRY_64_32);
# elif defined(ARDUINO_TTGO_LoRa32_v21new) // LILYGO® Disaster-Radio LoRa V2.1_1.6.1
pinMode(OLED_RST, OUTPUT);
digitalWrite(OLED_RST, LOW);
delay(50);
digitalWrite(OLED_RST, HIGH);
display = new SSD1306Wire(0x3c, OLED_SDA, OLED_SCL, GEOMETRY_128_64);
# endif
} // Not sure about this, came from Hardwareserial
}

void OledSerial::begin() {
// Heltec.begin(); // User OMG serial support
// SSD1306.begin(); // User OMG serial support

semaphoreOLEDOperation = xSemaphoreCreateBinary();
xSemaphoreGive(semaphoreOLEDOperation);
Expand All @@ -137,7 +161,7 @@ void OledSerial::begin() {
display->setColor(WHITE);
display->fillRect(0, 0, OLED_WIDTH, OLED_HEIGHT);
display->display();
displayIntro(OLED_WIDTH * 0.24, (OLED_WIDTH / 2) - OLED_WIDTH * 0.2, (OLED_HEIGHT / 2) + OLED_HEIGHT * 0.2);
ssd1306Intro(OLED_WIDTH * 0.24, (OLED_WIDTH / 2) - OLED_WIDTH * 0.2, (OLED_HEIGHT / 2) + OLED_HEIGHT * 0.2);
display->setLogBuffer(OLED_TEXT_ROWS, OLED_TEXT_BUFFER);
delay(1000);
}
Expand All @@ -157,9 +181,12 @@ void OledSerial::flush(void) {
}

void OledSerial::fillScreen(OLEDDISPLAY_COLOR color) {
display->clear();
display->setColor(color);
display->fillRect(0, 0, OLED_WIDTH, OLED_HEIGHT);
if (xSemaphoreTake(semaphoreOLEDOperation, pdMS_TO_TICKS(30000)) == pdTRUE) {
display->clear();
display->setColor(color);
display->fillRect(0, 0, OLED_WIDTH, OLED_HEIGHT);
xSemaphoreGive(semaphoreOLEDOperation);
}
}

size_t OledSerial::write(const uint8_t* buffer, size_t size) {
Expand All @@ -186,7 +213,7 @@ size_t OledSerial::write(const uint8_t* buffer, size_t size) {
Display OpenMQTTGateway logo - borrowed from ZboardM5.ino and tweaked for ssd1306 display ( removed color and tweaked size/location )
*/

void OledSerial::displayIntro(int scale, int displayWidth, int displayHeight) {
void OledSerial::ssd1306Intro(int scale, int displayWidth, int displayHeight) {
drawLogo(scale, displayWidth, displayHeight, false, true, false, false, false, false); // Circle 2
drawLogo(scale, displayWidth, displayHeight, false, false, true, false, false, false); // Circle 3
drawLogo(scale, displayWidth, displayHeight, false, true, true, true, false, false); // Line 1
Expand All @@ -196,64 +223,67 @@ void OledSerial::displayIntro(int scale, int displayWidth, int displayHeight) {
}

void OledSerial::drawLogo(int logoSize, int circle1X, int circle1Y, bool circle1, bool circle2, bool circle3, bool line1, bool line2, bool name) {
int circle1T = logoSize / 15;
int circle2T = logoSize / 25;
int circle3T = logoSize / 30;

int circle3Y = circle1Y - (logoSize * 1.2);
int circle3X = circle1X - (logoSize * 0.13);
int circle2X = circle1X - (logoSize * 1.05);
int circle2Y = circle1Y - (logoSize * 0.8);

if (line1) {
display->setColor(BLACK);
display->drawLine(circle1X - 2, circle1Y, circle2X - 2, circle2Y);
display->drawLine(circle1X - 1, circle1Y, circle2X - 1, circle2Y);
display->drawLine(circle1X, circle1Y, circle2X, circle2Y);
display->drawLine(circle1X + 1, circle1Y, circle2X + 1, circle2Y);
display->drawLine(circle1X + 2, circle1Y, circle2X + 2, circle2Y);
display->setColor(WHITE);
display->fillCircle(circle3X, circle3Y, logoSize / 4 - circle3T * 2); // , WHITE);
}
if (line2) {
display->setColor(BLACK);
display->drawLine(circle1X - 2, circle1Y, circle3X - 2, circle3Y);
display->drawLine(circle1X - 1, circle1Y, circle3X - 1, circle3Y);
display->drawLine(circle1X, circle1Y, circle3X, circle3Y);
display->drawLine(circle1X + 1, circle1Y, circle3X + 1, circle3Y);
display->setColor(WHITE);
display->fillCircle(circle2X, circle2Y, logoSize / 3 - circle2T * 2); // , WHITE);
}
if (circle1) {
display->setColor(WHITE);
display->fillCircle(circle1X, circle1Y, logoSize / 2); // , WHITE);
display->setColor(BLACK);
display->fillCircle(circle1X, circle1Y, logoSize / 2 - circle1T); // , TFT_GREEN);
display->setColor(WHITE);
display->fillCircle(circle1X, circle1Y, logoSize / 2 - circle1T * 2); // , WHITE);
}
if (circle2) {
display->setColor(WHITE);
display->fillCircle(circle2X, circle2Y, logoSize / 3); // , WHITE);
display->setColor(BLACK);
display->fillCircle(circle2X, circle2Y, logoSize / 3 - circle2T); // , TFT_ORANGE);
display->setColor(WHITE);
display->fillCircle(circle2X, circle2Y, logoSize / 3 - circle2T * 2); // , WHITE);
}
if (circle3) {
display->setColor(WHITE);
display->fillCircle(circle3X, circle3Y, logoSize / 4); // , WHITE);
display->setColor(BLACK);
display->fillCircle(circle3X, circle3Y, logoSize / 4 - circle3T); // , TFT_PINK);
display->setColor(WHITE);
display->fillCircle(circle3X, circle3Y, logoSize / 4 - circle3T * 2); // , WHITE);
}
if (name) {
display->setColor(BLACK);
display->drawString(circle1X + (circle1X * 0.27), circle1Y, "penMQTTGateway");
if (xSemaphoreTake(semaphoreOLEDOperation, pdMS_TO_TICKS(30000)) == pdTRUE) {
int circle1T = logoSize / 15;
int circle2T = logoSize / 25;
int circle3T = logoSize / 30;

int circle3Y = circle1Y - (logoSize * 1.2);
int circle3X = circle1X - (logoSize * 0.13);
int circle2X = circle1X - (logoSize * 1.05);
int circle2Y = circle1Y - (logoSize * 0.8);

if (line1) {
display->setColor(BLACK);
display->drawLine(circle1X - 2, circle1Y, circle2X - 2, circle2Y);
display->drawLine(circle1X - 1, circle1Y, circle2X - 1, circle2Y);
display->drawLine(circle1X, circle1Y, circle2X, circle2Y);
display->drawLine(circle1X + 1, circle1Y, circle2X + 1, circle2Y);
display->drawLine(circle1X + 2, circle1Y, circle2X + 2, circle2Y);
display->setColor(WHITE);
display->fillCircle(circle3X, circle3Y, logoSize / 4 - circle3T * 2); // , WHITE);
}
if (line2) {
display->setColor(BLACK);
display->drawLine(circle1X - 2, circle1Y, circle3X - 2, circle3Y);
display->drawLine(circle1X - 1, circle1Y, circle3X - 1, circle3Y);
display->drawLine(circle1X, circle1Y, circle3X, circle3Y);
display->drawLine(circle1X + 1, circle1Y, circle3X + 1, circle3Y);
display->setColor(WHITE);
display->fillCircle(circle2X, circle2Y, logoSize / 3 - circle2T * 2); // , WHITE);
}
if (circle1) {
display->setColor(WHITE);
display->fillCircle(circle1X, circle1Y, logoSize / 2); // , WHITE);
display->setColor(BLACK);
display->fillCircle(circle1X, circle1Y, logoSize / 2 - circle1T); // , TFT_GREEN);
display->setColor(WHITE);
display->fillCircle(circle1X, circle1Y, logoSize / 2 - circle1T * 2); // , WHITE);
}
if (circle2) {
display->setColor(WHITE);
display->fillCircle(circle2X, circle2Y, logoSize / 3); // , WHITE);
display->setColor(BLACK);
display->fillCircle(circle2X, circle2Y, logoSize / 3 - circle2T); // , TFT_ORANGE);
display->setColor(WHITE);
display->fillCircle(circle2X, circle2Y, logoSize / 3 - circle2T * 2); // , WHITE);
}
if (circle3) {
display->setColor(WHITE);
display->fillCircle(circle3X, circle3Y, logoSize / 4); // , WHITE);
display->setColor(BLACK);
display->fillCircle(circle3X, circle3Y, logoSize / 4 - circle3T); // , TFT_PINK);
display->setColor(WHITE);
display->fillCircle(circle3X, circle3Y, logoSize / 4 - circle3T * 2); // , WHITE);
}
if (name) {
display->setColor(BLACK);
display->drawString(circle1X + (circle1X * 0.27), circle1Y, "penMQTTGateway");
}
display->display();
delay(50);
xSemaphoreGive(semaphoreOLEDOperation);
}
display->display();
delay(50);
}

#endif
6 changes: 5 additions & 1 deletion main/ZgatewayRTL_433.ino
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,15 @@
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "User_config.h"
#ifdef ZgatewayRTL_433

# include <ArduinoJson.h>
# include <config_RF.h>
# include <rtl_433_ESP.h>

# include "ArduinoLog.h"
# include "User_config.h"

char messageBuffer[JSON_MSG_BUFFER];

rtl_433_ESP rtl_433(-1);
Expand Down
Loading