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.
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