Hallo,
ich hab da mal ein Problem!
seit ein paar Monaten hab ich ein TTGO Lora Modul montiert. Es nimmt die Pakete von diversen Nodes entgegen und gibt sie über MQTT an den RPi Server weiter.
Das Problem ist dass sich der TTGO, wenn er die Verbindung zum Wifi netz verliert, nicht mehr neu einwählt. Zusätzlich schmeisst er sich einmal pro woche aus dem netz(ich vermute routerbedingt)und dann muss ich ihn aus und neu anstecken und dann tut er auch wieder was er soll.
Könntet ihr so gut sein und mir mal über den code schauen, ich weiss nämlich nicht mehr was ich machen soll.
#include <WiFi.h>
#include <PubSubClient.h>
#include <RHDatagram.h>
#include <RH_RF95.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
//////////rfm95//////////
#define SERVER_ADDRESS 0xAA
#define TTGO_LORA_OLED
#ifdef ESP32_DOIT
#define SS 5
#define IRQ 4
#define led 2
#endif
#ifdef TTGO_LORA_OLED
#define SS 18
#define IRQ 26
#define led 25
#endif
RH_RF95 driver(SS, IRQ);
RHDatagram manager(driver, SERVER_ADDRESS);
//////////WiFi//////////
#define mqttClientID "ESP32LoRaGateway"
const char* ssid = "*********";
const char* password = "*********";
const char* mqtt_server = "192.168.178.50";
//const char* mqtt_server = "raspgateway";
char wifiHostname[ ] = "loraGatewayTTGO";
WiFiClient espClient;
PubSubClient client(espClient);
const char* mqttUser = "*******";
const char* mqttPass = "*******";
/*
//////////datenstruktur//////////
struct dataStruct {
uint8_t deviceID;
float temp ;
float hum;
uint8_t counter;
uint8_t finalizer;
} myData;
*/
//////////oled display//////////
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
void setup()
{
Serial.begin(9600); // Debugging only
//////////rfm95//////////
if (!manager.init())
Serial.println("init failed");
driver.setFrequency(868.0);
driver.setSpreadingFactor(10);
driver.setTxPower(10);
pinMode(led, OUTPUT);
//////////WiFi//////////
setup_wifi();
WiFi.setHostname(wifiHostname);
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
//////////oled display//////////
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128x32
Serial.println(F("SSD1306 allocation failed"));
for (;;); // Don't proceed, loop forever
}
display.setTextColor(WHITE);
display.clearDisplay();
display.println("initialise Server...");
display.println("Max msg length: ");
display.println(RH_RF95_MAX_MESSAGE_LEN);
display.setTextSize(1);
display.display();
delay(1000);
}
void loop()
{
//Serial.println("!");
if (!client.connected()) {
reconnect();
}
if (manager.available()) {
client.loop();
uint8_t buf[RH_RF95_MAX_MESSAGE_LEN];
uint8_t buflen = sizeof(buf);
uint8_t from;
if (manager.recvfrom(buf, &buflen, &from)) // Non-blocking
{
digitalWrite(led, HIGH);
Serial.print("buflen: ");
Serial.println(buflen);
driver.printBuffer("Got:", buf, buflen);
Serial.print("RSSI: ");
Serial.println(driver.lastRssi(), DEC);
//msg[i]=(char*) &buf[i];
uint8_t msg[buflen + 1];
for (int i = 0; i < buflen + 1; i++) {
msg[i] = (char) buf[i];
Serial.print("i: ");
Serial.print(i);
Serial.print(" *** ");
Serial.println(msg[i], BIN);
}
msg[buflen] = driver.lastRssi()*-1; //das letzte element im array wird die Empfangstärke als RSSI und das vorzeichen wird positiv gemacht
int flag = client.publish("sensor", msg, sizeof(msg));
Serial.print("publish done:");
Serial.println(flag);
//memcpy(&myData, buf, sizeof(myData));
showOnDisplay(from, buflen);
digitalWrite(led, LOW);
Serial.println("-----------------------------------------------------------------------------------");
}
}
}
void showOnDisplay(uint8_t _from, uint8_t _buflen) {
display.clearDisplay();
display.setCursor(0, 0);
display.print("got msg from: ");
display.println(_from, DEC);
display.print("msg length: ");
display.print(_buflen * 8);
display.println(" bit");
display.print("RSSI: ");
display.print(driver.lastRssi(), DEC);
display.display();
}
void setup_wifi() {
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
randomSeed(micros());
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
if (client.connect(mqttClientID, mqttUser, mqttPass)) {
Serial.println("connected!!");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(2000);
}
}
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
if ((char)payload[0] == '1') {
} else {
}
}
Vielen dank im voraus