PresePitDuino - applicazione del PitDuino - per comandare il presepio

Questa è la prima applicazione pratica del PitDuino - si tratta di alcuni controlli del presepio.

In particolare vengono controllati tramite l'utilizzo dei pin PWM dell'attiny due led ad alta luminosità che variano la propria luminosità (effetto fade). Altri dui pin digitali dell'attiny controllano due rele che a loro volta accendono e spengono la fontanella e un gruppo di luci dell'albero. L'altro gruppo di luci (ghiaccioli) è comandato da una intermittenza classica

Infine è presente un pulsante di switch che modifica la programmazione in modo causale. Dopo un numero fissati di cicli il tutto ritorna al punto di partenza.

 

ozio_gallery_jgallery

Cosa serve:

  • PitDuino 2.0
  • cavetti
  • led altra luminosità
  • relè di potenza
  • fontana
  • luci albero
  • trasformatore 6V per alimentazione

Download:

Codice sorgente:


/* 
PresepioPitDuino - ZappocoS - ZappocoJ - 29/11/2014 - 13/12/2014
cavo bianco        pin 4 - 13 - pulsante - cambia in modo casuale la sequenza ( 4 sequenze separate poi riparte)
cavo verde         pin 2 - 12 - rele 1
cavo giallo        pin 3 - 11 - rele 2
cavo blu           pin 0 - 10 - led 1 - PWM
cavo arancio       pin 1 -  9 - led 2 - PWM
--------------------------------------
*/
// ----- settaggio
int     statePin  = 4;  // pulsante
int     relPinUno = 2;  // rele 1
int     relPinDue = 3;  // rel2 2
int     ledPinUno = 0;  // led 1
int     ledPinDue = 1;  // led 2
int     switchState = 0;
int     sequenza = 15;
int     numCicli = 0;
int ledStsUno = 1;
int ledStsDue = 1;
int relStsUno = false;
int relStsDue = false;
boolean PitDuino = true;
int brightness = 0;    // how bright the LED is
int fadeAmount = 3;    // how many points to fade the LED by
int ledTmrUnoMax = 20000;
int ledTmrDueMax = 10000;
int relTmrUnoMax = 14300;
int relTmrDueMax = 15100;
int  relTmrStartUno;
int  relTmrStartDue;
int  ledTimStartUno;
int  ledTimStartDue;
int timeAdesso;
void setup()
{
  /*
  if (PitDuino == false){
    Serial.begin(9600);
    Serial.println("Test per controllo Presepe comandato da Arduino rev 2.00");
    Serial.println("dicembre 2014");  
    statePin = 13; // pulsante
    relPinUno = 12;  // rele 1
    relPinDue = 11;  // rel2 2
    ledPinUno = 10;  // led 1
    ledPinDue =  9;  // led 2
  } 
  */  
  // ----- Mulino
  pinMode (ledPinUno, OUTPUT);
  pinMode (ledPinDue, OUTPUT); 
  pinMode (relPinUno, OUTPUT);
  pinMode (relPinDue, OUTPUT);
  pinMode (statePin, INPUT);
  delay (100);
  relTmrStartUno = millis();
  relTmrStartDue = millis();
  ledTimStartUno = millis();
  ledTimStartDue = millis();
}
void loop()
{
  if(numCicli > 10) {
    switchState = true;
    numCicli = 0;
  }
  else{
    switchState = digitalRead (statePin);
  }
  if(switchState == true) {    
    sequenza = sequenza + 1;
    relTmrStartUno = millis();
    relTmrStartDue = millis();
    ledTimStartUno = millis();
    ledTimStartDue = millis();
    if(sequenza > 4) {    
        sequenza = 0;
    }
    switch (sequenza){
      case 0:
        ledTmrUnoMax = 5000;
        ledTmrDueMax = 8000;
        relTmrUnoMax = 4300;
        relTmrDueMax = 6100;
        break;
      case 1:
        ledTmrUnoMax =  ledTmrUnoMax * (1 + random(2));
        ledTmrDueMax =  ledTmrDueMax * (1 + random(2));
        relTmrUnoMax =  relTmrUnoMax * (1 + random(2));
        relTmrDueMax =  relTmrDueMax * (1 + random(2));
        break;
      case 2:
        ledTmrUnoMax =  ledTmrUnoMax / (1 + random(2));
        ledTmrDueMax =  ledTmrDueMax / (1 + random(2));
        relTmrUnoMax =  relTmrUnoMax / (1 + random(2));
        relTmrDueMax =  relTmrDueMax / (1 + random(2));
        break;
      case 3:
        ledTmrUnoMax =  ledTmrUnoMax * (1 + random(2));
        ledTmrDueMax =  ledTmrDueMax * (1 + random(2));
        relTmrUnoMax =  relTmrUnoMax * (1 + random(2));
        relTmrDueMax =  relTmrDueMax * (1 + random(2));
        break;
      case 4:
        ledTmrUnoMax =  ledTmrUnoMax / (1 + random(2));
        ledTmrDueMax =  ledTmrDueMax / (1 + random(2));
        relTmrUnoMax =  relTmrUnoMax / (1 + random(2));
        relTmrDueMax =  relTmrDueMax / (1 + random(2));
        break;
    }
  if (ledTmrUnoMax < 0) {
    ledTmrUnoMax = -ledTmrUnoMax;
  }
  if (ledTmrDueMax < 0) {
    ledTmrDueMax = -ledTmrDueMax;
  }
  if (relTmrUnoMax < 0) {
    relTmrUnoMax = -relTmrUnoMax;
  }
  if (relTmrDueMax < 0) {
    relTmrDueMax = -relTmrDueMax;
  }
    relTmrStartUno = millis();
    relTmrStartDue = millis();
    ledTimStartUno = millis();
    ledTimStartDue = millis();
    /*
    if(PitDuino == false) {    
       Serial.print("-----------------------------" );
       Serial.print("switchState: " );
       Serial.println(switchState);
       Serial.print("sequenza : " );
       Serial.println(sequenza);
       Serial.print("ledTmrUnoMax  : ");
       Serial.println(ledTmrUnoMax);
       Serial.print("ledTmrDueMax  : ");
       Serial.println(ledTmrDueMax);
       Serial.print("relTmrUnoMax  : ");
       Serial.println(relTmrUnoMax);
       Serial.print("relTmrDueMax  : ");
       Serial.println(relTmrDueMax);
    }
    */
  }
  timeAdesso = millis() - ledTimStartUno;
  if (timeAdesso > ledTmrUnoMax) {
    ledTimStartUno = millis();
    ledStsUno = !ledStsUno;    
    numCicli = numCicli + 1;
  }
  timeAdesso = millis() - ledTimStartDue;
  if (timeAdesso > ledTmrDueMax) {
    ledTimStartDue = millis();
    ledStsDue = !ledStsDue;    
    numCicli = numCicli + 1;
  }
  timeAdesso = millis() - relTmrStartUno;
  if (timeAdesso > relTmrUnoMax) {
    relTmrStartUno = millis();
    relStsUno = !relStsUno;    
    numCicli = numCicli + 1;
  }
  timeAdesso = millis() - relTmrStartDue;
  if (timeAdesso > relTmrDueMax) {
    relTmrStartDue = millis();
    relStsDue = !relStsDue;    
    numCicli = numCicli + 1;
  }
    /*
    if(PitDuino == false) {    
       Serial.print("-----------------------------" );
       Serial.print("switchState: " );
       Serial.println(switchState);
       Serial.print("sequenza : " );
       Serial.println(sequenza);
       Serial.print("relStsUno  : ");
       Serial.println(relStsUno);
       Serial.print("relStsDue  : ");
       Serial.println(relStsDue);
       Serial.print("ledStsUno  : ");
       Serial.println(ledStsUno);
       Serial.print("ledStsDue  : ");
       Serial.println(ledStsDue);
    }
    */
  if(ledStsUno != 0) {    
    analogWrite(ledPinUno, brightness);    
  }
  else {
    digitalWrite (ledPinUno, LOW);
  }
  if(ledStsDue != 0) {    
    analogWrite(ledPinDue, 255 - brightness);    
  }
  else {
    digitalWrite (ledPinDue, LOW);
  }
  brightness = brightness + fadeAmount;
  // inverte la direzione della dissolvenza alla fine della stessa
  if (brightness == 0 || brightness == 255) {
    fadeAmount = -fadeAmount ; 
  }     
  if(relStsUno != 0) {    
    digitalWrite (relPinUno, HIGH);
  }
  else {
    digitalWrite (relPinUno, LOW);
  }
  if(relStsDue != 0) {    
    digitalWrite (relPinDue, HIGH);
  }
  else {
    digitalWrite (relPinDue, LOW);
  }
  delay (30);
}

ZappocoS, ZappocoJ, dicembre 2014