/* 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);
}

/*============================================================================*/
$abcdeabcde151015202530fghijfghij