Néopixel + Domoticz + MySensors V1.5 & V2

Hello tout le monde,

Celà fait un moment que je me disait que ça serait bien de pouvoir controler des néopixels avec domoticz.

J'ai donc fais quelques recherche et je suis tombé sur un exemple assez intérressant , je l'ai donc testé.

Au niveau hardware, il faut un maitre mysensors connecter à la raspberry, voir ici pour le tutoriel.

Pour la partie esclave , une arduino, un module radio NRF24L01+, des leds neopixels.

Voilà pour les premiers tests, j’espère que cela vous plaira.

J’approfondirai le sujet plus tard.

Mickaël

Liens :https://www.domoticz.com/forum/viewtopic.php?t=8039

// Example sketch showing how to control an RGB Led Strip.
// This example will not remember the last rgb color set after power failure.

#include <MySensor.h>
#include <SPI.h>

#include "Adafruit_NeoPixel.h"

#define NUMPIXELS 4   // Number of connected pixels on a single datapin
#define PIN 4         // Digital output pin

#define node 254  //254 for testing purpose
#define CHILD_ID 0


Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
long RGB_values[3] = {0,0,0};

MySensor gw;

void setup()
{
    gw.begin(incomingMessage, node, true);
    gw.sendSketchInfo("RGB Node", "1.0");
    gw.present(CHILD_ID, S_RGB_LIGHT);
    strip.begin();
    strip.show(); // Update the strip, to start they are all 'off'
}


void loop()
{
    gw.process();
}

void incomingMessage(const MyMessage &message) {
    if (message.type==V_RGB) {
  // starting to process the hex code
        String hexstring = message.getString(); //here goes the hex color code coming from through MySensors (like FF9A00)
        long number = (long) strtol( &hexstring[0], NULL, 16);
        RGB_values[0] = number >> 16;
        RGB_values[1] = number >> 8 & 0xFF;
        RGB_values[2] = number & 0xFF;

        colorWipe(Color(RGB_values[0],RGB_values[1],RGB_values[2]), 60);
     }
     
    if (message.type==V_DIMMER) {
      strip.setBrightness(round((2.55*message.getInt())));
      strip.show();
      }
     
    if (message.type==V_LIGHT) {
       if (message.getInt() == 0) {
        strip.clear();
        strip.show();
       }
    }
 }
 
void colorWipe(uint32_t c, uint8_t wait) {
  int i;
 
  for (i=0; i < strip.numPixels(); i++) {
      strip.setPixelColor(i, c);
      strip.show();
      delay(wait);
  }
}

    /* Helper functions */

// Create a 15 bit color value from R,G,B
uint32_t Color(byte r, byte g, byte b)
{
  uint32_t c;
  c = r;
  c <<= 8;
  c |= g;
  c <<= 8;
  c |= b;
  return c;
}

 

Code utilisé

 

EDIT 07/02/2017

Si vous utilisez la V2 de Mysensors le code ci dessus ne fonctionnera pas.

Voici la version adaptée

Fred

// Code Neopixel pour Mysensors V2

#define MY_DEBUG
#define MY_RADIO_NRF24
#include <MySensors.h>
#include <SPI.h>

#include "Adafruit_NeoPixel.h"

#define NUMPIXELS 50    // Number of connected pixels on a single datapin
#define PIN 4         // Digital output pin

#define node 10  
#define CHILD_ID 0

Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
long RGB_values[3] = {0,0,0};

void presentation()
{
   // gw.begin(incomingMessage, node, true);
    sendSketchInfo("RGB Node", "1.1");
    present(CHILD_ID, S_RGB_LIGHT);
    strip.begin();
    strip.show(); // Update the strip, to start they are all 'off'
}

void loop()
{

}

void receive(const MyMessage &message) {
    if (message.type==V_RGB) {
  // starting to process the hex code
        String hexstring = message.getString(); //here goes the hex color code coming from through MySensors (like FF9A00)
        long number = (long) strtol( &hexstring[0], NULL, 16);
        RGB_values[0] = number >> 16;
        RGB_values[1] = number >> 8 & 0xFF;
        RGB_values[2] = number & 0xFF;

        colorWipe(Color(RGB_values[0],RGB_values[1],RGB_values[2]));
     }

    if (message.type==V_PERCENTAGE) {
      strip.setBrightness(round((2.55*message.getInt())));
      strip.show();
      }

    if (message.type==V_STATUS) {
       if (message.getInt() == 0) {
        strip.clear();
        strip.show();
       }
    }
 }

void colorWipe(uint32_t c) {
  int i;

  for (i=0; i < strip.numPixels(); i++) {
      strip.setPixelColor(i, c);
  }
  strip.show();  
}

    /* Helper functions */

// Create a 15 bit color value from R,G,B
uint32_t Color(byte r, byte g, byte b)
{
  uint32_t c;
  c = r;
  c <<= 8;
  c |= g;
  c <<= 8;
  c |= b;
  return c;
}

RaspberryPi 2 vs Domoticz

Bonjour à tous,

Ayant hérité d’une RPI2 j’ai voulu migrer mon système domoticz vers cette nouvelle carte. Je pensais que tout allait rouler tout seul puisque maintenant je maitrise assez bien le couple RPI/Domoticz …. et ben non !! Il y a encore une fois un astuce.

Bien entendu j’ai utilisé la dernière version de Domoticz, j’ai fais les maj su système et aussi du firmware. J’ai installé wirringPi pour avoir accès au GPIO. Je lui colle vite fait un capteur de t° DS18B20 pour une petite vérification. Et là rien, pas moyen de détecter cette fichue sonde !! Je vérifie tout 1X, 2X 3X je reboot et reboot encore rien à faire. Je change la sonde, la résistance aussi. Je contrôle encore que je me suis pas trompé dans le raccordement … 3 fils c’est pas trop compliqué ^^ Toujours rien.

L’heure tourne et mon système toujours pas … obligé de googeler pour trouver de nouvelles pistes. Ah je suis pas le seul et la solution semble on ne peut plus simple! Une simple ligne dtoverlay=w1-gpio à ajouter au bas du fichier /boot/config.txt

Reboot …
Ca maaarche !!

A vous de jouer 😉

Fred