Hallo allerseits,
seit ein paar Tagen ärgere ich mich mit einem Siemens Busankoppler (5WG1117-2AB12) und 2 verschiedenen Microcontrollern herum. Mein Ziel ist es, zur Belüftungssteuerung drei Servomotoren anzusteuern. Gerne auch mit ein paar kleineren Berechnungen im Microcontroller selbst. Dies ist jedoch nicht mein Problem.
Mein Problem besteht darin, Telegramme zu empfangen. Das Senden funktioniert einwandfrei. Ich verwende dazu das "KnxTpUart" von Throsten Gehrig in der Arudino API unter Linux. Als Microcontroller habe ich zum Testen den Seeeduino Xiao mit Logiklevelconverter (TXS0108E), bzw. einen Arduino Nano Clon von Elegoo ohne Logiklevelconverter. Als Grundlage habe ich mich am Video und an der Beschreibung von Matthias Kleine, bzw. seinem Blog "haus-automatisierung.com" orientiert.
Letzteren Microcontroller hatte ich eigentlich nur verwendet, um auszuschließen, dass das Problem am Logiklevelconverter liegt. Jedoch funktioniert das Senden ja auf beiden Geräten einwandfrei.
Folgender Sketch funktioniert auf dem Seeeduino Xiao bzgl Senden:
Folgendes funktioniert auf dem Arduino Nano Clon im Bereich Senden:
Und das funktioniert nicht was Empfang anbelangt am Xiao:
Und jenes funktioniert nicht am Nano:
Wenn ich das richtig ergoogled habe, kann der Xiao mit "void serialEvent()" nichts anfangen, der Nano aber schon. Der Xiao sollte "serial.available()" verwenden. Hätte ich das beim Nano enfernen sollen?
Mir fehlen komplett die Anhaltspunkte, wo ich starten kann und erhoffe mir hier, dass jemand da schon häufiger mit herumexperimentiert hat und mir bei meinen Startschwierigkeiten helfen kann.
Vielen Dank und schönen Abend!
Gruß
Georg
EDIT: Ein paar auskommentierte Dinge aus den Code-Schnipseln entfernt, um die Lesbarkeit zu verbessern.
seit ein paar Tagen ärgere ich mich mit einem Siemens Busankoppler (5WG1117-2AB12) und 2 verschiedenen Microcontrollern herum. Mein Ziel ist es, zur Belüftungssteuerung drei Servomotoren anzusteuern. Gerne auch mit ein paar kleineren Berechnungen im Microcontroller selbst. Dies ist jedoch nicht mein Problem.
Mein Problem besteht darin, Telegramme zu empfangen. Das Senden funktioniert einwandfrei. Ich verwende dazu das "KnxTpUart" von Throsten Gehrig in der Arudino API unter Linux. Als Microcontroller habe ich zum Testen den Seeeduino Xiao mit Logiklevelconverter (TXS0108E), bzw. einen Arduino Nano Clon von Elegoo ohne Logiklevelconverter. Als Grundlage habe ich mich am Video und an der Beschreibung von Matthias Kleine, bzw. seinem Blog "haus-automatisierung.com" orientiert.
Letzteren Microcontroller hatte ich eigentlich nur verwendet, um auszuschließen, dass das Problem am Logiklevelconverter liegt. Jedoch funktioniert das Senden ja auf beiden Geräten einwandfrei.
Folgender Sketch funktioniert auf dem Seeeduino Xiao bzgl Senden:
Code:
#include <Arduino.h> #include <KnxTpUart.h> #include <Servo.h> #define PHYSICAL_ADDRESS "1.0.61" #define INPUT_GROUP_ADDRESS "20/2/0" #define SERVOPIN 1 #define LED_OFF HIGH #define LED_ON LOW KnxTpUart knx(&Serial1, PHYSICAL_ADDRESS); Servo myservo;//create servo object to control a servo int pos = 90;//variable to store the servo position int led = LED_BUILTIN; void setup() { //Serial.begin(115200); // Start the hardware serial for USB communication Serial1.begin(19200, SERIAL_8E1); //while (!Serial); while (!Serial1); knx.uartReset(); myservo.attach(SERVOPIN); //attaches the servo on pin 1 to the servo object pinMode(led, OUTPUT); } void loop() { knx.groupWriteBool("20/2/1", true); //myservo.write(90); digitalWrite(led, LED_ON); //Serial.println("Test"); delay(3000); knx.groupWriteBool("20/2/1", false); //myservo.write(180); digitalWrite(led, LED_OFF); //Serial.println("Test2"); delay(3000); }
Folgendes funktioniert auf dem Arduino Nano Clon im Bereich Senden:
Code:
#include <Arduino.h> #include <KnxTpUart.h> #include <Servo.h> #define PHYSICAL_ADDRESS "1.0.61" #define INPUT_GROUP_ADDRESS "20/2/0" #define SERVOPIN 1 #define LED_OFF HIGH #define LED_ON LOW KnxTpUart knx(&Serial, PHYSICAL_ADDRESS); //Servo myservo;//create servo object to control a servo int pos = 90;//variable to store the servo position int led = LED_BUILTIN; void setup() { Serial.begin(19200, SERIAL_8E1); //while (!Serial); knx.uartReset(); // myservo.attach(SERVOPIN); //attaches the servo on pin 1 to the servo object pinMode(led, OUTPUT); } void loop() { knx.groupWriteBool("20/2/1", true); //myservo.write(90); digitalWrite(led, LED_ON); delay(3000); knx.groupWriteBool("20/2/1", false); //myservo.write(180); digitalWrite(led, LED_OFF); delay(3000); }
Code:
#include <Arduino.h> #include <KnxTpUart.h> #include <KnxTelegram.h> #include <Servo.h> #define PHYSICAL_ADDRESS "1.0.61" #define INPUT_GROUP_ADDRESS "20/2/0" #define OUTPUT_GROUP_ADDRESS "20/2/1" #define SERVOPIN 1 #define LED_OFF HIGH #define LED_ON LOW #define REFRESH_INTERVAL 10000 bool SERVOPOSITION = false; static unsigned long lastRefreshTime = 0; KnxTpUart knx(&Serial1, PHYSICAL_ADDRESS); Servo myservo; // create servo object to control a servo int pos = 90; // variable to store the servo position int led = LED_BUILTIN; void setup() { Serial.begin(115200); // USB Serial.println("Bla1"); Serial1.begin(19200, SERIAL_8E1); // Siemens seriell while (!Serial); // Warten auf USB Serial.println("Bla2"); while (!Serial1); // Warten auf Siemens Serial.println("Bla3"); knx.uartReset(); Serial.println("Bla4"); knx.addListenGroupAddress(INPUT_GROUP_ADDRESS); Serial.println("Bla5"); // delay(1000); Serial.println("Bla6"); myservo.attach(SERVOPIN); // attaches the servo on pin 1 to the servo object pinMode(led, OUTPUT); digitalWrite(led, LED_OFF); Serial.println("Setup done"); } void maintainKnxSerial() { if (Serial1.available() > 0) { KnxTpUartSerialEventType eType = knx.serialEvent(); if (eType == KNX_TELEGRAM) { Serial.println("Telegramm empfangen"); KnxTelegram* telegram = knx.getReceivedTelegram(); String target = String(0 + telegram->getTargetMainGroup()) + "/" + String(0 + telegram->getTargetMiddleGroup()) + "/" + String(0 + telegram->getTargetSubGroup()); Serial.print("Zieladresse: "); Serial.println(target); if (telegram->getCommand() == KNX_COMMAND_READ) { Serial.println("Leseanforderung erhalten"); // Antwort auf Leseanforderung if (target == OUTPUT_GROUP_ADDRESS) { knx.groupAnswerBool(OUTPUT_GROUP_ADDRESS, SERVOPOSITION); } } else if (telegram->getCommand() == KNX_COMMAND_WRITE) { Serial.println("Schreibanforderung erhalten"); // Schreibanforderung if (target == INPUT_GROUP_ADDRESS) { if (telegram->getBool()) { Serial.println("Servo auf Position 90 setzen"); SERVOPOSITION = true; myservo.write(90); digitalWrite(led, LED_ON); } else { Serial.println("Servo auf Position 180 setzen"); SERVOPOSITION = false; myservo.write(180); digitalWrite(led, LED_OFF); } } } } else { Serial.print("Kein KNX-Telegramm, Event-Type: "); Serial.println(eType); } } } void loop() { maintainKnxSerial(); // serialEvent1(); //Das funktioniert if (millis() - lastRefreshTime >= REFRESH_INTERVAL) { lastRefreshTime += REFRESH_INTERVAL; knx.groupWriteBool(OUTPUT_GROUP_ADDRESS, false); } }
Code:
#include <Arduino.h> #include <KnxTpUart.h> #define PHYSICAL_ADDRESS "1.0.61" #define CO2_REFRESH_INTERVAL 10000 #define CO2_PPM_GROUP_ADDRESS "20/5/5" //nur um die if schleife nicht zu verbeulen #define LED1_GROUP_ADDRESS "20/2/0" int LED1 = LED_BUILTIN; KnxTpUart knx(&Serial, PHYSICAL_ADDRESS); void setup() { // LED config pinMode(LED1, OUTPUT); digitalWrite(LED1, LOW); // KNX config Serial.begin(19200, SERIAL_8E1); knx.uartReset(); knx.addListenGroupAddress(LED1_GROUP_ADDRESS); } void serialEvent() { if (Serial.available() > 0) { KnxTpUartSerialEventType eType = knx.serialEvent(); if (eType == KNX_TELEGRAM) { KnxTelegram* telegram = knx.getReceivedTelegram(); String target = String(0 + telegram->getTargetMainGroup()) + "/" + String(0 + telegram->getTargetMiddleGroup()) + "/" + String(0 + telegram->getTargetSubGroup()); if (telegram->getCommand() == KNX_COMMAND_READ) { // Answer to Read if (target == CO2_PPM_GROUP_ADDRESS) { //knx.groupAnswer2ByteFloat(CO2_PPM_GROUP_ADDRESS, getCo2SensorPpm()); } } else if (telegram->getCommand() == KNX_COMMAND_WRITE) { // Write commands if (target == LED1_GROUP_ADDRESS) { //digitalWrite(LED1, telegram->getBool() ? HIGH : LOW); knx.groupWriteBool("20/2/1", true); } } } } } void loop() { // maintainKnxSerial(); }
Mir fehlen komplett die Anhaltspunkte, wo ich starten kann und erhoffe mir hier, dass jemand da schon häufiger mit herumexperimentiert hat und mir bei meinen Startschwierigkeiten helfen kann.
Vielen Dank und schönen Abend!
Gruß
Georg
EDIT: Ein paar auskommentierte Dinge aus den Code-Schnipseln entfernt, um die Lesbarkeit zu verbessern.
Kommentar