Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

LMC555 per riparare luci natalizie

Elettronica lineare e digitale: didattica ed applicazioni

Moderatori: Foto Utentecarloc, Foto Utenteg.schgor, Foto UtenteBrunoValente, Foto UtenteIsidoroKZ

1
voti

[321] Re: LMC555 per riparare luci natalizie

Messaggioda Foto Utentedjnz » 10 feb 2025, 23:09

Una domanda ben posta è già mezza risposta.
Avatar utente
Foto Utentedjnz
1.590 1 4 7
Master
Master
 
Messaggi: 709
Iscritto il: 26 lug 2020, 14:52

0
voti

[322] Re: LMC555 per riparare luci natalizie

Messaggioda Foto Utentefrankis » 10 feb 2025, 23:13

Va bene grazie, cercherò di dargli una lettura.
Avatar utente
Foto Utentefrankis
745 1 4 8
Stabilizzato
Stabilizzato
 
Messaggi: 427
Iscritto il: 5 set 2024, 15:42

1
voti

[323] Re: LMC555 per riparare luci natalizie

Messaggioda Foto Utentestefanopc » 10 feb 2025, 23:45

Complimenti Foto Utentefrankis sei sulla buona strada.
Qui c'è qualche video interessante.

viewtopic.php?f=21&t=91428&hilit=+Arduino
Ciao
600 Elettra
Avatar utente
Foto Utentestefanopc
13,3k 5 9 13
Master EY
Master EY
 
Messaggi: 5567
Iscritto il: 4 ago 2020, 9:11

0
voti

[324] Re: LMC555 per riparare luci natalizie

Messaggioda Foto Utentefrankis » 10 feb 2025, 23:54

Grazie Foto Utentestefanopc, ho visto il thread, leggerò anche quello.
Avatar utente
Foto Utentefrankis
745 1 4 8
Stabilizzato
Stabilizzato
 
Messaggi: 427
Iscritto il: 5 set 2024, 15:42

2
voti

[325] Re: LMC555 per riparare luci natalizie

Messaggioda Foto Utentefrankis » 11 feb 2025, 2:17

Questa è la versione senza commenti, se qualcuno preferisce un codice più compatto:

Codice: Seleziona tutto
#include <avr/sleep.h>
#include <avr/wdt.h>
#include <avr/interrupt.h>

const byte pinA = 3;
const byte pinB = 9;
const byte buttonPin = 2;

const unsigned long msCoeff = 1000;
const unsigned long runDuration = 6 * msCoeff * 3600;
const unsigned long sleepDuration = 18 * msCoeff * 3600;

volatile bool systemAwake = true;
volatile unsigned long lastWakeTime = 0;
byte sequenceNumber = 1;

void setup()
{
    pinMode(pinA, OUTPUT);
    pinMode(pinB, OUTPUT);
    pinMode(buttonPin, INPUT_PULLUP);
    PCICR |= (1 << PCIE2);
    PCMSK2 |= (1 << (buttonPin - 0));
    lastWakeTime = millis();
}

ISR(PCINT2_vect)
{
    if (!digitalRead(buttonPin))
    {
        systemAwake = true;
        lastWakeTime = millis();
        sleep_disable();
    }
}

ISR(WDT_vect)
{
}

void loop()
{
    sequences();
}

void testAwake()
{
    if ((millis() - lastWakeTime) >= runDuration)
    {
        enterSleep(false);
        return;
    }
}

void enterSleep(bool sleepForever)
{
    digitalWrite(pinA, LOW);
    digitalWrite(pinB, LOW);

    cli();
    MCUSR &= ~(1 << WDRF);
    WDTCSR |= (1 << WDCE) | (1 << WDE);
    WDTCSR = (1 << WDCE) | (1 << WDP3) | (1 << WDP0);
    WDTCSR |= _BV(WDIE);

    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
    sleep_enable();

    sei();
    systemAwake = false;
    unsigned long sleptTime = 0;

    while (sleptTime < sleepDuration)
    {
        sleep_mode();
        if (systemAwake) break;
        if (!sleepForever) sleptTime += 8000;
    }

    sleep_disable();
    systemAwake = true;
    lastWakeTime = millis();
}

bool readButton()
{
    unsigned long currentTime = millis();
    static bool buttonPressed = false;
    static unsigned long lastDebounceTime = 0;
    const unsigned long debouncewaitMsec = 50;

    bool reading = !digitalRead(buttonPin);
    if ((currentTime - lastDebounceTime) > debouncewaitMsec)
    {
        if (reading != buttonPressed)
        {
            buttonPressed = reading;
            if (buttonPressed)
            {
                lastWakeTime = millis();
                sequenceNumber++;
                return true;
            }
        }
        lastDebounceTime = currentTime;
    }
    return false;
}

bool waitMsec(int milliseconds)
{
    testAwake();
    unsigned long currentTime = millis();
    while (millis() - currentTime < milliseconds)
    {
        if (readButton()) return true;
    }
    return false;
}

void sequences()
{
    switch (sequenceNumber)
    {
        case 1:
            if(scrollingEffect()) break;
            if(alternateBlinkingEffect()) break;
            if(progressiveLightingEffect()) break;
            if(waveEffect()) break;
            if(randomBlinkingEffect()) break;
            if(rapidSequenceEffect()) break;
            if(fadePinA()) break;
            if(fadePinB()) break;
            if(fadeEffect()) break;
            if(strobeEffect()) break;
            if(breathingEffect()) break;
            if(runningEffect()) break;
            if(waterfallEffect()) break;
            if(meteorShowerEffect()) break;
            if(fireflyEffect()) break;
            if(rainbowFadeEffect()) break;
            if(twinkleEffect()) break;
            break;

        case 2:
            if(waveEffect()) break;
            if(rainbowFadeEffect()) break;
            break;

        case 3:
            if(randomBlinkingEffect()) break;
            if(twinkleEffect()) break;
            break;

        case 4:
            if(rapidSequenceEffect()) break;
            break;

        case 5:
            if(fadeEffect()) break;
            break;

        case 6:
            if(strobeEffect()) break;
            break;

        case 7:
            if(breathingEffect()) break;
            break;

        case 8:
            if(alternateBlinkingEffect()) break;
            break;

        case 9:
            digitalWrite(pinA, LOW);
            digitalWrite(pinB, LOW);
            while (!digitalRead(buttonPin));
            enterSleep(true);
            sequenceNumber = 1;
            break;

        default:
            sequenceNumber = 1;
    }
}

bool scrollingEffect()
{
    digitalWrite(pinA, HIGH);
    digitalWrite(pinB, LOW);
    if (waitMsec(300)) return true;
    digitalWrite(pinA, LOW);
    digitalWrite(pinB, HIGH);
    if (waitMsec(300)) return true;
    return false;
}

bool alternateBlinkingEffect()
{
    for (byte i = 0; i < 5; i++)
    {
        digitalWrite(pinA, HIGH);
        digitalWrite(pinB, LOW);
        if (waitMsec(500)) return true;
        digitalWrite(pinA, LOW);
        digitalWrite(pinB, HIGH);
        if (waitMsec(500)) return true;
    }
    return false;
}

bool progressiveLightingEffect()
{
    for (byte i = 0; i < 20; i++)
    {
        digitalWrite(pinA, HIGH);
        digitalWrite(pinB, LOW);
        if (waitMsec(255)) return true;
        digitalWrite(pinA, LOW);
        digitalWrite(pinB, HIGH);
        if (waitMsec(30)) return true;
    }
    return false;
}

bool waveEffect()
{
    for (byte j = 0; j < 20; j++)
    {
        digitalWrite(pinA, HIGH);
        digitalWrite(pinB, LOW);
        if (waitMsec(100)) return true;
        digitalWrite(pinA, LOW);
        digitalWrite(pinB, HIGH);
        if (waitMsec(100)) return true;
    }
    return false;
}

bool randomBlinkingEffect()
{
    for (byte i = 0; i < 30; i++)
    {
        if (random(10) == 0)
        {
            digitalWrite(pinA, HIGH);
            digitalWrite(pinB, LOW);
        }
        else
        {
            digitalWrite(pinA, LOW);
            digitalWrite(pinB, HIGH);
        }
        if (waitMsec(100)) return true;
    }
    return false;
}

bool rapidSequenceEffect()
{
    for (byte i = 0; i < 40; i++)
    {
        digitalWrite(pinA, HIGH);
        digitalWrite(pinB, LOW);
        if (waitMsec(50)) return true;
        digitalWrite(pinA, LOW);
        digitalWrite(pinB, HIGH);
        if (waitMsec(50)) return true;
    }
    return false;
}

bool fadePinA()
{
    for (int brightness = 0; brightness <= 255; brightness++)
    {
        analogWrite(pinA, brightness);
        if(waitMsec(10)) return true;
    }
    for (int brightness = 255; brightness >= 0; brightness--)
    {
        analogWrite(pinA, brightness);
        if(waitMsec(10)) return true;
    }
    return false;
}

bool fadePinB()
{
    for (int brightness = 0; brightness <= 255; brightness++)
    {
        analogWrite(pinB, brightness);
        if(waitMsec(10)) return true;
    }
    for (int brightness = 255; brightness >= 0; brightness--)
    {
        analogWrite(pinB, brightness);
        if(waitMsec(10)) return true;
    }
    return false;
}

bool fadeEffect()
{
    for (int brightness = 0; brightness <= 255; brightness++)
    {
        analogWrite(pinA, brightness);
        analogWrite(pinB, constrain(255 - brightness, 0, 255));
        if(waitMsec(10)) return true;
    }
    for (int brightness = 255; brightness >= 0; brightness--)
    {
        analogWrite(pinA, brightness);
        analogWrite(pinB, constrain(255 - brightness, 0, 255));
        if(waitMsec(10)) return true;
    }
    return false;
}

bool strobeEffect()
{
    for (byte i = 0; i < 40; i++)
    {
        if (i % 2 == 0)
        {
            digitalWrite(pinA, HIGH);
            digitalWrite(pinB, LOW);
        }
        else
        {
            digitalWrite(pinA, LOW);
            digitalWrite(pinB, HIGH);
        }
        if (waitMsec(100)) return true;
    }
    return false;
}

bool breathingEffect()
{
    static int brightness = 0;
    static int fadeAmount = 1;

    for (int i = 0; i < 512; i++)
    {
        analogWrite(pinA, brightness);
        analogWrite(pinB, 255 - brightness);
        brightness += fadeAmount;
        if (brightness <= 0 || brightness >= 255)
        {
            fadeAmount = -fadeAmount;
        }
        if (waitMsec(10)) return true;
    }
    return false;
}

bool runningEffect()
{
    for (byte i = 0; i < 3; i++)
    {
        digitalWrite(pinA, HIGH);
        digitalWrite(pinB, LOW);
        if (waitMsec(100)) return true;
        digitalWrite(pinA, LOW);
        digitalWrite(pinB, HIGH);
        if (waitMsec(100)) return true;
        digitalWrite(pinA, HIGH);
        digitalWrite(pinB, LOW);
        if (waitMsec(100)) return true;
    }
    for (byte i = 0; i < 3; i++)
    {
        digitalWrite(pinB, HIGH);
        digitalWrite(pinA, LOW);
        if (waitMsec(100)) break;
        digitalWrite(pinB, LOW);
        digitalWrite(pinA, HIGH);
        if (waitMsec(100)) return true;
        digitalWrite(pinB, HIGH);
        digitalWrite(pinA, LOW);
        if (waitMsec(100)) return true;
    }
    return false;
}

bool waterfallEffect()
{
    for (byte i = 0; i < 3; i++)
    {
        digitalWrite(pinA, HIGH);
        if (waitMsec(100)) return true;
        digitalWrite(pinA, LOW);
        digitalWrite(pinB, HIGH);
        if (waitMsec(100)) return true;
        digitalWrite(pinB, LOW);
    }
    digitalWrite(pinA, LOW);
    digitalWrite(pinB, LOW);
    return false;
}

bool meteorShowerEffect()
{
    for (int i = 0; i < 5; i++)
    {
        digitalWrite(pinA, HIGH);
        if (waitMsec(50)) return true;
        digitalWrite(pinA, LOW);
        if (waitMsec(50)) return true;
        digitalWrite(pinB, HIGH);
        if (waitMsec(50)) return true;
        digitalWrite(pinB, LOW);
        if (waitMsec(50)) return true;
    }
    return false;
}

bool fireflyEffect()
{
    for (int i = 0; i < 10; i++)
    {
        int duration = random(50, 200);
        digitalWrite(pinA, HIGH);
        if(waitMsec(duration)) return true;
        digitalWrite(pinA, LOW);
        if(waitMsec(duration)) return true;
        digitalWrite(pinB, HIGH);
        if(waitMsec(duration)) return true;
        digitalWrite(pinB, LOW);
        if(waitMsec(duration)) return true;
    }
    return false;
}

bool rainbowFadeEffect()
{
    for (int brightness = 0; brightness <= 255; brightness++)
    {
        analogWrite(pinA, brightness);
        analogWrite(pinB, constrain(255 - brightness, 0, 255));
        if(waitMsec(10)) return true;
    }
    for (int brightness = 255; brightness >= 0; brightness--)
    {
        analogWrite(pinA, brightness);
        analogWrite(pinB, constrain(255 - brightness, 0, 255));
        if(waitMsec(10)) return true;
    }
    return false;
}

bool twinkleEffect()
{
    for (int i = 0; i < 20; i++)
    {
        if (random(2) == 0)
        {
            digitalWrite(pinA, HIGH);
            digitalWrite(pinB, LOW);
        }
        else
        {
            digitalWrite(pinA, LOW);
            digitalWrite(pinB, HIGH);
        }
        if (waitMsec(random(100, 500))) return true;
    }
    return false;
}
Avatar utente
Foto Utentefrankis
745 1 4 8
Stabilizzato
Stabilizzato
 
Messaggi: 427
Iscritto il: 5 set 2024, 15:42

1
voti

[326] Re: LMC555 per riparare luci natalizie

Messaggioda Foto Utentecorneliofallaci » 12 feb 2025, 18:21

Certo che se dovevi realizzare tutti quegli effetti luminosi solo con l’elettronica, dovevi mettercene di componenti. :ok:
Ma funziona in modo stabile? Può essere replicato senza modifiche software?
Avatar utente
Foto Utentecorneliofallaci
1.470 1 4 7
Stabilizzato
Stabilizzato
 
Messaggi: 314
Iscritto il: 10 mag 2018, 18:43

1
voti

[327] Re: LMC555 per riparare luci natalizie

Messaggioda Foto Utentestefanopc » 12 feb 2025, 19:04

Si col 555 veniva difficile fare molte di quegli effetti.
Ciao
600 Elettra
Avatar utente
Foto Utentestefanopc
13,3k 5 9 13
Master EY
Master EY
 
Messaggi: 5567
Iscritto il: 4 ago 2020, 9:11

1
voti

[328] Re: LMC555 per riparare luci natalizie

Messaggioda Foto Utentecorneliofallaci » 12 feb 2025, 19:57

A ci credo. Poi le aggiunte degli effetti sono gratis, basta aggiungere qualche riga di programma.
Quasi quasi lo faccio anch’io. Ho un controller simile che è funzionante ma per provare a lavorarci mi basta scollegare la catena led senza rischi per il controller.
Avatar utente
Foto Utentecorneliofallaci
1.470 1 4 7
Stabilizzato
Stabilizzato
 
Messaggi: 314
Iscritto il: 10 mag 2018, 18:43

0
voti

[329] Re: LMC555 per riparare luci natalizie

Messaggioda Foto Utentefrankis » 13 feb 2025, 18:09

corneliofallaci ha scritto:A ci credo. Poi le aggiunte degli effetti sono gratis, basta aggiungere qualche riga di programma.
Quasi quasi lo faccio anch’io. Ho un controller simile che è funzionante ma per provare a lavorarci mi basta scollegare la catena led senza rischi per il controller.


Si adesso l’unica elettronica presente è la schedina Arduino Pro Mini e gestisce tutto il programma.
Il funzionamento ormai è invariato da molti giorni e la replicazione è garantita senza problemi. Il programma l’ho installato più volte e non ha mai saltato un’istruzione. Credo che le uniche modifiche utili potrebbero riguardare l’espansione degli effetti luminosi.
Avatar utente
Foto Utentefrankis
745 1 4 8
Stabilizzato
Stabilizzato
 
Messaggi: 427
Iscritto il: 5 set 2024, 15:42

Precedente

Torna a Elettronica generale

Chi c’è in linea

Visitano il forum: Nessuno e 166 ospiti