Projektvorstellung: Beleuchtung mit WS2812B

Hallo,

hab im Forum bereits das ein oder andere Mal bereits geschrieben, dass ich derzeit mit den WS2812B arbeite. Meine kleine Equinox ist leider noch nicht fertig (warte auf das Gehäuse, Sketch steht). Das wird sich noch ein bisschen hinziehen.

Nun, ich arbeite ebenfalls seit ein paar Wochen an einer Beleuchtung eines Regals. Es werden hierbei 8 Flaschen vom Flaschenboden aus bestrahlt. Verbaut habe ich dafür folgende Komponenten:

  • Arduino Mini Pro 5V/16MhZ
  • LC Display 1602 I²C
  • Arduino UNO DIP-Variante (zum Programmieren des Mini Pro)
  • 8 WS2812B

Noch nicht verbaut ist ein Bluetooth Modul, welches demnächst aus GB ankommen soll.
Wenn es soweit ist, wird der Arduino UNO abgebaut und die Kommunikation läuft dann nur noch über Bluetooth (Smartphone/PC). Des weiteren ist noch nicht sicher, ob das Display später im Projekt bleibt.

Ausgabe VS 2012 Professional mit Visual Micro

Compiling 'unor3sept30' for 'Arduino Pro or Pro Mini w/ ATmega328 (5V, 16 MHz)'
Binary sketch size: 12950 bytes (used 42% of a 30720 byte maximum) (0,55 secs)
Minimum Memory Usage: 588 bytes (29% of a 2048 byte maximum)
Uploading to I/O board using 'COM10'
Done uploading

Der eigentliche Grund, dass ich diese Projekt öffentlich stelle, ist u.a., dass ich nach Optimierungen suche. D.h. ich lege mich nicht fest, dass das Sketch optimal auf das Projekt ausgelegt ist. Ich wäre erfreut, wenn ihr entsprechende Stellen im Sketch nennen könnt, die man verbessern kann, falls nötig.

Dank Stefan(Eisebaer) bin ich bereits auf die Funktion memset gekommen. Dachte erst, das war etwas FastSPILibary-spezifisches. Hab dann in meinem schlauen Buch dann gesehen, dass ich damit die Werte zurücksetze.

Es gab auch eine Möglichkeit, die Funktionen nicht über ein Switch Case aufzurufen. Wie war der Befehl genau, und könnte einer ein kurzes Beispiel bringen (enum?)

Weitere Effekte folgen in Kürze…

Gruß Stefan

Der aktuelle Sketch auf Dropbox

Ich wollte eigentlich den Quellcode lesbar veröffentlichen auf Github. Jedoch wird einem die Freigabe und Änderung durch die Software sehr erschwert. Dauerhaft meldet er, Name beretis vergeben etc, ob wohl in den localen sowie online Repos die Projekte bereits entfert wurden. Des weitern stört diese commits!

Somit vorerst wieder auf der Dropbox.

arduino_jackdaniels.ino (8.45 KB)

Hi,

die Enum Möglichkeiten sparen keine Resourcen ein, aber es sieht dann schöner aus:

enum xx_ein_aus
{   ein = 1,
    aus = 0,
        xyz = 2,
} status01;

void setup()
{
  status01 = ein;
}

void loop()
{
}

Des weiteren könntest du dich mit ProgMem Beschäftigen und die Fade Vektroren im Flash Speicher ablegen. Dann werden 120 Byte vom SD Ram gespart.

Reicht das für PROGMEM bereits aus?

#include <avr/pgmspace.h>

uint8_t fade50[40] PROGMEM = 
{
	0,20,21,21,22,23,24,24,
	25,26,27,28,29,30,31,32,
	33,34,35,37,38,39,41,42,
	43,45,46,48,50,51,53,55,
	57,59,61,63,65,67,70,72
};

Mit der enum Variante stehe ich noch etwas auf dem Schlauch. Sehe da gerade nicht zwingend den Vorteil.

Um eine meiner Funktionen aufzurufen, müsste ich doch dann immer noch etwas mit

if(status == “ein”) fade(20, 255, 4000);

Habe nun doch wieder zurückgesetzt auf die PROGMEM freie Version. Entsprechende Codezeilen wurden auskommentiert, da es hier scheinbar doch zu unerwünschten Effekten kommt, die ich mir gerade nicht erklären kann.

Habe mit und ohne #include <avr/pgmspace.h>.
Die Arrays habe ich wie folgt dann angelegt:
PROGMEM uint8_t fade75[40] = {a,b,c};

Jedoch habe ich hierbei das Problem, dass mir die Leds durchgehen sobald ich eine Funktion aufrufe mit nur einer Led.

Enums bringen in diesem Fall nichts. Jedenfalls wird es nicht kürzer.

Was du machen kannst ist für case 2-6 den ersten Paramter in einem byte-Array zu speichern. Und dann die Methode so aufrufen: fadeLeds(array[modus], 255, 4000);

Dadurch wird der Code etwas kürzer.

Und PROGMEM ist etwas komplizierter: http://arduino.cc/en/Reference/PROGMEM

Du musst auch einen anderen Datentyp verwenden und eine spezielle Funktion zum Auslesen

:( Hab es mir fast gedacht, dass es letzten Endes nicht viel bringt.

Die Menüordnung soll später varieren, dann kommt es vor, dass ich keine 5 Programme habe, die die gleiche Funktion nutzen.

Zum Progmem habe ich bereits die Reference gelesen. Finde aber, dass es mit den beschriebenen doch relativ aufwendig wird. Des weiteren, ist es nicht für die Performance dann evtl. auch nicht eher schädlich, die Daten noch einmal zusätzlich aus dem Speicher zu holen?

Ich habe ja nicht mit dem Mega getestet und möchte dieses nun auf einen Arduino mit kleinerem Speicher verfrachten. Es geht ja bereits mit dem kleinen Speicher. Des weiteren wird der Code nicht so riesig, soviele Lichteffekte fallen mir garnicht ein, um diesen zu füllen.

Enums sind schon schön, aber halt nicht unbedingt hier. Und sie machen den Code auch nicht kürzer, wenn sie sinnvoll sind. Aber wenn man mit Status (pl.) arbeitet, hat man aussagekräftige Namen (was du bei dir halt nicht brauchst) :) Außerdem findet eine Überprüfung beim Kompilieren statt und man kann einer enum-Variablen nicht beliebige Werte zuweisen wie bei einem Integer.

Progmem kostet dich vielleicht ein paar ms (oder eher µs?) für das Auslesen des Speichers. Das sollte verkraftbar sein. Aber wenn du wirklich erst 30% RAM verbrauchst brauchst du es nicht.

hi,

ich lese hier oft, man soll doch progmem verwenden, und oft genug macht es ja auch sinn. aber eben nur dann, wenn das RAM knapp wird. ansonsten werd' ich doch nicht schnellen speicher ungenutzt lassen.

übrigens: heute war in einer folge von two and a half men zu sehen, wie walden einen aufbau mit einem arduino auf dem küchentisch stehen hat und programmiert. fand ich nett.

gruß stefan

Ja genau, ich nutze erst 30% RAM, wie oben im Log zu sehen. Dann werde ich es weglassen und einmal darauf zurückkommen, wenn ichs mal wirklich gebrauchen sollte.

Die Folge ist mir nicht bekannt. Oder aber du hast genauer hingesehen als ich ;) Schleichwerbung oder gekonntest Marketing? :D

hi,

es war die folge “Noch eine Nacht mit Neil Diamond”.
die, in der lindsey mit alan schluß macht.

gruß stefan

Scheint, wenn ichs richtig sehe, eine Esplora zu sein.

Hallo Stefan,

in meiner Vor Arduino Bastelära habe ich ein Präsentationsboard für Flaschen gebaut. Basis bildete ein Streifen Küchenarbeitsplatte. Darin habe ich mit der Lochkreissäge Löcher gebohrt und Halterungen für Halogenspots befestigt. Ich nahm normale MR16 Halogenspots, flexte mit der Diamantscheibe hinten die Lampe ab, klebte eine auf einem kleinen Chipsatz-Kühlkörper sitzende Power-LED in den Reflektor und setzte dieses Konstrukt wie einen normalen MR-16 Spot in die Halterung. Die Flaschen werden auf die Spots gestellt und ergeben einen Effekt, ähnlich einer Lava-Lampe :grin: Ca. 10cm vor den Flaschen habe ich eine 3-Kant Holzleiste mit der 45° Schräge zu den Flaschen zeigend aufgeschraubt. Auf die Schräge habe ich dann LED vom laufenden Meter gepappt, um die Etiketten der Flaschen blendfrei zu beleuchten. Bei mir alles in weiß, ohne µC, aber das ist ja ausbaufähig.

Gruß Gerald

Die Halterung, bzw. Bodenplatte befindet sich noch in der Mache ;) Wobei, was du gemacht hast, wäre schon viel zu hell :D Habe jetzt im Maximalfall 8x 3x20mA (~500mA). Wobei ich diese eigentlich nie erreiche, lediglich beim Weiß Fade.

Na ja, auf den Spots stehen teilweise recht dunkele Fruchtweine, wo man schon kräftig reinleuchten muß. für einen ersten Versuch nahm ich 3W Cree-LED’s, die tatsächlich zu viel des Guten waren. Aber 1W LED’s waren genau richtig. Ich baue mir meine Konstantstromquellen auf Schaltreglerbasis selber. Basis dafür ist ein LM2576 adj, den ich als KSQ “missbrauche” :grin:
Als Anhang habe ich meine schaltung als GIF angehängt, kann ich aber leider nicht in der Vorschau überprüfen :frowning:
Über Pin 5, ON/OFF, der an Masse liegt, kann man einen kleinen npn-Transistor einschleifen, 1K Pullup nach +Ub, 10K Basiswiderstand und du kannst die KSQ auch über einen Arduino-Pin steuern. Bedingt geht auch Helligkeitsänderung per PWM. Allerdings kann es dabei Stufen oder Flackern geben, wenn die PWM Frequenz ungünstig zur Frequenz der KSQ liegt. Ist halt quick & dirthy für einen ersten Versuch. Habe ich für die Umrüstung eines Baustrahlers mit einem 20W COB-LED Cluster und einem 555 zum dimmen so gemacht.

Gruß Gerald

Hi Stefan Einmal eine Frage: wo bestellst Du deine Arduino Mini Pro 5V/16MhZ, Ich habe mir in der Bucht 4 Stück bestellt gut sie kosten da nur 1 € plus 3,95€ versand. Jedoch ärgere ich mich darüber das ich wenn ich zusammen bestelle(die 4 Stück) für jeden Versand bezahlen muss, ich weis ja nicht ob es nicht trotzdem noch Günstig ist , da kommt jeder Mini auf 4,95€. ich habe schon versucht den Verkäufer zu erreichen aber da ist keine mail adresse bei.

l.G.Jürgen

Hab glaube bei dem gleichen bestellt. Wirklich günstiger habe ich den nicht gefunden. Orginal kostet er 10€. War damals bei exp-tech aber nicht lieferbar.

Das du jedesmal Versand bezahlst ist Absicht. Denke es hängt mit dem Zoll zusammen.

Nein Stefan, ich habe auch keinen Günstigeren gefunden, naja ist ja auch nicht die Welt irgendwo müssen die ja auch was verdiehnen :) denn für 1€ ist schon top.

l.G.Jürgen

Hallo Jürgen,

das ist doch ein guter Preis. Für einen Chip im DIP Gehäuse zahlt man ca. 3€, Quarz, 2x 22pF, ein Pfostenstecker zum Programmieren, ein 100n KerKo, ein 47µ Elko, sind auch noch mal zusammen 1€. Billiger kommst du also, falls du alles "zu Fuß" aufbaust (wie ich) auch nicht. Das ist dann eher Spaß an der Freude, bzw. das die Schaltung aus einem Guß ist :) Was du maximal versuchen kannst, bei Ebay international oder beim englischen Ebay zu gucken, ob du irgendwo durch Währungsumrechnungen besser kommst, da die Händler meist "gerade Preise" in der jeweiligen Währung machen 8)

Gruß Gerald

Hi Gerald, der Preis ist schon OK. Ich ärgere mich immer nur darüber das ich für jedes Teil versand bezahlen soll, aber ist schon OK irgendwo muss ja für den Verkäufer was hängen bleiben. Ich habe mir 5 Stück bestellt ich denke das ist schon in Ordnung so.

l.G.Jürgen

Der höhere Versand kommt dir aber zu gute.

Ebay Gebühren für 1€ Produkte sind günstiger als für 5€ Produkte. Der Versand wird soweit ich das weiß nicht mit in den Gebühren erfasst. Des weiteren ist der Versand auch nicht zollpflichtig. (Ausgenommen der Warenwert liegt hier bei 1€ und Versand 40€, dann werden auch die vom Zoll stutzig ;:D)