/* UD5.LAB7A - Monostabile */
/*============================== CONFIGURAZIONI ==============================*/
#define PIN_RED_BTN 11 //PIN utilizzati su Arduino per collegare
#define PIN_RED_LED 2 //"wokwi-pushbutton" e "wokwi-led"
#define TIMER 2000 //Durata del tempo di accensione del LED in
//millisecond
/*============================================================================*/
/*============================ VARIABILI GLOBALI =============================*/
typedef struct { //Definisco un nuovo tipo di dato tramite la
int pinLed; //keyword 'typedef'. Si tratta di un tipo di
int pinButton; //dato strutturato ('struct' - chiamato an-
int button = 1; //che 'record', si contrappone al tipo di
unsigned long timer; //dato 'scalare')
unsigned long timerStart;
} monostabile;
monostabile red; //Dichiaro una variabile di tipo monostabile
//chiamata 'red' per gestire il led rosso
void setPins(monostabile x); //Prototipo della subroutine utilizzata per
//impostare la modalità dei pin collegati al
//LED e al button
void setButton(monostabile x); //Prototipo della subroutine utilizzata per
//impostare a 0 lo stato del button
unsigned long timerStart = 0; //Dichiaro e inizializzo una variabile utile
//a misurare la durata dell'accensione del
//led
/*============================================================================*/
/*=========================== FUNZIONI PRINCIPALI ============================*/
void setup() {
Serial.begin(9600); //Inizializzo la porta seriale, utile per il
//debug
red.pinLed = PIN_RED_LED; //Assegno il pin al led rosso
red.pinButton = PIN_RED_BTN; //Assegno il pin al button rosso
setPins(red); //Imposto la modalità dei pin
}
void loop() {
setButton(red); //Imposto il campo 'button' della variabile
//'red'
//red.button = !digitalRead(red.pinButton);
//Stampo sulla seriale il valore attribuito al campo 'pinLed' della variabi-
//le 'red'
Serial.print("Il led rosso è collegato sul pin ");
Serial.println(red.pinLed);
Serial.print("Il button rosso è collegato sul pin ");
Serial.println(red.pinButton);
//Stampo sulla seriale il valore attribuito al campo 'button' della variabi-
//le 'red'
Serial.print("Ora button rosso è ");
Serial.println(red.button);
//ha PIN_RED_BTN normalmente HIGH
//("1 logi-co"). Si desidera che
//"wokwi-pushbutton" restituisca
//normalmente uno "0 logico"e alla
//sua pressione corrisponda "1 logi-
//co". Pertanto, si sfrutta la va-
//riabile 'btn1' inizializzandola
//con valore negato rispetto a quan-
//to letto su PIN_RED_BTN.
if(red.button) { //Se la variabile 'btn1' è vera
digitalWrite(PIN_RED_LED,HIGH); //("1 logico"), PIN_RED_LED viene porta-
//to su HIGH e "wokwi-led" si accende.
timerStart = millis(); //Sfruttando la funzione millis(), si
//assegna alla variabile timerStart il
//valore dell'istante temporale in cui
//viene rilevata la pressione di "wokwi-
//pushbutton".
}
if(millis() - timerStart > TIMER) { //Se la differenza tra il tempo di ac-
digitalWrite(PIN_RED_LED,LOW); //censione di Arduino e il valore della
} //variabile timerStart è maggiore di
//TIMER, PIN_LED1 viene portato su LOW e
//il "wokwi_led" si spegne.
delay(30); //Ritardo introdotto per evitare false
//pressioni di "wokwi-pushbutton"
//(debounce)
}
/*============================================================================*/
/*=============================== SUBROUTINES ================================*/
//Implemento la subroutine utilizzata per impostare la modalità dei pin collega-
//ti al LED e al button
void setPins(monostabile x) {
pinMode(x.pinLed, OUTPUT);
pinMode(x.pinButton, INPUT_PULLUP);
}
//Implemento la subroutine utilizzata per impostare a 0 lo stato del button
void setButton(monostabile x) {
x.button = !digitalRead(x.pinButton);
}
/*============================================================================*/