Ciao a tutti,
sono nuovo. Ho un passato da programmatore e nessuna conoscenza elettronica.
Mi sto studiando questo bellissimo oggetto (Arduino UNO) cimentandomi nella realizzazione di un po' di prototipi, per ora, didattici.
Ho un po' di probemi con i pulsanti.
Il seguente codice non funziona se non inserisco un delay dopo la lettura dello stato del pulsante.... mi aiutate a capire il perché? Ho cercato sul forum e su internet ma essendo nuovissimo di questo mondo ho pure difficoltà a fare le giuste domande/ricerche...
Potreste indicarmi quando è necessario usare il delay per questo tipo di INPUT? Per caso si può risolvere/velocizzare la lettura tramite particolari accortezze sul circuito elettrico?
Il circuito che uso per il pulsante è quello allegato.
Di seguito il mio programma
#define TEST
//#define BUILD
// Definizione PIN per i componenti
#define BUTTON_ONOFF 7
#define LED_ON 13
#define LED_ALARM 12
#define TILT_SENSOR 8
#define BUZZER 4
#define VOLUME_BUZZER A0
/* QUI SOTTO SONO DEFINITI I SENSORI DI TEST PER SIMULAZIONE */
#if defined(TEST)
#define DOOR_SENSOR 2
#endif
// inizializzo variabili globali
bool ON = false; /* false: OFF; true: ON */
bool ALARM = false; /* false: ALARM OFF; true: ALARM ON */
int VOLUME; /* volume buzzer interno*/
unsigned long PREVIOUS_MILLIS;
// =========================================================================
void setup()
{
// inizializzo i dati in ingresso
Serial.begin(9600);
/* riservo e definisco i PIN */
pinMode(LED_ON, OUTPUT);
pinMode(LED_ALARM, OUTPUT);
pinMode(BUZZER, OUTPUT);
pinMode(TILT_SENSOR, INPUT);
#if defined(TEST)
pinMode(DOOR_SENSOR, INPUT);
#endif
/* inizializzo i LED */
digitalWrite(LED_ON, HIGH);
digitalWrite(LED_ALARM, LOW);
/* imposto il volume del BUZZER*/
VOLUME = (analogRead(VOLUME_BUZZER)/ 4.015686275); //1024÷255 = 4,015686275
}
// =========================================================================
void loop()
{
// put your main code here, to run repeatedly:
/* controllo attivazione/disattivazione monitoraggio allarme*/
if (digitalRead(BUTTON_ONOFF) == HIGH)
{
delay(250);
switch (ON)
{
case false:
ON = true;
Serial.println("Allarme attivato");
break;
case true:
ON = false;
Serial.println("Allarme disattivato");
break;
}
}
/* monitoro i sensori solo se l'allarme è inserito*/
if (ON)
{
Serial.println("Controllo i sensori...");
/* controllo il sensore di TILT*/
Serial.println("\tSensore TILT: ");
if (digitalRead(TILT_SENSOR) == HIGH)
{
ALARM = true;
Serial.println("\tSensore TILT: ATTIVATO");
}
#if defined(TEST)
if (digitalRead(DOOR_SENSOR) == LOW)
{
ALARM = true;
Serial.println("\tSensore DOOR_SENSOR: ATTIVATO");
}
#endif
if (ALARM)
{
Serial.println("Procedura allarme...");
/* in caso di allarme attivo un clock con intervallo di 1000 millisecondi */
int interval = 1000; //clock interval
unsigned long currentMillis = millis();
if((currentMillis - PREVIOUS_MILLIS) > interval)
{
PREVIOUS_MILLIS = currentMillis;
if (digitalRead(LED_ALARM) == HIGH)
{
digitalWrite(LED_ALARM, LOW);
Serial.println("\tLED_ALARM: SPENTO");
noTone(BUZZER);
Serial.println("\tBUZZER: SPENTO");
}
else
{
digitalWrite(LED_ALARM, HIGH);
Serial.println("\tLED_ALARM: ACCESO");
tone(BUZZER, 50000);
Serial.println("\tBUZZER: ACCESO");
}
}
} //ALARM
}
else
{
digitalWrite(LED_ALARM, LOW);
noTone(BUZZER);
} // ON
}

