Hello everyone,
I have a to deal with a big Problem and i can't find a solution for it ...
I want to contorle an digital led strip ( ws2811), with the Raspberry,
but it's direktly not possible, so i have to use an Arduino for it.
My idea was to send 4 Variables ( Red, Green, Blue,Mode) to it over i2c.
At first it worked pretty well, but now the slave dissapers, get's an other adress
and then get's back to it's old adress.
Because of that there is now way to send the data stable to the Arduino.
both are running at 400khz.
here is the python script on the Raspberry i'm using :
#!/usr/bin/python
import smbus
import time
bus = smbus.SMBus(1)
address = 0x47
def writeNumber(r,g,b,m):
bus.write_byte(address, m)
bus.write_byte(address, r)
bus.write_byte(address, g)
bus.write_byte(address, b)
time.sleep(0.05)
#bus.write_byte(address, m)
# bus.write_byte_data(address, 0, value)
return -2
mode = int(input("Modus:" ))
red = int(input("Rotwert:"))
green = int(input("Gruenwert:"))
blue = int(input("Blauwert:"))
writeNumber(red,green,blue,mode)
and here the arduino code
#include <Wire.h>
#define SLAVE_ADDRESS 0x47
#define lengtharray 4
#include <FastLED.h>
#define NUM_LEDS 100
#define DATA_PIN 8
#define TWI_FREQ_SETTING 400000L
#define CPU_FREQ 16000000L
CRGB leds[NUM_LEDS];
int ledscontrole[lengtharray]; // laenge der Modi array ( rot gruen blau modus )
int i = 0; // zaehlervariable fuer das array
int red = 0; // rgbwert fuer rot 0-255
int blue = 0; // rgbwert fuer blau 0-255
int green = 0; // rgbwert fuer gruen 0-255
int mode = 0; // modus
/////////// Metoershower ///////////
uint8_t hue = 32;
byte idex = 255;
byte meteorLength = 29;
//////////////////////
//////////Rainbow///////////
uint8_t max_bright = 128;
uint8_t thisdelay = 1;
uint8_t thishue;
uint8_t deltahue = 10;
///////////////////////
void setup() {
Serial.begin(9600); // print output
TWBR = ((CPU_FREQ / TWI_FREQ_SETTING) - 16) / 2;
Wire.begin(SLAVE_ADDRESS); // adruino slvae adress
Wire.onReceive(receiveData); // baudraht "oeffnen"
FastLED.addLeds<WS2811, DATA_PIN>(leds, NUM_LEDS); // definieren der leds
}
void receiveData(int byteCount){
while(Wire.available()) {
ledscontrole[i++]=Wire.read();
}
}
void loop() {
red = ledscontrole[1];
green = ledscontrole[2];
blue = ledscontrole[3];
mode = ledscontrole[0];
Serial.println(mode);
i =0;
delay(5);
switch (mode){
case 0:
ledstriptest();
break;
case 1:
meteorShower();
break;
case 2:
rainbow_march();
delay_at_max_brightness_for_power(2.5*thisdelay);
break;
case 3:
strobe();
break;
case 4:
test();
break;
case 5:
backnforth();
break;
case 6:
hinherrandom();
break;
case 7:
hinherschwarz();
break;
default:
test();
break;
}
}
void ledstriptest(){
for (int i = 0; i < NUM_LEDS;i++){
leds[i] = CRGB (green,red,blue);
FastLED.show();
}
}
void test(){
LEDS.showColor(CRGB (green,red,blue));
}
////////////// Rainbow //////////
void rainbow_march() { // The fill_rainbow call doesn't support brightness levels
thishue++; // Increment the starting hue.
fill_rainbow(leds, NUM_LEDS, thishue, deltahue); // Use FastLED's fill_rainbow routine.
}
///////////////////////////////
///////// meteorShower///////////
void meteorShower(){
memmove8( &leds[1], &leds[0], (NUM_LEDS - 1) * 3 );
idex++;
if ( idex > meteorLength ) {
idex = 0;
hue += 32;
}
switch ( idex ) {
case 0:
leds[0] = CRGB(200,200,200);
break;
case 1:
leds[0] = CHSV((hue - 20), 255, 210);
break;
case 2:
leds[0] = CHSV((hue - 22), 255, 180);
break;
case 3:
leds[0] = CHSV((hue - 23), 255, 150);
break;
case 4:
leds[0] = CHSV((hue - 24), 255, 110);
break;
case 5:
leds[0] = CHSV((hue - 25), 255, 90);
break;
case 6:
leds[0] = CHSV((hue - 26), 160, 60);
break;
case 7:
leds[0] = CHSV((hue - 27), 140, 40);
break;
case 8:
leds[0] = CHSV((hue - 28), 120, 20);
break;
case 9:
leds[0] = CHSV((hue - 29), 100, 20);
break;
default:
leds[0] = CRGB::Black;
}
FastLED.show();
delay(50);
}
///////////////////// Metorshower ende ////////////////////////
//////////STrobe////////
void strobe() {
LEDS.showColor(CRGB (green,red,blue));
delay(20);
LEDS.showColor(CRGB::Black);
delay(20);
}
//////////////////////////Hin und her//////////
void backnforth(){
int de =10;
for(int k =0; k < NUM_LEDS-5; k++){
leds[k] = CRGB (green,red,blue);
delay(de);
leds[k+1] = CRGB (green,red,blue);
delay(de);
leds[k+2] = CRGB (green,red,blue);
delay(de);
leds[k+3] = CRGB (green,red,blue);
delay(de);
leds[k+4] = CRGB (green,red,blue);
delay(de);
leds[k+5] = CRGB (green,red,blue);
FastLED.show();
}
delay(200);
for(int k =NUM_LEDS-1; k >0; k--){
leds[k] = CRGB ::Black;
delay(de);
leds[k-1] = CRGB ::Black;
delay(de);
leds[k-2] = CRGB ::Black;
delay(de);
leds[k-3] = CRGB ::Black;
delay(de);
leds[k-4] = CRGB ::Black;
delay(de);
leds[k-5] = CRGB ::Black;
delay(de);
FastLED.show();
}
delay(200);
}
//////////////////////////////////////////////////
///////////////Hin her random//////////////
void hinherrandom(){
int rndr = random(255);
int rndb = random(255);
int rndg = random(255);
for(int i =0; i < NUM_LEDS; i+=5){
leds[i] = CRGB (rndr,rndb,rndg);
delay(10);
leds[i+1] = CRGB (rndr,rndb,rndg);
delay(10);
leds[i+2] = CRGB (rndr,rndb,rndg);
delay(10);
leds[i+3] = CRGB (rndr,rndb,rndg);
delay(10);
leds[i+4] = CRGB (rndr,rndb,rndg);
FastLED.show();
delay(200);
}
rndr = random(255);
rndb = random(255);
rndg = random(255);
for(int k =NUM_LEDS-1; k > 0 ; k-=5){
leds[k] = CRGB (rndr,rndb,rndg);
delay(10);
leds[k-1] = CRGB (rndr,rndb,rndg);
delay(10);
leds[k-2] = CRGB (rndr,rndb,rndg);
delay(10);
leds[k-3] = CRGB (rndr,rndb,rndg);
delay(10);
leds[k-4] = CRGB (rndr,rndb,rndg);
FastLED.show();
Serial.println(k);
delay(200);
}
}
//////////////////////////////////////////
//////////// Hin und her mit schwarz /////////
void hinherschwarz(){
int de = 5;
for(int i =0; i < NUM_LEDS-5; i++){
leds[i] = CRGB (green,red,blue);
delay(de);
leds[i+1] = CRGB (green,red,blue);
delay(de);
leds[i+2] = CRGB (green,red,blue);
delay(de);
leds[i+3] = CRGB (green,red,blue);
delay(de);
leds[i+4] = CRGB (green,red,blue);
delay(de);
leds[i+5] = CRGB (green,red,blue);
FastLED.show();
leds[i] = CRGB ::Black;
delay(de);
leds[i+1] = CRGB ::Black;
delay(de);
leds[i+2] = CRGB ::Black;
delay(de);
leds[i+3] = CRGB ::Black;
delay(de);
leds[i+4] = CRGB ::Black;
delay(de);
leds[i+5] = CRGB ::Black;
delay(de);
}
for(int i =NUM_LEDS-5; i >0; i--){
delay(de);
leds[i] = CRGB (green,red,blue) ;
delay(de);
leds[i-1] = CRGB (green,red,blue);
delay(de);
leds[i-2] = CRGB (green,red,blue);
delay(de);
leds[i-3] = CRGB (green,red,blue);
delay(de);
leds[i-4] = CRGB (green,red,blue);
delay(de);
leds[i-5] = CRGB (green,red,blue);
FastLED.show();
leds[i] = CRGB ::Black;
delay(de);
leds[i-1] = CRGB ::Black;
delay(de);
leds[i-2] = CRGB ::Black;
delay(de);
leds[i-3] = CRGB ::Black;
delay(de);
leds[i-4] = CRGB ::Black;
delay(de);
leds[i-5] = CRGB ::Black;
delay(de);
}
}
/////////////////////////////////////
I hope you guys can help me, i count on you !
thank you