Fix LoRa not processing message that are not JSON Add also a non-JSON-message to the example
115 lines
3.1 KiB
C++
115 lines
3.1 KiB
C++
#include <LoRa.h>
|
|
#include <SPI.h>
|
|
#include <WiFi.h>
|
|
#include <Wire.h>
|
|
#include <stdio.h>
|
|
|
|
#include "SSD1306.h"
|
|
#include "rom/ets_sys.h"
|
|
#include "soc/rtc_cntl_reg.h"
|
|
#include "soc/sens_reg.h"
|
|
|
|
#define SCK 5 // GPIO5 -- SX1278's SCK
|
|
#define MISO 19 // GPIO19 -- SX1278's MISnO
|
|
#define MOSI 27 // GPIO27 -- SX1278's MOSI
|
|
#define SS 18 // GPIO18 -- SX1278's CS
|
|
#define RST 14 // GPIO14 -- SX1278's RESET
|
|
#define DI0 26 // GPIO26 -- SX1278's IRQ(Interrupt Request)
|
|
#define BAND 915E6
|
|
|
|
unsigned int counter = 0;
|
|
|
|
SSD1306 display(0x3c, 4, 15);
|
|
String rssi = "RSSI --";
|
|
String packSize = "--";
|
|
String packet;
|
|
|
|
float intTemperatureRead() {
|
|
SET_PERI_REG_BITS(SENS_SAR_MEAS_WAIT2_REG, SENS_FORCE_XPD_SAR, 3,
|
|
SENS_FORCE_XPD_SAR_S);
|
|
SET_PERI_REG_BITS(SENS_SAR_TSENS_CTRL_REG, SENS_TSENS_CLK_DIV, 10,
|
|
SENS_TSENS_CLK_DIV_S);
|
|
CLEAR_PERI_REG_MASK(SENS_SAR_TSENS_CTRL_REG, SENS_TSENS_POWER_UP);
|
|
CLEAR_PERI_REG_MASK(SENS_SAR_TSENS_CTRL_REG, SENS_TSENS_DUMP_OUT);
|
|
SET_PERI_REG_MASK(SENS_SAR_TSENS_CTRL_REG, SENS_TSENS_POWER_UP_FORCE);
|
|
SET_PERI_REG_MASK(SENS_SAR_TSENS_CTRL_REG, SENS_TSENS_POWER_UP);
|
|
ets_delay_us(100);
|
|
SET_PERI_REG_MASK(SENS_SAR_TSENS_CTRL_REG, SENS_TSENS_DUMP_OUT);
|
|
ets_delay_us(5);
|
|
float temp_f = (float)GET_PERI_REG_BITS2(SENS_SAR_SLAVE_ADDR3_REG,
|
|
SENS_TSENS_OUT, SENS_TSENS_OUT_S);
|
|
float temp_c = (temp_f - 32) / 1.8;
|
|
return temp_c;
|
|
}
|
|
|
|
void setup() {
|
|
pinMode(16, OUTPUT);
|
|
pinMode(2, OUTPUT);
|
|
|
|
digitalWrite(16, LOW); // set GPIO16 low to reset OLED
|
|
delay(50);
|
|
digitalWrite(16, HIGH); // while OLED is running, must set GPIO16 in high
|
|
|
|
Serial.begin(115200);
|
|
while (!Serial)
|
|
;
|
|
Serial.println();
|
|
Serial.println("LoRa Sender Test");
|
|
|
|
SPI.begin(SCK, MISO, MOSI, SS);
|
|
LoRa.setPins(SS, RST, DI0);
|
|
if (!LoRa.begin(BAND)) {
|
|
Serial.println("Starting LoRa failed!");
|
|
while (1)
|
|
;
|
|
}
|
|
|
|
Serial.println("init ok");
|
|
display.init();
|
|
display.flipScreenVertically();
|
|
display.setFont(ArialMT_Plain_10);
|
|
|
|
delay(1500);
|
|
}
|
|
|
|
void loop() {
|
|
display.clear();
|
|
display.setTextAlignment(TEXT_ALIGN_LEFT);
|
|
display.setFont(ArialMT_Plain_10);
|
|
|
|
display.drawString(0, 0, "Sending packet: ");
|
|
display.drawString(90, 0, String(counter));
|
|
|
|
String NodeId = WiFi.macAddress();
|
|
float temp = intTemperatureRead();
|
|
// send packet
|
|
LoRa.beginPacket();
|
|
// Build json string to send
|
|
String msg = "{\"model\":\"ESP32TEMP\",\"id\":\"" + NodeId + "\",\"tempc\":" + String(temp) + "}";
|
|
// Send json string
|
|
LoRa.print(msg);
|
|
LoRa.endPacket();
|
|
|
|
Serial.println(msg);
|
|
|
|
display.drawString(0, 15, String(NodeId));
|
|
display.drawString(0, 30, "tempc: " + String(temp) + " C");
|
|
display.display();
|
|
|
|
delay(5000);
|
|
|
|
// Send makerfab soil sensor example packet
|
|
LoRa.beginPacket();
|
|
String msg2 = "ID010770 REPLY : SOIL INEDX:5862 H:100.00 T:1.77 ADC:624 BAT:857";
|
|
LoRa.print(msg2);
|
|
LoRa.endPacket();
|
|
|
|
Serial.println(msg2);
|
|
|
|
counter++;
|
|
|
|
digitalWrite(2, HIGH); // turn the LED on (HIGH is the voltage level)
|
|
delay(1000); // wait for a second
|
|
digitalWrite(2, LOW); // turn the LED off by making the voltage LOW
|
|
delay(60000); // wait for 60 seconds
|
|
} |