MQTT ethernet gateway Works great for 3+ hours then stops
-
I've been doing a great deal of research on this and I think I might have found the issue.
It seems that the radio is very sensitive to power changes... In my original circuit I had the Arduino and the radio running from the 3.3v line. Since I moved it to the 5Volts line the Gateway has stayed up for over a day now.
So to sum up. Everything is now powered by 5Volts except the radio which is 3.3v from the LE33CZ-TR regulator. I have it powered direct from a USB power adapter as well rather than the Uno I did have.
Once I have etched and tested I will post the circuit and PCB layout.
-
-
-
I was still seeing it stop working. However after further diagnostics it seems the issue lies with the ethernet side of things, the Arduino and Radio still continue to function.
I tried to use the Arduino to reboot it's self, which didn't work, but also would not have rebooted the ethernet modules and thus would not have solved this.
I've ended up building a 555 timer circuit which is triggered from the Arduino (Digital pin 3), the time fires and triggers a relay to remove power from everything for 2 seconds. Thus we end up with a complete reboot.
Here's my circuit diagram, take 5Volts directly and then PWR is fed into my previous circuit that way when the relay clicks over all power to the Arduino and ethernet is removed.

-
Well it's very simple to detect if the network has gone away.
In the processEthernetMessage() function, it checks
if (client) {
if there's a client connection then the network must be working. If not then either the network has stopped or nothing is connected. Well OpenHAB always maintains a connection.
So I've just added the
} else {
part to say the connection has gone. I also setup a timeout by counting the micros() since boot. so it's not constantly firing the reboot.
I then raise digital pin 3 which is linked to my 555 timer circuit, which causes the power cycle.
unsigned long resetCounter = micros(); int rebootAborted = 0; void processEthernetMessages() { char inputString[MQTT_MAX_PACKET_SIZE] = ""; uint8_t inputSize = 0; EthernetClient client = server.available(); if (client) { resetCounter=micros(); if (rebootAborted) { Serial.println("Rebooting Aborted"); rebootAborted = 0; } while (client.available()) { char inChar = client.read(); inputString[inputSize] = inChar; inputSize++; } #ifdef TCPDUMP Serial.print("<<"); char buf[4]; for (uint8_t a=0; a<inputSize; a++) { sprintf(buf,"%02X ", (uint8_t)inputString[a]); Serial.print(buf); } Serial.println(""); #endif gw.processMQTTMessage(inputString, inputSize); } else { if ((micros() - resetCounter) >= 100000000 && !client.connected() && !rebootAborted) { rebootAborted = 1; Serial.println("Rebooting"); pinMode(3,OUTPUT); digitalWrite(3,HIGH); delay(100); digitalWrite(3,LOW); } } }

