Hi,
ich kenne den Stack hier jetzt nicht, aber könnte es sein, dass der langsamere Prozessor es nicht schafft, rechtzeitig ein ACK zu schicken? Dann werden die Telegramme wiederholt und so wären die Wiederholungen erklärbar.
Falls das der Fall ist, kannst Du das im Busmonitor (nicht Gruppenmonitor) checken.
Gruß, Waldemar
Ankündigung
Einklappen
Keine Ankündigung bisher.
ARDUINO am KNX
Einklappen
X
-
Hallo,
erstmal Danke für die Antworten und das Interesse an meinem Problem.
Ich habe das ganze auch schon ganz ohne Player versucht und nur eine LED für eine Sekunde angeschaltet. Der LED-An-Befehl wird auch mehrfach ausgeführt. Ich verstehe aber nicht warum. Mit dem 16Mhz-Arduino gibts auch hier keine Probleme.
Was das Stromversorgungsproblem angeht:
Der Player benötigt schnell zu viel Leistung, um über die BCU versorgt zu werden. Wenn man ihn mit an die BCU hängt und die Lautstärke etwas aufdreht, hat man gleich einen Reset. Ich habe jetzt zwar noch nicht nachgesehen wieviel man über den 20V Pin ziehen darf, aber ich werde vermutlich die ganze Schaltung über das Reserve-Adernpaar mit 24V versorgen. Die 24V kommen aus dem Verteiler und sind sowieso da. Mein Plan sieht also so aus:
Buskabel mit KNX und 24V Hilfsspannung.
KNX-Kabel - BCU - ADUM1201 - Arduino Pro Mini (3,3V 8Mhz) - DFPlayerMini (3,3V) - TPA3118 Endstufe (24V) - Einbaulautsprecher (8ohm)
Den Arduino und den Player speise ich aus einem kleinen 24V/3,3V StepDownConverter. Die Endstufe hängt direkt an den 24V. Mit dem Arduino kann man die Endstufe auf Standby schalten. Ich wollte den 3,3V/8Mhz Arduino nehmen weil der einfach weniger Strom benötigt. Ich wollte mir auch noch den Verbrauch vom Player anschauen. Eventuell kann man den auch noch abschalten bzw in Standby schicken.
Gruss,
Casim
Einen Kommentar schreiben:
-
Fody da ich seit geraumer Zeit das gleiche Projekt habe (jedoch ein anderes Problem) habe ich deinen Code schnell getestet (Pro Mini 5V) und exakt das gleiche Verhalten festgestellt. Beim Empfang der GA wir die MP3 3x gestartet, bei Betätigung mit einem Button klappt es wunderbar.
Mit einem Delay wars etwas besser aber das ist nicht optimal, wäre es möglich hier mit Glättung zu arbeiten?
Kannst du eventuell mal deinen Hardware Aufbau skizzieren oder beschreiben welche Teile du einsetzt?
Ich versuche es z.B. mit der Siemens BCU / Pro Mini 5V / DFPlayer Mini wobei der Arduino über die 5V der BCU läuft und der DF Player Mini an der 20V Schiene mit Spannungswandler und Kondensatoren. Genau da liegt aber das Problem denn die Kondensatoren brauchen beim Anschluss der BCU an den Bus sehr lange bis diese geladen sind sodass der DF Player nicht startet. Der Player alleine benötigt leider zuviel Strom.
Hätte jemand einen Tipp wie man das Versorgungsproblem sowie die Mehrfachbetätigung lösen kann?
Gruß Markus
Einen Kommentar schreiben:
-
Es hilft auch nicht den Arduino mit 5V laufen zu lassen oder einen Pegelwandler dazwischen zu hängen. Beides schon probiert. Kann es sein, dass die 8Mhz die Probleme verursachen?
Gruss,
Casim
Einen Kommentar schreiben:
-
Ohne mir das jetzt näher anzuschauen, würde ich sagen 3,3V sind nun mal nicht 5V!Zitat von Fody Beitrag anzeigenFolgendes Problem bekomme ich nicht gelöst:
Benutze ich einen 3,3V 8Mhz Arduino Pro Mini startet er mehrmals kurz nacheinander den Player beim Empfang der Gruppenadresse. Der abzuspielende Jingle beginnt mehrmals von vorne bis er dann komplett abgespielt wird.
Spiele ich den selben Sketch auf einen 5V 16Mhz Arduino Pro Mini funktioniert alles wie es soll. Telegramm kommt rein, Steuerbefahl geht raus, Jingle wird einmal abgespielt.
Wie hängt denn der Arduino am KNX? Der Busankoppler kann bestimmt nur 5V, oder?
Einen Kommentar schreiben:
-
Hallo,
bin neu hier, Arduino- und KNX-Anfänger, aber langjähriger und begeisterter Bastler.
Ich bastel gerade an einem kleinen Projekt rum. Dabei geht es um einen KNX gesteuerten, MP3 fähigen Türgong.
Letztendlich hängt ein Arduino Pro Mini an einem TP-Uart und lauscht den KNX-Bus ab. Bei der passenden Gruppenadresse gibt er einen Steuerbefehl über Softwareserial an ein MP3-Player-Modul (Mini-DF-Player). Daran hängt eine kleine Class-D Endstufe und ein Einbaulautsprecher.
Folgendes Problem bekomme ich nicht gelöst:
Benutze ich einen 3,3V 8Mhz Arduino Pro Mini startet er mehrmals kurz nacheinander den Player beim Empfang der Gruppenadresse. Der abzuspielende Jingle beginnt mehrmals von vorne bis er dann komplett abgespielt wird.
Spiele ich den selben Sketch auf einen 5V 16Mhz Arduino Pro Mini funktioniert alles wie es soll. Telegramm kommt rein, Steuerbefahl geht raus, Jingle wird einmal abgespielt.
Hier ist der Sketch (im Prinzip das Beispiel etwas umgeschrieben):
Wäre super wenn jemand mal überprüfen könnte, ob das ein generelles Problem ist, oder ob ich was falsch mache.
#include "KnxTpUart.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
KnxTpUart knx(&Serial, "1.1.2");
SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
const int LED = 13;
const int Volume = 15;
void setup() {
mySoftwareSerial.begin(9600);
myDFPlayer.begin(mySoftwareSerial);
myDFPlayer.volume(Volume); //Set volume value. From 0 to 30
pinMode(LED, OUTPUT);
digitalWrite(LED, LOW);
Serial.begin(19200, SERIAL_8E1);
UCSR0C = UCSR0C | B00100000;
knx.uartReset();
knx.addListenGroupAddress("2/2/2");
}
void loop() {
// nothing in the loop. This example is only to receive telegrams
}
void execute() {
digitalWrite(LED, HIGH);
myDFPlayer.play(1);
delay(1000);
digitalWrite(LED, LOW);
}
void serialEvent() {
KnxTpUartSerialEventType eType = knx.serialEvent();
if (eType == KNX_TELEGRAM) {
KnxTelegram* telegram = knx.getReceivedTelegram();
// Telegrammauswertung auf KNX (bei Empfang immer notwendig)
String target =
String(0 + telegram->getTargetMainGroup()) + "/" +
String(0 + telegram->getTargetMiddleGroup()) + "/" +
String(0 + telegram->getTargetSubGroup());
// Here you have the telegram and can do whatever you want
if (telegram->getCommand() == KNX_COMMAND_WRITE) {
// Auswertung des empfangenen KNX-Telegrammes mit Schreibbefehl (Flag) -> Aktion
if (target == "2/2/2") {
int received_2_2_2 = telegram->getBool();
if (received_2_2_2) {
execute();
}
}
}
}
}
Über Hilfe würde ich mich sehr freuen. Schon mal vielen Dank.
Gruss,
Casim
- Likes 1
Einen Kommentar schreiben:
-
Guten Abend zusammen,
ich hab jetzt bei meinem Projekt einen Arduino pro Mini in Gebrauch.
Das senden der Daten von ihm funktioniert auch, das Empfangen von einer Antwort (KNX_COMMAND_READ) klappt auch bis einschließlich Hauptgruppe 15.
Ich würde jedoch gerne über die HG 31 kommunizieren, hier macht der Arduino jedoch nichts bei den Anfragen.
Hatte jemand schon diesen Fall?
Meine erste Vermutung war der IP Router, hier hab ich die weiterleitung für alles schon aktiviert. Hat jedoch nichts gebracht.
Dake für die Hilfe schon einmal
Einen Kommentar schreiben:
-
Servus,
ich verwende einen Arduino Nano Every bei diesem erhalte ich mit PlatformIO einen Fehler bei KnxTelegram.cpp Zeile 357Diese Problem wurde ebenfalls auf https://www.arduinoforum.de/arduino-Thread-NodeMCU-KNX besprochen, die dortige Lösung funktioniert bei mir ebenfalls:Code:long m = round(v) & 0x7FF;
Gruß Christian.Code:long m = round(v); m = m & 0x7FF;
Zuletzt geändert von chdragonaut; 24.01.2021, 17:08.
Einen Kommentar schreiben:
-
Moin,
Ich habe ein Problem mit KnxTpUart von ThorstenGehrig, anfangs hat alle Problemlos funktioniert als ich mein Sketch denn erweitert habe schafft die bib es wohl nicht mehr richtig die middleGroup per substring zu lesen. Somit generiert er immer eine 0 statt einer wie angegebenen 1.
das währe der Sketch. Ist noch nicht fertig da ich noch mit case switch das ganze abarbeiten wollte.Code:#include <Arduino.h> #include <KnxTpUart.h> #include <EEPROM.h> #include <Adafruit_NeoPixel.h> #include <ColorConverterLib.h> #define LED_STRIP_PIN 6 #define LED_PIN 13 #define NUMPIXELS 500 #define DEBUG_MODE false Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, LED_STRIP_PIN, NEO_GRB + NEO_KHZ800); KnxTpUart knx(&Serial1, "1.1.77"); boolean WohnzimmerTrafoState; String WohnzimmerColorState; String BadColorState; char testListener[][20] = { {1, 1, 1} }; char listener[][20] = { "6/1/1", //Wohnzimmer Schalten 0 "6/1/2", //Bad Schalten 1 "6/1/14", //Wohnzimmer Dimmen 2 "6/1/16", //Bad Dimmen 3 "6/1/20", //Wohnzimmer Color Schalten 4 "6/1/23", //Bad Color Schalten 5 "6/1/50" //Wohnzimmer Trafo Schalten 6 }; char statis[][20] = { "6/4/1", //Wohnzimmer Status "6/4/2", //Bad Status "6/4/14", //Wohnzimmer Dimmen Status "6/4/16", //Bad Dimmen Status "6/4/20", //Wohnzimmer Color Status "6/4/23", //Bad Color Status "6/4/50" //Wohnzimmwe Trafo Status }; void addingListener() { for (size_t i = 0; i < sizeof(listener) / sizeof(listener[0]); i++) { knx.addListenGroupAddress(listener[i]); } for (size_t i = 0; i < sizeof(statis) / sizeof(statis[0]); i++) { knx.addListenGroupAddress(statis[i]); } } void readListener() { knx.groupRead(listener[6]); } boolean writeEEProm(byte index, byte value) { //only needed for short if //disable by debug mode if (!DEBUG_MODE) { EEPROM.write(index, value); } return true; } void checkEEPOM() { /* EEPROM 1 = Wohnzimmer State EEPROM 2 = Wohnzimmer Brightness EEPROM 3 = Wohnzimmer R EEPROM 4 = Wohnzimmer G EEPROM 5 = Wohnzimmer B EEPROM 10 = Bad State EEPROM 11 = Bad Brightness EEPROM 12 = Bad R EEPROM 13 = Bad G EEPROM 14 = Bad B EERPOM 20 = Trafostate */ delay(1000); // Wohnzimmer EEProm write EEPROM.read(1) == 255 && writeEEProm(1, 0); EEPROM.read(2) == 255 && writeEEProm(2, 30); EEPROM.read(3) == 255 && writeEEProm(3, 153); EEPROM.read(4) == 255 && writeEEProm(4, 4); EEPROM.read(5) == 255 && writeEEProm(5, 100); //Bad EEProm write EEPROM.read(10) == 255 && writeEEProm(10, 0); EEPROM.read(11) == 255 && writeEEProm(11, 30); EEPROM.read(12) == 255 && writeEEProm(12, 153); EEPROM.read(13) == 255 && writeEEProm(13, 4); EEPROM.read(14) == 255 && writeEEProm(14, 100); // Trafo EEPROM write EEPROM.read(20) == 255 && writeEEProm(20, 0); } void initilaizeStates() { //Wohnzimmer Trafo State WohnzimmerTrafoState = EEPROM.read(20) == 0 ? false : true; EEPROM.read(20) == 0 ? knx.groupWriteBool(listener[6], false) : knx.groupWriteBool(listener[6], true); //Wohnzimmer Status EEPROM.read(1) == 0 ? knx.groupWriteBool(listener[0], false) : knx.groupWriteBool(listener[0], true); EEPROM.read(1) == 0 ? knx.groupWriteBool(statis[0], false) : knx.groupWriteBool(statis[0], true); //Wohnzimmer Dimm Status knx.groupWrite2ByteInt(listener[2], EEPROM.read(2)); knx.groupWrite2ByteInt(statis[2], EEPROM.read(2)); //Wohnzimmer Color State WohnzimmerColorState = String(EEPROM.read(3)) + String(EEPROM.read(4)) + String(EEPROM.read(5)); knx.groupWrite14ByteText(listener[4], WohnzimmerColorState); knx.groupWrite14ByteText(statis[4], WohnzimmerColorState); //Bad Status EEPROM.read(10) == 0 ? knx.groupWriteBool(listener[1], false) : knx.groupWriteBool(listener[1], true); EEPROM.read(10) == 0 ? knx.groupWriteBool(statis[1], false) : knx.groupWriteBool(statis[1], true); //Bad Dimm Status knx.groupWrite2ByteInt(listener[3], EEPROM.read(11)); knx.groupWrite2ByteInt(statis[3], EEPROM.read(11)); //Bad Color State BadColorState = String(EEPROM.read(12)) + String(EEPROM.read(13)) + String(EEPROM.read(14)); knx.groupWrite14ByteText(listener[5], WohnzimmerColorState); knx.groupWrite14ByteText(statis[5], WohnzimmerColorState); } void setup() { pinMode(LED_PIN, OUTPUT); Serial1.begin(19200, SERIAL_8E1); checkEEPOM(); knx.uartReset(); initilaizeStates(); addingListener(); delay(1000); readListener(); pixels.begin(); } void loop() { } void showLeds(int startIndex, int maxIndex, uint8_t red, uint8_t blue, uint8_t green, int EEPromBrightness) { Serial.print(EEPROM.read(EEPromBrightness)); for (int i = startIndex; i <= 500; i++) { pixels.setPixelColor(i, pixels.Color(red, blue, green)); pixels.setBrightness(EEPROM.read(EEPromBrightness) ); pixels.show(); } } void showWohnzimmer() { uint8_t red; uint8_t green; uint8_t blue; ColorConverter::HexToRgb(WohnzimmerColorState, red, green, blue); EEPROM.read(3) != byte(red) && writeEEProm(3, byte(red)); EEPROM.read(4) != byte(green) && writeEEProm(4, byte(green)); EEPROM.read(5) != byte(blue) && writeEEProm(3, byte(blue)); showLeds(0, 237, red, blue, green, 2); } void showBad() { uint8_t red; uint8_t green; uint8_t blue; ColorConverter::HexToRgb(BadColorState, red, green, blue); EEPROM.read(12) != byte(red) && writeEEProm(12, byte(red)); EEPROM.read(13) != byte(green) && writeEEProm(13, byte(green)); EEPROM.read(14) != byte(blue) && writeEEProm(14, byte(blue)); showLeds(238, 370, red, green, blue, 11); } void serialEvent1() { //Aufruf knx.serialEvent() KnxTpUartSerialEventType eType = knx.serialEvent(); //Evaluation of the received telegram -> only KNX telegrams are accepted if (eType == KNX_TELEGRAM) { KnxTelegram *telegram = knx.getReceivedTelegram(); String target = String(0 + telegram->getTargetMainGroup()) + "/" + String(0 + telegram->getTargetMiddleGroup()) + "/" + String(0 + telegram->getTargetSubGroup()); // Evaluation of group address of the received telegram and caching in variable "target" if (telegram->getCommand() == KNX_COMMAND_ANSWER) { // Evaluation of the received KNX telegram with response to read request (flag) -> action if (target == listener[6]) { WohnzimmerTrafoState = telegram->getBool(); if (WohnzimmerTrafoState && (EEPROM.read(1) == 0 || EEPROM.read(10) == 0)) { //Trafo aus wenn keine leds an knx.groupWriteBool(listener[6], false); } else { if (EEPROM.read(1) == 1) { showWohnzimmer(); } if (EEPROM.read(10) == 1) { showBad(); } } } } //Write to bus if (telegram->getCommand() == KNX_COMMAND_WRITE) { Serial.print(target); //Wohnzimmer LED Status if (target == listener[0]) { Serial.print(EEPROM.read(20)); if (EEPROM.read(1) != telegram->getBool()) { telegram->getBool() ? writeEEProm(1, 1) : writeEEProm(1, 0); } if (telegram->getBool()) { EEPROM.read(20) == 0 && knx.groupWriteBool(listener[6], true); delay(1000); showWohnzimmer(); } if (!telegram->getBool()) { knx.groupWriteBool(listener[0], false); knx.groupWriteBool(statis[0], false); if (EEPROM.read(20) == 1 && EEPROM.read(10) == 0) { knx.groupWriteBool(listener[6], false); } } } //BAD LED Status if (target == listener[1]) { if (EEPROM.read(10) != telegram->getBool()) { telegram->getBool() ? writeEEProm(10, 1) : writeEEProm(10, 0); } if (telegram->getBool()) { EEPROM.read(20) == 0 && knx.groupWriteBool(listener[6], true); delay(1000); showBad(); } if (!telegram->getBool()) { knx.groupWriteBool(listener[1], false); knx.groupWriteBool(statis[1], false); if (EEPROM.read(20) == 1 && EEPROM.read(1) == 0) { knx.groupWriteBool(listener[6], false); } } } //Wohnzimmer Trafo Status if (target == listener[6]) { byte result = telegram->getBool() ? 1 : 0; if (EEPROM.read(20) != result) { telegram->getBool() ? writeEEProm(20, 1) : writeEEProm(20, 0); } if (result) { if (EEPROM.read(1) == 1) { showWohnzimmer(); } if (EEPROM.read(10) == 1) { showBad(); } } } //Wohnzimmer Dimmen Status if (target == listener[2]) { writeEEProm(2, telegram->get1ByteIntValue()); if (telegram->get1ByteIntValue() > 0) { if (EEPROM.read(1) == 0) { knx.groupWriteBool(listener[0], true); knx.groupWriteBool(statis[0], true); } showWohnzimmer(); } else { knx.groupWriteBool(listener[0], false); knx.groupWriteBool(statis[0], false); } } //Wohnzimmer Color Status if (target == listener[4]) { if (WohnzimmerColorState != telegram->get14ByteValue().substring(1)) { WohnzimmerColorState = telegram->get14ByteValue().substring(1); showWohnzimmer(); } } //Bad Dimmen Status if (target == listener[3]) { writeEEProm(11, telegram->get1ByteIntValue()); Serial.print(EEPROM.read(11)); if (telegram->get1ByteIntValue() > 0) { if (EEPROM.read(10) == 0) { knx.groupWriteBool(listener[1], true); knx.groupWriteBool(statis[1], true); } showBad(); } else { knx.groupWriteBool(listener[1], false); knx.groupWriteBool(statis[1], false); } } //Bad Color Status if (target == listener[5]) { if (BadColorState != telegram->get14ByteValue().substring(1)) { BadColorState = telegram->get14ByteValue().substring(1); showBad(); } } } //answer to read request if (telegram->getCommand() == KNX_COMMAND_READ) { //Wohnzimmer Trafo Status if (target == listener[6]) { knx.groupAnswerBool(listener[6], WohnzimmerTrafoState); } if (target == statis[6]) { knx.groupAnswerBool(statis[6], WohnzimmerTrafoState); } //Wohnzimmer Status if (target == listener[0]) { EEPROM.read(1) == 0 ? knx.groupAnswerBool(listener[0], false) : knx.groupAnswerBool(listener[0], true); } if (target == statis[0]) { EEPROM.read(1) == 0 ? knx.groupAnswerBool(statis[0], false) : knx.groupAnswerBool(statis[0], true); } //Wohnzimmer Dimmen Status if (target == listener[2]) { knx.groupAnswer2ByteFloat(listener[2], EEPROM.read(2)); } if (target == statis[2]) { knx.groupAnswer2ByteFloat(statis[2], EEPROM.read(2)); } //Wohnzimmer Color Status if (target == listener[4]) { knx.groupAnswer14ByteText(listener[4], "#" + WohnzimmerColorState); } if (target == statis[4]) { knx.groupAnswer14ByteText(statis[4], "#" + WohnzimmerColorState); } //Bad Status if (target == listener[1]) { EEPROM.read(10) == 0 ? knx.groupAnswerBool(listener[1], false) : knx.groupAnswerBool(listener[1], true); } if (target == statis[1]) { EEPROM.read(10) == 0 ? knx.groupAnswerBool(statis[1], false) : knx.groupAnswerBool(listener[1], true); } //Bad Dimmen Status if (target == listener[3]) { knx.groupAnswer2ByteFloat(listener[3], EEPROM.read(11)); } if (target == statis[3]) { knx.groupAnswer2ByteFloat(statis[3], EEPROM.read(11)); } //Bad Color Status if (target == listener[5]) { knx.groupAnswer14ByteText(listener[5], "#" + BadColorState); } if (target == statis[5]) { knx.groupAnswer14ByteText(statis[5], "#" + BadColorState); } } } }
Das Problem besteht schon in der initilaizeStates Methode wo er die werte eigentlich setzten sollte das er sie mit der falschen middelgroup an den Bus sendet.
Hat jemand eine idee wo da mein fehler liegen könnte?
PS. Board ist ein Ardoino leonardo
Gruß
Philipp
Einen Kommentar schreiben:
-
Delta6400
Das mit dem Auslöten habe ich nicht probiert, klingt aber auch nach einer Lösung (dann musst Du aber eine Alternative zum sketch-upload haben). Sicher gibt's noch andere Treiber als ein 7404, vielleicht ist das auch für den dann inoch vorhandenen CH340 ein Problem, dass sein Ausgang hochgezogen wird, hat aber bei mir funktioniert (wie auf dem Bild).Zitat von Delta6400 Beitrag anzeigenUnd ma kann dies lösen indem man entweder einen 7404TTL vor dem RX hängt oder den CH340 auslötet und dann mit Hilfe eines USB-zu-TTL Konverter Moduls den Arduino beschreibt?
- Likes 1
Einen Kommentar schreiben:
-
Das könnte schon sein dass da der TX dabei ist - das kannst Du doch einfach mit einem hochohmigen Multimeter durchklingeln.Zitat von Golfer Beitrag anzeigenHatte gehofft das wäre die Schnittstelle
Einen Kommentar schreiben:
-
Das dürften die Testpads sein, mit denen Siemens im Q-Check die Funktion der Platine überprüft oder die Firmware reinschießt.
Einen Kommentar schreiben:
-
Nochmal zum defektem TX Pin auf meiner Siemens Platine also am TPUART IC lässt es sich sehr bescheiden löten und aus Angst es völlig zu zerstören lasse ich es. Aber was sind das für 4 Kontakte (siehe Foto)
You do not have permission to view this gallery.
This gallery has 1 photos.
Einen Kommentar schreiben:


Einen Kommentar schreiben: