Runninglight Uno(x)

Uno maar ik kon het niet laten er een x aan te breien.

Nu ernstig.
Ik heb een Running Light gemaakt.

Met dit (gejat) schema.

int i = 2;
int time = 200;
int dir = 1;
// https://circuits.io/circuits/81300-arduino-running-light
// the setup routine runs once when you press reset:

void setup() {  

             
  // initialize the digital pin as an output.
    for(i=2;i<=13;i++){
  pinMode(i, OUTPUT);
  }   
}

// the loop routine runs over and over again forever:
void loop() {
  digitalWrite(i, HIGH);  
  delay(time);              
  digitalWrite(i, LOW);   
  i+=dir;            
  if(i<2|i>13){
  dir*=-1;
  i+=dir*2;
  } 
}

Hier worden 12 leds gebruikt. Echter ik heb in mijn opstelling 13 leds gebruikt.

Uit de code
for(i=2;i<=13;i++) en ik wijzig dat naar 14 zou dat dan lukken?
for(i=2;i<=14;i++)

Alvast bedankt voor de reacties.
Dit is de link waar ik de mosterd haalde.

Ivan

int i = 2;
int time = 200;
int dir = 1;


// https://circuits.io/circuits/81300-arduino-running-light
// the setup routine runs once when you press reset:

void setup() {  

pinMode(A0, OUTPUT);
pinMode(A1, OUTPUT);
pinMode(A2, OUTPUT);
pinMode(A3, OUTPUT);
pinMode(A4, OUTPUT);
pinMode(A5, OUTPUT);


             
  // initialize the digital pin as an output.
    for(i=2;i<=18;i++){
  pinMode(i, OUTPUT);
  }   
}

// the loop routine runs over and over again forever:
void loop() {
  digitalWrite(i, HIGH);  
  delay(time);              
  digitalWrite(i, LOW);   
  i+=dir;            
  if(i<2|i>18){
  dir*=-1;
  i+=dir*2;
  } 
}

Zou dit werken?

Ik heb de oplossing voor het 13Lampje

int i = 2;
int time = 200;
int dir = 1;

void setup(){

pinMode(A0, OUTPUT);
pinMode(A1, OUTPUT);
pinMode(A2, OUTPUT);
pinMode(A3, OUTPUT);
pinMode(A4, OUTPUT);
pinMode(A5, OUTPUT);
int inPin = 4 ;
int inPin = 5 ;


//}
// the setup routine runs once when you press reset:



//void setup() {               
 
  Serial.print(A4);
  Serial.print(A5);  
  
  
  // initialize the digital pin as an output.
    for(i=2;i<=16;i++){
  pinMode(i, OUTPUT);
  }   
}

// the loop routine runs over and over again forever:
void loop() {
  digitalWrite(i, HIGH);  
  delay(time);              
  digitalWrite(i, LOW);   
  i+=dir;            
  if(i<2|i>16){
  dir*=-1;
  i+=dir*2;
  } 
}

Maar ik zou graag dat variabele “time” kan worden verhoogd
eerste drukknop time + 50
tweede drukknop time -50

Ik deed een poging in de sketch, maar het lukt me niet.

Hoe kan ik de drukknoppen integreren in dit projectje.

Alvast bedankt
Ivan

Waarom ga je helemaal naar 16? Het origineel maakte alleen the pinnen 2 … 13; je voegt er een (1) aan toe maakt er meteen the pinnen 2 … 16 van.

Waar is de code die de knoppen leest?

Als ik naar je inPin kijk, zit er iets fout. Normaliter worden deze gedefinieerd voor de setup(), niet in de setup(). Als je ze in de setup() functie definieerd heeft de loop() functie er geen kennis van.

Verder kan er maar een variabele zijn met de naam inPin dus zal de compiler daar wel over klagen. Het lijkt me ook logisch om de pinnen een naam te geven die aangeeft wat de functie van de pin is; bv ‘upPin’ en ‘downPin’.

Dus dat kan dan iets worden als

int i = 2;
int time = 200;
int dir = 1;

int upPin = 4;
int downPin = 5;

void setup()
{
  ...
  ...

Nu heb je nog een ander probleem. De pinnen 4 en 5 worden gebruikt als uitgang om de leds aan te sturen. Nu will je ze gebruiken als ingang en er zal een conflict zijn. Het is beter om de knoppen op wat vrije aansluitingen van je rookworst aan te sluiten; bv A3 en A4.

Er zit ook een foutje in the originele code date je meteen maar hebt gekopieerd naar je niewe code
if (i < 2 | i > 16) zou moeten zijn if (i < 2 || i > 16). Een enkele ‘|’ is een bitwise OF, de dubbele ‘||’ is een logische OF.

Eerst met schaamrode kop enkele van je vragen beantwoorden.
In theorie moesten er 12 leds heen en weer lopen.
Ik had, uiteraard 13 gaatjes gemaakt.

En ik had nog mijn analoge pinnen over.
Een rekensommetje gaf me direct 18 leds die ik kon aansturen.

Verdorie nog eens aan toe, de snelheid van het "lopen" moet een beetje variabel zijn.
Dus dacht ik aan een UP drukknop & DOWN drukknop.

Het liep een (beetje) verkeerd en het noorden bijster. En ik DOWN.

Ik heb dan van de 18 leds A4 en A5 "gereserveerd voor up & down.
en van mijn 18 leds -2 > 16 leds.

Het zou een praktisch geheel moeten worden.
zoals

Maar ik ben een beetje het bos en de bomen kwijt.

Maar van harte bedankt voor je opmerkingen.

Ivan

int i = 2;
int time = 200;
int dir = 1;
int upPin = 4;
int downPin = 5;

// the setup routine runs once when you press reset:


void setup() {

pinMode(A0, OUTPUT);
pinMode(A1, OUTPUT);
pinMode(A2, OUTPUT);
pinMode(A3, OUTPUT);


if (upPin == HIGH) {(time=time+50);};
if (downPin == HIGH) {(time=time-50);};
                 
  // initialize the digital pin as an output.
    for(i=2;i<=16;i++){
  pinMode(i, OUTPUT);
  }   
}

// the loop routine runs over and over again forever:
void loop() {
  digitalWrite(i, HIGH);  
  delay(time);              
  digitalWrite(i, LOW);   
  i+=dir;            
  if(i<2|i>16){
  dir*=-1;
  i+=dir*2;
  } 
}

En het werkt. Morgen 21/12 schakel ik in de drukknoppen…

Dus dan wordt het

int upPin =A4;
int downPin = A5;

En die kun je lezen met digitalRead().

Dit is het programma tot dus ver:

int i = 2;
int time = 200;
int dir = 1;
int upPin=A4;
int downPin=A5;
int Leds=13;


// the setup routine runs once when you press reset:


void setup() {
  
Serial.begin(9600);   
pinMode(A0, OUTPUT);
pinMode(A1, OUTPUT);
pinMode(A2, OUTPUT);
pinMode(A3, OUTPUT);


                 
  // initialize the digital pin as an output.
    for(i=2;i<=Leds;i++){
  pinMode(i, OUTPUT);
  }   
}

// the loop routine runs over and over again forever:
void loop() {
  digitalWrite(i, HIGH);  
  delay(time);              
  digitalWrite(i, LOW);   
  i+=dir;            
  if(i<2|i>Leds){
  dir*=-1;
  i+=dir*2;

Serial.print (time);
Serial.print('\n'); 
Serial.print (A4);
Serial.print('\n'); 
Serial.print (A5);
Serial.print('\n'); 
if (upPin==HIGH) {(time=time+50);};
if (downPin==HIGH) {(time=time-50);};


  
  } 
}

Ik heb een serial monitor bij geplaatst, om naar A4 & A5 te zien.

uitgang geven
200 => time
18
19
200
18
19
200
18
19

Het leek me een makkelijk projectje voor mij, maar de muren lopen hoog op.
Mag ik nog even expertise rekenen, om dit tot een goed einde te brengen.

Alvast bedankt
Ivan

Wat je print zijn pin nummers, niet de status van de pinnen. Kan dat je probleem (of een van je problemen) zijn?

Vervolgens vergelijk je bv upPin (A4, waarde 18) met HIGH (waarde 1) en dat zal altijd onwaar zijn.

Je zult je pinnen moeten lezen met digitalRead() en op het resultaat moeten reageren.

Het volgende stukje zal je een beetje verder op weg helpen
Voeg dit toe in het begin van loop

void loop()
{
  byte upStatus;
  byte downStatus;

  ...
  ...

Dit declareert twee variabelen waar de status van je knoppen in kan worden opgeslagen.

Vervolgens kun je de knoppen lezen en de waarde opslaan in de variabelen.

void loop()
{
  byte upStatus;
  byte downStatus;

  upStatus = digitalRead(upPin);
  downStatus = digitalRead(downPin);

  ...
  ...

In de ‘if’ kun je nu de status printen

  if (i < 2 | i > Leds)
  {
    dir *= -1;
    i += dir * 2;

    Serial.print("time = "); Serial.println(time);
    Serial.print("upStatus = "); Serial.println(upStatus); 
    Serial.print("downStatus = "); Serial.println(downStatus); 

  ...
  ...

En je kunt de status testen en daarop reageren.

    if (upStatus == HIGH)
    {
      time = time + 50;
    }
    if (downStatus == HIGH)
    {
      time = time - 50;
    }

Ik heb de extra ronde haakjes verwijderd (die zijn niet nodig) en ook de ‘;’ na de ‘}’ (ook niet nodig).

Nu zijn er nog wat problemen. Als de downStatus HIGH is, kan je time variabele negatief worden. Je zult waarschijnlijk willen testen voor nul.

    if (downStatus == HIGH)
    {
      time = time - 50;
      if(time < 0)
      {
        time = 0;
      }
    }

Je kunt ook andere limieten zetten, bv 200ms als de minimum tijd (verander the twee nullen naar tweehonderd).

Er zit waarschijnlijk ook een fout in je logica. Je probeert alleen je knoppen te lezen (als ik de code goed begrijp) als je looplicht van richting verandert. Is dat de intentie? Misschien moet je het lezen, printen en reageren op de knoppen uit de eerste ‘if’ halen en ervoor plaatsen.

Verder is er een probleem dat je alleen de uitgangen 2…13 hoog of laag maakt in loop(); je extra leds worden niet aangestuurd. Je zult de variabele Leds moeten aanpassen om extra leds aan te sturen. Deze oplossing zal werken op een bv een Uno maar misschien niet met andere Arduinos

En dan is er nog een varieteit aan andere mogelijke problemen.
1)
Ik vermoed dat je knop is aangesloten tussen 5V en een pin van de Arduino. Als dat het geval is zul je ook weerstanden (bv 10k) moeten gebruiken tussen tussen de pin en gro(u)nd. Als je dat niet doet zullen de ingangen zweven en het lezen van een knop die niet is ingedrukt zal soms resulteren in LOW en soms resulteren in HIGH. Je kunt een beetje onderzoek doen naar ‘floating inputs’ en de weerstanden die je aansluit tussen de pin and gro(u)nd worden pull-down weerstanden genoemd.

Gebruik je weerstanden? Indien niet, dan kun je gebruik maken van de weerstanden die zijn ingebouwd in de microcontroller. Dit zijn weerstanden tussen 5V en de pin (zogenaamde pull-up weerstanden); je zult echter de knoppen moeten aansluiten tussen de pinnen en gro(u)nd. En de logica is dan omgedraaid; een ingedrukte knop geet LOW en een niet ingedrukte knop geeft HIGH.

Als je een lange tijd hebt ingesteld zal het lang duren voordat je code reageert op op het indrukken van een knop; als bv, de tijd 1 minuut is, zal het 1 minuut duren voordat de tijd wordt aangepast als je de knop indrukt.

In principe wil je niet reageren op de status van een knop maar op de verandering in de status van de knop. Als er geen delays() waren zal je code in een rot tempo de tijd aanpassen als de knop is ingedrukt.

Als een knop wordt ingedrukt of losgelaten is dat niet een eenmalige overgang van bv hoog naar laag maar een aantal overgangen; dit zal invloed hebben op (3) hierboven. Dit heet ‘contact dender’ (of bounce in het engels).

Ik laat het hier even bij; je hebt een paar dingen om uit te proberen :wink:

Je kunt voor (3) kijken naar het ‘state change detection’ voorbeeld in de IDE en je kunt ook eens kijken naar het ‘blink without delay’ voorbeeld in de IDE zodat je de delay kwijt kunt raken en je code bij langere tijden nog steeds snel zal reageren op het indrukken van de knoppen.

Ik vind het fair dat je mij laat zoeken naar de oplossing.
Het ligt vlak voor mij.

Dank je wel voor het neerpennen van deze procedure.
Ik ga er mee aan de slag.

Wanneer je iemand een brood geeft, staat hij daar de volgende dag opnieuw.
Leer je hem een brood bakken, dan hoeft hij jou hulp niet meer vandoen.

(en kan jij dan op je lauweren rusten) dat was/is grappig bedoelt…

Hi Guys,
Vooreerst een zeer goede Kerstmis toegewenst. En ook een prettig uit eind en in Nieuwjaar…

Echter ik heb het terug verknoeid, Ik had een werkend Sketch van een running Lights.

Sommige projecten moet je “saven”. Ik ik heb dan niet gedaan.
blame it on the goat.

Ik heb deze sketch terug samengesteld:

int i = 2;
int time = 200;
int dir = 1;
int leds = 14;




// the setup routine runs once when you press reset:
void setup() {               

  
  // initialize the digital pin as an output.
    for(i=2;i<=leds;i++)
         {
  pinMode(i, OUTPUT);
  pinMode(A0, OUTPUT);
          }
  }   


// the loop routine runs over and over again forever:
void loop() {

  digitalWrite(i, HIGH);  
  digitalWrite(A0, HIGH);

  delay(time);              
  digitalWrite(i, LOW);   
  digitalWrite(A0, LOW);  

 
  i+=dir;            
  if(i<2||i>leds){
  dir*=-1;
  i+=dir*2;
  } 
}

Maar mijn “A0” ledje blijft constant aan.
Waar loop ik in de fout?

Alvast bedankt voor jullie inbreng.

Ivan

A0 is hetzelfde als d14. En jij neemt alles mee tot en met 14. Als je van leds 13 maakt gaat het vermoedelijk goed. Verder zou ik wat meer commentaar toevoegen. Jij draait al een tijdje mee dus dan weet jij inmiddels als geen ander dat je niet vreemd moet opkijken als je Bij geen commentaar geen commentaar krijgt :grin: :grin:

de loop klopt niet want je zet elke led apart aan en daarnaast doe je dat voor A0 iedere keer, dus eerst alle cijfers (2 .. 13) en dan pas A0

Waarom zou dat niet kloppen ?

Hij zet eerst een LED, plus die aan A0 aan, 200 milliseconden later zet ie beide weer uit.
Dan gaat ie naar de volgende of de vorige LED, net of ie op dat moment heen of weer gaat.
Lijkt me dat dat bewust zo gedaan word, bij wijze van spreken een hartslag en een looplichtje.

O ja.

Ivan:

De duty cycle van je A0 LED is nu > 99.5 %
Want je zet de LED uit, maar vrijwel meteen daarna weer aan.
Wanneer je scanner nu de juiste snelheid heeft, dan kun je volgende overwegen:

  digitalWrite(i, HIGH);  
  digitalWrite(A0, HIGH);

  delay(time/2);              
  digitalWrite(A0, LOW);  
  delay(time/2);
  digitalWrite(i, LOW);

Dit alles bij elkaar duurt nu een fractie langer (zo kort dat jij dat niet gaat merken), maar je A0 LED zal nu gaan knipperen met een duty cycle die erg dicht in de buurt ligt van 50 %.
Je kunt natuurlijk ook de waarde van time aanpassen want dan hoeft er niet telkens een berekening gemaakt te worden.

Nog een tipje wat dat betreft:
Als je een int toewijst aan time, dan word er door de compiler een bepaalde ruimte gereserveerd voor time.
Die ruimte is er omdat je vermoedelijk de inhoud van die variabele wil veranderen.
Wanneer je het als een const definieert, dan word er helemaal geen ruimte gereserveerd en word telkens als de compiler het woord time tegenkomt, de waarde van die const ingevuld.

Dat is dus het verschil tussen een variabele, het woord geeft al aan dat die steeds verandert, en const, een afkorting van constante.

Heren, mijn excuus voor het laattijdig antwoord. Hier was het naast de Kerst een en ander hectisch gebeuren.
MAS 3 Het is inderdaad een running light. Heen en terug.

De basis snelheid is 200, maar iets later maak ik met twee drukknoppen, de snelheid opdrijven dan wel verminderen.

Er is steeds 1 verdomde LED die niet wil meegaan in het rijtje.
Ik ben geen programmeur, en ik klooi maar wat tot iets draait. (Mijn laatste programma was op een Tandy model 3, basic)

En eerlijk ik zie noch het bos noch de bomen.

IK weet al, dank je wel Nico, dat een analoge pi kan (en hier moet) gebruikt worden als een digitale pin.

pinMode(A0, OUTPUT);

En om ze dan Hoog of laag te krijgen

digitalWrite(A0, HIGH);
digitalWrite(A0, LOW);

Ik voel ook aan mijn knieën, dat de oplossing voor de hand ligt.
Maar verder dan mijn neus…

Oja, gelukkig kerst en prettig nieuwjaar.

Ivan

Je mag de analoge pinnen ook gewoon 14-19 noemen hoor alsje ze digitaal gebruikt

Er is steeds 1 verdomde LED die niet wil meegaan in het rijtje.

Is het zo dat het een rijtje LEDs is waarvan iedere LED een voor een aangestuurd moet worden, of moet er eentje apart knipperen (want dat heb je nu in je code).

Ik vermeldde al dat ik van programmeren niet thuis ben. Dus werkende sketch zijn mijn bronnen.
Met een (veel) te kleine kabelgoot gin alles ok


Dit is het model dat ik maakte.

Daar ging prima, totdat ik een kortsluiting maakte. Arduino defect. Daarbij had ik de kleinste kabelgoot genomen. Alle draden kan ik daarin niet stoppen.

Ik maakte een nieuw model, een grotere kabel goot. Geschroefd aan een aftakdoos.
Maar ik boorde 1 gaatje teveel. Ik had dus een led over. Tellen blijkt ook niet mijn ding niet te zijn -)

de Cyclus is (maar niet oor mij) als volgt.

Led 1 gaat aan; Led 1 gaat uit;
Led 2 gaat aan; Led 2 gaat uit;
...
....
Led 12 gaat aan; led 12 gaat uit
de verdomde Led 13 gaat aan; led 13 gaat uit;
Led 1 gaat aan.

Het liefst geen tijdspanne tussen het verloop van de leds.
Etc, etc

Voor het aan uit gebeuren schakel ik de voeding spanning uit.
Voor de snelheid zou ik als standaard 200 nemen;
Dit met een drukknop verhogen per 50 (of 25) verhogen;
Voor het trager gaan gaan per 50 of (of 25) verlagen tot 25. Wat al heel traag is.

Had ik dat verdomde 13 gaatje niet geboord, dan zat ik hier niet te schrijven....

De mosterd heb ik hier vandaan gehaald/gejat:

Met twaalf leds priem, een 13 led, en ik liep in een diep moeras...

Een kleine noot, Het toestel zou in de psychologie gebruikt worden.
Het haat daar EMDR
Het "zou" werken. Bij sommigen als placedo, bij anderen effectief.
Hoe dan ook, een praktisch model is,bij mij, met 13Leds...

Ivan

Misschien hier niet gepast, ik moet op tij en stond medicatie nemen. Elke dag op een juist tijdstoip.
Met een met oude modem, die ik liggen had, en een raspberry flenste ik iets in elkaar.
Het werkt prima.
Ook een weerstation die wonderen die data stuurt naar US, (Wunderground), daarnaast een Raspberry-NAS,
En een rtl-sdr server Odroid (raspberry equivalent)

Aan goede <wil ontbreekt het mij niet.
Echter dat zijn allemaal programma’s die bestaan, en enkele aanpassingen moet doen om ze werkende te krijgen.