[MySensors] Ruban led RGB (RVB)

Vous avez créé un script LUA dont vous êtes fier, un .sh génial, un programme Python hors du commun, un Tuto, c'est ici que vous pouvez les partager.
deennoo
Messages : 4036
Inscription : 25 janv. 2015, 02:00

Re: [tuto] Ruban led RGB (RVB)

Message par deennoo »

Ah ouais nickel !!! Belle integration !

ah les chats tous les memes ! Dehors la nuit, dedans le jour....
De quoi se faire Plaisir et essayer d'aider...
http://www.domo-attitude.fr
Jeff
Messages : 1007
Inscription : 17 nov. 2016, 20:54
Localisation : Rennes (35)

Re: [tuto] Ruban led RGB (RVB)

Message par Jeff »

Pour apporter ma petite pierre à l'édifice, j'ai rajouté une fonction de clignotement (rouge, vert ou bleue). J'ai essayé d'être le plus propre possible, pour ne pas saccager le beau boulot de @Vil1driver.

Cela peut servir à signaler une alerte (fenêtre ouverte trop longtemps et/ou temp ext trop froide, porte de service ouverte > 20h le soir, on peut imaginer plein de chose sans vouloir une notification et en alertant les personnes vivant dans la maison d'une anomalie.

Code : Tout sélectionner

/**
 * The MySensors Arduino library handles the wireless radio link and protocol
 * between your home built sensors/actuators and HA controller of choice.
 * The sensors forms a self healing radio network with optional repeaters. Each
 * repeater and gateway builds a routing tables in EEPROM which keeps track of the
 * network topology allowing messages to be routed to nodes.
 *
 * Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
 * Copyright (C) 2013-2015 Sensnology AB
 * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
 *
 * Documentation: http://www.mysensors.org
 * Support Forum: http://forum.mysensors.org
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * version 2 as published by the Free Software Foundation.
 *
 *******************************
 *
 * REVISION HISTORY
 * Version 1.0 - Created by vil1driver
 * Version 2.0 - add a blink function by Jeff
 *
 * DESCRIPTION
 * RGB led strip controled with three dimmers + one On/Off for run/stop rgb color cycle + On/Off for blink for alert or message
 * 
 */
 
#define SN   "RGB Led strip 3D"
#define SV   "v2"

// Enable debug prints to serial monitor
#define MY_DEBUG 

// Enable and select radio type attached
#define MY_RADIO_NRF24
//#define MY_RADIO_RFM69

//#define MY_NODE_ID 5 // Sets a static id for a node

#include <SPI.h>
#include <MySensors.h>  

// Arduino pin attached to MOSFET Gate pin
#define RED_PIN 3   
#define GREEN_PIN 5
#define BLUE_PIN 6

// Choose your color for your blink : 3 RED, 5 GREEN, 6 BLUE
#define BLINK_PIN 6

// Define message name and type to send sensor info
MyMessage RedStatus(RED_PIN, V_DIMMER);   
MyMessage GreenStatus(GREEN_PIN, V_DIMMER);
MyMessage BlueStatus(BLUE_PIN, V_DIMMER);
MyMessage Status(1, V_DIMMER);
MyMessage rgbShowState(0, V_LIGHT);
MyMessage blinkState(2, V_LIGHT);
    
// Serial.print translate sensor id to sensor name
char color[][6] = {"","","","RED","","GREEN","BLUE"}; 
   
// Vars for rgbShow function
int redval = 0;
int greenval = 0;
int blueval = 0;
long time=0;
int isShow;

// Vars for blink function
unsigned long mtime=1000;  // memory time
unsigned int timeblinkOn=1000; // time blink On in ms
unsigned int timeblinkOff=1000; // time blink Off in ms
int blinkval=255; // value On led for blink
int isBlink=0; // for activate the blink, first is Off
   
void setup() 
{
  // Define pin mode (pin number, type)
  pinMode(RED_PIN, OUTPUT);   
  pinMode(GREEN_PIN, OUTPUT);
  pinMode(BLUE_PIN, OUTPUT);

  // Correct saved RGB value for first start
  saveState(RED_PIN, constrain((int8_t)loadState(RED_PIN), 0, 100)); 
  saveState(GREEN_PIN, constrain((int8_t)loadState(GREEN_PIN), 0, 100)); 
  saveState(BLUE_PIN, constrain((int8_t)loadState(BLUE_PIN), 0, 100)); 
             
  // Get value from eeprom and write to output
  analogWrite(RED_PIN, 255 * loadState(RED_PIN) / 100);     
  analogWrite(GREEN_PIN, 255 * loadState(GREEN_PIN) / 100);
  analogWrite(BLUE_PIN, 255 * loadState(BLUE_PIN) / 100);
         
  // Write some debug info
  Serial.print("Load from eeprom RED: "); 
  Serial.print(loadState(RED_PIN)); 
  Serial.println("%"); 
  Serial.print("Load from eeprom GREEN: "); 
  Serial.print(loadState(GREEN_PIN)); 
  Serial.println("%"); 
  Serial.print("Load from eeprom BLUE: "); 
  Serial.print(loadState(BLUE_PIN)); 
  Serial.println("%");  
  
  // Send RGB value to controler (request ack back: true/false)
  Serial.println("Send eeprom value to controler"); 
  send( RedStatus.set(loadState(RED_PIN)), false );    
  send( GreenStatus.set(loadState(GREEN_PIN)), false );
  send( BlueStatus.set(loadState(BLUE_PIN)), false );
  
  // Correct RGB show state for first start and load it (set to 'On' at first start)
  saveState(0, constrain((int8_t)loadState(0), 0, 1));
  isShow=loadState(0);
       
  // Send RGB show state to controler (request ack back: true/false)
  //send( rgbShowState.set(isShow), false);
  send( rgbShowState.set(1), false);

  if (isShow==1){Serial.println("RGB show running..."); }
  Serial.println("Ready to receive messages...");  
}

void presentation()  {
  // Present sketch (name, version)
  sendSketchInfo(SN, SV);        
       
  // Register sensors (id, type, description, ack back)
  present(RED_PIN, S_DIMMER, "RED", false);
  present(GREEN_PIN, S_DIMMER, "GREEN", false);
  present(BLUE_PIN, S_DIMMER, "BLUE", false);
  present(0, S_LIGHT, "Show button", false);
  present(2, S_LIGHT, "Blink", false);
}

void loop()
{
  
   // Run RGB show if is set
  if (isShow==1)
  {
      rgbShow();
    analogWrite(RED_PIN, redval);
    analogWrite(GREEN_PIN, greenval);
    analogWrite(BLUE_PIN, blueval);
   } 

  // Run blink
  if (isBlink==1 && isShow==0)
  {  
    analogWrite(BLINK_PIN , blinkval); // LED blink Pin On/Off
      
      if ( millis() >= mtime )  // If time is up
     { 
              
       if (blinkval==255)
       { 
       Serial.println("Blink On");
       mtime = millis() + timeblinkOn ;
       blinkval=0;
       }
       else if (blinkval==0)
       {
       Serial.println("Blink Off"); 
       mtime = millis() + timeblinkOff ; 
       blinkval=255;
      
       }     
     } 
   } 
}


void receive(const MyMessage &message)
{

  BlinkShowOff();   // all commands we stop the blink.
  
  if (message.isAck())
  {
    Serial.println("Got ack from gateway");
  }
  if (message.type == V_LIGHT)
  {
           
    // Incoming on/off command sent from controller ("1" or "0")
    int lightState = message.getString()[0] == '1';
  
    // if receive RGB Show On commands, start the show
    if (message.sensor==0 && lightState==1)
    {
    rgbShowOn(); 
    }
        // if receive RGB Show Off commands, stop the show
    else if (message.sensor==0 && lightState==0)
    {
    rgbShowOff();
    }

    // if receive Blink Show On commands, start the Blink
    else if (message.sensor==2 && lightState==1)
    { 
    rgbShowOff();
    BlinkShowOn();
    }
    
    // if receive Blink Show Off commands, stop the show
    else if (message.sensor==2 && lightState==0)
    { 
    BlinkShowOff();
    rgbShowOn();
    send( rgbShowState.set(1), false);
    }
       
    // if receive RGB switch On command
    else if (lightState==1)
    {
      // Write some debug info
            Serial.print("Incoming change for ");
            Serial.print(color[message.sensor]);
            Serial.println(": On");
            Serial.print("Load from eeprom: ");
          
      if ( loadState(message.sensor) == 0)
      {
        // Pick up last saved dimmer level from the eeprom
                analogWrite(message.sensor, 255 * loadState(10*message.sensor) / 100);
                // Save loaded value to current
                saveState(message.sensor, loadState(10*message.sensor));
                Serial.print(loadState(10*message.sensor)); 
                Serial.println("%");
                // Send value to controler
                Serial.println("Send value to controler");
                send(Status.setSensor(message.sensor).set(loadState(10*message.sensor)),false);
            }
            else
            {
                // Pick up last saved dimmer level from the eeprom
                analogWrite(message.sensor, 255 * loadState(message.sensor) / 100);
                Serial.print(loadState(message.sensor));
                Serial.println("%"); 
                // Send value to controler
                Serial.println("Send value to controler");
                send(Status.setSensor(message.sensor).set(loadState(message.sensor)),false);
            } 
            // Stop the show if it's running
            if (isShow==1){ rgbShowStop(message.sensor); }
        }
    // if recieve switch Off command
    else if (lightState==0)
    {
      // Write output to 0 (Off)
            analogWrite(message.sensor, 0);
            // Save old value to eeprom if it'was not zero
            if ( loadState(message.sensor) != 0 )
            {
                saveState(10*message.sensor, constrain((int8_t)loadState(message.sensor), 0, 100)); 
            }
            // Save new value to eeprom
            saveState(message.sensor, 0); 
            // Write some debug info
      Serial.print("Incoming change for ");
      Serial.print(color[message.sensor]);
      Serial.print(": ");
      Serial.println("Off");  
            Serial.print("Store old value: ");
            Serial.print(loadState(10*message.sensor));  
            Serial.println("%");
            // Send value to controler
            Serial.println("Send value to controler");
            send(Status.setSensor(message.sensor).set(loadState(message.sensor)),false);
      // Stop the show if it's running
      if (isShow==1){ rgbShowStop(message.sensor); }
    }
  }
  else if (message.type == V_DIMMER)
  {    
      uint8_t incomingDimmerStatus = message.getByte();
      // limits range of sensor values to between 0 and 100 
      incomingDimmerStatus = constrain((int8_t)incomingDimmerStatus, 0, 100);
      // Change Dimmer level
      analogWrite(message.sensor, 255 * incomingDimmerStatus / 100);
      //Save value to eeprom
      saveState(message.sensor, incomingDimmerStatus); 
      // Write some debug info
      Serial.print("Incoming change for ");
      Serial.print(color[message.sensor]);
      Serial.print(": ");
      Serial.print(incomingDimmerStatus);
      Serial.println("%");
        // Send value to controler
        Serial.println("Send value to controler");
        send(Status.setSensor(message.sensor).set(loadState(message.sensor)),false);
      // Stop the show if it's running
      if (isShow==1){ rgbShowStop(message.sensor); }
    }
}
   
void rgbShow()
{
  time = millis();
  redval = 128+250*cos(2*PI/300000*time);
  greenval = 128+250*cos(2*PI/300000*time-222);
  blueval = 128+250*cos(2*PI/300000*time-111);
  // limits range of sensor values to between 0 and 255 
  redval = constrain(redval, 0, 255);
  greenval = constrain(greenval, 0, 255);
  blueval = constrain(blueval, 0, 255);
}

void rgbShowOn()
{
  // define show On
  isShow=1;
  // Save state
  saveState(0, 1); 
  // Write some debug info
  Serial.println("Show must go on");
}

 
void rgbShowOff()
{
  // define show Off
  isShow=0;
  // Save state
  saveState(0, 0);
  // Save RGB value to eeprom
  saveState(RED_PIN, 100 * redval / 255); 
  saveState(GREEN_PIN, 100 * greenval / 255);
  saveState(BLUE_PIN, 100 * blueval / 255);
  // Write some debug info
  Serial.println("Stop the show");
  // Send actual RGB value and state to controler and request ack back (true/false)
  Serial.println("Send eeprom value to controler"); 
  send( RedStatus.set(loadState(RED_PIN)), false );    
  send( GreenStatus.set(loadState(GREEN_PIN)), false );
  send( BlueStatus.set(loadState(BLUE_PIN)), false );
  send( rgbShowState.set(0), false);
}

void rgbShowStop(int sensor)
{
   // define show Off
   isShow=0;
   // Save state
   saveState(0, 0);
   // Write some debug info
   Serial.println("Stop the show");
   // Send actual RGB value and state to controler and request ack back (true/false)
   Serial.println("Send eeprom value to controler"); 
   if (sensor != RED_PIN)
   {
        saveState(RED_PIN, 100 * redval / 255); 
        send( RedStatus.set(loadState(RED_PIN)), false );  
    }
    if (sensor != GREEN_PIN)
    {
        saveState(GREEN_PIN, 100 * greenval / 255); 
        send( GreenStatus.set(loadState(GREEN_PIN)), false );
    }
    if (sensor != BLUE_PIN)
    {
        saveState(BLUE_PIN, 100 * blueval / 255);
        send( BlueStatus.set(loadState(BLUE_PIN)), false );
    }
    send( rgbShowState.set(0), false);
}

void BlinkShowOn()
{
    //  On the Blink led, Off other, before begin the blink show
   if (BLINK_PIN == RED_PIN)
   {
   analogWrite(RED_PIN, 255);
   analogWrite(GREEN_PIN, 0);
   analogWrite(BLUE_PIN, 0);
   }
   else if (BLINK_PIN == GREEN_PIN)
   {
   analogWrite(RED_PIN, 0);
   analogWrite(GREEN_PIN, 255);
   analogWrite(BLUE_PIN, 0);
   }
   else
   {
   analogWrite(RED_PIN, 0);
   analogWrite(GREEN_PIN, 0);
   analogWrite(BLUE_PIN, 255);
   }
  
  // define show On
  isBlink=1;
  // Save state
  saveState(2, 1); 
  // Write some debug info
  Serial.println("Blink show on");
  send( blinkState.set(1), false);
}

void BlinkShowOff()
{
  // define show On
  isBlink=0;
  // Save state
  saveState(2, 0); 
  // Write some debug info
  Serial.println("Blink show off");
  send( blinkState.set(0), false);
 }
Version: 2023.1 sur VM Synology, docker Zwave Js UI (Z-stick GEN5, Fibaro...), Zigbeefordomoticz. Nextion RGB Led Screen
gawel3164
Messages : 325
Inscription : 07 janv. 2016, 19:51

Re: [tuto] Ruban led RGB (RVB)

Message par gawel3164 »

Merci Jeff pour cette fonctionnalité supplémentaire!! :)
Domoticz 2022.1/RFlink V1.1_R48/ prises: DIO, SCS/caméras IP/station météo Auriol/sondes Oregon/PIR/ZK1PA/Relevé compteur Gaz/téléinfo EDF/Mysensors:RGB-3D,Temp.,IR/Arrosage autonome/Google home/ ESP: IR,Temp.,relai,distance,OLED/Withings Ws30
Gimlur
Messages : 2
Inscription : 24 janv. 2017, 19:34

Re: [tuto] Ruban led RGB (RVB)

Message par Gimlur »

Bonjour à tous,

débutant dans le langage Arduino, quelqu'un peut-il éclairer ma lanterne ?

Je travaille sur ce sketch pour y rajouter des fonctionnalités et je me pose une question sur cette ligne :

Code : Tout sélectionner

int lightState = message.getString()[0] == '1';
Quelle en est la signification ?
Une affectation '=' suivi d'une comparaison '==' ça donne quoi ? ;)

Merci pour votre éclairage RGB LED bien sur :lol:
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: [tuto] Ruban led RGB (RVB)

Message par vil1driver »

la variable prend la valeur de la comparaison tout simplement ;) donc soit true soit false donc soit 1 soit 0
MAJ = VIDER LE CACHE(<-Clicable)
/!\Les mises à jour de Domoticz sont souvent sources de difficultés, ne sautez pas dessus
modules.lua

Un ex domoticzien
Gimlur
Messages : 2
Inscription : 24 janv. 2017, 19:34

Re: [tuto] Ruban led RGB (RVB)

Message par Gimlur »

Merci vil1driver.
Donc si je traduis :
si message.getString()[0] renvoi 1 donc == à 1 alors lightstate=1 sinon lightstate=0 :P
jule1986
Messages : 68
Inscription : 02 nov. 2015, 18:30
Localisation : Loiret (45)

Re: [tuto] Ruban led RGB (RVB)

Message par jule1986 »

Bonjour a tous,
Je souhaiterais savoir si certain on rajouter le support du blanc a ce script ? sachant que normalement il n'y a plus de pin PWM de libre, il faut modifier le câblage du NRF24L01...

Apres avoir cherché un peu j'ai modifié (un peu) le script.... je ne sais pas encore si il est fonctionnel (je n'ai pas encore tout reçu).

Le voici, dite moi ce que vous en pensez svp :

Code : Tout sélectionner

/**
 * The MySensors Arduino library handles the wireless radio link and protocol
 * between your home built sensors/actuators and HA controller of choice.
 * The sensors forms a self healing radio network with optional repeaters. Each
 * repeater and gateway builds a routing tables in EEPROM which keeps track of the
 * network topology allowing messages to be routed to nodes.
 *
 * Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
 * Copyright (C) 2013-2015 Sensnology AB
 * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
 *
 * Documentation: http://www.mysensors.org
 * Support Forum: http://forum.mysensors.org
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * version 2 as published by the Free Software Foundation.
 *
 *******************************
 *
 * REVISION HISTORY
 * Version 1.0 - Created by vil1driver
 * 
 * DESCRIPTION
 * RGB led strip controled with three dimmers + one On/Off for run/stop rgb color cycle :p
 * 
 */
 
#define SN   "RGBW Led strip 3D"
#define SV   "v1 RGBW"

// Load mysensors library	
#include <MySensor.h>	
// Load Serial Peripheral Interface library  
#include <SPI.h>

// Arduino pin attached to MOSFET Gate pin
#define RED_PIN 3 	
#define GREEN_PIN 5
#define BLUE_PIN 6
#define WHITE_PIN 9
// MySensor gw;	

// change the pins to free up the pwm pin for led control
#define RF24_CE_PIN   4 //<-- NOTE!!! changed, the default is 9
#define RF24_CS_PIN   10  // default is 10
#define RF24_PA_LEVEL RF24_PA_MAX

MyTransportNRF24 transport(RF24_CE_PIN, RF24_CS_PIN, RF24_PA_LEVEL);
MySensor gw(transport);  

// Define message name and type to send sensor info
MyMessage RedStatus(RED_PIN, V_DIMMER);		
MyMessage GreenStatus(GREEN_PIN, V_DIMMER);
MyMessage BlueStatus(BLUE_PIN, V_DIMMER);
MyMessage WhiteStatus(WHITE_PIN, V_DIMMER);
MyMessage Status(1, V_DIMMER);
MyMessage rgbShowState(0, V_LIGHT);
    
// Serial.print translate sensor id to sensor name
char color[][6] = {"","","","RED","","GREEN","BLUE"};	
   
// Vars for rgbShow function
int redval = 0;
int greenval = 0;
int blueval = 0;
long time=0;
int isShow;
     
void setup() 
{
  // Initializes the sensor node (Callback function for incoming messages, node id, is repeater)
  gw.begin(incomingMessage, 31, true);		
       
  // Present sketch (name, version)
  gw.sendSketchInfo(SN, SV);				
       
  // Register sensors (id, type, description, ack back)
  gw.present(RED_PIN, S_DIMMER, "present RED light", false);
  gw.present(GREEN_PIN, S_DIMMER, "present GREEN light", false);
  gw.present(BLUE_PIN, S_DIMMER, "present BLUE light", false);
  gw.present(WHITE_PIN, S_DIMMER, "present WHITE light", false);
  gw.present(0, S_LIGHT, "present Show button", false);

  // Define pin mode (pin number, type)
  pinMode(RED_PIN, OUTPUT);		
  pinMode(GREEN_PIN, OUTPUT);
  pinMode(BLUE_PIN, OUTPUT);
  pinMode(WHITE_PIN, OUTPUT);

  // Correct saved RGB value for first start
  gw.saveState(RED_PIN, constrain((int8_t)gw.loadState(RED_PIN), 0, 100)); 
  gw.saveState(GREEN_PIN, constrain((int8_t)gw.loadState(GREEN_PIN), 0, 100)); 
  gw.saveState(BLUE_PIN, constrain((int8_t)gw.loadState(BLUE_PIN), 0, 100));
  gw.saveState(WHITE_PIN, constrain((int8_t)gw.loadState(WHITE_PIN), 0, 100)); 
             
  // Get value from eeprom and write to output
  analogWrite(RED_PIN, 255 * gw.loadState(RED_PIN) / 100); 		
  analogWrite(GREEN_PIN, 255 * gw.loadState(GREEN_PIN) / 100);
  analogWrite(BLUE_PIN, 255 * gw.loadState(BLUE_PIN) / 100);
  analogWrite(WHITE_PIN, 255 * gw.loadState(WHITE_PIN) / 100);
         
  // Write some debug info
  Serial.print("Load from eeprom RED: "); 
  Serial.print(gw.loadState(RED_PIN)); 
  Serial.println("%"); 
  Serial.print("Load from eeprom GREEN: "); 
  Serial.print(gw.loadState(GREEN_PIN)); 
  Serial.println("%"); 
  Serial.print("Load from eeprom BLUE: "); 
  Serial.print(gw.loadState(BLUE_PIN)); 
  Serial.println("%");  
  Serial.print("Load from eeprom WHITE: "); 
  Serial.print(gw.loadState(WHITE_PIN)); 
  Serial.println("%");  
  
  
  // Send RGB value to controler (request ack back: true/false)
  Serial.println("Send eeprom value to controler"); 
  gw.send( RedStatus.set(gw.loadState(RED_PIN)), false );    
  gw.send( GreenStatus.set(gw.loadState(GREEN_PIN)), false );
  gw.send( BlueStatus.set(gw.loadState(BLUE_PIN)), false );
  gw.send( WhiteStatus.set(gw.loadState(WHITE_PIN)), false );
    
  // Correct RGB show state for first start and load it (set to 'On' at first start)
  gw.saveState(0, constrain((int8_t)gw.loadState(0), 0, 1));
  isShow=gw.loadState(0);
       
  // Send RGB show state to controler (request ack back: true/false)
  gw.send( rgbShowState.set(isShow), false);
  
  if (isShow==1){Serial.println("RGB show running..."); }
  Serial.println("Ready to receive messages...");  
}

void loop()
{
  // Process incoming messages (like config and light state from controller)
  gw.process();		
      
  // Run RGB show if is set
  if (isShow==1)
  {
    	rgbShow();
  	analogWrite(RED_PIN, redval);
  	analogWrite(GREEN_PIN, greenval);
  	analogWrite(BLUE_PIN, blueval);
   } 
}


void incomingMessage(const MyMessage &message)
{
  if (message.isAck())
  {
   	Serial.println("Got ack from gateway");
  }
  if (message.type == V_LIGHT)
  {
  	// Incoming on/off command sent from controller ("1" or "0")
  	int lightState = message.getString()[0] == '1';
  
  	// if receive RGB Show On commands, start the show
  	if (message.sensor==0 && lightState==1){ rgbShowOn();	}
        // if receive RGB Show Off commands, stop the show
  	else if (message.sensor==0 && lightState==0){	rgbShowOff();	}
       
  	// if receive RGB switch On command
  	else if (lightState==1)
  	{
  		// Write some debug info
          	Serial.print("Incoming change for ");
          	Serial.print(color[message.sensor]);
          	Serial.println(": On");
          	Serial.print("Load from eeprom: ");
          
  		if ( gw.loadState(message.sensor) == 0)
  		{
  			// Pick up last saved dimmer level from the eeprom
            		analogWrite(message.sensor, 255 * gw.loadState(10*message.sensor) / 100);
            		// Save loaded value to current
            		gw.saveState(message.sensor, gw.loadState(10*message.sensor));
            		Serial.print(gw.loadState(10*message.sensor)); 
            		Serial.println("%");
            		// Send value to controler
            		Serial.println("Send value to controler");
            		gw.send(Status.setSensor(message.sensor).set(gw.loadState(10*message.sensor)),false);
          	}
          	else
          	{
            		// Pick up last saved dimmer level from the eeprom
            		analogWrite(message.sensor, 255 * gw.loadState(message.sensor) / 100);
            		Serial.print(gw.loadState(message.sensor));
            		Serial.println("%"); 
            		// Send value to controler
            		Serial.println("Send value to controler");
            		gw.send(Status.setSensor(message.sensor).set(gw.loadState(message.sensor)),false);
          	} 
          	// Stop the show if it's running
          	if (isShow==1){ rgbShowStop(message.sensor); }
        }
  	// if recieve switch Off command
  	else if (lightState==0)
  	{
  		// Write output to 0 (Off)
          	analogWrite(message.sensor, 0);
          	// Save old value to eeprom if it'was not zero
          	if ( gw.loadState(message.sensor) != 0 )
          	{
            		gw.saveState(10*message.sensor, constrain((int8_t)gw.loadState(message.sensor), 0, 100)); 
          	}
          	// Save new value to eeprom
          	gw.saveState(message.sensor, 0); 
          	// Write some debug info
  		Serial.print("Incoming change for ");
  		Serial.print(color[message.sensor]);
  		Serial.print(": ");
  		Serial.println("Off");	
          	Serial.print("Store old value: ");
          	Serial.print(gw.loadState(10*message.sensor));  
          	Serial.println("%");
          	// Send value to controler
          	Serial.println("Send value to controler");
          	gw.send(Status.setSensor(message.sensor).set(gw.loadState(message.sensor)),false);
  		// Stop the show if it's running
  		if (isShow==1){ rgbShowStop(message.sensor); }
  	}
  }
  else if (message.type == V_DIMMER)
  {    
    	uint8_t incomingDimmerStatus = message.getByte();
    	// limits range of sensor values to between 0 and 100 
    	incomingDimmerStatus = constrain((int8_t)incomingDimmerStatus, 0, 100);
    	// Change Dimmer level
    	analogWrite(message.sensor, 255 * incomingDimmerStatus / 100);
    	//Save value to eeprom
    	gw.saveState(message.sensor, incomingDimmerStatus); 
    	// Write some debug info
    	Serial.print("Incoming change for ");
    	Serial.print(color[message.sensor]);
    	Serial.print(": ");
    	Serial.print(incomingDimmerStatus);
    	Serial.println("%");
        // Send value to controler
        Serial.println("Send value to controler");
        gw.send(Status.setSensor(message.sensor).set(gw.loadState(message.sensor)),false);
    	// Stop the show if it's running
    	if (isShow==1){ rgbShowStop(message.sensor); }
    }
}
   
void rgbShow()
{
  time = millis();
  redval = 128+250*cos(2*PI/300000*time);
  greenval = 128+250*cos(2*PI/300000*time-222);
  blueval = 128+250*cos(2*PI/300000*time-111);
  // limits range of sensor values to between 0 and 255 
  redval = constrain(redval, 0, 255);
  greenval = constrain(greenval, 0, 255);
  blueval = constrain(blueval, 0, 255);
}

void rgbShowOn()
{
  // define show On
  isShow=1;
  // Save state
  gw.saveState(0, 1); 
  // Write some debug info
  Serial.println("Show must go on");
}
   
void rgbShowOff()
{
  // define show Off
  isShow=0;
  // Save state
  gw.saveState(0, 0);
  // Save RGB value to eeprom
  gw.saveState(RED_PIN, 100 * redval / 255); 
  gw.saveState(GREEN_PIN, 100 * greenval / 255);
  gw.saveState(BLUE_PIN, 100 * blueval / 255);
  // Write some debug info
  Serial.println("Stop the show");
  // Send actual RGB value and state to controler and request ack back (true/false)
  Serial.println("Send eeprom value to controler"); 
  gw.send( RedStatus.set(gw.loadState(RED_PIN)), false );    
  gw.send( GreenStatus.set(gw.loadState(GREEN_PIN)), false );
  gw.send( BlueStatus.set(gw.loadState(BLUE_PIN)), false );
  gw.send( rgbShowState.set(0), false);
}

void rgbShowStop(int sensor)
{
   // define show Off
   isShow=0;
   // Save state
   gw.saveState(0, 0);
   // Write some debug info
   Serial.println("Stop the show");
   // Send actual RGB value and state to controler and request ack back (true/false)
   Serial.println("Send eeprom value to controler"); 
   if (sensor != RED_PIN)
   {
        gw.saveState(RED_PIN, 100 * redval / 255); 
        gw.send( RedStatus.set(gw.loadState(RED_PIN)), false );  
    }
    if (sensor != GREEN_PIN)
    {
        gw.saveState(GREEN_PIN, 100 * greenval / 255); 
        gw.send( GreenStatus.set(gw.loadState(GREEN_PIN)), false );
    }
    if (sensor != BLUE_PIN)
    {
        gw.saveState(BLUE_PIN, 100 * blueval / 255);
        gw.send( BlueStatus.set(gw.loadState(BLUE_PIN)), false );
    }
    gw.send( rgbShowState.set(0), false);
}
           
   
   
jule1986
Messages : 68
Inscription : 02 nov. 2015, 18:30
Localisation : Loiret (45)

Re: [tuto] Ruban led RGB (RVB)

Message par jule1986 »

Bonjour, je me permet un petit up, si les pro mysensors pouvait me donner leur avis ça serait sympa au moins pour savoir si je risque pas de griller quelque chose.... après je chercherais si ça ne fonctionne pas.


Envoyé de mon iPhone en utilisant Tapatalk
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: [tuto] Ruban led RGB (RVB)

Message par vil1driver »

Domoticz vient en fin de passer les dimmers mysensors à 100 niveaux au lieu de 16 :mrgreen:

@jule1986,
au moins ceci à changer (le reste semble pas trop mal..)

Code : Tout sélectionner

// Serial.print translate sensor id to sensor name
char color[][6] = {"","","","RED","","GREEN","BLUE"};
par ceci

Code : Tout sélectionner

// Serial.print translate sensor id to sensor name
char color[][9] = {"","","","RED","","GREEN","BLUE","","","WHITE"};
MAJ = VIDER LE CACHE(<-Clicable)
/!\Les mises à jour de Domoticz sont souvent sources de difficultés, ne sautez pas dessus
modules.lua

Un ex domoticzien
jule1986
Messages : 68
Inscription : 02 nov. 2015, 18:30
Localisation : Loiret (45)

Re: [tuto] Ruban led RGB (RVB)

Message par jule1986 »

Merci vil1driver pour la modif du code.

Pour les 100 niveaux c'est dans la dernière bêta ?
Répondre