Arduino functie met meerdere functies

Wil een functie void Led(int X)

Als Led=(1) (37) (73) (109) (145) (181)
Maak 1 high (pin 13)
Als Led = (2) (38) enz
Maak 2 high(pin 14)
Tot aan als led =(36) (72)...... (216).
Maak 36 high. (pin 48)

En daarnaast moet hij bij:
1 tot 36 Layer1 hoog maken.
37 tot 72 Layer1 enz.
Heb hiervoor een void Layer aangemaakt.
Hij moet dus bij Led(1);
Layer1 hoogmaken is pin 1 sr6/6
En pin 13 sr5/6

Ik heb dat nu als een if statement.
Maar zou hem graag korter hebben als in een for loop met een formule erin.

Zodat ik niet meer heb dan wat ik gedaan heb bij de Zas.

code:

 
void Z(int Z) 
{
for (int i = 0; i <=217; i+36)
{
Led(i *Z) ;
delay(1);
}}

Had iets in gedachten.

code:

 

void Led(int pin)
{
 if(pin  <= 37) {                        // pin 1 t/m 6 activeert Layer1//
 Layer(1);}

 else if(pin  <= 36 || pin  >= 73) {    // pin 7 t/m 12 activeert Layer2//
 Layer(2);}

 else if(pin  <= 72 || pin  >= 109) {   // pin 13 t/m 18  activeert Layer3//
 Layer(3);}

 else if(pin  <= 108 || pin  >= 145) {   // pin 19 t/m 24 activeert Layer4//
 Layer(4);}

 else if(pin  <= 144 || pin  >= 181) {   // pin 25 t/m 30 activeert Layer5//
 Layer(5);}

 else if(pin  <= 180 || pin  >= 217) {   // pin 31 t/m 36 activeert Layer6//
 Layer(6);}


 for (int i = pin; i <= 217; i+36)
{
 if(i % i  == pin +12) {
   shift.writeBit(pin, HIGH);
    }else{   
    shift.writeBit(pin +12, LOW);
}
}                       
  }

Maar i % i =altijd 1 dus dat klopt niet zo.
Iemand ideeen
Heb nog een ander forum gevraagd als ik antwoord heb zal ik het melden scheelt jullie denkwerk.

Hoewel de vraag in de categorie "geen idee" behoort, denk ik dat ik begrijp wat je bedoeld.
als je dit deel :

c code:

if(pin  <= 37) {                        // pin 1 t/m 6 activeert Layer1//
 Layer(1);}

 else if(pin  <= 36 || pin  >= 73) {    // pin 7 t/m 12 activeert Layer2//
 Layer(2);}

 else if(pin  <= 72 || pin  >= 109) {   // pin 13 t/m 18  activeert Layer3//
 Layer(3);}

 else if(pin  <= 108 || pin  >= 145) {   // pin 19 t/m 24 activeert Layer4//
 Layer(4);}

 else if(pin  <= 144 || pin  >= 181) {   // pin 25 t/m 30 activeert Layer5//
 Layer(5);}

 else if(pin  <= 180 || pin  >= 217) {   // pin 31 t/m 36 activeert Layer6//
 Layer(6);}

met iets als :
int layer = (pin/36)+1;

dan ben je er ook. immers als je 0..36 bekijkt (layer 1) dan is bijvoorbeeld 20/36 = 0 (immers, int) en plus één maakt één.
dan alleen nog Layer(layer), of Layer((pin/36)+1);

Anoniem

Let op: (pin <= 37) en (pin <= 36 || pin >= 73) zijn ook beiden waar bij elke 'pin' waarde tussen 0 en 36...

Lees als: (Pin is kleiner of gelijk aan 37) OF (Pin is kleiner of gelijk aan 36)

Wat er na die || (OR) staat doet er niet eens meer toe...

Zo zal de code nooit de 'else if (pin <= 36 || pin >= 73)' invallen want de eerste 'if(pin <= 37)' is al waar...

Waarschijnlijk bedoel je:

code:


if(pin <= 36)  // pin 1 t/m 6 activeert Layer1
{
  Layer(1);
}
 
else if(pin >= 37 || pin <= 73)  // pin 7 t/m 12 activeert Layer2
{   
  Layer(2);
}

etc.

[Bericht gewijzigd door Anoniem op maandag 15 april 2019 15:07:00 (22%)

Klopt die or moet and worden ze moeten beide waar zijn.

Zal proberen het duidelijk uit te leggen.
Ik heb een kubus 6x6x6.
6 kathode Layers
36 anode kolommen.

Ik gebruikt een libery.
Waarbij shift.writeBit gelijk = aan digitalWrite maar dan voor schuifregisters.

Ik wil in de functie led(nummer) 1 t/m 216 het volgende doen.

Ik wil dat de gekozen led aan gaat en de rest uit.

Dus kies ik Led(1);
Gaat kolom 1 aan de rest uit.
Dit betreft ook de laag
Led 1 zit op laag 1 dus laag 1 gaat aan de andere 5 gaan de uit.

Kies ik led 37 gaat ook kolom 1 aan maar op laag 2.

Met deze functie wil ik voorkomen dat er maar 1 kolom aangaat per x en 1 laag.

De lagen zitten op pin 1 t/m 6
Dus led 1/16 is laag 1
17 t/m 32 is laag 2.

De kolommen zitten op 13 t/m 48
Dus led 1 is 13 maar led 37 ook enz.
Led 2 is 14 maar led 38 ook enz.
Led 3 is 15 maar led 39 ook enz.

Op 15 april 2019 15:03:57 schreef Pimmetje:
Let op: (pin <= 37) en (pin <= 36 || pin >= 73) zijn ook beiden waar bij elke 'pin' waarde tussen 0 en 36...

Lees als: (Pin is kleiner of gelijk aan 37) OF (Pin is kleiner of gelijk aan 36)

Wat er na die || (OR) staat doet er niet eens meer toe...

Zo zal de code nooit de 'else if (pin <= 36 || pin >= 73)' invallen want de eerste 'if(pin <= 37)' is al waar...

Waarschijnlijk bedoel je:

code:


if(pin <= 36)  // pin 1 t/m 6 activeert Layer1
{
  Layer(1);
}
 
else if(pin >= 37 || pin <= 73)  // pin 7 t/m 12 activeert Layer2
{   
  Layer(2);
}

etc.

Nee sorry pimmetje.
Ik heb al een void Layer.
Die zet de 1 Layer aan de rest uit.
Dus in de functie led zet ik functie Layer(int Layer)

Led 1 t/m 36 vul 1 in bij layer
Led 37 t/m 72 vul 2 in bij layer
Led 73 t/m 108 vul 3 in bij layer
Led 109 t/m 144 vul 4 in bij layer
Led 145 t/m 180 vul 5 in bij layer
Led 181 t/m 216 vul 6 in bij layer
Zo kan ik de layers schakelen.

Daarnaast moet hij in de zelfde led FUNCTIE ook de pin 13 t/m 48 schakelen.

Led 1,37,73,109,145,181=
schrijf pin 13 high en (14 t/m 48) low
Led 2,38,74,110,146,182=
Schrijf pin14 high en (13 + 15 t/m 48) LOW.
Enz tot aan led 36 t/m 216=
Pin 48 high en 13 t/m 47 Low

Zo had ik de code eerst.

code:

 
#include <Shifty.h>


// Declare the shift register
Shifty shift; 



void setup() {
  
  shift.setBitCount(16);

 ///////////////3///6//5/////////
  shift.setPins(11, 8, 12); 
  pinMode(6,OUTPUT);
digitalWrite(6,HIGH);
}
void OE()
{
  digitalWrite(6,HIGH);
  delay(1);
  digitalWrite(6,LOW);
}
void Layer(int L)
{
  for (int i = 1; i <= 6; i++)
{
  if(i == L) {
      continue;
    }
    shift.writeBit(i , LOW);   
}
    shift.writeBit(L , HIGH);
    delay(1);
}
void Kolom(int K)
{
  for (int i = 1; i <= 36; i++)
{
  if(i == K) {
      continue;
    }
    shift.writeBit(i +12 , LOW);   
}
    shift.writeBit(K +12, HIGH);
    delay(1);
}
void Led(int K, int L)
{
  Layer(L);
  Kolom(K);
  delay(1);
}

 
void loop()
{}

Werkt ook wel maar moet telkens bij led() 2 waardes invullen.
Als ik nu alle 216 leds achter elkaar wil laten aan en uit gaan zoals in blink without delay moet ik 6 for loops maken 1 per laag.
Zou makkelijker zijn als ik gewoon 1 for loop kan doen

[Bericht gewijzigd door Jeroen vrij op maandag 15 april 2019 17:33:36 (29%)

Lucky Luke

Golden Member

Op 15 april 2019 15:53:09 schreef Jeroen vrij:
Led 1 t/m 36 vul 1 in bij layer
Led 37 t/m 72 vul 2 in bij layer
Led 73 t/m 108 vul 3 in bij layer
Led 109 t/m 144 vul 4 in bij layer
Led 145 t/m 180 vul 5 in bij layer
Led 181 t/m 216 vul 6 in bij layer
Zo kan ik de layers schakelen.

Hmm. Als het nu steeds per 36 ging, kon layer = led / 36 (desnoods layer = (int) floor(led/36);

Eluke.nl | De mens onderscheid zich van (andere) dieren door o.a. complexe gereedschappen en bouwwerken te maken. Mens zijn is nerd zijn. Blijf Maken. (Of wordt, bijvoorbeeld, cultuurhistoricus)

code:


void led  (int n)
{
  Layer ((n-1)/36 + 1);
  digitalWrite (13+((n-1)%36), 1);
}
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

Bedankt allemaal maar volgens mij heb ik hem
Was inderdaad te moeilijk aan het denken oplossing wat makkelijk voor woorden.

c code:

 
#include <Shifty.h>

// Declare the shift register
Shifty shift; 


void setup() {
  
  shift.setBitCount(16);

 ///////////////3///6//5/////////
  shift.setPins(11, 8, 12); 
  pinMode(6,OUTPUT);
digitalWrite(6,HIGH);
}
void OE()
{
  digitalWrite(6,HIGH);
  delay(1);
  digitalWrite(6,LOW);
}
void Layer(int pin)
{
  
  for (int i = 1; i <= 6; i++)
{
 if(i == pin) {
  continue;
   } 
    shift.writeBit(i , LOW);
   } 
    shift.writeBit(pin , HIGH);

}
void Kolom(int pin)

{
  for (int i = 1; i <= 36; i++)
{
  if(i == pin) {
      continue;
    }
    shift.writeBit(i , LOW);   
}

    shift.writeBit(pin , HIGH);
}
  

void Led(int pin)
{
 if(pin  <= 37) {                        // pin 1 t/m 6 activeert Layer1//
Layer(1);
Kolom(pin);Kolom(pin);}

 else if(pin  <= 36 && pin  >= 73) {    // pin 7 t/m 12 activeert Layer2//
Layer(2);
Kolom(pin -36);}

 else if(pin  <= 72 && pin  >= 109) {   // pin 13 t/m 18  activeert Layer3//
Layer(3);
Kolom(pin -72);}

 else if(pin  <= 108 && pin  >= 145) {   // pin 19 t/m 24 activeert Layer4//
Layer(4);
Kolom(pin -108);}

 else if(pin  <= 144 && pin  >= 181) {   // pin 25 t/m 30 activeert Layer5//
Layer(5);
Kolom(pin -144);}

 else if(pin  <= 180 && pin  >= 217) {   // pin 31 t/m 36 activeert Layer6//
Layer(6);
Kolom(pin -180);}


}
void loop(){}

[Bericht gewijzigd door Henry S. op donderdag 18 april 2019 21:59:17 (0%)

c code:

 if(i == pin) {
      continue;
    }
    shift.writeBit(i , LOW);   
}

    shift.writeBit(pin , HIGH);

code:


shift.writeBit (i, i==pin);
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
KGE

Golden Member

c code:

for (int i = pin; i <= 217; i+36)

Dat had

c code:

for (int i = pin; i <= 217; i+=36)

moeten zijn denk ik.

die uitgebreide if else om de layer te kiezen moet je gewoon vervangen door
pin te delen door 36.
Dat resulteert in 0 voor 0 t/m 35
Dus als je pin bij 1 begint tel je er eerst 1 bij op voor je deelt.
Wil je de restwaarde hebben gebruik je ene modulo (%)
Precies zoals rew al aangaf.

Weet je dat zeker als ik led 40 aan wil hebben op layer2 deel ik dat door 36 =1,14
Tel ik daar 1 bij op= 2,14.
Ziet de arduino dat dan als 2?

als je het in een int stopt en niet in een float dan zal er in C altijd naar beneden afgerond worden in hele getallen.

dus 1/36 = 0
40/36 = 1
wil je nu bijvoorbeeld weten dat voor led 40 dit de 4e led is in layer 2 (40-36 = 4)
dan doe je dit:

c code:


int ledPin = 40;
int layer = ledPin / 36; //dit wordt dus 1
int layerPin = ledPin % 36; //de rest waarde is 4
Arco

Special Member

Als je bij één begint met nummeren van leds en layers moet je wel bij beiden eentje optellen. Als je bij nul begint niet...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Zit er nog aan te denken om de sr poorten te switchen.
Als ik namelijk 7 pinnen per sr gebruik ipv 8.
Kom ik nooit aan de maximale 70mA
Ik gebruik 9.4mA per pin.

led op dat omdat je je leds in de layers scant je meer stroom door je leds moet/mag jagen om geen afbreuk op de helderheid te doen.
Dus stel een led is 20mA gespect, en je scant hem met een bepaalde dutycyle mag je er bijvoorbeeld 60mA doorheen sturen. Moet je wel in de datasheet kijken.
Nu vormt dat dan wel een probleem met je schuifregisters misschien?
gebruik je de 595?
Daar is anders ook een TPIC595 van.
Of je zet er een uln2803 achter

Ik heb een project waarbij ik drie zeven-segmenten displays aanstuur. Ik heb de stroom door de segmenten op net onder 20mA uitgemikt.

Als ik een reeds-geprogrammeerd bordje probeer te herprogrammeren, dan blijkt dat ie de boel niet compleet reset alvorens te gaan programmeren: er blijft een digit gewoon staan. En daar heb je dus de reden dat het eigenlijk fijn is dat je toch op die 20mA mikt, statisch. Doe je dat niet zou je eigenlijk hardware moeten maken om de boel uit te zetten als er niet geswitched wordt.

Bij moderne leds is het prima acceptabel als ze 1/3e van de tijd aanzijn. Voor 1/8e zal je misschien iets betere leds moeten kopen dan ik in mijn zeven segments displays heb zitten om dit voor mekaar te krijgen....

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

Ik had al een 3x3x3 cube gemaakt hier krijgen de leds ook 9,4mA.
Die zijn behoorlijk fel.

Ik gebruik nu npn transistor op de gnd de voor de 6x6x6.
Zou ik deze ook op de anodes kunnen gebruiken?
Weet niet hoeveel mA ik dan per pin gebruik. En of dat beter is
Ik gebruik 1kohm resistors op de base weet niet hoeveel dat moet zijn om 20mA naar de led te sturen.
Weet iemand dat

https://youtu.be/xxaDUhBjsiE

Handig om eindelijk te weten waar je mee bezig bent. Achteraf logisch met 36 leds en 6 layers.

Je gebruikt een arduino mega, toch? Je hebt nu de 36 kolommen gewoon met een weerstandje direct aan een output zitten?
Ah. Nu zie ik dat je een shiftregister gebruikt. Ik dacht dat andere mensen dat (fout) zaten te gokken. Gok of niet: ze hadden het goed. Dan zit je aan de max 70mA per '595 o.i.d. en dan is het een voordeel dat je iedere 8 leds toch naar een nieuwe chip moet. De per-chip limiet is zo veel minder heftig.

Ik zou dat zo houden. Het is geen lolletje om 36 weerstand-tor combinaties te moeten gaan solderen.

De arduino kan gewoon 20mA op iedere output leveren. Je zal vast tegen: 'officieel mag je maar zoveel mA totaal trekken' aanlopen. In de praktijk loopt het wel los. Als je maar weet dat je waarschijnlijk wel "buiten spec" gaat en dat je het netter op moet lossen als je "professioneel ontwerper" zou zijn.

Ik zou in dit stadium niet gaan lopen optimaliseren aan de weerstanden. Als ze "best wel fel" waren bij de 3x3, dan kan je nu gewoon de helft van het licht accepteren als je naar 6x6 gaat. Geen probleem.

Als je torren wilt gebruiken voor ook de led-lijnen dan is het 't makkelijst om dat met PNP te doen als de layers met NPN aangstuurd worden. Andersom kan natuurlijk ook. Maar ik vind het nu niet nodig. Gewoon nu iets werkends proberen te maken.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

Kan het niet alleen met npn?
Op mijn breadboards kan ik met npn zowel de gnd als de vcc schakelen
Pnp moet ik bestellen Namenlijk.
Ik wil de transistors gebruiken uit veiligheid om de max 70ma te vermijden.
En wou voor de gnd 2 npn parallel zetten omdat 1 laag alle leds bijna 360ma moet sinken

Twee torren parallel is "tricky". Van twee weerstanden parallel weet je dat ze in princiepe de stroom zullen delen: De spanningen zijn gelijk dus ook de stroom.

Van twee torren parallel die je als schakelaar gebruikt kan het zomaar zijn dat de verzadigingsspanning van de ene lager is dan die van de andere. Het gevolg is dan dat je een enorm scheve verhouding kan krijgen in de stroom die de twee torren krijgen.

Stuur je dan 150mA door twee torren die ieder max 100mA mogen, dan kan het al zijn dat de ene minder dan 50 pakt en de andere meer dan 100. Poef!

In jou opstelling ZOU je dit probleem kunnen omzeilen door 18 leds op de ene en 18 op de andere tor aan te sluiten.

Als je 74HC595 chips gebruikt: Die 70mA is met 10mA per ledje een vrij "zachte" limiet: De chip kan het officieel niet aan, maar in de praktijk heeft ie nog behoorlijk wat marge.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

Kan dus beter 6 leds op 1 sr zetten en een gnd
Dan weet ik zeker dat het een nooit mis gaat.
Moet ik alleen even uitzoeken hoe ik dan de leds toch makkelijk kan nummeren op volgorde.
Dan moet ik maar een case aan maken met 32 cases

Ik heb nu een case aangemaakt.
Met Col(int range,int state)
Range staat voor case nummer.
Dus de leds hebben nu nr 1-36.
State is voor high of LOW.

Zo nu kan ik col(1,1) kolom1 aan.
Kan iemand mij helpen hier een pin array voor te maken
Zodat ik op ee de makkelijke manier er 6 aan kan zetten 30 uit.
Het zijn altijd 6 op1 volgend.
Dus gaat 1-6 aan rest uit.
7-12 aan rest uit.

Kan iemand mij hier vertellen wat er mis is met onderstaande codes.

code:

 
void Layer(int i)
{
  if (int i = 1; i <= 5; i++) {
       digitalWrite(12,HIGH);
       digitalWrite(13,HIGH);
       digitalWrite(11,LOW);
  } else if(int i = 6; i <= 10; i++) {
       digitalWrite(11,HIGH);
       digitalWrite(13,HIGH);
       digitalWrite(12, LOW);
  } else (int i = 1; i <= 15; i++) {
       digitalWrite(12,HIGH);
       digitalWrite(11,HIGH);
       digitalWrite(13,LOW);   
  } 
}  

Deze noob is een echte noob haha

Heb onderstaande ook geprobeerd maar die laat alleen de derde if branden.

code:

 
void Layer(int K)
{
  
 if ( K >= 0 &&  K < 6 ) {
    digitalWrite(12, HIGH);
    digitalWrite(13, HIGH);
    digitalWrite(11, LOW);
  } else if ( K >= 5 &&  K < 11 ) {
    digitalWrite(11, HIGH);
    digitalWrite(13, HIGH);
    digitalWrite(12, LOW);
  } else  (K >= 10 &&  K < 16 );{
    digitalWrite(12, HIGH);
    digitalWrite(11, HIGH);
    digitalWrite(13, LOW);
  }
}

En heb hem opgelost
Heb nu if k<6
Else if k<11
En de laatse else leeg

Begin layers en leds met nul te tellen. Is echt handiger.

Als je int s = led/6; doet, dan heb je direct het schuifregisternummer. Vermenigvuldig dat met 8 en dan heb je het eerste ledje op dat schuifregister.

c code:

int n;
n = 8*(led/6) + led %6;

voila! je n heeft het lednummer van als je de laatste twee posities van ieder schuifregister leeg laat.

Maar ik snap niet waarom je moeilijk doet. Gewoon de stroom iets lager afstellen of gewoon weten dat je zelden patronen hebt waarbij alles tegelijk aan is.

Daarnaast snap ik niet waarom je alle leds 1 voor 1 lijkt te willen aansturen. Dan krijg je een 1:216 multiplexing terwijl je de hardware lijkt te maken zodat een 1:6 multiplexing mogelijk is.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/