[Opgelost] Problemen met Arduino uno met WS2812B Led strip, HC-05 en BT app

Hallo, Voor mijn schoolproject ben ik bezig met een ledstrip op muziek. Ik ben nieuw op dit forum, dus sorry als ik iets vergeet te vermelden.
Materialen

  • Arduino Uno
  • WS2812B Ledstrip 2m, 60 led/m
  • HC-05 BT module
  • Jack chassis (Om jack input naar analoge poort te doen)

Ik heb in mijn app verschillende modussen voor verschillende soorten muziek. Ik heb ook een apart gedeelte voor een statische kleur, dus niet op muziek.
Ik wil dat ik met behulp van de app de led strip kan bedienen.

#include <SoftwareSerial.h>
#include <FastLED.h>
#define NUM_LEDS 120
#define PIN 7
#define COLOR_ORDER GRB
CRGB leds[NUM_LEDS];
SoftwareSerial Bluetooth(3,2);

int k = 2040;
int k2 = 340;
int k3 = 340;
int k4 = 340;
int k5 = 340;
int k6 = 340;
int k7 = 340;
  int kleur =  0;
  int kleur2 = 0;
  int kleur3 = 0;
  int kleur4 =  150;
  int kleur5 = 120;
  int kleur6 = 250;
  int kleur7 = 150;
  int kleur8 = 120;
  int kleur9 = 250;
  int kleur10 = 150;
  int kleur11 = 120;
  int kleur12 = 250;
  int kleur13 = 150;
  int kleur14 = 120;
  int kleur15 = 250;
  int kleur16 = 150;
  int kleur17 = 120;
  int kleur18 = 250;
  int kleur19 = 150;
  int kleur20 = 120;
  int kleur21 = 250;
  int R = 0;
  int G = 0;
  int B = 0;
  int brightness = 50;
  String dataIn ="";
  String mode = "0";

void setup() {
  // put your setup code here, to run once:
FastLED.addLeds<WS2812B, PIN, COLOR_ORDER>(leds, NUM_LEDS);
FastLED.setBrightness(brightness);
Serial.begin(9600);
Bluetooth.begin(9600);
}

void loop() {
    if ((Bluetooth.available() > 0) && (mode == "0")){
    dataIn = Bluetooth.readString();
    Serial.println(dataIn);
    delay(20);
    if (dataIn.startsWith("M")){
    mode = dataIn.substring(dataIn.indexOf("M") + 1);
        Serial.println(mode);
      } else if (dataIn.startsWith("2")) {
    delay(10);
    String stringR = dataIn.substring(dataIn.indexOf("R") + 1, dataIn.indexOf("G"));
      R = stringR.toInt();
      String stringG = dataIn.substring(dataIn.indexOf("G") + 1, dataIn.indexOf("B"));
      G = stringG.toInt();
      String stringB = dataIn.substring(dataIn.indexOf("B") + 1, dataIn.indexOf("E"));
      B = stringB.toInt();
      mode = "4";
    }
   else if (dataIn.startsWith("3")){
    String stringBrightness = dataIn.substring(dataIn.indexOf("3") + 1, dataIn.length());
    brightness = stringBrightness.toInt();
    FastLED.setBrightness(brightness);
   } 
   }
   
if (mode == "1"){
        int audioInput = analogRead(A0);
        int ledSterkte0 = map(audioInput, 0, 60, 0, 120);
        FastLED.clear();
        Serial.println(audioInput);
        for (int i = 0; i < ledSterkte0; i++) {
            leds[i].setRGB (R, G, B);
            k++;
            if(k > 2040){
              R = random(0, 150);
              G = random(0, 240);
              B = random(0, 170);
              k = 0;
}}
        FastLED.show();
        if (Bluetooth.available() > 0){
            mode = "0";
}}
      
else if (mode == "2"){
           int audioInput = analogRead(A0);
           int ledSterkte0 = map(audioInput, 0, 60, 0, 59);
           int ledSterkte1 = map(audioInput, 0, 60, 120, 60);
           FastLED.clear();
           Serial.println(audioInput);
           for (int i = 0; i < ledSterkte0; i++) {
              leds[i].setRGB (kleur, kleur2, kleur3);
              k++;
              if(k > 2040){
                  kleur = random(10, 255);
                  kleur2 = random(10, 255);
                  kleur3 = random(10, 255);
                  k = 0;
}}
          for (int i2 = 120; i2 > ledSterkte1; i2--) {
              leds[i2].setRGB (kleur, kleur2, kleur3);
              k++;
              if(k > 2040){
                kleur = random(10, 255);
                kleur2 = random(10, 255);
                kleur3 = random(10, 255);
                k = 0;
}}  
    FastLED.show();
    if (Bluetooth.available() > 0){
    mode = "0";
      }  
      }
else if (mode == "3"){
     int audioInput = analogRead(A0);
  int ledSterkte0 = map(audioInput, 0, 60, 0, 19);
  int ledSterkte1 = map(audioInput, 0, 60, 20, 39);
  int ledSterkte2 = map(audioInput, 0, 60, 40, 59);
  int ledSterkte3 = map(audioInput, 0, 60, 60, 79);
  int ledSterkte4 = map(audioInput, 0, 60, 80, 99);
  int ledSterkte5 = map(audioInput, 0, 60, 100, 120);
  
  FastLED.clear();
          Serial.println(audioInput);

  for (int i = 0; i < ledSterkte0; i++) {
    leds[i].setRGB (kleur4, kleur5, kleur6);
  k2++;
  if(k2 > 340){
  kleur4 = random(10, 255);
  kleur5 = random(10, 255);
  kleur6 = random(10, 255);
  k2 = 0;
  }
}
  for (int i2 = 20; i2 < ledSterkte1; i2++) {
    leds[i2].setRGB (kleur7, kleur8, kleur9);
  k3++;
  if(k3 > 340){
  kleur7 = random(10, 255);
  kleur8 = random(10, 255);
  kleur9 = random(10, 255);
  k3 = 0;
  }
}
  for (int i3 = 40; i3 < ledSterkte2; i3++) {
    leds[i3].setRGB (kleur10, kleur11, kleur12);
  k4++;
  if(k4 > 340){
  kleur10 = random(10, 255);
  kleur11 = random(10, 255);
  kleur12 = random(10, 255);
  k4 = 0;
  }
}
  for (int i4 = 60; i4 < ledSterkte3; i4++) {
    leds[i4].setRGB (kleur13, kleur14, kleur15);
  k5++;
  if(k5 > 340){
  kleur13 = random(10, 255);
  kleur14 = random(10, 255);
  kleur15 = random(10, 255);
  k5 = 0;
  }
}
  for (int i5 = 80; i5 < ledSterkte4; i5++) {
    leds[i5].setRGB (kleur16, kleur17, kleur18);
  k6++;
  if(k6 > 340){
  kleur16 = random(10, 255);
  kleur17 = random(10, 255);
  kleur18 = random(10, 255);
  k6 = 0;
  }
}
  for (int i6 = 100; i6 < ledSterkte5; i6++) {
    leds[i6].setRGB (kleur19, kleur10, kleur11);
  k7++;
  if(k7 > 340){
  kleur19 = random(10, 255);
  kleur20 = random(10, 255);
  kleur21 = random(10, 255);
  k7 = 0;
  }
}
  

FastLED.show();
if (Bluetooth.available() > 0){
    mode = "0";
      }  
      }
else if (mode == "4"){
        for (int i = 0; i < NUM_LEDS; i++) {
    leds[i].setRGB (R, G, B);
    if (Bluetooth.available() > 0){
  mode = "0";
      }
    }
    FastLED.show();
    delay(20);  
        }
    if (dataIn.startsWith("3")){
      delay(10);
      String stringBr = dataIn.substring(dataIn.indexOf("I") + 1, dataIn.indexOf("J"));
      brightness = stringBr.toInt();
      FastLED.setBrightness(brightness);
              Serial.println(brightness);
              
          }
          FastLED.show();
    }

Dit is al aardig gelukt. Het lukt me om kleurtjes te krijgen en om modussen te kiezen, alleen heb ik het allemaal samengevoegd en nu werkt het niet meer. In de code haal ik de inkomende data van de bluetooth op, zodat er een modus gekozen wordt. Alleen als ik in de app een modus kies, krijg ik in de uitvoer van de Arduino een omgekeerd vraagteken. In een andere code heb ik de bluetooth module getest en kreeg ik wel goede waardes eruit.
Ik stuur met behulp van de app informatie naar de bluetooth module. Ik heb 4 knoppen, mode 1, mode 2, mode 3 en colors.
Foto's van de app + code: Arduino Uno Hulp - Album on Imgur
Code 1, code van mode knop
Code 2, code van color knop
Bovenstaande code zorgt ervoor dat ik met behulp van een colorpicker een code krijg, bestaande uit 2R...G...B...E
Op de puntjes komen dan de RGB waardes van die kleur.
Als je op een mode knop klikt stuurt die de waarde M1, M2, of M3. Als je op de color knop klikt, stuurt die de waarde M4.

Aan het begin van de code zorg ik ervoor dat de variabele mode 1, 2, 3 of 4 wordt. Alleen heb ik het probleem dat in deze codes niet goed worden opgehaald, in de uitvoer krijg ik soms een omgekeerd vraagteken en soms werkt het wel, maar dan kan ik niet van mode veranderen. Hoe kan ik dat oplossen? De app werkt wel zoals ik wil, dit heb ik getest met een andere code.

Alvast bedankt!
PS de app kan je via deze linkjes downloaden
.apk : File on MEGA
.aia ; File on MEGA
Het aia bestand kan je in MIT App Inventor uploaden zodat je bij de volledige code kan.

Code6.0.ino (5.85 KB)

Hoi jorisw2004, en welkom.

Gezien je andere posts, vraag ik je om eerst de gebruiksaanwijzing van het forum (klik !) te lezen.
Het helpt je het forum zo optimaal mogelijk te gebruiken, en te voorkomen dat je behulpzame leden tegen de schenen schopt (bijvoorbeeld door je vragen op verschillende plaatsen te stellen).

Je vertelt dat de verschillende delen van je code goed werken, maar wanneer je die verschillende delen combineert, dat het dan niet meer werkt.
Dat betekent dus dat de delen met elkaar botsen.
1 van jouw delen is software serial, en een andere is FastLED.
Software serial maakt gebruik van interrupts, dat is essentieel voor de werking er van.
En FastLED zet interrupts uit om zijn naam (Fast) waar te maken, zie de betreffende documentatie.

Dit betekent dus dat je voor het ene of het andere een andere oplossing zult moeten kiezen.
Het is aan jou welke oplossing dat dan zal worden.
Veel succes met de keuze en wij zijn benieuwd, dus houd ons op de hoogte !

Hallo,

Ik heb het probleem met de Led-strip en app opgelost.
Het volgende heb ik gedaan,
De code hieronder heb ik veranderd

if (mode == "1"){[color=#222222][/color]
        int audioInput = analogRead(A0);[color=#222222][/color]
        int ledSterkte0 = map(audioInput, 0, 60, 0, 120);[color=#222222][/color]
        FastLED.clear();[color=#222222][/color]
        Serial.println(audioInput);[color=#222222][/color]
        for (int i = 0; i < ledSterkte0; i++) {[color=#222222][/color]
            leds[i].setRGB (R, G, B);[color=#222222][/color]
            k++;[color=#222222][/color]
            if(k > 2040){[color=#222222][/color]
              R = random(0, 150);[color=#222222][/color]
              G = random(0, 240);[color=#222222][/color]
              B = random(0, 170);[color=#222222][/color]
              k = 0;[color=#222222][/color]
}}[color=#222222][/color]
        FastLED.show();[color=#222222][/color]
        if (Bluetooth.available() > 0){[color=#222222][/color]
            mode = "0";[color=#222222][/color]
}}

Dit geldt ook voor de code van de andere modussen.
Dit is de gehele code:

#include <SoftwareSerial.h>
#include <FastLED.h>
#define NUM_LEDS 120
#define PIN 7
#define COLOR_ORDER GRB
CRGB leds[NUM_LEDS];
SoftwareSerial Bluetooth(3,2);

int k = 2040;
int k2 = 340;
int k3 = 340;
int k4 = 340;
int k5 = 340;
int k6 = 340;
int k7 = 340;
  int kleur =  0;
  int kleur2 = 0;
  int kleur3 = 0;
  int kleur4 =  150;
  int kleur5 = 120;
  int kleur6 = 250;
  int kleur7 = 150;
  int kleur8 = 120;
  int kleur9 = 250;
  int kleur10 = 150;
  int kleur11 = 120;
  int kleur12 = 250;
  int kleur13 = 150;
  int kleur14 = 120;
  int kleur15 = 250;
  int kleur16 = 150;
  int kleur17 = 120;
  int kleur18 = 250;
  int kleur19 = 150;
  int kleur20 = 120;
  int kleur21 = 250;
  int R = 0;
  int G = 0;
  int B = 0;
  int brightness = 50;
  String dataIn ="";
  String mode = "0";
  
void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
Bluetooth.begin(9600);
FastLED.addLeds<WS2812B, PIN, COLOR_ORDER>(leds, NUM_LEDS);
FastLED.setBrightness(brightness);
}

void loop() {
  // put your main code here, to run repeatedly:

if ((Bluetooth.available() > 0)){
    dataIn = Bluetooth.readString();
    Serial.println(dataIn);
    delay(20);
    if (dataIn == "o"){
    mode = "0";
    }
    else if (mode == "0"){
      off();
     if (dataIn.startsWith("M")){
    mode = dataIn.substring(dataIn.indexOf("M") + 1);
        Serial.println(mode);
      }} else if (dataIn.startsWith("2")) {
    String stringR = dataIn.substring(dataIn.indexOf("R") + 1, dataIn.indexOf("G"));
      R = stringR.toInt();
      String stringG = dataIn.substring(dataIn.indexOf("G") + 1, dataIn.indexOf("B"));
      G = stringG.toInt();
      String stringB = dataIn.substring(dataIn.indexOf("B") + 1, dataIn.indexOf("E"));
      B = stringB.toInt();
      mode = "4";
    }
   else if (dataIn.startsWith("3")){
    bright();
   }} 
 if (mode == "1"){
  mode1(3);
  if (Bluetooth.available() > 0){
            mode = "0";
}
 }
 if (mode == "2"){
  mode2(3);
  if (Bluetooth.available() > 0){
            mode = "0";
}
 }
 if (mode == "3"){
  mode3(12);
  if (Bluetooth.available() > 0){
            mode = "0";
}
 }
 if (mode == "4"){
  mode4();
    }
}

void mode1 (int wait){
  FastLED.setBrightness(100);
  if (Bluetooth.available() > 0){
    mode = "0";
      }  
int audioInput = analogRead(A0);
         if(audioInput > 60){
          audioInput = 59;
         }
        int ledSterkte0 = map(audioInput, 0, 60, 0, 120);
        FastLED.clear();
        Serial.println(mode);
       
        
        for (int i = 0; i < ledSterkte0; i++) {
            leds[i].setRGB (R, G, B);
            k++;
            if(k > 2040){
              R = random(0, 150);
              G = random(0, 240);
              B = random(0, 170);
              k = 0;
}}
        FastLED.show();
delay(wait);
}

void mode2 (int wait){
  FastLED.setBrightness(100);
  if (Bluetooth.available() > 0){
    mode = "0";
      }  
int audioInput = analogRead(A0);
            if(audioInput > 60){
          audioInput = 59;
         }
           int ledSterkte0 = map(audioInput, 0, 60, 0, 59);
           int ledSterkte1 = map(audioInput, 0, 60, 120, 60);
           FastLED.clear();
           Serial.println(mode);
           for (int i = 0; i < ledSterkte0; i++) {
              leds[i].setRGB (kleur, kleur2, kleur3);
              k++;
              if(k > 2040){
                  kleur = random(10, 255);
                  kleur2 = random(10, 255);
                  kleur3 = random(10, 255);
                  k = 0;
}}
          for (int i2 = 120; i2 > ledSterkte1; i2--) {
              leds[i2].setRGB (kleur, kleur2, kleur3);
              k++;
              if(k > 2040){
                kleur = random(10, 255);
                kleur2 = random(10, 255);
                kleur3 = random(10, 255);
                k = 0;
}}  
    FastLED.show();
delay(wait);
}

void mode3 (int wait){
  FastLED.setBrightness(100);
  if (Bluetooth.available() > 0){
    mode = "0";
      }  
int audioInput = analogRead(A0);
      if(audioInput > 60){
          audioInput = 59;
         }
  int ledSterkte0 = map(audioInput, 0, 60, 0, 19);
  int ledSterkte1 = map(audioInput, 0, 60, 20, 39);
  int ledSterkte2 = map(audioInput, 0, 60, 40, 59);
  int ledSterkte3 = map(audioInput, 0, 60, 60, 79);
  int ledSterkte4 = map(audioInput, 0, 60, 80, 99);
  int ledSterkte5 = map(audioInput, 0, 60, 100, 120);
  
  FastLED.clear();
          Serial.println(mode);

  for (int i = 0; i < ledSterkte0; i++) {
    leds[i].setRGB (kleur4, kleur5, kleur6);
  k2++;
  if(k2 > 340){
  kleur4 = random(10, 255);
  kleur5 = random(10, 255);
  kleur6 = random(10, 255);
  k2 = 0;
  }
}
  for (int i2 = 20; i2 < ledSterkte1; i2++) {
    leds[i2].setRGB (kleur7, kleur8, kleur9);
  k3++;
  if(k3 > 340){
  kleur7 = random(10, 255);
  kleur8 = random(10, 255);
  kleur9 = random(10, 255);
  k3 = 0;
  }
}
  for (int i3 = 40; i3 < ledSterkte2; i3++) {
    leds[i3].setRGB (kleur10, kleur11, kleur12);
  k4++;
  if(k4 > 340){
  kleur10 = random(10, 255);
  kleur11 = random(10, 255);
  kleur12 = random(10, 255);
  k4 = 0;
  }
}
  for (int i4 = 60; i4 < ledSterkte3; i4++) {
    leds[i4].setRGB (kleur13, kleur14, kleur15);
  k5++;
  if(k5 > 340){
  kleur13 = random(10, 255);
  kleur14 = random(10, 255);
  kleur15 = random(10, 255);
  k5 = 0;
  }
}
  for (int i5 = 80; i5 < ledSterkte4; i5++) {
    leds[i5].setRGB (kleur16, kleur17, kleur18);
  k6++;
  if(k6 > 340){
  kleur16 = random(10, 255);
  kleur17 = random(10, 255);
  kleur18 = random(10, 255);
  k6 = 0;
  }
}
  for (int i6 = 100; i6 < ledSterkte5; i6++) {
    leds[i6].setRGB (kleur19, kleur10, kleur11);
  k7++;
  if(k7 > 340){
  kleur19 = random(10, 255);
  kleur20 = random(10, 255);
  kleur21 = random(10, 255);
  k7 = 0;
  }}
  

FastLED.show();
delay(wait);
}

void mode4(){
        for (int i = 0; i < NUM_LEDS; i++) {
    leds[i].setRGB (R, G, B);
    }
    if (Bluetooth.available() > 0){
  mode = "0";
      }
    FastLED.show();
    delay(20);  
        }

void bright(){
String stringBr = dataIn.substring(dataIn.indexOf("I") + 1, dataIn.indexOf("J"));
      brightness = stringBr.toInt();
      FastLED.setBrightness(brightness);
              Serial.println(brightness);
              FastLED.show();
              mode = "4";
}

void off(){
  FastLED.clear();
  
}

Ik heb alles wat in de if lussen van de modussen stond verplaatst naar een andere void.
Dit heeft voor mij gewerkt.
Bedankt voor de hulp!

Wat commentaar; doe ermee wat je wilt. Het is bedoeld om je programma wat eenvoudiger te maken.

Iedere keer dat ik variabelen zie met nummers, denk ik "arrays".

Als ik naar je code kijk lijkt het erop dat 3 kleuren altijd samen gaan (bv kleur, kleur2, kleur3, vervolgens bv kleur7, kleur8, kleur9 enzovoorts) en dan denk ik aan structs, classes of (om het simpel te houden voor de beginner) 3 arrays (een voor rood, een voor groen en een voor blauw).

De variabele kX lijkt ook een relatie te hebben met de de variable kleurX maar ik kan daar niet direct mijn vinger op leggen. Waar staat k voor; misschien kun je overwegen een naam te gebruiken die de lading dekt? Als je over een jaar je code wilt aanpassen zul je het waarschijnlijk niet meer weten.

Wetenswaardigheidje:
De variabelen in een for-loop zijn alleen bekend in die for-loop; dus in de tweede for-loop kun je ook i gebruiken; er is geen reden om de variabele i2 te noemen.

  for (int i = 0; i < ledSterkte0; i++) {
    ...
    ...
  }

  for (int i2 = 20; i2 < ledSterkte1; i2++) {
    ...
    ...
  }

Dan heb je, vermoed ik, ook een foutje zitten in

  for (int i6 = 100; i6 < ledSterkte5; i6++) {
    leds[i6].setRGB (kleur19, kleur10, kleur11);

Ik vermoed dat kleur10 en kleur11 eigenlijk kleur20 end kleur21 moeten zijn.

Je mist ook de besturing van wat leds in mode3 maar misschien is dat de bedoeling.

  int ledSterkte0 = map(audioInput, 0, 60, 0, 19);
  int ledSterkte1 = map(audioInput, 0, 60, 20, 39);
  int ledSterkte2 = map(audioInput, 0, 60, 40, 59);
  int ledSterkte3 = map(audioInput, 0, 60, 60, 79);
  int ledSterkte4 = map(audioInput, 0, 60, 80, 99);
  int ledSterkte5 = map(audioInput, 0, 60, 100, 120);

  for (int i = 0; i < ledSterkte0; i++) {
    leds[i].setRGB (kleur4, kleur5, kleur6);
    ...
    ...
  }
  for (int i2 = 20; i2 < ledSterkte1; i2++) {
    leds[i2].setRGB (kleur7, kleur8, kleur9);
    ...
    ...
  }
  for (int i3 = 40; i3 < ledSterkte2; i3++) {
    leds[i3].setRGB (kleur10, kleur11, kleur12);
    ...
    ...
  }
  for (int i4 = 60; i4 < ledSterkte3; i4++) {
    leds[i4].setRGB (kleur13, kleur14, kleur15);
    k5++;
    ...
    ...
  }
  for (int i5 = 80; i5 < ledSterkte4; i5++) {
    leds[i5].setRGB (kleur16, kleur17, kleur18);
    ...
    ...
  }
  for (int i6 = 100; i6 < ledSterkte5; i6++) {
    leds[i6].setRGB (kleur19, kleur10, kleur11);
    ...
    ...
  }

De eerste for-loop gaat van 0 tot 18, de tweede for-loop begint bij 20 en gaat tot 38; enz. Dus wat gebeurt er met leds[19], leds[39] enz. ?

Bedankt voor de hulp.
Ik zal dit proberen aan te passen in mijn code

De variabelen k heb ik voor het veranderen van de kleur. K telt elke keer op als die 1 keer door een mode is geweest, dus als die 300 keer door een mode loopt, is k 300

Ik heb een if-lus waarbij ik kijk of k > 2400
Dit betekend dat die 2400 keer de lus in is geweest, als dat zo is krijgt die een willekeurige kleur, en dan wordt k weer 0, zodat die dat proces weer opnieuw kan doen

Oke, toch weer een klein probleem.

Ik heb nu het probleem dat die af en toe als ik in de app een kleur kies, dat ik nog steeds rare waardes krijg vanuit de bluetooth module. Dit gebeurd geheel willekeurig. Is er misschien iemand die nog een foutje ziet in mijn code? Het gaat hierbij om mode 4, dit is voor de kleuren. Ik heb geprobeerd het bluetooth gedeelte en het LED-strip gedeelte zo veel mogelijk te scheiden van elkaar. De waarde die ik binnen hoor te krijgen ziet er als volgt uit: 2R...G...B...E, op de drie puntjes komen dan waarden te staan van een kleur die ik in de app heb gekozen. Ik krijg nu soms dit terug:
&*:⸮55B255E
Dit is mijn huidige code zonder globale variabelen, heb ik wel, maar te veel tekens:

#include <SoftwareSerial.h>
#include <FastLED.h>
#define NUM_LEDS 120
#define PIN 7
#define COLOR_ORDER GRB
CRGB leds[NUM_LEDS];
SoftwareSerial Bluetooth(3,2);
void setup() {
    // put your setup code here, to run once:
    Serial.begin(9600);
    Bluetooth.begin(9600);
    FastLED.addLeds<WS2812B, PIN, COLOR_ORDER>(leds, NUM_LEDS);
    FastLED.setBrightness(brightness);
}

void loop() {
  // put your main code here, to run repeatedly:
    if ((Bluetooth.available() > 0)){
      dataIn = Bluetooth.readString();
      Serial.println(dataIn);
      delay(20);
      if (dataIn == "o"){
        mode = "0";
}
if (dataIn == "5"){
        willekeurig = true;
} else if (dataIn == "6"){
        willekeurig = false;
}
    else if (mode == "0"){
      k = 180;
      off();
     if (dataIn.startsWith("M")){
    mode = dataIn.substring(dataIn.indexOf("M") + 1);
      }} else if (dataIn.startsWith("2")) {
    String stringR = dataIn.substring(dataIn.indexOf("R") + 1, dataIn.indexOf("G"));
      R = stringR.toInt();
      String stringG = dataIn.substring(dataIn.indexOf("G") + 1, dataIn.indexOf("B"));
      G = stringG.toInt();
      String stringB = dataIn.substring(dataIn.indexOf("B") + 1, dataIn.indexOf("E"));
      B = stringB.toInt();
      mode = "4";
    }
   else if (dataIn.startsWith("3")){
    bright();
   }
   if (dataIn.startsWith("4")){
      R = random(10, 255);
      G = random(10, 255);
      B = random(10, 255);
      
    }
   } 
 if (mode == "1"){
  if (Bluetooth.available() > 0){
            mode = "0";
}
 else if(willekeurig == true){
     if (k > 200){
      kleur =  random(10, 255);
      kleur2 = random(10, 255);
      kleur3 = random(10, 255);
      kleur4 = random(10, 255);
      kleur5 = random(10, 255);
      kleur6 = random(10, 255);
      kleur7 = random(10, 255);
      kleur8 = random(10, 255);
      kleur9 = random(10, 255);
      kleur10 = random(10, 255);
      kleur11 = random(10, 255);
      kleur12 = random(10, 255);
      kleur13 = random(10, 255);
      kleur14 = random(10, 255);
      kleur15 = random(10, 255);
      kleur16 = random(10, 255);
      kleur17 = random(10, 255);
      kleur18 = random(10, 255);
  k = 0;
} 
  }
  else if(willekeurig == false){
      kleur =  R;
      kleur2 = G;
      kleur3 = B;
      kleur4 = R;
      kleur5 = G;
      kleur6 = B;
      kleur7 = R;
      kleur8 = G;
      kleur9 = B;
      kleur10 = R;
      kleur11 = G;
      kleur12 = B;
      kleur13 = R;
      kleur14 = G;
      kleur15 = B;
      kleur16 = R;
      kleur17 = G;
      kleur18 = B; 
  }
  mode1(12);
 }
 if (mode == "2"){
  if (Bluetooth.available() > 0){
            mode = "0";
}
else if(willekeurig == true){
     if (k > 200){
      kleur =  random(10, 255);
      kleur2 = random(10, 255);
      kleur3 = random(10, 255);
  k = 0;
} 
  }
  else if(willekeurig == false){
      kleur =  R;
      kleur2 = G;
      kleur3 = B;
  }
    mode2(3);
 }
 if (mode == "3"){
  mode3(12);
  if (Bluetooth.available() > 0){
            mode = "0";
}
else if(willekeurig == true){
     if (k > 200){
      kleur =  random(10, 255);
      kleur2 = random(10, 255);
      kleur3 = random(10, 255);
      kleur4 = random(10, 255);
      kleur5 = random(10, 255);
      kleur6 = random(10, 255);
      kleur7 = random(10, 255);
      kleur8 = random(10, 255);
      kleur9 = random(10, 255);
      kleur10 = random(10, 255);
      kleur11 = random(10, 255);
      kleur12 = random(10, 255);
      kleur13 = random(10, 255);
      kleur14 = random(10, 255);
      kleur15 = random(10, 255);
      kleur16 = random(10, 255);
      kleur17 = random(10, 255);
      kleur18 = random(10, 255);
  k = 0;
} 
  }
  else if(willekeurig == false){
      kleur =  R;
      kleur2 = G;
      kleur3 = B;
      kleur4 = R;
      kleur5 = G;
      kleur6 = B;
      kleur7 = R;
      kleur8 = G;
      kleur9 = B;
      kleur10 = R;
      kleur11 = G;
      kleur12 = B;
      kleur13 = R;
      kleur14 = G;
      kleur15 = B;
      kleur16 = R;
      kleur17 = G;
      kleur18 = B; 
  }
 }
 if (mode == "4"){
  mode4();
    }
}

void mode1 (int wait){
  FastLED.setBrightness(brightness);
  int audioInput = analogRead(A0);
  if(audioInput > 60){
          audioInput = 60;
         }
  FastLED.clear();
    Serial.println(audioInput);

for (int i = 9; i > ledSterkte1; i--) {
    leds[i].setRGB (kleur, kleur2, kleur3);
}

for (int i = 9; i < ledSterkte2; i++) {
    leds[i].setRGB (kleur, kleur2, kleur3);
}

for (int i = 29; i > ledSterkte3; i--) {
    leds[i].setRGB (kleur4, kleur5, kleur6);
}

for (int i = 29; i < ledSterkte4; i++) {
    leds[i].setRGB (kleur4, kleur5, kleur6);
}

for (int i = 49; i > ledSterkte5; i--) {
    leds[i].setRGB (kleur7, kleur8, kleur9);
}

for (int i = 49; i < ledSterkte6; i++) {
    leds[i].setRGB (kleur7, kleur8, kleur9);
}

for (int i = 69; i > ledSterkte7; i--) {
    leds[i].setRGB (kleur10, kleur11, kleur12);
}

for (int i = 69; i < ledSterkte8; i++) {
    leds[i].setRGB (kleur10, kleur11, kleur12);
}

for (int i = 89; i > ledSterkte9; i--) {
    leds[i].setRGB (kleur13, kleur14, kleur15);
}

for (int i = 89; i < ledSterkte10; i++) {
    leds[i].setRGB (kleur13, kleur14, kleur15);
}

for (int i = 109; i > ledSterkte11; i--) {
    leds[i].setRGB (kleur16, kleur17, kleur18);
}
for (int i = 109; i < ledSterkte12; i++) {
    leds[i].setRGB (kleur16, kleur17, kleur18);
}
k++;
FastLED.show();
delay(wait);
}

void mode2 (int wait){
  FastLED.setBrightness(brightness);
  if (Bluetooth.available() > 0){
    if (dataIn == "o"){
        mode = "0";
}
      }  
int audioInput = analogRead(A0);
            if(audioInput > 60){
          audioInput = 60;
         }
           int ledSterkte0 = map(audioInput, 0, 60, 0, 59);
           int ledSterkte1 = map(audioInput, 0, 60, 120, 60);
           FastLED.clear();
           Serial.println(mode);
           for (int i = 0; i < ledSterkte0; i++) {
              leds[i].setRGB (kleur, kleur2, kleur3);
              }
          for (int i2 = 120; i2 > ledSterkte1; i2--) {
              leds[i2].setRGB (kleur, kleur2, kleur3);
              }
  
    FastLED.show();
delay(wait);
k++;
}

void mode3 (int wait){
  FastLED.setBrightness(brightness);
  if (Bluetooth.available() > 0){
      if (dataIn == "o"){
        mode = "0";
}}  
int audioInput = analogRead(A0);
      if(audioInput > 60){
          audioInput = 60;
         }
  int ledSterkte0 = map(audioInput, 0, 60, 0, 19);
  int ledSterkte1 = map(audioInput, 0, 60, 20, 39);
  int ledSterkte2 = map(audioInput, 0, 60, 40, 59);
  int ledSterkte3 = map(audioInput, 0, 60, 60, 79);
  int ledSterkte4 = map(audioInput, 0, 60, 80, 99);
  int ledSterkte5 = map(audioInput, 0, 60, 100, 120);
  
  FastLED.clear();
          Serial.println(mode);

  for (int i = 0; i <  ledSterkte0; i++) {
    leds[i].setRGB (kleur, kleur2, kleur3);
}
  for (int i = 20; i < ledSterkte1; i++) {
    leds[i].setRGB (kleur4, kleur5, kleur6);
}
  for (int i = 40; i < ledSterkte2; i++) {
    leds[i].setRGB (kleur7, kleur8, kleur9);
}
  for (int i = 60; i < ledSterkte3; i++) {
    leds[i].setRGB (kleur10, kleur11, kleur12);
}
  for (int i = 80; i < ledSterkte4; i++) {
    leds[i].setRGB (kleur13, kleur14, kleur15);
}
  for (int i = 100; i < ledSterkte5; i++) {
    leds[i].setRGB (kleur16, kleur17, kleur18);
  }
  

FastLED.show();
delay(wait);
k++;
}

void mode4(){
        for (int i = 0; i < NUM_LEDS; i++) {
    leds[i].setRGB (R, G, B);
    }
    if (Bluetooth.available() > 0){
  mode = "0";
      }
    FastLED.show();
    delay(20);  
        }

void bright(){
String stringBr = dataIn.substring(dataIn.indexOf("I") + 1, dataIn.indexOf("J"));
      brightness = stringBr.toInt();
      FastLED.setBrightness(brightness);
              Serial.println(brightness);
              FastLED.show();
              mode = "4";
}

void off(){
  FastLED.clear();
  FastLED.show();
}

In de code hierboven heb ik dingen weggelaten, de volledige code staat in de bijlage. Ik heb dingen weggelaten die hoogstwaarschijnlijk niet van toepassing zijn op dit probleem. Ik had wel de volledige code willen posten, maar dit heeft te veel tekens.

BTcode3.0.ino (9.22 KB)

Ik vermoed dat je probleem ligt in het gebruik van SoftwareSerial. Je zult een soortgelijk probleem tegenkomen met HardwareSerial, maar dat zal zich uiten in gemiste karakters, niet in corrupte karakters.

SoftwareSerial en HardwareSerial gebruiken interrupts. NeoPixels zijn kritisch als het aankomt op de timing en om die reden worden interrupts uitgeschakeld als je FastLED.show() aanroept.

Je hebt een paar opties voor zover ik kan zien:
1)
Gebruik HardwareSerial (pins 0 en 1) op de Uno; zoals gezegd kan het resulteren in gemiste karakters maar niet in corrupte karakters.
Nadeel 1 is dat je, voordat je een upload van je code doet, de bluetooth module moet losnemen. Nadeel 2 is dat je geen debug opties meer hebt tenzij je dat implementeert in je phone app of een extra ttl-to-usb adapter aansluit en SoftwareSerial gebruikt voor de debug communicatie met de PC.
2)
Gebruik een Arduino met extra seriele poorten. De Arduino Leonardo heeft dezelfde vorm als de Uno en pinnen 0 en 1 zijn niet gebruikt voor communicatie met de PC. De Arduino Mega is een andere optie. En als het kleiner moet kun je denken aan een Arduino Micro of een SparkFun ProMicro. En er zijn meer opties.

Verder kan een goed protocol ervoor zorgen dat je niet reageert op corrupte data of gemiste data; dit vergt veranderingen in de app en in de Arduino.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.