const int bluPin = 10;
const int redPin = 9;
const int greenPin = 11;
const int bottone = 8;
int T_prec_bottone = HIGH;
int Lampeggio = 1000;
unsigned long T_Blink;
unsigned long TempoBlu = 200;
unsigned long TempoRosso = 3000;
unsigned long TempoVerde = 5000;
unsigned long TempoReset = 10000;
unsigned long tempo_pulsante;
volatile unsigned long tempo_premuto;
unsigned long tempo;
volatile unsigned long tempo_iniziale_bottone;
unsigned long tempoprecedente = 0;
int i=1; //variabile per il conteggio secondi bottone premuto
void setup()
{
Serial.begin(9600);
pinMode(bluPin, OUTPUT);
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bottone, INPUT_PULLUP);
}
void loop() {
tempo=millis();
if (digitalRead(bottone)==LOW){ //controllo se il pulsante è premuto
tempo_iniziale_bottone = millis();
while(digitalRead(bottone)==LOW){ //controllo per quanto tempo è premuto
tempo_premuto = millis();
if (tempo_premuto -tempo_iniziale_bottone == Lampeggio){ //se è stato premuto per \ secondo farò un lampeggio di 10 ms
digitalWrite(bluPin, HIGH);
delay (10);
digitalWrite(bluPin, LOW);
Serial.println(i);
i++;
Lampeggio=Lampeggio+990;
}
}
if (tempo_premuto - tempo_iniziale_bottone >= TempoBlu && tempo_premuto - tempo_iniziale_bottone < TempoRosso)
{//se il tempo in cui il bottone è premuto è compreso tra questi due tempi
unsigned long T_ciclo=millis();
unsigned long t_blu=millis();
bluup(); //eseguo la mia funzione di fade up
while (T_ciclo - t_blu <= 60000 ){ //e tengo acceso il led per 1 minuto
digitalWrite(bluPin, HIGH);
T_ciclo=millis();
}
bludown(); //per poi spegnerlo con fade down
Lampeggio=1000; //reimposto il tempo di lampeggio a 1 secondo (relativo)
i=1;
}
if ( tempo_premuto - tempo_iniziale_bottone >= TempoRosso && tempo_premuto - tempo_iniziale_bottone < TempoVerde ){
redup(); //se il tempo in cui il bottone è premuto è compreso tra questi due tempi accendo e spengo il led
reddown();
Lampeggio=1000;
i=1;
}
if (tempo_premuto - tempo_iniziale_bottone >= TempoVerde && tempo_premuto - tempo_iniziale_bottone < TempoReset){
greenup(); //se il tempo in cui il bottone è premuto è compreso tra questi due tempi accendo e spengo il led
greendown();
Lampeggio=1000;
i=1;
}
//nel caso tenga premuto per più di 10 secondi, non faccio nulla.
if (tempo_premuto - tempo_iniziale_bottone >= TempoReset )
{
digitalWrite(bluPin, LOW);
digitalWrite(redPin, LOW);
digitalWrite(greenPin, LOW);
Lampeggio=1000;
i=1;
}
}
}
void redup () { //accende il led rosso
int valoreFade = 1;
while (valoreFade <= 255 ) {
unsigned long tempocorrente = millis();
const long intervallo = 10;
if (tempocorrente - tempoprecedente >= intervallo){
tempoprecedente = tempocorrente;
valoreFade++;
}
analogWrite(redPin, valoreFade); //impostiamo la luminosità del LED
}
}
void reddown () { //spegne il led rosso
int valoreFade = 255;
while (valoreFade >= 1 ) {
unsigned long tempocorrente = millis();
const long intervallo = 10;
if (tempocorrente - tempoprecedente >= intervallo){
tempoprecedente = tempocorrente;
valoreFade--;
}
analogWrite(redPin, valoreFade); //impostiamo la luminosità del LED
}
}
void bluup () { //accende il led blu
int valoreFade = 1;
while (valoreFade <= 255 ) {
unsigned long tempocorrente = millis();
const long intervallo = 10;
if (tempocorrente - tempoprecedente >= intervallo){
tempoprecedente = tempocorrente;
valoreFade++;
}
analogWrite(bluPin, valoreFade); //impostiamo la luminosità del LED
}
}
void bludown () { //spegne il led blu
int valoreFade = 255;
while (valoreFade >= 1 ) {
unsigned long tempocorrente = millis();
const long intervallo = 10;
if (tempocorrente - tempoprecedente >= intervallo){
tempoprecedente = tempocorrente;
valoreFade--;
}
analogWrite(bluPin, valoreFade); //impostiamo la luminosità del LED
}
}
void greenup () {//accende il led verde
int valoreFade = 1;
while (valoreFade <= 255 ) {
unsigned long tempocorrente = millis();
const long intervallo = 10;
if (tempocorrente - tempoprecedente >= intervallo){
tempoprecedente = tempocorrente;
valoreFade++;
}
analogWrite(greenPin, valoreFade); //impostiamo la luminosità del LED
}
}
void greendown () { //spegne il led verde
int valoreFade = 255;
while (valoreFade >= 1 ) {
unsigned long tempocorrente = millis();
const long intervallo = 10;
if (tempocorrente - tempoprecedente >= intervallo){
tempoprecedente = tempocorrente;
valoreFade--;
}
analogWrite(greenPin, valoreFade); //impostiamo la luminosità del LED
}
}
Questo è il programma che ho creato, funziona a dovere anche se è da perfezionare, ho preso in mano Arduino 2 giorni fa XD, quindi perdonatemi se è poco elegante.
il funzionamento è semplice, in base al tempo in cui tengo premuto il pulsante, ho tre tipi diversi di accensione di led, tenendolo premuto per 10 secondi spengo i led che si trovavano accesi, è come se resettassi il tutto.
A me piace crearmi delle subroutine e richiamarle a piacimento.
Ho cercato di usare la funzione millis per non "bloccare" il programma, tuttavia riscontro le seguenti anomalie:
- nella fase di fadeup e fadedown il micro esegue solo quel comando.
- una volta che tengo il led blu acceso per 1 minuto, qualsiasi altra funzione non viene accettata, se tengo premuto per 10 secondi il pulsante, non spengo nulla.