Fade/aufblenden

Guten Abend,

ich habe folgendes Problem:

Ich möchte mit Hilfe eines Arduinos - Kommunikation via Modbus - einen kleinen Verbraucher, in meinem Fall ein Lämpchen, dimmen.

Dazu habe ich in IPS eine Integer-Variable, in die ich einen Wert zwischen 0-255 schreiben kann - dies funktioniert soweit auch.
Nun möchte ich aber, dass ich das Lämpchen langsam ein- (und vielleicht auch) ausblenden kann. Dazu habe ich eine zweite Integer-Variable angelegt, in der ich die Zeit zum ein- bzw. ausblenden in Sekunden einstellen kann.

Leider hat mir die Forensuche nicht zum gewünschten Erfolg verholfen. Hat Jemand eine Idee, wie ich die Sache hinbekomme?

Zur Erläuterung des Codes:
$fadetime = INT mit Fadezeit in Sekunden,
$on = Bool für Lampe an/aus,
$wert = Int für gewünschten Helligkeitswert

Die kleine If-Abfrage ist quasi nur dazu da, dass ich einen gewünschten Helligkeitswert im Vorfeld auswähle und beim setzen der Bool-Variable das Lämpchen mit eben diesem Wert leuchtet (ich möchte die Lampe ungern über den Slider ein- bzw. ausschalten wollen…).

Zum faden an sich: ich stelle mit $wert den gewünschten Helligkeitswert z.B. 127 (50%) ein, wähle mit $fadetime eine Zeit von 5 Sekunden aus, setze $on auf ‚true‘ und das Lämpchen fährt innerhalb von 5 Sekunden von 0 auf 127.

Für die Hilfe möchte ich mich schon im Voraus recht herzlich bedanken.

MfG screamue




<?

$fadetime=GetValue(46274);
$on=GetValue(27791);
$wert=GetValue(53381);


if($on==true){
   ModBus_WriteRegisterWord(26690, $wert);

}else {
    ModBus_WriteRegisterWord(26690, 0);
    }
	
?>



Hallo,

kann Dir leider nicht helfen.
Wäre aber auch an der Lösung sehr interessiert!

Bin auch gerade da am ausprobieren, dachte erst
das der Atduino faden übernimmt. Hab aber dies
noch nicht hinbekommen.

Wie sieht den Ihr Arduino Code aus?
Dürfte ich mir diesen ansehen?

Gruß

Guten Morgen,

ich habe das jetzt mit einer einfachen for-Schelife wie folgt in IPS gelöst:


for($i=0; $i <= 255; $i++) {
   SetValue(38168 /*[Wohnzimmer\ArduinoMB\Beleuchtung\LED Stripe Pin6\rot]*/, $i); //Rot 
   IPS_Sleep($fadetime * 1000);  //Fadetime in Sekunden

Ein beispielhafter Arduino-Code zum Anst

Ich hoffe, ich konnte dir weiterhelfen;euern eines Ws2812b-LED-Stripes über Modbus würde dann so aussehen:

#include <SPI.h>
#include "DHT.h"
#include <Ethernet.h>
#include "Mudbus.h"
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
#define PIN 6 // Datenleitung an Pin 6


Adafruit_NeoPixel strip = Adafruit_NeoPixel(300, PIN, NEO_GRB + NEO_KHZ800);
Mudbus Mb;


float rot,gruen,blau;

void setup() 
{
 



  uint8_t mac[]     = { 0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX };
  uint8_t ip[]      = { XXX, XXX, XXX, XXX };
  uint8_t gateway[] = { XXX, XXX, XXX, XXX };
  uint8_t subnet[]  = { 255, 255, 255, 0 };
  Ethernet.begin(mac, ip, gateway, subnet);
  //Avoid pins 4,10,11,12,13 when using ethernet shield
  
  
  strip.begin();
  strip.show(); // Alle Pixel zu Beginn ausschalten
  

}

 
void loop() 

{

  




  
 strip.setPixelColor(0, (strip.Color(rot, gruen, blau)));
 strip.setPixelColor(1, (strip.Color(rot, gruen, blau)));
 strip.setPixelColor(2, (strip.Color(rot, gruen, blau)));
 strip.setPixelColor(3, (strip.Color(rot, gruen, blau)));
 strip.setPixelColor(4, (strip.Color(rot, gruen, blau)));
 strip.setPixelColor(5, (strip.Color(rot, gruen, blau)));
 strip.setPixelColor(6, (strip.Color(rot, gruen, blau)));
 strip.setPixelColor(7, (strip.Color(rot, gruen, blau)));
 strip.setPixelColor(8, (strip.Color(rot, gruen, blau)));
 strip.setPixelColor(9, (strip.Color(rot, gruen, blau)));
 strip.setPixelColor(10, (strip.Color(rot, gruen, blau)));
 
 strip.show();


 {
 } 
   
{

Mb.Run();




 
 //Analog Input
rot = Mb.R[10];
gruen = Mb.R[11];
blau = Mb.R[12];
}
}

 

MfG

Vielen Dank für die Antwort!

Das sieht ja gut aus! Und das Faden funktioniert wie gewollt?
Also wie ich sehe macht der Aduino ja beim Ihren Sketch auch nichts selbständig.
Dachte erst das ich das faden im Arduino konfigurieren muss !

Fadet Ihrer auch zwischen den Werten? Sagen wir mal von 50 zu 200 etc.?

Mein Arduino muss aber mir auch andere Daten zur Verfügung stellen.
(Pir´s etc.)

Da der IPS faden soll, denke das in mein Sketch noch kaum was rein muss.

So sieht er aus:

#include <SPI.h>
#include <Ethernet.h>

#include "Mudbus.h"

Mudbus Mb;
//Function codes 1(read coils), 3(read registers), 5(write coil), 6(write register)
//signed int Mb.R[0 to 125] and bool Mb.C[0 to 128] MB_N_R MB_N_C
//Port 502 (defined in Mudbus.h) MB_PORT

void setup()
{
  uint8_t mac[]     = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
  uint8_t ip[]      = { 192, 168, 178, 00 };
  uint8_t gateway[] = { 192, 168, 178, 1 };
  uint8_t subnet[]  = { 255, 255, 255, 0 };
  Ethernet.begin(mac, ip, gateway, subnet);


  //PWM Frequenz
  //0×01  1      31.374 KHz
  //0×02  8      3.921 Khz
  //0×03  64     490.1 Hz            // default
  //0×04  256    122.5 Hz
  //0×05  1024   30.63 Hz
  //http://playground.arduino.cc/Main/TimerPWMCheatsheet

  TCCR1A = (TCCR1A & 0xF8) | 0x01;
  TCCR0A = (TCCR0A & 0xF8) | 0x01;
  TCCR0B = (TCCR0B & 0xF8) | 0x01;
  TCCR2B = (TCCR2B & 0xF8) | 0x01;
  
  pinMode(0, INPUT); // Pin 0 des Mega (Digital)
  pinMode(1, INPUT); // Pin 1 des Mega (Digital)
  pinMode(2, OUTPUT); // Pin 2 des Mega
  pinMode(3, OUTPUT); // Pin 3 des Mega
  pinMode(4, OUTPUT); // Pin 4 des Mega
  pinMode(5, OUTPUT); // Pin 5 des Mega
  pinMode(6, OUTPUT); // Pin 6 des Mega
  pinMode(7, OUTPUT); // Pin 7 des Mega
  pinMode(8, OUTPUT); // Pin 8 des Mega
  pinMode(9, OUTPUT); // Pin 9 des Mega
  pinMode(11, OUTPUT); // Pin 11 des Mega
  pinMode(12, OUTPUT); // Pin 12 des Mega
  pinMode(13, OUTPUT); // Pin 13 des Mega
  pinMode(45, OUTPUT); // Pin 45 des Mega, Led 10 auf der Platine und Modbus
  pinMode(14, OUTPUT); // Pin 14 des Mega
  pinMode(15, INPUT); // Pin 15 des Mega
  pinMode(16, INPUT); // Pin 16 des Mega
  pinMode(17, INPUT); // Pin 17 des Mega
  pinMode(18, INPUT); // Pin 18 des Mega
  pinMode(19, INPUT); // Pin 19 des Mega
  pinMode(20, INPUT); // Pin 20 des Mega
  pinMode(21, INPUT); // Pin 21 des Mega
  pinMode(22, INPUT); // Pin 1 des Mega (Analog) Modbus = 22
  pinMode(23, INPUT); // Pin 2 des Mega (Analog) Modbus = 23
  pinMode(24, INPUT); // Pin 3 des Mega (Analog) Modbus = 24
  pinMode(25, INPUT); // Pin 4 des Mega (Analog) Modbus = 25
}

void loop()

{
  Mb.Run();

  //D2 Timer Pin0
  analogWrite(0, Mb.R[0]);
  //D2 Timer Pin1
  analogWrite(1, Mb.R[1]);
  //D2 Timer Pin2
  analogWrite(2, Mb.R[2]);
  //D3 Timer Pin3
  analogWrite(3, Mb.R[3]); 
  //D4 Timer Pin4
  analogWrite(4, Mb.R[4]); 
  //D5 Timer Pin5
  analogWrite(5, Mb.R[5]); 
  //D6 Timer Pin6
  analogWrite(6, Mb.R[6]); 
  //D7 Timer Pin7
  analogWrite(7, Mb.R[7]); 
  //D8 Timer Pin8
  analogWrite(8, Mb.R[8]); 
  //D9 Timer Pin9
  analogWrite(9, Mb.R[9]);
  //D10 Timer Pin45
  analogWrite(45, Mb.R[10]); 
  //D11 Timer Pin11
  analogWrite(11, Mb.R[11]); 
  //D12 Timer Pin12
  analogWrite(12, Mb.R[12]); 
  //D13 Timer Pin13
  analogWrite(13, Mb.R[13]);
  //D2 Timer Pin14
  analogWrite(14, Mb.R[14]);
  //D2 Timer Pin15
  analogWrite(15, Mb.R[15]);
  //D2 Timer Pin16
  analogWrite(16, Mb.R[16]);
  //D3 Timer Pin17
  analogWrite(17, Mb.R[17]); 
  //D4 Timer Pin18
  analogWrite(18, Mb.R[18]); 
  //D5 Timer Pin19
  analogWrite(19, Mb.R[19]); 
  //D6 Timer Pin20
  analogWrite(20, Mb.R[20]); 
  //D7 Timer Pin21
  analogWrite(21, Mb.R[21]);
  //D2 Timer Pin22 Analog 0
  analogWrite(22, Mb.R[22]);
  //D2 Timer Pin23 Analog 1
  analogWrite(23, Mb.R[23]);
  //D2 Timer Pin24 Analog 2
  analogWrite(24, Mb.R[24]);
  //D3 Timer Pin25 Analog 3
  analogWrite(25, Mb.R[25]); 
  
}

Mit ModbusView TCP kann ich die Werte ändern und auslesen.!

Bedanke mich nochmal für die Antwort!

Gruß

Hallo,

ja, bei mir funktioniert alles wie gewollt. Das faden von einem anderen Punkt aus ließe sich so realisieren, dass man den den aktuellen Wert der LED’s - in unserem Beispiel 50 am Anfang des IPS-Scriptes aus einer Variable einliest und eben diesen Wert als ‚Startwert‘ der For-Schleife nimmt. Funktioniert natürlich auch mit dem ‚Endwert‘.
Für mein Beispiel würde aus

for($i=0; $i <= 255; $i++) { 
   SetValue(38168 /*[Wohnzimmer\ArduinoMB\Beleuchtung\LED Stripe Pin6\rot]*/, $i); //Rot  
   IPS_Sleep($fadetime * 1000);  //Fadetime in Sekunden  

soetwas wie z.B.


$start = GetValue(47788);
$ende = GetValue(51233);

for($i=$start; $i <= $ende; $i++) { 
   SetValue(38168 /*[Wohnzimmer\ArduinoMB\Beleuchtung\LED Stripe Pin6\rot]*/, $i); //Rot  
   IPS_Sleep($fadetime * 1000);  //Fadetime in Sekunden  

werden.

MfG

Vielen Dank für die Antwort,

vielleicht schaffe ich es heute mal zu testen.
Hab eben ne SD Karte geholt, meine wollte nicht mehr. Nach ne Woche…

Hab auch eben gekämpft wie ich ein Pir auslesen kann, hab es aber auch noch nicht
hin bekommen. Dachte das der Pir beim auslösen eine 1 auf den Pin schreibt.
Da muss ich noch nachforschen.

Danke noch mal für die Tipps!

Gruß

Hallo,

habe eben probiert das Skript zu benutzen.

$start = GetValue(47788);
$ende = GetValue(51233);

for($i=$start; $i <= $ende; $i++) { 
   SetValue(38168 /*[Wohnzimmer\ArduinoMB\Beleuchtung\LED Stripe Pin6\rot]*/, $i); //Rot  
   IPS_Sleep($fadetime * 1000);  //Fadetime in Sekunden  

Bei Start und ende zu was gibt man die Gerätenummern ein?
SetValue ist dann das zu schaltende Gerät?

Den bei mir ist so, das ich 2 Ereignisse hab, ein mal für ein und andere für aus.
Da wird nur 1 oder eine 0 ausgewertet, bei 1 schreibt er 255 bei 0 eine null.

Vielleicht ist Ihr Aufbau etwas anders?

Die ID ´s hatte ich natürlich ausgetauscht gehabt.

Gruß

GetValue liest eine Variable aus und SetValue setzt eine Variable. Die ObjektID ist in dem Fall also die ObjektID der Variable.

Hallo,

hab hier mit Ausprobieren faden hinbekommen.
Dafür habe ich benötigt 2 Skripts und 2 extra Variablen.
Könnt Ihr mir nur mal sagen ob das der richtige Weg sei?

Danke euch schon mal.

Die beiden Scripts sehen so aus:

$start = GetValue(46838 /*[Außen Vorne\Hausnummernschild Pin4\Wert]*/);
$ende = GetValue(12782 /*[Außen Vorne\Hausnummernschild Pin4\Fade Ziel AN]*/);

for($i=$start; $i <= $ende; $i++) { 
   ModBus_WriteRegister(56308 /*[Außen Vorne\Hausnummernschild Pin4]*/, $i);
   IPS_Sleep(1);  //Fadetime in Sekunden  
$start = GetValue(22596 /*[Außen Vorne\Hausnummernschild Pin4\Fade Ziel AUS]*/);
$ende = GetValue(46838 /*[Außen Vorne\Hausnummernschild Pin4\Wert]*/);

for($i=$ende; $i >= $start; $i--) { 
   ModBus_WriteRegister(56308 /*[Außen Vorne\Hausnummernschild Pin4]*/, $i);
   IPS_Sleep(1);  //Fadetime in Sekunden  
}
?>

Edit:

Mit Bewegungsmelder will es nicht ganz gut funktionieren.
Wenn das Ziel erreicht ist flimmert es, oder wenn es runter fadet
und man in der Zeit den Bewegungsmelder auslöst flimmerts wieder.

Hallo,

versuche es gerade so zu Lösen, will auch net wirklich:

$wert = GetValue(46838 /*[Außen Vorne\Hausnummernschild Pin4\Wert]*/);
$tagnacht = GetValue(10476 /*[Location\Ist es Tag]*/);
$aus = GetValue(12106 /*[Außen Vorne\Hausnummernschild Pin4\AUS]*/);
$an = GetValue(18676 /*[Außen Vorne\Hausnummernschild Pin4\AN]*/);

if ($tagnacht == false) {
   for($i=$wert; $i <= $an; $i++) { 
   ModBus_WriteRegister(56308 /*[Außen Vorne\Hausnummernschild Pin4]*/, $i);
   IPS_Sleep(1);  //Fadetime in Sekunden   
   if ($tagnacht == true) {  
   for($i=$wert; $i >= $aus; $i--) { 
   ModBus_WriteRegister(56308 /*[Außen Vorne\Hausnummernschild Pin4]*/, $i);
   IPS_Sleep(1);  //Fadetime in Sekunden  
   }
}  
?>