Pagina1 van 1
Forum

Welkom bij de Tweaking4All gemeenschapsforums!
Voor je gaat deelnemen, bekijk de Forum Regels!

Specifieke onderwerpen: Start het onderwerp met de naam van het programma of systeem.
Bijvoorbeeld “MacOS X – Jouw vraag“, of bijvoorbeeld “MS Word – Jouw Tip of Truc“.

Merk op: Omschakelen naar een andere taal zal niet werken als je een post aan het lezen bent aangezien er waarschijnlijk geen vertaling beschikbaar is.



Arduino - WS2812 en...
 
Deel:
Meldingen
Alles wissen

[Opgelost] Arduino - WS2812 en Audio In

56 Berichten
2 Gebruikers
0 Reactions
8,817 Bekeken
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 12 jaar geleden
Berichten: 2859
Topic starter  

Probeer het volgende eens (niet getest omdat ik de spullen er niet voor heb):

#include <IRremote.h>
#include “FastLED.h”
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
  #include <avr/power.h>
#endif
#define PIN 6
#define NUM_LEDS 60
CRGB leds[NUM_LEDS];
const unsigned int IR_RECEIVER_PIN = 11;
IRrecv ir_receiver(IR_RECEIVER_PIN);
decode_results results;
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);
void setup()
{
  strip.begin();
  strip.show(); // Initialize all pixels to ‘off’
  Serial.begin(9600);
  ir_receiver.enableIRIn(); // Start the receiver
}
void loop() {
  if (ir_receiver.decode(&results)) { 
    long int decCode = results.value;
    Serial.println(decCode);
    switch (results.value) {
      case 16753245: //code to turn on LED
        Serial.println(“WS2812b On”);
        setAll(0xff,0xff,0xff); // alle LEDs op WIT
        break;
      case 16769565: //code to turn off LED
        Serial.println(“WS2812b Off”);
        setAll(0,0,0); // alle LEDS UIT
        break;
      default: 
        Serial.println(“Arduino wacht op input.”);
    }
    ir_receiver.resume();
  } delya(100); // kan behulpzaam zijn om even te ademen hier
}
void setAll(byte red, byte green, byte blue) {
  for(int i = 0; i < NUM_LEDS; i++ ) {
       strip.setPixelColor(Pixel, strip.Color(red, green, blue));
  }
 strip.show();
}

   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 12 jaar geleden
Berichten: 2859
Topic starter  

Werkt het niet omdat je foutmeldingen krijgt? Of reageert het niet op de afstandsbediening? Of veranderen de LEDs niet?


   
BeantwoordenCiteren
(@uncels)
Trusted Member
Deelgenomen: 9 jaar geleden
Berichten: 81
 

De afstandbediening heb ik werkend mbv seriele monitor heb ik de codes uitgelezen en per knop toegewezen.

Nu zoek ik commando's die moeten worden uitgevoerd als er een knop op de AB word ingedrukt, waardoor de strip aan/uit gaat of kan dimmen.

Diverse mogelijkheden heb ik al geprobeerd, onderstaande code werkt zonder foutmeldingen op de AB, maar het commando digitalwrite is niet goed.

Als ik de door jou voorgestelde code in dit .ino bestand verwerk krijg ik foutmeldingen, die ik (nog) niet opgelost krijg


   
BeantwoordenCiteren
(@uncels)
Trusted Member
Deelgenomen: 9 jaar geleden
Berichten: 81
 

Zojuist je code getest & krijg de volgende foutmeldingen bij compileren.

Arduino: 1.6.6 (Windows 7), Board:"Arduino/Genuino Uno"

C:UsersjohnDocumentsArduinoTestHANSTestHANS.inoTestHANS.ino.ino: In function 'void loop()':

TestHANS.ino:31: error: unable to find numeric literal operator 'operator"" ff'

         setAll (0xff,0ff,0xff); // alle LEDs wit
                     ^
TestHANS.ino:31: error: 'setAll' was not declared in this scope

         setAll (0xff,0ff,0xff); // alle LEDs wit
                              ^
TestHANS.ino:118: error: a function-definition is not allowed here before '{' token

     void setAll(byte red, byte green,byte blue){
                                                ^
TestHANS.ino:123: error: expected '}' at end of input
 }
 ^
TestHANS.ino:123: error: expected '}' at end of input
exit status 1
unable to find numeric literal operator 'operator"" ff'


   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 12 jaar geleden
Berichten: 2859
Topic starter  

"digitalwrite" is om een pin hoog of laag te zetten - dat gaat niks doen met de LED strips.

Ik zie net wel een typefout in the "setAll()" functie;

strip.setPixelColor(Pixel, strip.Color(red, green, blue));

moet zijn

strip.setPixelColor(i, strip.Color(red, green, blue));

Dus de functie aan het einde wordt dan:

void setAll(byte red, byte green, byte blue) {
  for(int i = 0; i < NUM_LEDS; i++ ) {
       strip.setPixelColor(i, strip.Color(red, green, blue));
  }
 strip.show();
}

En nog een type fout (tip: probeer geen code te typen voor je wakker bent ):

setAll (0xff,0ff,0xff); // alle LEDs wit

moet zijn (je bent een "x" vergeten):

setAll (0xff,0xff,0xff); // alle LEDs wit

maar je mag ook het volgende gebruiken:

setAll (255,255,255); // alle LEDs wit

Dus alles bij elkaar:

#include <IRremote.h>
#include “FastLED.h”
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
  #include <avr/power.h>
#endif
#define PIN 6
#define NUM_LEDS 60
CRGB leds[NUM_LEDS];
const unsigned int IR_RECEIVER_PIN = 11;
IRrecv ir_receiver(IR_RECEIVER_PIN);
decode_results results;
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);
void setup()
{
  strip.begin();
  strip.show(); // Initialize all pixels to ‘off’
  Serial.begin(9600);
  ir_receiver.enableIRIn(); // Start the receiver
}
void loop() {
  if (ir_receiver.decode(&results)) { 
    long int decCode = results.value;
    Serial.println(decCode);
    switch (results.value) {
      case 16753245: //code to turn on LED
        Serial.println(“WS2812b On”);
        setAll(0xff,0xff,0xff); // alle LEDs op WIT
        break;
      case 16769565: //code to turn off LED
        Serial.println(“WS2812b Off”);
        setAll(0,0,0); // alle LEDS UIT
        break;
      default: 
        Serial.println(“Arduino wacht op input.”);
    }
    ir_receiver.resume();
  }
  delay(100); // kan behulpzaam zijn om even te ademen hier
}
void setAll(byte red, byte green, byte blue) {
  for(int i = 0; i < NUM_LEDS; i++ ) {
       strip.setPixelColor(i, strip.Color(red, green, blue));
  }
 strip.show();
}

Misschien handig om deze code te kopiëren en in de IDE te plakken.


   
BeantwoordenCiteren
(@uncels)
Trusted Member
Deelgenomen: 9 jaar geleden
Berichten: 81
 

Helaas geeft ook deze code fouten.

TestHANS:32: error: 'setAll' was not declared in this scope

setAll(0xff,0xff,0xff); // alle LEDs wit

TestHANS:119: error: a function-definition is not allowed here before '{' token

void setAll(byte red, byte green, byte blue){

TestHANS:124: error: expected '}' at end of input
 }


   
BeantwoordenCiteren
(@uncels)
Trusted Member
Deelgenomen: 9 jaar geleden
Berichten: 81
 

Opgelost Hans.

Na nog wat knip & plakwerk, werkt het geheel met de AB en kleur naar keuze onder elke knop.

Tevreden ja, volgende uitdaging onder een knop een andere .ino starten (bijv knipper op de maat vd muziek of moodlicht)


   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 12 jaar geleden
Berichten: 2859
Topic starter  

Mooi om te horen - ik kon de code zelf niet testen.

Wat was nou de fout in de code?


   
BeantwoordenCiteren
(@uncels)
Trusted Member
Deelgenomen: 9 jaar geleden
Berichten: 81
 

De void setup, ziet er nu zo uit en werkt, daarom heb ik het bestand ook gepost zodat mogelijk meerdere mensen hiermee hun voordeel kunnen doen.:

Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);
void setup()
{
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
  Serial.begin(9600);
  ir_receiver.enableIRIn(); // Start the receiver
  }
  void setAll(byte red, byte green,byte blue){
      for (int i = 0; i < NUM_LEDS; i++ ) {
        strip.setPixelColor(i, strip.Color(red, green, blue));
        strip.show();
      }}

Als ik Neopixel_soundact.ino onder een knop wil plaatsen, zou dat theoretisch mogelijk moeten zijn om deze code in kleur.ino in te voegen ?


   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 12 jaar geleden
Berichten: 2859
Topic starter  

Oh dat is raar ...???

Declareren van "void setAll()" hoort niet in de "void setup()" te staan en als je goed kijkt, dan staat deze ook niet in setup() in jouw code.

Weet je zeker dat je niet iets anders over het hoofd hebt gezien?
(voor andere voorbeelden, zie ook dit LED effects artikel)

Als ik jouw code zie, dan (na herformateren):

Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);
void setup()
{
  strip.begin();
  strip.show(); // Initialize all pixels to ‘off’
  Serial.begin(9600);
  ir_receiver.enableIRIn(); // Start the receiver
}
void setAll(byte red, byte green,byte blue) {
  for (int i = 0; i < NUM_LEDS; i++ ) {
    strip.setPixelColor(i, strip.Color(red, green, blue));
  strip.show();
}} // <---- fout!!!

en dan zie ik ook meteen waar je een type fout hebt staan: een sluiten accolade tussen setPixelColor en strip.show>
In jouw code blijft setAll inde for-loop herhaaldelijk strip.show() aanroepen en dat is niet efficient.
Beter is:

Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);
void setup()
{
  strip.begin();
  strip.show(); // Initialize all pixels to ‘off’
  Serial.begin(9600);
  ir_receiver.enableIRIn(); // Start the receiver
}
void setAll(byte red, byte green,byte blue){
  for (int i = 0; i < NUM_LEDS; i++ ) {
    strip.setPixelColor(i, strip.Color(red, green, blue)); } // <--------- deze accolade staat in jouw code fout!
  strip.show(); }

Ik neem dan ook maar even aan dat je de code overtypt, en niet met copy/paste in de IDE plakt?
Probeer eens de code met copy en paste in de IDE te plakken (waarbij je alles in de "lege" sketch vervangt door de code die ik eerder gaf).

Meestal heeft een sketch de volgende opmaak:

1. Definieer includes
2. Definieer compiler constanten (#define), globale constanten en variabelen
3. void setup()
4. void loop()
5. Definieer eigen functies (die geen "return" waarde hebben, dus zoiets als "void mijnfunctie()")

Mocht je functies definieren met return variabelen dan moet dit voor de setup kenbaar gemaakt worden, maar als je daar aan gaat beginnen, dan is het beter om je even wat meer in de taal C te verdiepen.

Vandaar dus dat een "lege" sketch er zo uit ziet:

// <-- hier include, define en globale constanten en variablen
void setup() {
  // put your setup code here, to run once:
}
void loop() {
  // put your main code here, to run repeatedly:
} // <-- hier jouw eigen functies

   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 12 jaar geleden
Berichten: 2859
Topic starter  

Je kunt het luisteren naar geluid en het instellen van de kleur inderdaad samenvoegen en onder een knop hangen van de afstandsbediening.

Voor de dim-functie wordt het e.e.a. wat gecompliceerder omdat je een array moet bijhouden met de bestaande kleuren (tenzij we dat op een handige manier met NeoPixel of FastLED kunnen leen maar daar heb ik me nog niet in verdiept).

Voor aan/uit zetten van de geluid interactie zou je het beste het geluidsdeel in een functie zetten, en dan tijdens het testen van de infrarood zoiets doen:

...
   boolean VUMeter = false;
...
  void setup() {
    ... }
  void loop() {
  ...
  switch (results.value) {
      case 16753245: // geluid aan
        Serial.println(“geluid aan”);
        VUMeter = true;
        break;
      case 16769565: // geluid uit
        Serial.println(“geluid uit”);
        VUMeter = false;
        break;
      default: 
        Serial.println(“Arduino wacht op input.”);
    }
    ... etc ...
    if (VUMeter) { DoeGeluid(); }
    ...
}
void DoeGeluid() {
   ... geluid code hier ...
}

   
BeantwoordenCiteren
(@uncels)
Trusted Member
Deelgenomen: 9 jaar geleden
Berichten: 81
 

Ik heb je code overgenomen& met de verplaatste accolade werkt deze ook, nu met de efficiëntere manier van strip.show.

Bedankt voor je correctie & ja ik zal me meer in C moeten bekwamen, het geeft wel voldoening als het uiteindelijk lukt.


   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 12 jaar geleden
Berichten: 2859
Topic starter  

Leuk he? Ja ik ervaar dat zelf ook zo. Beetje prullen maar dan is het zo leuk om te zien dat het werkt. 


   
BeantwoordenCiteren
(@uncels)
Trusted Member
Deelgenomen: 9 jaar geleden
Berichten: 81
 

VU Meter op WS2812 op audio mbv  audio splitter op de audio uitgang v PC
Onderstaande code heb ik gevonden & aangepast. Dit geeft een aardig lichtorgel, beginnend uit de midden met gedimd groen licht aan tot 1/3 & vanaf 2/3.
 1/3 & 3/3 doet wel mee in het lichtorgel.
Ik ben nog spelende met div waardes, hieronder de code.


   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 12 jaar geleden
Berichten: 2859
Topic starter  

Mooi! 

(ik ga vandaag op reis, dus ik probeer tussendoor even naar jouw code te kijken)

Maar wat me een beetje irriteerde bij mijn experimenten is dat de LEDs (lijken) te springen met "blokken" - als je snapt wat ik bedoel. Met nadruk: Het lijken blokken, omdat de "resolutie" te beperkt is van het Audio signaal dat naar A0 gaat, vandaar dat ik wilde gaan testen met een klein versterkertje.

Misschien ken je het effect wel van oudere stereo's waarbij de LEDs van de VU meter steeds met 2 of 3 tegelijk omhoog springen. Ik zou dat liever wat soepeler willen zien. Maar,... als je minder LEDs gebruikt (ik test met 60 LEDs) dan kan dat natuurlijk heel erg meevallen.


   
BeantwoordenCiteren
Pagina 3 / 4
Deel: