Arduino - enkel upp/ner-räknare funkar inte

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
FormerMazda
Inlägg: 6076
Blev medlem: 27 februari 2006, 14:59:36
Ort: Tranås (Jönköping)

Arduino - enkel upp/ner-räknare funkar inte

Inlägg av FormerMazda »

Ibland fastnar man på de enklaste saker, men jag skyller väl på att jag inte sitter så mycket i Arduino IDE och mer i den jag faktiskt har som yrke att hantera..

Hur som haver, jag vill ha två räknare, en räknar upp till 255, en ner till 0. Sen byter dom håll.
Enkelt förklarat, inte kritiskt med exakt 255 eller 0 som ni ser i koden.
För debug så skriver jag ut mina värden och om vi är i ena eller andra if-satsen.
Det som händer, och syns i debug, är att den räknar åt ena hållet tills iCU blir 255, då sätts iUP till 0 och iDN BORDE sättas till 1. Men det verkar inte så?
Se utdrag ur debug, kopierade delen som är av intresse.
Debug skrev: Startar:

2 - 254
bUP
3 - 253
bUP
4 - 252
bUP

osv..

bUP
253 - 3
bUP
254 - 2
bUP
254 - 2

254 - 2

254 - 2

254 - 2
Alltså räknar den på, men sen blir ju varken iUP eller iDN 1 och därför räknar den inte längre.

Vad missar jag för enkelt fel?

Jag kan dra in hela koden om så önskas, men det som är av intresse (enligt mig) är detta:
int iCU = 1;
int iCD = 255;
int iUP = 1;
int iDN = 0;

void loop() {

if (iUP == 1) {
iCU = iCU + 1;
iCD = iCD - 1;
if (iCU == 255) {
iUP = 0;
iDN = 1;
}
}

if (iDN == 1) {
iCU = iCU - 1;
iCD = iCD + 1;
if (iCD == 255) {
iUP = 1;
iDN = 0;
}
}

Serial.print(iCU);
Serial.print(" - ");
Serial.print(iCD);
Serial.println(" ");

if (iUP == 1) {
Serial.print("bUP");
}
if (iDN == 1) {
Serial.print("bDN");
}

Serial.println(" ");

}
Borre
Inlägg: 4570
Blev medlem: 14 juni 2007, 15:43:50
Ort: Hälsingland

Re: Arduino - enkel upp/ner-räknare funkar inte

Inlägg av Borre »

Posta koden med code-taggen, nu är det väldigt svårläst.
Användarvisningsbild
Klas-Kenny
Inlägg: 11325
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Arduino - enkel upp/ner-räknare funkar inte

Inlägg av Klas-Kenny »

Jag kan i alla fall inte se något sätt i den koden, så att resultatet skulle bli som det blir.

Posta hela koden, kanske gör du något dumt någon annanstans utan att veta om det..?
Och som sagt, posta i code-taggar.
FormerMazda
Inlägg: 6076
Blev medlem: 27 februari 2006, 14:59:36
Ort: Tranås (Jönköping)

Re: Arduino - enkel upp/ner-räknare funkar inte

Inlägg av FormerMazda »

Här är hela koden Code fönster. Ber om ursäkt för att inte ha postat så, brukar göra det annars..

Kan kanske nån lib skriva till samma variabel?
Eller kan jag ha knas med min kina-klon-ardunio?
Den har dock kört större program än så..

Kod: Markera allt

#include "FastLED.h"


#define NUM_LEDS 50
#define DATA_PIN    41
#define CLOCK_PIN   40
#define BRIGHTNESS  128
#define FRAMES_PER_SECOND  120
CRGB leds[NUM_LEDS];

int iCU = 1;
int iCD = 255;
int iUP = 1;
int iDN = 0;

void setup() {
    // sanity check delay - allows reprogramming if accidently blowing power w/leds
    delay(2000);

    FastLED.addLeds<WS2801, DATA_PIN, CLOCK_PIN, RGB>(leds, NUM_LEDS);
    FastLED.setBrightness(  BRIGHTNESS );
    Serial.begin(9600);
}

void loop() {
  
  if (iUP == 1) {
  iCU = iCU + 1;
  iCD = iCD - 1;
    if (iCU == 255) {
      iUP = 0;
      iDN = 1;
    }
  }

  if (iDN == 1) {
  iCU = iCU - 1;
  iCD = iCD + 1;
    if (iCD == 255) {
      iUP = 1;
      iDN = 0;
    }
  }
  
  
  
  for (int i = 0; i <= NUM_LEDS; i++) {
    leds[i]  =   CRGB( 000, iCU, 000);
    leds[i+1] =  CRGB( iCD, 000, 000);
    leds[i+2] =  CRGB( 220, 100, 000);
    i=i+2;
  }
  addGlitter(50);
  FastLED.show();
  delay(10);
    Serial.print(iCU);
    Serial.print(" - ");
    Serial.print(iCD);
  Serial.println(" ");
  
 if (iUP == 1) {
      Serial.print("bUP");
 }
  if (iDN == 1) {
      Serial.print("bDN");
 }
    
  Serial.println(" ");

}

void xmas() {
for (int i = 0; i <= NUM_LEDS; i++) {
    leds[i]  =   CRGB( 000, 255, 000);
    leds[i+1] =  CRGB( 255, 000, 000);
    leds[i+2] =  CRGB( 220, 100, 000);
    i=i+2;
  }

}

void addGlitter( fract8 chanceOfGlitter) 
{
  if( random8() < chanceOfGlitter) {
    leds[ random16(NUM_LEDS) ] += CRGB::White;
  }
}
Mr Andersson
Inlägg: 1397
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

Re: Arduino - enkel upp/ner-räknare funkar inte

Inlägg av Mr Andersson »

Inte säker på vad som är tänkt ska göras här men du skriver iaf utanför arrayen, så det är möljigt att du skriver över din räknare.

Kod: Markera allt

for (int i = 0; i <= NUM_LEDS; i++) {
    leds[i]  =   CRGB( 000, iCU, 000);
    leds[i+1] =  CRGB( iCD, 000, 000);
    leds[i+2] =  CRGB( 220, 100, 000);
    i=i+2;
  }
}
i får aldrig vara mer än NUM_LEDS-1

Edit:
Det är också ett bra exempel på hur man ber om hjälp på ett forum.
Testa först att koden som postas verkligen reproducerar felet. :)
(Inte menat som kritik mot dig specifikt utan mer ett allmänt tips för att få hjälp snabbare)

Edit2:
Oops, citerade fel kodsnutt. Uppdaterat. :doh:
FormerMazda
Inlägg: 6076
Blev medlem: 27 februari 2006, 14:59:36
Ort: Tranås (Jönköping)

Re: Arduino - enkel upp/ner-räknare funkar inte

Inlägg av FormerMazda »

Ja den arrayen får väl fler värden än vad NUM_LEDS egentligen "tillåter". Men just nu är detta 50 LEDS som får färgerna grön, röd, orange.
Sen är tanken att få dessa färger att vandra mjukt över varandra. Hur man nu beskriver det.

Men arrayen är bara till för att läsa in RGB-värden, och där läses iCU och iCD in. Oavsett det så tycker jag att iUP och iDN inte sätts korrekt, faktiskt blir väl bägge 0, vilket inte borde kunna hända?

Jag ska absolut testa att begränsa min skrivning så inte NUM_LEDS överskrids.
Imorgon, kan inte testa det här nu ändå.

Och jag tackar för pointers om hur man beter sig, för egen del och andras.
Men senast postade koden av mig är komplett iallafall.
Användarvisningsbild
Klas-Kenny
Inlägg: 11325
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Arduino - enkel upp/ner-räknare funkar inte

Inlägg av Klas-Kenny »

Ja den där for-loopen skriver ju långt utanför array, högst sannolikt där som andra variabler skrivs över.

För övrigt inte säkert att iUP och iDN sätts till just noll, resultatet blir detsamma oavsett vad de sätts till förutom just ett. Kan lika väl vara att de blir 100 eller vad som helst.
Användarvisningsbild
ffredrik
Inlägg: 341
Blev medlem: 20 oktober 2009, 17:52:18
Ort: Göinge

Re: Arduino - enkel upp/ner-räknare funkar inte

Inlägg av ffredrik »

Där är två felaktiga for-loopar f.ö.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43176
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Arduino - enkel upp/ner-räknare funkar inte

Inlägg av sodjan »

> Hur som haver, jag vill ha två räknare, en räknar upp till 255, en ner till 0. Sen byter dom håll.

Det räcker med *en* räknare, det andra värdet är alltid 255 - räknaren.
Eller missförstår jag något? Kan de ha andra startvärden som inte ligger så?
FormerMazda
Inlägg: 6076
Blev medlem: 27 februari 2006, 14:59:36
Ort: Tranås (Jönköping)

Re: Arduino - enkel upp/ner-räknare funkar inte

Inlägg av FormerMazda »

Då ska vi se, bägge for-looparna går utanför sina gränser. Dock har bara den ena körts då den andra låg inom en rutin som aldrig kördes. Gammalt skräp, städades bort.
Men så debuggade jag var iUP och iDN var, inte om dom blev 1. Och mycket riktigt så var iUP 1 tills den blev 0. iDN däremot var bara 0 innan for-loopen och blev därefter massor. Så helt klart skrev for-loopen över den.
Ny lärdom för mig! Lite för bortskämd med mitt andra språk inser jag nu.

Jag helt enkelt skrev en hård gräns långt under NUM_LEDS, och då funkar det.

Kod: Markera allt

  for (int i = 0; i <= 30; i++) {
    leds[i]  =   CRGB( 000, iCU, 000);
    leds[i+1] =  CRGB( iCD, 000, 000);
    leds[i+2] =  CRGB( 220, 100, 000);
    i=i+2;
MEN, vad är det som händer egentligen?
NUM_LEDS är bara det antal LEDs man har i sin slinga som FastLED ska tända. Har man en slinga på 100 LEDs och sätter NUM_LEDS till 50 så tänds bara 50 upp. Gör man tvärt om så borde det väl bara innebära att FastLED skickar mer data till LEDs som inte finns?
Borde liksom inte knasa och skriva över andra variabler?
Användarvisningsbild
ffredrik
Inlägg: 341
Blev medlem: 20 oktober 2009, 17:52:18
Ort: Göinge

Re: Arduino - enkel upp/ner-räknare funkar inte

Inlägg av ffredrik »

Skriver du så här:

Kod: Markera allt

for (int i = 0; i <= N; i++)
kommer loopen att gås igenom N+1 gånger (0 t o m N). Bättre att alltid skriva

Kod: Markera allt

for (int i = 0; i < N; i++)
FormerMazda
Inlägg: 6076
Blev medlem: 27 februari 2006, 14:59:36
Ort: Tranås (Jönköping)

Re: Arduino - enkel upp/ner-räknare funkar inte

Inlägg av FormerMazda »

Om N = 50

i <= N
Resulterar i att loopen körs 0-50 = 51 gånger.

i < N
Resulterar i att loopen körs 0-49 = 50 gånger.

Så det är ju en rimlighet i det.

Två saker "motsäger" det som mitt problem:
1. Den loopen är tagen från exempelkod från FastLED, alltså har dom själva skrivit den så. Men man kanske inte stött på problemet, för det har inte spelat nån roll att den försöker tända 51 LEDs istället för bara de 50 man anslutit.
2. Jag gör ju dessutom hopp om 3 i loopen, så jag ska ju stanna ännu mer innan. Får kanske räkna på det lite bättre.

Sodjan:
Du har helt rätt! Och det är ju en snyggare lösning på två räknare som går åt varsitt håll.
Jag vet dock inte helt säkert än hur många och mellan vilka värden de ska gå. Klarar jag mig på dessa två, så är din lösning klart roligare
Det jag vill uppnå är att färgerna ska vandra i slingan. Färgerna är röd, grön och gul. Man sätter dom som RGB. Röd och grön är enkelt då 255 av vardera ger en bra färg. Gul lite värre då 220röd och 100grön ser bäst ut.
Så en led ska först vara 255 röd, svepa över till 220 röd + 100 grön, sen svepa till 255 grön. Men jag vill ha alla tre färgerna samtidigt på slingan. Så:
LED #1: röd -> gul -> grön -> röd etc.
LED #2: gul -> grön -> röd -> gul etc.
LED #3: grön -> röd -> gul -> grön etc.
osv..

Om det blev tydligare så.. :D
Användarvisningsbild
Wedge
Inlägg: 1026
Blev medlem: 8 juli 2012, 17:33:33

Re: Arduino - enkel upp/ner-räknare funkar inte

Inlägg av Wedge »

Din loop går varken 50 eller 51 gånger. Du pillar på loopvariabeln, så koden i loopen körs 17 gånger.

I din loop är det sista värdet på i=48.
leds[i+2] är leds[50]. Med storleken på leds satt till 50 element är detta utanför arrayen, det pekar på 51:a elementet. Du skriver sönder variablerna efter leds-arrayen.
Shimonu
Inlägg: 294
Blev medlem: 21 oktober 2015, 22:44:33

Re: Arduino - enkel upp/ner-räknare funkar inte

Inlägg av Shimonu »

Någon bör väl också påpeka att det är ganska onödigt att kör i += 2 i for-loopen, det bör göras korrekt i "headern" för for-loopen

Kod: Markera allt

for(int i = 0; i < N; i += 3)
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43176
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Arduino - enkel upp/ner-räknare funkar inte

Inlägg av sodjan »

En annan lösning är att ha en tabell med alla RGB värden som är tänkbara,
en komplett RGB "sekvens" med fasta beräknade RGB värden.. Sen startat
på olika positioner för de olika lysdioderna och bara rullat runt tabellen.

En fördel är att varje RGB värde kan anpassas för att få rätt färgintryck
med hänsyn till hur olika färger upplevs o.s.v.
Skriv svar