/* * * Benötigte Arduino version 1.5.4 * * * LED Bilderrahmen übertragung HEX Code als String um die X-te LED mit Y-te Farbe anzuzeigen FHEM Mit Farbübertragung: Gerät mit FHEM verbinden Name hier: LEDRahmen Dummy Hinzufügen define LEDRahmenSwitch dummy Notify Hinzufügen define LEDRahmenSwitchNotify notify LEDRahmenSwitch.* { sendLEDColor($EVTPART0, $EVTPART1) } in 99_myUtils.pm Methode hinzufügen sub sendLEDColor($$){ my ($stat,$val) = @_; my $tmp; $tmp .= changeLengthTo(hexstr_to_signed32int(substr($val,0,2)),3); $tmp .= "-"; $tmp .= changeLengthTo(hexstr_to_signed32int(substr($val,2,2)),3); $tmp .= "-"; $tmp .= changeLengthTo(hexstr_to_signed32int(substr($val,4,6)),3); #my $m = hexstr_to_signed32int($tmp); #Log 1, "MeinE Testmethode"; #Log 1, $; fhem("set LEDRahmen status".$stat." ".$tmp.""); } sub changeLengthTo($$){ my($str,$toLength) = @_; my $tmpstr; for(my $i = (length($str)+1); $i <= $toLength; $i++){ $tmpstr.= "0"; } return $tmpstr.$str; } sub hexstr_to_signed32int($) { my ($hexstr) = @_; die "Invalid hex string: $hexstr" if $hexstr !~ /^[0-9A-Fa-f]{1,8}$/; my $num = hex($hexstr); return $num >> 31 ? $num - 2 ** 32 : $num; } ///////////AUFRUF zur ANZEIGE in FHEM ////// //////////////////////////////////////////// //// set LEDRahmenSwitch 7 00FF00 ////////// //////////////////////////////////////////// //Definition set // //////////////////////////////////////////// funktion/ Ablauf: Farbe wird in Fhem in seine RGB werte zerlegt diese Werte werden als Int umgerechnet dann mit - separiert und als String an den Arduino übertragen BSP FF00FF: 255-0-255 Im Arduino wird es als String Empfangen mit der Methode getValue in die Einzelteile zerlegt dann mittels .toInt() als Zahl umgerechnet (typenkonvertierung) und dann mit leds[LEDID].r = Wert angesprochen und mit FastLED.show(); angezeigt. */ /////////////////////////////////////////////////////////////////////////// #include #include #include #include #include #include #include #include #include "FastLED.h" #define DATA_PIN 3 #define CLOCK_PIN 13 #define NUM_LEDS 19 CRGB leds[NUM_LEDS]; #define NUMBER_OF_OUTLETS 99 #define SN "LEDRahmenEG" #define SV "1.7" const byte SC_CHILD_ID = 0 ; //unsigned long receivedCode = 0 ; MySensor gw; MyMessage scene_on(SC_CHILD_ID, V_LEVEL); MyMessage scene_off(SC_CHILD_ID, V_LEVEL); void setup() { Serial.begin(115200); gw.begin(incomingMessage); gw.sendSketchInfo(SN, SV); FastLED.addLeds(leds, NUM_LEDS); //TEST //leds[9].g=1; //leds[9].b=255; //leds[10].r=255; //leds[11].b=255; //FastLED.show(); // Create a child device for each outlet for (int sensor = 1; sensor <= NUMBER_OF_OUTLETS; sensor++) { gw.present(sensor, S_LIGHT); delay(2); } } void loop() { gw.process(); } String getValue(String data, char separator, int index) { int found = 0; int strIndex[] = {0, -1}; int maxIndex = data.length() - 1; for (int i = 0; i <= maxIndex && found <= index; i++) { if (data.charAt(i) == separator || i == maxIndex) { found++; strIndex[0] = strIndex[1] + 1; strIndex[1] = (i == maxIndex) ? i + 1 : i; } } return found > index ? data.substring(strIndex[0], strIndex[1]) : ""; } //command has been received from gateway void incomingMessage(const MyMessage &message) { Serial.println(message.sensor); Serial.println("......."); Serial.println(message.getInt()); if (message.type == V_LIGHT) { Serial.print("LED ID #: "); Serial.println(message.sensor); Serial.print("Color: "); Serial.println(message.getString()); //receive String like 125-255-111 call getValue and split //.toInt() convert the String Number to int and would be assigned to the LED leds[message.sensor-1].r = getValue(message.getString(), '-', 0).toInt(); leds[message.sensor-1].g = getValue(message.getString(), '-', 1).toInt(); leds[message.sensor-1].b = getValue(message.getString(), '-', 2).toInt(); FastLED.show(); if (message.sensor == 99) { for (int i = 0; i < NUM_LEDS; ++i) { leds[i].r = getValue(message.getString(), '-', 0).toInt(); leds[i].g = getValue(message.getString(), '-', 1).toInt(); leds[i].b = getValue(message.getString(), '-', 2).toInt(); FastLED.show(); } } } delay(50); }