74hc595 chip. Fade leds met een potmeter

@sterretje

Ik zie al een "klein" probleempje met het idee om de brightness van leds te sturen met een potmeter.

De uno heeft maar 6 analoge pinnen.

Eens kijken hoe dit op te lossen

Dit onderwerp is een vervolg op Hoe kan ik dit beter aansluiten dat erg lang begon te worden :wink:

@roelofw
Misschien kun je hier de laatste code en een link naar de laatste werkende wokwi neer zetten.
En een beschrijving wat het doel van (deze stap van) het project is.

Dan hebben anderen die dit onderwerp vinden een beetje een idee waar je / wij mee bezig zijn.

De laatste werkende versie voordat we deze stap nemen , kan hier gevonden worden.

Wat we daar gedaan hebben is via het schuifregister de helderheid van elke individule led instellen via een software pwm.

Wat we nu proberen is te kijken als we nu potmeters aansluiten of we de helderheid ook dynamisch kunnen maken.

Een LED minder gebruiken :smiley: Die kun je dan later gebruiken om automatisch te faden als je dat wilt.

Of een analoge multiplexer gebruiken (zie screenshot).

Of een oplossing met drukknoppen waarmee je de LED kunt selecteren en de lichtsterkte kunt instellen (geen potentiometers).

Genoeg oplossingen.

Maar zoals in je andere topic gezegd, begin simpel.

Dan ga ik eerst voor de 6 aansluiten en werkend krijgen.
En daarna misschien in die multiplexer gebruiken.
Daar moet ik eerst even induiken.

Was mijn uitleg duidelijk ??

Voor mij wel. Maar misschien kun je je bericht met de uitleg een klein beetje aanpassen en aangeven dat je de LEDs individueel wilt kunnen dimmen.

Anders komt er misschien een slimmerik die zegt "je kunt de 74HC595vmakkelijk dimmen door een analogWrite op de OE pin" :smiley:

verandert.

Ben aan het experimenteren met de potmeter en een led

En zoals gewoonlijk lijjkt de eerste poging niet te werken

Geen idee waarom het nu niet werkt.

Ik heb alleen regel 40 en 41 toegevoegd

Kun je eens meekijken ?

Je lijkt in ieder geval een rommeltje te hebben gemaakt van de originele if/else.

En waarschijnlijk van je schema. Als je die nieuwe regels voor de potmeter weghaalt heb je nog steeds geen LEDs die aan zijn.

Ik stel voor dat je je oude schema gebruikt en daar en potmeter aan toevoegt. De logic analyser zit niet in de weg.

En het is handiger als je die potmeter naast de LEDs zet. Op mijn 1080 pixels hoge scherm moet ik het of erg klein maken om zowel de LEDs als de potentiometer te zien of de hele tijd scrollen. Gedeelte lijk omdat de seriële monitor in de weg zit.

oke,

Gaat dat ook werken met als ik 6 potmeters of meer ga toevoegen.

en vond nog een bug in de code :

if (currentMicros - previousMicros >= timerInterval) {
    previousMicros = currentMicros;
    for (int i = 0; i < NUMELEMENTS(pulseWidths); i++)
      if (pulseWidths[i] > 0) {
        data |= 1 << i;
      }
  } else {
    for (int i = 0; i <  NUMELEMENTS(pulseWidths); i++) {
      if (currentMicros - previousMicros >= pulseWidths[i]) {

        data &= ~(1 << i);
      }
    }
  }

Moet er achter de eerste for-loop niet ook een { ?

Niet persé.

Als de for-loop of een if-statement slechts één statement bevatten kun je de accolades weglaten. Het is over het algemeen niet aan te bevelen dat te doen.

Dit

if (a == b)
  Serial.println("identiek");

is hetzelfde als

if (a == b)
{
  Serial.println("het zelfde");
}

Je probleem komt als je (later) wat meer wilt doen.

if (a == b)
  Serial.println("identiek");
  Serial.println("iets meer";

Dat laatste statement zal altijd uitgevoerd worden (onafhankelijk van het feit of de conditie waar is of niet).

Als je consistent accolades gebruikt is dat risico veel kleiner.

precies

Ben dus nu de hele middag aan het proberen uit te vogelen waar dan de } moet
maar waar ik het ook plaats de leds doen het dan niet meer :frowning:

Dus het lijkt erop dat het vergeten van de { een bug heeft verborgen.

Als jij een idee hebt om uit deze puinhoop te komen , gooi het maar in de groep.

Proberen maar, zou ik zeggen. Wees je ervan bewust dat het lezen van één potentiometer 100 usec neemt. Als je er 6 leest dus 600 usec en tijdens die tijd zullen alle LEDs uit zijn; op de 2000 usec is dat relatief lang (30%).

oke

Eerst maar eens proberen om de bug te vinden.

Voor mijn gevoel , moet dit werken

#define NUMELEMENTS(x) (sizeof(x) / sizeof(x[0]))

byte dataPin = 2;
byte clockPin = 3;
byte latchPin = 4;
byte outputEnablePin = 6;

byte potPin1 = A0;
int value;

// timing in microseconds
unsigned long timerInterval = 2000;
unsigned long previousMicros = 0;

uint8_t data = 0;

uint16_t pulseWidths[] = { 200, 400, 600, 800, 1000, 1200, 2000 };

void setup() {
  Serial.begin(115200);
  Serial.println(F("Software PWM"));

  pinMode(dataPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(latchPin, OUTPUT);
}

void loop() {

  unsigned long currentMicros = micros();

  if (currentMicros - previousMicros >= timerInterval) {

    previousMicros = currentMicros;

    for (unsigned int i = 0; i < NUMELEMENTS(pulseWidths); i++) {

      value = analogRead(potPin1);
      pulseWidths[0] = map(value, 0, 1023, 0, 2000);

      if (pulseWidths[i] > 0) {
        data |= 1 << i;
      }


      else {

        for (unsigned int i = 0; i < NUMELEMENTS(pulseWidths); i++) {

          if (currentMicros - previousMicros >= pulseWidths[i]) {

            data &= ~(1 << i);
          }

        }
      }
    }
  }

  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, data << 1);
  digitalWrite(latchPin, HIGH);

}

maar geen van de leds gaat nu aan

Tijd voor een break. Ben denk ik al uren mee bezig en geen geluk

Heb jij een idee wat mis is.

IK zie het nog steeds niet.

Gebaseerd op je programma heb je je if/else nog steeds totaal verkeerd.

Ik stel voor dat je het laatste programma van je vorige onderwerp (https://wokwi.com/projects/446250858447377409) pakt en dat in je huidige wokwi zet.

Werkt dat zoals verwacht? Indien niet dan heb je een hardware probleem in je huidige wokwi en moet je dat oplossen.

Indien het wel werkt de potentiometer code toevoegen; denk na waar dat precies moet. Je hebt het in principe op de juiste plek gezet maar daarna de }s op de verkeerde plek gezet.

Het moet er ongeveer zo uit zien

  if (currentTime - previousTime >= timerInterval)
  {
    for-loop here 
  }
  else
  {
    other for-loop here
  }

Op dit moment ziet het er zo uit

  if (currentMicros - previousMicros >= timerInterval) {
    all kinds of stuff
  }

Weet ik

maar we hebben ook de discussie gehad dat if then de {} gebruiken en dat gebeurt nu niet.
Zoals ik het zie is dat het eerste probleem dat we moeten oplossen.

ik heb dit nu :

#define NUMELEMENTS(x) (sizeof(x) / sizeof(x[0]))

byte dataPin = 2;
byte clockPin = 3;
byte latchPin = 4;
byte outputEnablePin = 6;

byte potPin1 = A0;
int value;

// timing in microseconds
unsigned long timerInterval = 2000;
unsigned long previousMicros = 0;

uint8_t data = 0;

uint16_t pulseWidths[] = { 200, 400, 600, 800, 1000, 1200, 2000 };

void setup() {
  Serial.begin(115200);
  Serial.println(F("Software PWM"));

  pinMode(dataPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(latchPin, OUTPUT);
}

void loop() {

  unsigned long currentMicros = micros();

  if (currentMicros - previousMicros >= timerInterval) {

    previousMicros = currentMicros;

    for (unsigned int i = 0; i < NUMELEMENTS(pulseWidths); i++) {

      value = analogRead(potPin1);
      pulseWidths[0] = map(value, 0, 1023, 0, 2000);

      if (pulseWidths[i] > 0) {
        data |= 1 << i;
      }
    }
  }
  else {

    for (unsigned int i = 0; i < NUMELEMENTS(pulseWidths); i++) {

      if (currentMicros - previousMicros >= pulseWidths[i]) {

        data &= ~(1 << i);
      }

    }
  }


  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, data << 1);
  digitalWrite(latchPin, HIGH);

}

maar nog steeds geen leds die branden :frowning: