Hoe kan dit beter

Ik wil graag 4 leds in een cirkel laten draaien.
Nu kan ik dit doen

void loop() {
   digitalwrite(Greenpin, HIGH) ;
   digitalwrite(RedPin, LOW) ; 
   digitalwrite(BluePin, LOW); 
   digitalwrite(GreenPin2, LOW); 
  delay(1000); 

  digitalwrite(Greenpin, LOW) ;
   digitalwrite(RedPin, HIGH) ; 
   digitalwrite(BluePin, LOW); 
  digitalwrite(GreenPin2, LOW); 

......
}

Kan ik deze code ook verbeteren omdat ik hier heel veel code zie die eigenlijk hetzelfde doet.

Probeer dit eens...

// Geef de pinnen een naam
#define Greenpin 2
#define RedPin 3
#define BluePin 4
#define GreenPin2 5

byte pin[] = {Greenpin, RedPin, BluePin, GreenPin2 }; // Zet pinnen in array

void setup() {
  for (int i = 0; i < 4; i++) {
    pinMode(pin[i], OUTPUT); // Configureer de pinnen
  }
}

void loop() {
  for (int i = 0; i < 4; i++) { // Tel tot vier
    for (int j = 0; j < 4; j++) { // Kies het nummer dat je wilt aansteken
      if (i == j)
        digitalWrite(pin[j], HIGH); // Steek deze aan
      else
        digitalWrite(pin[j], LOW); // Doof de anderen
    }
    delay(1000); // Doe een dutje
  }
}

Heel goed, roelofw.

Dat zijn de kleine stapjes waar ik het in jouw andere onderwerp al over had.
Zoals je aan xfpd's sketchje al ziet, hoef je niet per se met namen zoals "RedPin" te werken.
Je Arduino kan het niets schelen hoe je dingen noemt of aanduidt, zolang er maar geen misverstand over kan bestaan; die namen zijn voor jouw gemak en/of overzicht bedoeld.
Dus je kunt ook gewoon de pinnummers gebruiken en daar mee gaan rekenen.
Wanneer je xfpd's sketch hebt uitgeprobeerd en begrijpt wat daar gedaan wordt, kun je het nog efficiënter maken.
Want daar tel je vier keer tot vier.
In die 16 stappen zet je per stap 1 LED aan, en 3 LEDs uit, ook als die al uitstaan.
Misschien kun jij dan nog iets bedenken waarmee je eerst de oude LED uitzet, en dan de nieuwe LED aanzet.
En wie weet kun je ook nog iets bedenken waardoor je ook kunt zien wat er gebeurt, want de huidige sketch is in een flits (letterlijk) voorbij.
Geinig wordt het wanneer je dan gaat variëren op de sketch die je dan gebouwd hebt.
Bijvoorbeeld door eerst de nieuwe LED aan te zetten en dan pas de vorige uit, ik noem maar wat.

Waar jij nu mee bezig bent is waar ik me het eerste weekend met de Arduino mee heb bezig gehouden.
Enorm veel plezier mee gehad, en weinig geslapen.
Ik had 6 LEDs en heb er ook een potmeterje bij betrokken want ook daar kun je leuke variaties mee bedenken.
Het leukste vond ik om zelf te bedenken wat ik nu eens kon veranderen en hoe dat dan bereikt kon worden.

Het bevindt zich in een eeuwige lus. Het is nooit voorbij.

Dank je,

Dit geeft me wel ideeën voor welke weg ik zou kunnen bewandelen om dit op te lossen.

Om alleen de laatste uit te schakelen , heb ik een formule nodig die deze reeks maakt.

1 -> 4 
2 -.> 1 
3 -> 2 
4 ->  3 

maar daar kan ik even niet goed uitkomen,

Dit zou het moeten doen als voorbeeld; je zult zelf even setop() moeten toevoegen.

int x = 4;
void loop()
{
  Serial.println(x);
  x--;
  if(x==0)
  {
    x = 4;
  }
}

Je telt van nul tot 4, dat zijn 5 waardes.
Van de LEDs flitsen er 3 heel erg kort (ik gok < 0,0000016 seconde) op, de 5e (die eigenlijk de 4e is omdat we bij nul waren begonnen) blijft aan en er wordt er een seconde gewacht.
Pin nul wordt ook gebruikt.
Dat is een eeuwige lus waarbij je ambitieus zal moeten kijken om alle 4 de LEDs te kunnen zien oplichten.

Die laatste blijft dus aan met de eerder geopperde code (waarop ik overigens geen commentaar wilde geven, maar er juist op voort wilde borduren).
De laatste stap die je wil zetten voor de 1 seconde pause, is het uitschakelen van een LED, niet het inschakelen.
Ik stel voor dat je nog een 2e veel kortere pause inlast op een strategische plaats in de sketch.
En dat je begint met tellen bij 1 zodat je pin nul niet aanstuurt.
Wanneer je dan tot 5 telt, gaat de 4e LED wel uit, maar stuur je ook pin 5 aan en ik denk niet dat dat jouw bedoeling precies was.
Onthoud dat je kunt rekenen terwijl je een pin wil aanwijzen, en dat je in elke stap 2 pinnen wil kunnen beïnvloeden.

klopt,

ben ook op zoek naar een formule die dat voor elkaar krijgt.

Dus als led1 aan moet , dan zou led 4 uit moeten gaan
Als led 2 aan moet, dan zou led 1 uit moeten gaan.
Als led 3 aan moet, dan zou led 2 uit moeten gaan
Als led 4 aan moet, dan zou led 3 uit moeten gaan.

IK zou dus de array kunnen gebruiken met de for lus en dan array[teller -1] gebruiken maar dat werkt niet voor led 1 , dan zou dan 0 worden in plaats van 4.

Dat klopt.
Je kunt nog een extra controle doen voor je de pin aanstuurt.
Die controleert dan of je na je rekenwerk buiten je bereik komt, en wanneer dat zo is, zal de waarde weer binnen het bereik worden gedwongen.
Omdat je de hoofdteller niet wil verprutsen, kun je dan wel beter een nieuwe variabele maken voor het uitschakelen.
Is je hoofdteller de variabele i (voor inschakelen), zou ik de subteller de variabele u geven voor uitschakelen.

Met dit alles los je overigens niet op dat de laatste LED aan blijft.

bummer,

Dan terug naar de tekentafel.

Nee, waarom ?
Niet te snel opgeven hoor.
Gewoon doorgaan waar je gebleven bent.
Ik heb je inmiddels meerdere tips gegeven die je kunt toepassen op de bestaande weg, door er wat code aan toe te passen.
Het is niet veel meer dan code die er nu al staat net iets anders toe te passen.

De tips die ik gegeven heb is dat jouw laatste handeling voor de seconde pauze niet is dat je een LED aanzet, maar dat je er een uitzet.
En ook dat je op een strategische plaats in je code nog een vertraging kunt toevoegen zodat je beter kunt zien wat er gebeurt (en je dus meer de ervaring krijgt die je (vermoedelijk) voor ogen had).

Geef het ook niet op.
Zie alleen nu even niet hoe dit op te lossen.

Als led1 aan moet , dan zou led 4 uit moeten gaan
Als led 2 aan moet, dan zou led 1 uit moeten gaan
Als led 3 aan moet, dan zou led 2 uit moeten gaan
Als led 4 aan moet, dan zou led 3 uit moeten gaan

Dit is wat je eerder zei.
"Zou moeten" mag je van maken "moet", het is niet iets wat eventueel zou kunnen gebeuren maar waar jij zeker van gaat maken dat het gebeurt.

Ik beschrijf hieronder wat ik begrijp dat jij wil laten gebeuren.

Er zijn X LEDs.
Als een LED aangaat, gaat ie even later uit, en is daarna de volgende aan de beurt.
Dan volgt er een pauze waarna het geheel nog een keer plaatsvindt.

Voor X mag je een willekeurig getal kiezen.

Dat kun je dan weer vertalen naar de volgende stappen in pseudo code:

Ga tellen totdat je X bereikt en maak met elke stap 1 hoger.
Zet LED X aan
Neem een korte pauze.
Zet LED X uit.
Zet de volgende teller stap.
Neem een langere pauze.
Begin van voor af aan.

Zoals je ziet is dit iets heel anders dan de eerder gegeven oplossing, en het is bewust geen echte code.
Want ik wil je graag helpen na te denken over hoe je dingen bereiken kunt, maar ook dat je meestal even goede resultaten kunt bereiken op verschillende wijzes.
Door je direct een werkende code te geven weet ik niet of je daarvan echt wat leert.

Wat ik zelf doe, is de vraagstukken die ik wil oplossen met code, opbreken in kleinere vraagstukken.
Uiteindelijk krijg je dan een lijst met vragen waarvan de oplossing heel eenvoudig is, en wanneer dat nog niet zo is dan is er nog meer op te breken.
Natuurlijk moet je daarbij ook een heel duidelijk beeld hebben van wat je uiteindelijk wil bereiken (de "opdracht").
Voor het begin is dit alles wat je nodig hebt.

Mijn eerste stapjes waren het standaard blink programma (wat meestal al in je Arduino zit wanneer je m krijgt) aanpassen zodat er om de beurt een 2e LED knipperde.
Dan naar 3, 4 LEDs.
Dan 6 LEDs in een cirkeltje.
Dan de LEDs laten "draaien" in een snelheid die met een potmeter geregeld kon worden.
Nogmaals hetzelfde maar dan met een middenstand van de potmeter, waarbij de LEDs linksom of rechtsom gingen draaien naar mate van de stand van die potmeter die dus ook de snelheid bepaalde.
Hier heb ik een weekend mee gevuld.
Het weekend daarna ging de potmeter nog de helderheid van de LEDs bepalen, en gingen de LEDs niet meteen uit, maar werd er nog een nagloeien van de LEDs gesimuleerd.
Daar had ik veel plezier van en heb er veel van geleerd, want natuurlijk ging dat niet allemaal goed en moest ik gaan uitzoeken hoe dat dan kwam.

Ik hoop je weer wat inspiratie gegeven te hebben.

Dank je ,
IK denk dat dit wel als opgelost beschouwd kan worden.

En nu tijd om daar eens iets meer met te experimenteren.
Daar leer je toch het meeste van.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.