PrettyPrint

domenica 31 maggio 2020

Semplice funzione di debounce per Arduino

Una semplice funzione per la gestione della lettura di un pulsante, con Arduino ma anche con Raspberry Pi (WiringPI), che rende sintatticamente più comprensibile il codice, soprattutto quando ci sono molti pulsanti.

La funzione esegue due compiti: attendere il termine del rimbalzo dei contatti del pulsante, con una durata di tempo determinata, e attendere il rilascio del pulsante, con una durata di tempo indeterminata (governata da un ciclo while) , evitando così di eseguire nuovamente il blocco di istruzioni previsto alla pressione del pulsante e quindi provocare eventuali false letture.

E' di tipo bloccante, quindi va usata in quei sistemi in cui non sia necessaria un'esecuzione real-time, anche se il tempo di pausa è sicuramente trascurabile nella maggioranza delle applicazioni. Può essere ovviamente anche usata su un segnale ON/OFF proveniente da una fotocellula dove va acquisita solo la prima transizione.

Il tempo di attesa del rimbalzo va trovato sperimentalmente; nel mio caso 10ms sono risultati più che suffcienti.

Il programma di prova, quando si preme il tasto commuta lo stato di un LED e incrementa una variabile n stampandola sul monitor seriale

Per quanto riguarda l'hardware: il pin 4 è collegato a massa mediante un resistore pull-down da 10kΩ e il pulsante NO fra il pin 4 e +5V.  Il LED (rosso) è collegato al pin 9 mediante un classico resistore di limitazione da 220Ω .. 270Ω


const int pin_led = 9;
const int pin_btn = 4;                  
int stato_led=0;
int n=0;

void setup()
{ pinMode(pin_btn, INPUT); pinMode(pin_led, OUTPUT);
   digitalWrite(pin_led, stato_led);
   Serial.begin(9600);
}

void loop()
{
   if (btnPressed(pin_btn, HIGH))
{ stato_led = !stato_led; digitalWrite(pin_led, stato_led); Serial.println(++n); } } // LEVEL è il livello logico associato alla pressione del pulsante int btnPressed(const int pin_btn, const int LEVEL) { int res=0; if (digitalRead(pin_btn)==LEVEL) { delay(10); // aspetta esaurirsi rimbalzo if (digitalRead(pin_btn)==LEVEL) // rimbalzo terminato res = 1; while (digitalRead(pin_btn)==LEVEL) // aspetta rilascio pulsante delay(1); } return res; }


Sintassi evidenzata by hilite.me (emacs style)

domenica 24 maggio 2020

Conoscere sketch e data di caricamento

Molte volte ci si dimentica di quale firmware sia attualmente installato sulla memoria flash di Arduino e soprattutto della data di caricamento.

A tal proposito vengono in soccorso due macro del preprocessore:

__FILE__
__DATA__

La prima espande il percorso completo (sul filesystem del PC usato per lo sviluppo) dello sketch e la seconda la data di caricamento dello stesso.

Il  codice da aggiungere allo sketch andrà nel corpo della setup() :


void setup() 
{
    Serial.begin(9600);
    Serial.print("Sketch:   "); Serial.println(__FILE__);
    Serial.print("Uploaded: "); Serial.println(__DATE__);
}



In questo modo, collegandoci ad Arduino mediante il monitor seriale, verrà visualizzato: il nome dello sketch caricato e la data di caricamento. Esempio:








Fonte: http://www.martyncurrey.com/switching-things-on-and-off-with-an-arduino/