Giorno virtuale per presepe

Ho creato questo circuito per simulare il ciclo giorno e notte nel presepe di casa..

gv101

L'idea è molto semplice, con un'Arduino mini ho creato un programma che controlla un Mosfet in PWM e grazie alla gestione di 3 pulsanti è possibile variare il periodo del ciclo giorno notte. Il Mosfet controlla la corrente che alimenta una barra di led.

Sketch Arduino :


#include <TimerOne.h>

#define switchPin A0
#define led 7
#define incre 1000 // 500 centesimi = 5 sec | 6000 centesimi = 60 sec = 1 min
#define timertick 20000 // 250000 = 25 centesimi = 0.25 sec 
#define inccen 2 // = timertick / 10000
#define fine 3 // minimo 2

volatile unsigned long mise = 0; // centesimi di secondo
byte duti = 0; // da 0 a 255
boolean onof = false;
boolean btst = false;
boolean hilo = false;

#define sole 11
#define stagione 255 //da 1 a 255
long luce = 0;

void setup() {

  pinMode(switchPin, INPUT);
  pinMode(led, OUTPUT);
  
  pinMode(sole, OUTPUT);

  Timer1.initialize(timertick);
  Timer1.attachInterrupt(Tick);
}

void Tick(){

  mise = mise + inccen;

  if (onof == true) {
    if (duti == 0) {
      digitalWrite(led, HIGH);
      digitalWrite(sole, HIGH);
    } else {
      if ((mise % (incre * (unsigned long)duti)) == 0 ) {
        hilo = !hilo;
        mise = 0;
      }
      if (hilo == true) {
        digitalWrite(led, HIGH);

        long x = ((incre * (unsigned long)duti)/fine);

        if (mise < x) {luce = (mise * stagione) / x;}
        if ((mise > x) && (mise < (x*(fine-1)))) {luce = stagione;}
        if (mise > (x*(fine-1))) {luce = (((x*fine)-mise) * stagione) / x;}

        if (luce < 0) {luce = 0;} 
        if (luce > stagione) {luce = stagione;}

        Serial.println(luce);
        analogWrite(sole, (int)luce);
        
      } else {
        digitalWrite(led, LOW);
        digitalWrite(sole, LOW);
      }
    }
  } else {
    digitalWrite(led, LOW);
    digitalWrite(sole, LOW);
  }
  
}

void loop() {
  
  switch(int(analogRead(switchPin)/10)){
    case (101):
      if (btst == false) {
        btst = true;
        mise = 0;
        hilo = true;
        duti++;
      }
    break;
    case (100):
      if (btst == false) {
        btst = true;
        onof = !onof;
        mise = 0;
        hilo = true;
        duti = 0;
      }
    break;
    case (99):
      if (btst == false) {
        btst = true;
        mise = 0;
        hilo = true;
        duti--;
      }
    break;
    case (0):
      btst = false;
    break;
  }

}

Schema Elettrico :

Galleria :

gv01.jpg gv02.jpg gv03.jpg

gv04.jpg