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
IBM fortsætter offensiv opkøbsstrategi: Køber en af de største og ældste multicloud-leverandører i USA
IBM opkøber cloud-virksomheden MSP Taos. Det er blot det seneste opkøb fra IBM i jagten på de store cloud-giganter og falder i tråd med IBM's offensive hybrid cloud-strategi.
Computerworld
Verdens tredjestørste smartphone-producent blacklistes af Trump-administrationen
Smartphoneproducenten Xiaomi er blandt de ni nytilkomne på Trump-administrationens sorte liste over kinesiske virksomheder, som amerikanerne ikke længere må investere i.
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
Microsoft i kæmpe dansk satsning - åbner tre store datacentre i Danmark
Microsoft lancerer kæmpe satsning fra hovedkvarteret i Lyngby. Selskabet åbner tre store bæredygtige datacentre på Sjælland.
White paper
Cisco Umbrella: Sådan udvikler truslerne sig netop nu
Hver eneste dag håndterer de mere end 30 datacentre under Cisco Umbrella mere end 240 milliarder forespørgsler fra 190 lande. Det giver sikkerhedseksperter hos Cisco Talos et enestående datagrundlag for at kortlægge, hvordan cybertrusselsbilledet udvikler sig. I dette whitepaper kan du læse, hvordan trusselsbilledet har udviklet sig hen over 2020. Men – endnu vigtigere – om, hvordan din organisation bedst forbereder sig på at håndtere truslerne i tiden der kommer.