LMC555 per riparare luci natalizie
Moderatori:
carloc,
g.schgor,
BrunoValente,
IsidoroKZ
1
voti
Complimenti
frankis sei sulla buona strada.
Qui c'è qualche video interessante.
viewtopic.php?f=21&t=91428&hilit=+Arduino
Ciao
Qui c'è qualche video interessante.
viewtopic.php?f=21&t=91428&hilit=+Arduino
Ciao
600 Elettra
2
voti
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;
}
1
voti
Certo che se dovevi realizzare tutti quegli effetti luminosi solo con l’elettronica, dovevi mettercene di componenti.
Ma funziona in modo stabile? Può essere replicato senza modifiche software?
Ma funziona in modo stabile? Può essere replicato senza modifiche software?
-

corneliofallaci
1.470 1 4 7 - Stabilizzato

- Messaggi: 314
- Iscritto il: 10 mag 2018, 18:43
1
voti
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.
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.
-

corneliofallaci
1.470 1 4 7 - Stabilizzato

- Messaggi: 314
- Iscritto il: 10 mag 2018, 18:43
0
voti
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.
Chi c’è in linea
Visitano il forum: Nessuno e 122 ospiti

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)



