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;
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.
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.
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);
}
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.
pmnielsen Novice
29. juli 2019 - 20:50 #5
Jeg blive vil stadig nød til at bruge
If ( color="red"){....} O.S.V
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);
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);
}
arne_v Ekspert
30. juli 2019 - 01:39 #8
Hm.

Det sidste problem er nok Arduino specifikt.
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
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

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





Premium
Test: Apples nye iPhone er bygget til fart og stil: Så gode er iPhone 12 og iPhone 12 Pro
Computerworld tester: IPhone 12 og iPhone 12 Pro er bygget til fart og til at se godt ud. Varen leveres stilsikkert, men noget er overset i farten.
Computerworld
Salling Group lukker stor online-satsning efter kun et år
Millionsatsningen Fillop lukker ved årets udgang. I stedet er supermarkeds-giganten Salling Group nu på vej med en række helt nye online-satsninger, der er affødt af coronakrisen.
CIO
Podcast: Hos Viking Life-Saving Equipment er it gået fra at være backend til at være noget, som kunderne spørger aktivt efter
Podcast, The Digital Edge: Viking leverer en stadig større del af deres produkt som en tjeneste. Som en del af tjenesten tager Viking ansvar for sikkerheden ved at levere, dokumentere og vedligeholde det nødvendige sikkerhedsudstyr. Hør hvordan Henrik Balslev senior digital director hos Viking har løftet den opgave.
Job & Karriere
Regner din ferie væk? Brug tiden på at søge en af disse otte stillinger, der er ledige netop nu
Det sjasker ned over hele Danmark. Du kan bruge de våde sommerdage på at søge et af disse otte job, der er ledige lige nu.
White paper
Sådan outsourcer du effektivt – og undgår fælderne
Nogle outsourcer for at minimere omkostningsniveauet, andre for at skaffe ressourcer og spidskompetencer, der er svære at skaffe lokalt – eller af en helt tredje årsag. Der er dog talrige forhold, der er gode at afdække, før man overhovedet begynder at lede en outsourcingudbyder. Man skal klarlægge egne projektbehov samt de spørgsmål og krav, man vil stille samt indsamle viden og erfaringer om, hvordan samarbejdet indledes, drives og styres optimalt. Dertil skal man kende til de hyppigste faldgruber, der kan få et ellers lovende outsourcingsamarbejde til at køre i grøften.