Update to use e22 instead of sx1278
This commit is contained in:
parent
f27a3e026a
commit
c9dad05631
|
|
@ -19,6 +19,6 @@ lib_deps =
|
||||||
zinggjm/GxEPD2@^1.5.6
|
zinggjm/GxEPD2@^1.5.6
|
||||||
bblanchon/ArduinoJson@^7.0.4
|
bblanchon/ArduinoJson@^7.0.4
|
||||||
peterus/esp-logger@^1.0.0
|
peterus/esp-logger@^1.0.0
|
||||||
sandeepmistry/LoRa@^0.8.0
|
jgromes/RadioLib@^6.0.0
|
||||||
olikraus/U8g2_for_Adafruit_GFX@^1.8.0
|
olikraus/U8g2_for_Adafruit_GFX@^1.8.0
|
||||||
milesburton/DallasTemperature@^3.11.0
|
milesburton/DallasTemperature@^3.11.0
|
||||||
|
|
|
||||||
|
|
@ -6,50 +6,131 @@
|
||||||
extern logging::Logger logger;
|
extern logging::Logger logger;
|
||||||
extern Config config;
|
extern Config config;
|
||||||
|
|
||||||
|
LoraHandler::LoraHandler() {
|
||||||
|
// Initialize with new SX1268 radio
|
||||||
|
}
|
||||||
|
|
||||||
void LoraHandler::setup()
|
void LoraHandler::setup()
|
||||||
{
|
{
|
||||||
|
logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "LoRa", "Initializing SX1268 with RadioLib!");
|
||||||
logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "LoRa", "Set SPI pins!");
|
|
||||||
SPI.begin(RADIO_SCK, RADIO_MISO, RADIO_MOSI, RADIO_CS);
|
// Create new SPI instance for LoRa
|
||||||
LoRa.setPins(RADIO_CS, RADIO_RST, RADIO_IRQ);
|
spi = new SPIClass(VSPI);
|
||||||
|
spi->begin(RADIO_SCK, RADIO_MISO, RADIO_MOSI, RADIO_CS);
|
||||||
long freq = config.loraConfig.frequency;
|
|
||||||
if (!LoRa.begin(freq))
|
// Create SX1268 instance
|
||||||
|
radio = new SX1268(new SPIDriver(spi, RADIO_CS));
|
||||||
|
|
||||||
|
// Configure RXEN/TXEN pins
|
||||||
|
pinMode(RADIO_RXEN, OUTPUT);
|
||||||
|
pinMode(RADIO_TXEN, OUTPUT);
|
||||||
|
digitalWrite(RADIO_RXEN, LOW);
|
||||||
|
digitalWrite(RADIO_TXEN, LOW);
|
||||||
|
|
||||||
|
// Initialize LoRa module
|
||||||
|
int state = radio->begin();
|
||||||
|
if (state != RADIOLIB_ERR_NONE)
|
||||||
{
|
{
|
||||||
logger.log(logging::LoggerLevel::LOGGER_LEVEL_ERROR, "LoRa", "Starting LoRa failed!");
|
logger.log(logging::LoggerLevel::LOGGER_LEVEL_ERROR, "LoRa", "LoRa init failed: %i", state);
|
||||||
// show_display("ERROR", "Starting LoRa failed!");
|
while (true) {
|
||||||
while (true)
|
|
||||||
{
|
|
||||||
delay(1000);
|
delay(1000);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
LoRa.setSpreadingFactor(config.loraConfig.spreadingFactor);
|
|
||||||
LoRa.setSignalBandwidth(config.loraConfig.signalBandwidth);
|
// Configure LoRa parameters
|
||||||
LoRa.setCodingRate4(config.loraConfig.codingRate4);
|
long freq = config.loraConfig.frequency;
|
||||||
LoRa.enableCrc();
|
state = radio->setFrequency(freq);
|
||||||
LoRa.setTxPower(config.loraConfig.power);
|
if (state != RADIOLIB_ERR_NONE)
|
||||||
logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "LoRa", "LoRa init done!");
|
{
|
||||||
String currentLoRainfo = "LoRa Freq: " + String(config.loraConfig.frequency) + " / SF:" + String(config.loraConfig.spreadingFactor) + " / CR: " + String(config.loraConfig.codingRate4);
|
logger.log(logging::LoggerLevel::LOGGER_LEVEL_ERROR, "LoRa", "setFrequency failed: %i", state);
|
||||||
|
}
|
||||||
|
|
||||||
|
state = radio->setSpreadingFactor(config.loraConfig.spreadingFactor);
|
||||||
|
if (state != RADIOLIB_ERR_NONE)
|
||||||
|
{
|
||||||
|
logger.log(logging::LoggerLevel::LOGGER_LEVEL_ERROR, "LoRa", "setSpreadingFactor failed: %i", state);
|
||||||
|
}
|
||||||
|
|
||||||
|
state = radio->setBandwidth(config.loraConfig.signalBandwidth);
|
||||||
|
if (state != RADIOLIB_ERR_NONE)
|
||||||
|
{
|
||||||
|
logger.log(logging::LoggerLevel::LOGGER_LEVEL_ERROR, "LoRa", "setBandwidth failed: %i", state);
|
||||||
|
}
|
||||||
|
|
||||||
|
state = radio->setCodingRate(config.loraConfig.codingRate4);
|
||||||
|
if (state != RADIOLIB_ERR_NONE)
|
||||||
|
{
|
||||||
|
logger.log(logging::LoggerLevel::LOGGER_LEVEL_ERROR, "LoRa", "setCodingRate failed: %i", state);
|
||||||
|
}
|
||||||
|
|
||||||
|
state = radio->setOutputPower(config.loraConfig.power);
|
||||||
|
if (state != RADIOLIB_ERR_NONE)
|
||||||
|
{
|
||||||
|
logger.log(logging::LoggerLevel::LOGGER_LEVEL_ERROR, "LoRa", "setOutputPower failed: %i", state);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Enable CRC
|
||||||
|
radio->setCRC(true);
|
||||||
|
|
||||||
|
logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "LoRa", "SX1268 initialized successfully!");
|
||||||
|
String currentLoRainfo = "LoRa Freq: " + String(freq) + " / SF:" + String(config.loraConfig.spreadingFactor) + " / CR: " + String(config.loraConfig.codingRate4);
|
||||||
logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "LoRa", currentLoRainfo.c_str());
|
logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "LoRa", currentLoRainfo.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LoraHandler::sendPacket(const String& data)
|
||||||
|
{
|
||||||
|
logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "LoRa Tx", "Sending: %s", data.c_str());
|
||||||
|
|
||||||
|
// Enable TX mode
|
||||||
|
digitalWrite(RADIO_TXEN, HIGH);
|
||||||
|
digitalWrite(RADIO_RXEN, LOW);
|
||||||
|
delay(10);
|
||||||
|
|
||||||
|
int state = radio->transmit(data);
|
||||||
|
|
||||||
|
// Disable TX mode
|
||||||
|
digitalWrite(RADIO_TXEN, LOW);
|
||||||
|
|
||||||
|
if (state != RADIOLIB_ERR_NONE)
|
||||||
|
{
|
||||||
|
logger.log(logging::LoggerLevel::LOGGER_LEVEL_ERROR, "LoRa Tx", "Transmit failed: %i", state);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "LoRa Tx", "Packet sent!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ReceivedLoRaPacket LoraHandler::receivePacket()
|
ReceivedLoRaPacket LoraHandler::receivePacket()
|
||||||
{
|
{
|
||||||
ReceivedLoRaPacket receivedLoraPacket;
|
ReceivedLoRaPacket receivedLoraPacket;
|
||||||
String packet = "";
|
|
||||||
int packetSize = LoRa.parsePacket();
|
// Enable RX mode
|
||||||
if (packetSize)
|
digitalWrite(RADIO_RXEN, HIGH);
|
||||||
|
digitalWrite(RADIO_TXEN, LOW);
|
||||||
|
|
||||||
|
int state = radio->receive(0); // 0 = non-blocking
|
||||||
|
|
||||||
|
if (state == RADIOLIB_ERR_RX_ONGOING)
|
||||||
{
|
{
|
||||||
while (LoRa.available())
|
// No packet received yet
|
||||||
{
|
return receivedLoraPacket;
|
||||||
int inChar = LoRa.read();
|
|
||||||
packet += (char)inChar;
|
|
||||||
}
|
|
||||||
receivedLoraPacket.text = packet;
|
|
||||||
receivedLoraPacket.rssi = LoRa.packetRssi();
|
|
||||||
receivedLoraPacket.snr = LoRa.packetSnr();
|
|
||||||
receivedLoraPacket.freqError = LoRa.packetFrequencyError();
|
|
||||||
logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "LoRa Rx", "---> %s", packet.c_str());
|
|
||||||
}
|
}
|
||||||
|
else if (state == RADIOLIB_ERR_NONE)
|
||||||
|
{
|
||||||
|
// Packet received!
|
||||||
|
receivedLoraPacket.text = radio->readData();
|
||||||
|
receivedLoraPacket.rssi = radio->getRSSI();
|
||||||
|
receivedLoraPacket.snr = radio->getSNR();
|
||||||
|
receivedLoraPacket.freqError = radio->getFrequencyError();
|
||||||
|
|
||||||
|
logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "LoRa Rx", "---> %s (RSSI: %d, SNR: %.1f)",
|
||||||
|
receivedLoraPacket.text.c_str(), receivedLoraPacket.rssi, receivedLoraPacket.snr);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
logger.log(logging::LoggerLevel::LOGGER_LEVEL_ERROR, "LoRa Rx", "Receive error: %i", state);
|
||||||
|
}
|
||||||
|
|
||||||
return receivedLoraPacket;
|
return receivedLoraPacket;
|
||||||
}
|
}
|
||||||
|
|
@ -2,8 +2,7 @@
|
||||||
#define LORAHANDLER_H
|
#define LORAHANDLER_H
|
||||||
|
|
||||||
#include "config.hpp"
|
#include "config.hpp"
|
||||||
#include <SPI.h>
|
#include <RadioLib.h>
|
||||||
#include <LoRa.h>
|
|
||||||
|
|
||||||
struct ReceivedLoRaPacket {
|
struct ReceivedLoRaPacket {
|
||||||
String text;
|
String text;
|
||||||
|
|
@ -14,9 +13,13 @@ struct ReceivedLoRaPacket {
|
||||||
|
|
||||||
class LoraHandler {
|
class LoraHandler {
|
||||||
public:
|
public:
|
||||||
|
LoraHandler();
|
||||||
void setup();
|
void setup();
|
||||||
|
void sendPacket(const String& data);
|
||||||
ReceivedLoRaPacket receivePacket();
|
ReceivedLoRaPacket receivePacket();
|
||||||
private:
|
private:
|
||||||
|
SX1268* radio;
|
||||||
|
SPIClass* spi;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* LORAHANDLER_H */
|
#endif /* LORAHANDLER_H */
|
||||||
|
|
@ -2,10 +2,16 @@
|
||||||
#include "config.hpp"
|
#include "config.hpp"
|
||||||
#include "eink.hpp"
|
#include "eink.hpp"
|
||||||
#include "io.hpp"
|
#include "io.hpp"
|
||||||
|
#include "lorahandler.hpp"
|
||||||
|
#include "tpl5110.hpp"
|
||||||
|
#include "pins.hpp"
|
||||||
|
#include <ArduinoJson.h>
|
||||||
|
|
||||||
logging::Logger logger;
|
logging::Logger logger;
|
||||||
Eink eink;
|
Eink eink;
|
||||||
IO io;
|
IO io;
|
||||||
|
LoraHandler lora;
|
||||||
|
TPL5110 tpl5110(TPL5110_DONE);
|
||||||
|
|
||||||
RTC_DATA_ATTR int bootCount = 0;
|
RTC_DATA_ATTR int bootCount = 0;
|
||||||
RTC_DATA_ATTR int updateCount = 0;
|
RTC_DATA_ATTR int updateCount = 0;
|
||||||
|
|
@ -22,6 +28,8 @@ void setup()
|
||||||
#ifndef DEBUG
|
#ifndef DEBUG
|
||||||
logger.setDebugLevel(logging::LoggerLevel::LOGGER_LEVEL_INFO);
|
logger.setDebugLevel(logging::LoggerLevel::LOGGER_LEVEL_INFO);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
tpl5110.setup(); // Initialize TPL5110 timer
|
||||||
io.setup_io();
|
io.setup_io();
|
||||||
io.set_low_power();
|
io.set_low_power();
|
||||||
|
|
||||||
|
|
@ -57,7 +65,29 @@ void setup()
|
||||||
eink.show_count(180 - 24 - 4 - 100 - 60, 12, (float)bootCount, "c: ");
|
eink.show_count(180 - 24 - 4 - 100 - 60, 12, (float)bootCount, "c: ");
|
||||||
eink.show_count(180 - 24 - 4 - 100 - 60 - 50, 12, (float)bootCount, "u: ");
|
eink.show_count(180 - 24 - 4 - 100 - 60 - 50, 12, (float)bootCount, "u: ");
|
||||||
eink.display(true);
|
eink.display(true);
|
||||||
|
|
||||||
|
// Initialize LoRa and send data
|
||||||
|
lora.setup();
|
||||||
|
|
||||||
|
// Create JSON payload
|
||||||
|
JsonDocument doc;
|
||||||
|
doc["temp"] = temp;
|
||||||
|
doc["battery"] = battery;
|
||||||
|
doc["boot"] = bootCount;
|
||||||
|
doc["update"] = updateCount;
|
||||||
|
|
||||||
|
String payload;
|
||||||
|
serializeJson(doc, payload);
|
||||||
|
|
||||||
|
logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "MAIN", "Sending LoRa payload: %s", payload.c_str());
|
||||||
|
lora.sendPacket(payload);
|
||||||
|
|
||||||
|
delay(1000); // Give time for transmission
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Signal TPL5110 that work is done - device will sleep
|
||||||
|
tpl5110.signalDone();
|
||||||
|
delay(100);
|
||||||
io.set_deep_sleep();
|
io.set_deep_sleep();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,13 +11,18 @@ const int EPD_RSET = 16;
|
||||||
const int EPD_DC = 17;
|
const int EPD_DC = 17;
|
||||||
const int EPD_CS = 5;
|
const int EPD_CS = 5;
|
||||||
|
|
||||||
// Pin assignments for LORA module
|
// Pin assignments for LORA module (SX1268 E22-400M22S)
|
||||||
const int RADIO_SCK = 5;
|
const int RADIO_SCK = 5;
|
||||||
const int RADIO_MISO = 19;
|
const int RADIO_MISO = 19;
|
||||||
const int RADIO_MOSI = 27;
|
const int RADIO_MOSI = 27;
|
||||||
const int RADIO_CS = 18; // CS --> NSS
|
const int RADIO_CS = 18; // CS --> NSS
|
||||||
const int RADIO_RST = 14;
|
const int RADIO_RST = 14;
|
||||||
const int RADIO_IRQ = 26; // IRQ --> DIO0
|
const int RADIO_IRQ = 26; // IRQ --> DIO0
|
||||||
|
const int RADIO_RXEN = 2; // RX Enable
|
||||||
|
const int RADIO_TXEN = 13; // TX Enable
|
||||||
|
|
||||||
|
// TPL5110 timer module
|
||||||
|
const int TPL5110_DONE = 15; // DONE signal
|
||||||
|
|
||||||
// Battery pin
|
// Battery pin
|
||||||
const int ADC_BATTERY = 35; //builtin = 35
|
const int ADC_BATTERY = 35; //builtin = 35
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,32 @@
|
||||||
|
#include "tpl5110.hpp"
|
||||||
|
#include "logger.h"
|
||||||
|
|
||||||
|
extern logging::Logger logger;
|
||||||
|
|
||||||
|
TPL5110::TPL5110(int donePin) : _donePin(donePin) {
|
||||||
|
}
|
||||||
|
|
||||||
|
void TPL5110::setup() {
|
||||||
|
logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "TPL5110", "Initializing TPL5110 timer!");
|
||||||
|
pinMode(_donePin, OUTPUT);
|
||||||
|
digitalWrite(_donePin, LOW); // DONE pin starts LOW
|
||||||
|
logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "TPL5110", "TPL5110 initialized!");
|
||||||
|
}
|
||||||
|
|
||||||
|
void TPL5110::signalDone() {
|
||||||
|
logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "TPL5110", "Signaling DONE to TPL5110!");
|
||||||
|
digitalWrite(_donePin, HIGH);
|
||||||
|
delay(100); // Hold HIGH for 100ms
|
||||||
|
digitalWrite(_donePin, LOW);
|
||||||
|
logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "TPL5110", "DONE signal sent - device will sleep now");
|
||||||
|
}
|
||||||
|
|
||||||
|
void TPL5110::setActive() {
|
||||||
|
logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "TPL5110", "TPL5110 set to ACTIVE");
|
||||||
|
digitalWrite(_donePin, LOW);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TPL5110::setInactive() {
|
||||||
|
logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "TPL5110", "TPL5110 set to INACTIVE");
|
||||||
|
digitalWrite(_donePin, HIGH);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,17 @@
|
||||||
|
#ifndef TPL5110_H
|
||||||
|
#define TPL5110_H
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
class TPL5110 {
|
||||||
|
public:
|
||||||
|
TPL5110(int donePin);
|
||||||
|
void setup();
|
||||||
|
void signalDone();
|
||||||
|
void setActive();
|
||||||
|
void setInactive();
|
||||||
|
private:
|
||||||
|
int _donePin;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* TPL5110_H */
|
||||||
Loading…
Reference in New Issue