Avatar billede pmnielsen Novice
29. juli 2019 - 13:24 Der er 8 kommentarer og
1 løsning

Arduino. Kan ikke bruge parameter i funktion

Jeg har følgene kode hvor jeg forsøger at bruge en parameter til at ændre farven på en led strip.
Funktion row1 giver fejl, row2 virker som den skal, men kunne godt tænke mg at benytte parameter fra funktionen.

void row1(String color='Red'){
  leds_2[0] = CRGB::color;
  leds_3[0] = CRGB::color;
  FastLED.show();
}

void row2(){
  leds_2[1] = CRGB::Red;
  leds_3[1] = CRGB::Red;
  FastLED.show();
}

FEJL KODE:
/tmp/686048918/Blink_lys_indgang_v1_1/Blink_lys_indgang_v1_1.ino: In function 'void row1(String)':

/tmp/686048918/Blink_lys_indgang_v1_1/Blink_lys_indgang_v1_1.ino:70:15: error: 'color' is not a member of 'CRGB'

leds_2[0] = CRGB::color;
Avatar billede Slater Ekspert
29. juli 2019 - 14:25 #1
Du kan ikke oversætte en streng til en konstant ved runtime, det vil slet ikke virke. Hvis du vil bruge en streng, er du nødt til manuelt at oversætte det, f.eks. med

if (color == "Red")
  x = CRGB::Red;
else if (color == "Blue")
  x = CRGB::Blue;

osv. Ikke en specielt køn måde at gøre det på. Bedre vil generelt være at passe farven fra den kaldende funktion i stedet for en streng der repræsenterer det. Jeg vil gætte på farverne bare er en int, så noget a la

void row1(int color) { ... }

og så kalde den med row1(CRGB::Red) osv. Kræver dog den kaldende funktion har adgang til CRGB objektet.
Avatar billede arne_v Ekspert
29. juli 2019 - 15:32 #2
Den foerste fejl er vel at:

void row1(String color='Red'){

skal vaere:

void row1(String color = "Red"){

men ellers ja der maa skulle streng sammenlignes.
Avatar billede pmnielsen Novice
29. juli 2019 - 20:00 #3
Mange tak for det.
I får jo nok ret :-) fik den til at verify efterfølgene kode. Men den bliver kun blå.

void row1(String color, int waitTime){
  String newcolor="CRGB::"+color;
  leds_1[0] = "newcolor"; 
  leds_2[0] = "newcolor";
  leds_3[0] = "newcolor";
  FastLED.show();
  delay(waitTime);
}

void loop() {
  row1("Red",5000);
  row1("Blue",5000);
}
------------------------------------------------------------------------------------------
kode som Slater forslog virker fint

void row1(String color, int waitTime){
  if(color=="Red"){
  leds_1[0] = CRGB::Red;
  leds_2[0] = CRGB::Red;
  leds_3[0] = CRGB::Red;}
  else if(color=="Blue"){
  leds_1[0] = CRGB::Blue;
  leds_2[0] = CRGB::Blue;
  leds_3[0] = CRGB::Blue;}
    Serial.println(color);
  FastLED.show();
  delay(waitTime);
}
void loop() {
row1("Red",5000);
row1("Blue",5000);
}
---------------------------------------------------------------------------
Efterfølgene kode virker også. Kan i sige hvilken der er bedst? hvis der er en af dem der er det.

void row1red(int waitTime){
  leds_1[0] = CRGB::Red;
  leds_2[0] = CRGB::Red;
  leds_3[0] = CRGB::Red;
  FastLED.show();
  delay(waitTime);
}
void row1blue(int waitTime){
  leds_1[0] = CRGB::Blue;
  leds_2[0] = CRGB::Blue;
  leds_3[0] = CRGB::Blue;
  FastLED.show();
  delay(waitTime);
}
void loop() {
row1red(5000);
row1blue(5000);
}
Avatar billede arne_v Ekspert
29. juli 2019 - 20:44 #4
void row1(uint8_t color, int waitTime){
  leds_1[0] = color;
  leds_2[0] = color;
  leds_3[0] = color;
  FastLED.show();
  delay(waitTime);
}

virker praktisk.
Avatar billede pmnielsen Novice
29. juli 2019 - 20:50 #5
Jeg blive vil stadig nød til at bruge
If ( color="red"){....} O.S.V
Avatar billede arne_v Ekspert
29. juli 2019 - 21:02 #6
Nej. Ikke naar du sender en uint8_t over.

row1(CRGB::Red, 5000);
row1(CRGB::Blue, 5000);
Avatar billede pmnielsen Novice
29. juli 2019 - 21:25 #7
Det er jo lige det jeg ønsker mig :-)

Men jeg kan ikke få det til at virke
Den står og skiftet mellem blå og ingen lys når jeg bruger denne kode ?

void row1(uint8_t color, int waitTime){
  leds_1[0] = color; 
  leds_2[0] = color;
  leds_3[0] = color;
  FastLED.show();
  delay(waitTime);
}

void loop() {
  row1(CRGB::Red,5000);
  row1(CRGB::Blue,5000);
  row1(CRGB::White,5000);
}
Avatar billede arne_v Ekspert
30. juli 2019 - 01:39 #8
Hm.

Det sidste problem er nok Arduino specifikt.
Avatar billede pmnielsen Novice
31. juli 2019 - 20:26 #9
Jeg ved ikke om det giver nogen mening for nogen af jer.

Jeg har prøvet at lave en serial print af parameteren color, og det se ud som om det skriver det som "RGB numre"

KODE:
void row1(uint8_t color, int waitTime){
  leds_1[0] = color; 
  leds_2[0] = color;
  leds_3[0] = color;
  Serial.println(color);
  FastLED.show();
  delay(waitTime);
}
void row2(uint8_t color, int waitTime){
  leds_2[1] = color; 
  leds_3[1] = color;
  Serial.println(color);
  FastLED.show();
  delay(waitTime);
}


void loop() {
  row1(CRGB::Red,5000);
  row2(CRGB::Green,5000);
  row1(CRGB::Blue,5000);
  row2(CRGB::Yellow,5000);
  row1(CRGB::White,5000);

}
SERIAL MONITOR
0
0
255
0
255
0
0
255
0
255
0
0
255
0
255
0
0
255
0
255
0
0
255
0
255
0
0
255
0
255
0
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester