Pram
December 3, 2014, 8:24am
1
Hey guys. I am now writing here, because no one answered to my question on the german forum.
My Problem:
I am using OpenHAB on a Raspberry Pi which is connected to my arduino mega via ethernet. The arduino is supposed to get commands of the pi and then switch lights with wireless sockets. The problem that I have is that the arduino does not work anymore after 2 or 3 hours. So now I am asking where the problem might be.
Pram
December 3, 2014, 8:25am
2
Here is the first bit of my code:
#include <SPI.h>
#include <UIPEthernet.h>
#include "PubSubClient.h"
#include <RCSwitch.h>
#include <OneWire.h>
#include <DallasTemperature.h>
// unkommemntieren um Debug-Modus zu aktivieren
//#define DEBUG
// --------------------------------
// Ethernet Server
// http://arduino.cc/de/Reference/Ethernet
// --------------------------------
EthernetClient ethClient;
// --------------------------------
// MQTT Client
// http://knolleary.net/arduino-client-for-mqtt/
// --------------------------------
byte MQTTserver[] = { 192, 168, 0, 1 };
PubSubClient MQTTClient(MQTTserver, 1883, callback, ethClient);
unsigned long time;
long previoustime = 0;
long MQTTTimer = 7200000; //2 Stunden
// --------------------------------
// LED Leiste
// --------------------------------
// Pins des RGB LED Lichts
int LEDredPIN=12;
int LEDgreenPIN=10;
int LEDbluePIN=11;
// Übermittelte Farbwerte
int LEDredValue = 0;
int LEDgreenValue = 0;
int LEDblueValue = 0;
// Gerade gesetzte Farbe
int LEDredCurrent = 0;
int LEDgreenCurrent = 0;
int LEDblueCurrent = 0;
// Timervariable für eine Verzögerung. Als alternative zu delay was die verarbeitung anhält.
int LEDtimer = 0;
int LEDendTimer = 50;
// --------------------------------
// RC-Switch
// https://code.google.com/p/rc-switch/
// --------------------------------
RCSwitch RCsender = RCSwitch();
String rcID = ""; // Übermittelte ID
String rcCommand = ""; // Übermittelter Befehl
char rcID1[6]; // ID erster Teil
char rcID2[6]; // ID zweiter Teil
// --------------------------------
// Temperatur
// http://milesburton.com/Main_Page?title=Dallas_Temperature_Control_Library
// http://www.pjrc.com/teensy/td_libs_OneWire.html
// --------------------------------
#define SENSOR_PIN 2 // Any pin 2 to 12 (not 13) and A0 to A5
OneWire temp(SENSOR_PIN);
unsigned long TEMPtimer;
unsigned long TEMPendTimer = 300000; // Schleifendurchläufe bis neue Abfrage startet
float tempC;
#define TEMPERATURE_PRECISION 9
DallasTemperature sensors(&temp);
DeviceAddress insideThermometer; // Variable zum zwischenspeichern der Adresse eines Sensors
//================================================================================================================
void setup()
//================================================================================================================
{
#ifdef DEBUG
Serial.begin(9600);
Serial.println("Basestation v1.0");
#endif
// --------------------------------
// LED Leiste
// --------------------------------
// Setzen der PINS als Ausgang
pinMode(LEDbluePIN, OUTPUT);
pinMode(LEDredPIN, OUTPUT);
pinMode(LEDgreenPIN, OUTPUT);
// Bei start Farbe Blau setzen
analogWrite(LEDredPIN, 0);
analogWrite(LEDgreenPIN, 0);
analogWrite(LEDbluePIN, 10);
// --------------------------------
// RC-Switch
// --------------------------------
RCsender.enableTransmit(40); //Arduino Pin #40
RCsender.setRepeatTransmit(15);
// --------------------------------
// Temperatur
// --------------------------------
sensors.begin();
sensors.getAddress(insideThermometer, 0);
sensors.setResolution(insideThermometer, 12);
byte addr[8];
temp.search(addr);
temp.reset_search();
// --------------------------------
// Ethernet Server
// --------------------------------
// Initialisierung des Ethernets
Ethernet.begin(addr);
if (Ethernet.begin(addr) == 0) {
// Wenn DHCP fehlschlägt dann rot setzen und aufhören
analogWrite(LEDredPIN, 100);
analogWrite(LEDgreenPIN, 0);
analogWrite(LEDbluePIN, 0);
while (true);
}
else {
// Wenn DHCP OK ist dann grün setzen
LEDgreenValue = 10;
#ifdef DEBUG
Serial.print("IP-Adresse:");
Serial.println(Ethernet.localIP());
#endif
}
}
Pram
December 3, 2014, 8:26am
3
This is the last bit:
//================================================================================================================
void loop(){
//================================================================================================================
// --------------------------------
// MQTT Client
// --------------------------------
// Aufbau der Verbindung mit MQTT falls diese nicht offen ist.
time = millis();
if (!MQTTClient.connected()) {
MQTTClient.connect("Basestation");
// Abonieren von Nachrichten mit dem angegebenen Topics
// MQTTClient.subscribe("/haus/moritz/ledkugel/RED/#");
// MQTTClient.subscribe("/haus/moritz/ledkugel/GREEN/#");
// MQTTClient.subscribe("/haus/moritz/ledkugel/BLUE/#");
MQTTClient.subscribe("/haus/moritz/ledkugel/#");
// RC Steckdosen Commands
MQTTClient.subscribe("/haus/RC/#");
}
Ethernet.maintain();
/* if(time - previoustime > MQTTTimer){
previoustime = time;
MQTTClient.disconnect();
delay(100);
MQTTClient.connect("Basestation");
MQTTClient.subscribe("/haus/moritz/ledkugel/#");
MQTTClient.subscribe("/haus/RC/#");
} */
// --------------------------------
// LED Leiste
// --------------------------------
if (LEDtimer <= LEDendTimer) LEDtimer++;
else {
LEDtimer = 0;
if (LEDredValue < LEDredCurrent) LEDredCurrent--;
else if (LEDredValue > LEDredCurrent) LEDredCurrent++;
if (LEDgreenValue < LEDgreenCurrent) LEDgreenCurrent--;
else if (LEDgreenValue > LEDgreenCurrent) LEDgreenCurrent++;
if (LEDblueValue < LEDblueCurrent) LEDblueCurrent--;
else if (LEDblueValue > LEDblueCurrent) LEDblueCurrent++;
}
analogWrite(LEDredPIN, LEDredCurrent);
analogWrite(LEDgreenPIN, LEDgreenCurrent);
analogWrite(LEDbluePIN, LEDblueCurrent);
// --------------------------------
// RC Steckdosen
// --------------------------------
if (rcID.length() == 10) {
#ifdef DEBUGDEBUG
Serial.println("ID : " + rcID);
#endif
rcID.toCharArray(rcID1,6);
rcID = rcID.substring(5,10);
rcID.toCharArray(rcID2,6);
if (rcCommand == "ON")RCsender.switchOn(rcID1, rcID2);
if (rcCommand == "OFF")RCsender.switchOff(rcID1, rcID2);
rcID = "";
}
// if (rcID.length() == 10)
if (rcID.length() == 5) {
#ifdef DEBUG
Serial.println("ID : " + rcID);
#endif
rcID.toCharArray(rcID1,6);
rcID = rcID.substring(5,10);
rcID.toCharArray(rcID2,6);
if (rcCommand == "ON") RCsender.switchOn(rcID1, 1);
if (rcCommand == "OFF")RCsender.switchOff(rcID1, 1);
rcID = "";
}
// if (rcID.length() == 6)
// --------------------------------
// Temperatur
// --------------------------------
if (TEMPtimer <= TEMPendTimer) TEMPtimer++;
else {
TEMPtimer = 0;
sensors.requestTemperatures();
// Bei Änderungen zum vorherigen Wert Publizieren
if (tempC != sensors.getTempCByIndex(0) ) {
tempC = sensors.getTempC(insideThermometer);
char tempbuf[4];
dtostrf(tempC, 2, 2, tempbuf);
//client.connect("Arduino-Mega");
MQTTClient.publish("/haus/moritz/temperatur", tempbuf);
#ifdef DEBUG
Serial.println("Temp: " + tempbuf);
#endif
} // TEMPSensor
} // else TEMPtimer
// --------------------------------
// MQTT Client Loop
// --------------------------------
MQTTClient.loop(); // Schleife für MQTT
}
//================================================================================================================
// Callback Funktion von MQTT. Die Funktion wird aufgerufen
// wenn ein Wert empfangen wurde.
//================================================================================================================
void callback(char* topic, byte* payload, unsigned int length) {
TEMPtimer = 0; // Wenn eine Nachricht kommt wird der Timer
// für die Temperatur auf 0 gesetzt um den Ablauf nicht zu Verzögern
// Zähler
int i = 0;
// Hilfsvariablen für die Convertierung der Nachricht in ein String
char message_buff[100];
// Kopieren der Nachricht und erstellen eines Bytes mit abschließender \0
for(i=0; i<length; i++) {
message_buff[i] = payload[i];
}
message_buff[i] = '\0';
// Konvertierung der nachricht in ein String
String msgString = String(message_buff);
String topString = String(topic);
#ifdef Debug
Serial.println("Topic: " + topString);
Serial.println("Msg : " + msgString);
#endif
// --------------------------------
// RC Steckdose
// --------------------------------
// Wenn das Topic mit "/haus/RC/" anfängt dann ID und Message ermitteln und schalten
if (topString.startsWith("/haus/RC/")) {
rcID = topString.substring(topString.lastIndexOf('/') + 1);
rcCommand = msgString;
} // if (topString.startsWith("/openHAB/wzRC/"))
// --------------------------------
// LED Leiste
// --------------------------------
// Überprüfung des Topics und setzen der Farbe je nach übermittelten Topic
if (topString == "/haus/moritz/ledkugel/RED") LEDredValue = round(msgString.toInt() * 2.55);
if (topString == "/haus/moritz/ledkugel/GREEN") LEDgreenValue = round(msgString.toInt() * 2.55);
if (topString == "/haus/moritz/ledkugel/BLUE") LEDblueValue = round(msgString.toInt() * 2.55);
} // void callback()