pugliasos newlogoDEF

Orario della segreteria: tutti i martedì, dalle ore 17 alle 19, su appuntamento.

Esercizio

Creare nel LED EDITOR MATRIX una animazione con i seguenti fotogrammi:

pilaInCarica.png

con un tempo di transizione di 600 ms.
Per creare un ciclo continuo a video nell'editor: Maiusc. + Barra spaziatrice

Pillola informatica: le variabili di tipo intere

int8_t

un valore con segno a 8 bit
da -128 a +127
char

1 byte di RAM

uint8_t

un valore senza segno a 8 bit
da 0 a 255
byte

1 byte di RAM

int16_t

un valore con segno a 16 bit
da -32.768 a +32.767
int

2 byte di RAM

uint16_t è di

valore senza segno a16 bit
da 0 a 65.535
unsigned int

2 byte di RAM

int32_t

valore con segno a 32 bit
da -2.147.483.648 a +2.147.483.647
long

4 byte di RAM

uint32_t

valore senza segno a 32 bit
da 0 a 4.294.967.295
unsigned long

4 byte di RAM

 

Per comprendere i danni provocati da un overflow basti pensare al display di un contagiri costituito da soli due digit; allorchè si passa da 99 a 100, compaiono solo i due zeri poichè l'uno va fuori campo.

Libreria Serial

Con Arduino è possibile attivare una comunicazione seriale per inviare e ricevere dati tramite un cavo USB (Universal Serial Bus) con la libreria Serial già integrata nell’IDE. Tale libreria crea un oggetto denominato, di default, Serial.

All'interno di questa libreria vi sono funzioni (dette anche metodi) come:

Serial.begin(velocità);
da usare nel setup,
predispone Arduino a ricevere ed inviare informazioni tramite la porta seriale.

velocità: in bit al secondo (baud1): normalmente 9600 bit/s.

Serial.print(valore);
invia al monitor seriale il contenuto della variabile valore o una stringa posta tra doppie virgolette o un carattere posto fra virgolette semlici2, senza mandare a capo il cursore.

Serial.println(valore);
come prima, ma il cursore va a capo.

Serial.available();
restituisce il numero intero dei caratteri che attendono di essere letti sulla porta seriale; restituisce 0 se il buffer è vuoto.

Serial.read();
restituisce, sotto forma di carattere, il primo byte in input dal buffer di ricezione seriale 3.

Serial.readString();
legge tutta la stringa presente nel buffer di ricezione seriale.

Serial.print(\t);
introduce una tabulazione.

Serial.parseInt();4
legge i caratteri che rappresentano cifre e li restituisce nella rappresentazione numerica.

Serial.parseFloat();
legge i caratteri che rappresentano numeri decimali e li restituisce nella rappresentazione numerica.

La comunicazione seriale

È un processo di invio di bit uno alla volta; quando i dati arrivano ad Arduino, vanno nel buffer di ricezione seriale. Arduino è dotato di un componente hardware chiamato ricevitore/trasmettitore asincrono universale (UART): tale componente quando arrivano i bit di dati dal computer, li assembla a otto ad otto e li memorizza nel buffer di ricezione seriale.

Quando si inviano dati, può accadere che al termine della trasmissione venga aggiunto un carattere di terminazione: un CR (Carriage Return, ritorno carrello) o un LF (Line Feed, fine riga) o entrambi; ciascuno di essi aggiungerebbe un byte al buffer di ricezione seriale e questo potrebbe generare qualche effetto indesiderato. Per evitare che ciò possa accadere, è opportuno selezionare Entrambi CR & NL nel menu a discesa che compare nella finestra del Monitor Seriale

ll monitor seriale è anche utile per verificare se il codice Arduino sta dando i risultati desiderati e risolvere eventuali problemi (tecnica conosciuta come debug seriale).

Inoltre va puntualizzato che tutto ciò che viene immesso o visualizzato nel Monitor seriale è una stringa5 o un carattere!

Approfondimenti
Per comprendere la comunicazione seriale:
https://dumblebots.com/2019/05/06/arduino-tutorial-its-getting-serial-part-a/
https://www.programmingelectronics.com/serial-read/

Variabile globale e variabile locale

Approfondiamo, attraverso il Serial Monitor, la differenza tra variabile globale e variabile locale.

  • Globale
    È una variabile dichiarata al di fuori delle funzione, compreso setup() e loop(), visibile e modificabile in ogni parte del programma.
  • Locale
    Esse sono visibili solo all'interno delle funzioni e cicli dove vengono definite; viene così ridotta la possibilità di commettere errori di scrittura nelle variabili.
    Due variabili locali, definite in differenti parti del programma, possono avere lo stesso nome e contenere valori differenti, poiché una variabile locale ha vita e visibilità solo nella funzione o ciclo dove viene dichiarata.
    Una variabile che viene definita all'interno di parentesi graffe è una variabile locale.
  • Statica
    È una variabile locale che si comporta come una globale. Infatti è visibile solo dalla funzione in cui viene creata, solo che non viene distrutta quando si esce dalla funzione e ricreata ogni volta che viene chiamata la funzione: sarà definita ed inizializzata solo la prima volta e persisterà e conserverà il proprio valore all'interno della funzione. Al momento non è di nostro interesse!
    La parola chiave è static

Esempio di variabile globale

int contatore=1;
int attesa=1000;

void setup() {
   Serial.begin(9600);
}

void loop() {
   Serial.print("Ora la variabile contatore contiene il numero: ");
   Serial.println(contatore);
   /*Serial.println("Ora la variabile contatore contiene il numero: " + String(contatore)); */
   contatore=contatore+1;
   delay(attesa);
}

Esempio di variabile locale

Lo stesso programma di prima, solo che contatore viene definito in setup, invece che prima. Poiché la variabile è locale, si ottiene un errore:

Compilation error: 'contatore' was not declared in this scope

Pillola Informatica: gli array

Supponiamo di voler memorizzare una cinquina di estrazione al lotto, due metodi:

Con 5 variabili (cinque scatole)
uint8_t numeroEstratto1=9;
uint8_t numeroEstratto2= 21;
uint8_t numeroEstratto3= 45;
uint8_t numeroEstratto4= 90;
uint8_t numeroEstratto5= 46;

Con un array di dimensione 5 (una scatola con 5 scomparti)

uint8_t numeriEstratti [5];
numeriEstratti [0]=9;
numeriEstratti [1]=21;
numeriEstratti [2]=45;
numeriEstratti [3]=90;
numeriEstratti [4]=46;

oppure, più sbrigativamente

uint8_t numeriEstratti [5]={9,21,45,90,46}

9

21

45

90

46

 

Array unidimensionale o vettore

Un vettore è un insieme omogeneo di dati, i cui valori vengono contrassegnati, e quindi vi si accede ad ognuno di essi, con un indice.
Il primo elemento di un vettore costituito da N elementi (di dimensione N) è contrassegnato con lo 0, l'ultimo con N-1.

Valore

a

b

c

d

e

f

Indice

0

1

2

3

4

5

 

Sintassi

int unArray[6]; // dichiarazione di un array di dimensione 6, senza inizializzarlo

byte unArray[6] = {'a','b','c','d','e','f'}; // dichiarazione di un array di dimensione 6 inizializzato

Se si dichiara una dimensione maggiore del numero di elementi utilizzati nella inizializzazione, vengono aggiunti spazi vuoti alla fine dell'array: in un secondo momento si potranno aggiungere gli altri elementi.

byte unArray[]={'a','b','c','d','e','f'}; // dichiarazione di un array inizializzato di  dimensione pari al numero degli elementi inseriti;

Per recuperare il valore di un elemento dell'array è necessario avere una variabile di lettura o di accesso alla quale assegnare il valore richiesto.

Un valore nell’array può essere richiamato con il nome dell’array e l’indice numerico della posizione occupata nell’array, posto fra parentesi quadre.

int variabile = unArray[3] // nell’esempio precedente equivale a variabile = d

Semplice è anche assegnare un valore ad un elemento di un array, ad esempio

unArray[3] = 'd';

assegna il valore d al quarto elemento.

ATTENZIONE: se si accede agli elementi di un array di dimensione N con un indice superiore a N-1, si va in una zona di memoria diversa da quella occupata dall'array e si commettono errori in fase di lettura e danni in quella di scrittura!

Array bidimensionale o matrice

Essi sono delle strutture dati bidimensionali, in pratica delle tabelle, in cui organizzare elementi omogenei, ciascuno individuato da due indici, il primo indice è detto indice di riga, il secondo indice di colonna.

La sintassi per creare una matrice è la seguente:
tipoDiDati nomeMatrice [R][C];
dove R è il numero delle righe, mentre C quello delle colonne

La sintassi per operare con le matrici è analoga a quella vista per i vettori, con la differenza che per individuare un elemento della matrice ora sono necessari due indici.

NOTE

1 Unità di velocità di trasmissione in Telecomunicazioni.
2 “stringa”, ‘carattere’
3 Restituisce il primo (il più vecchio) carattere nel buffer, dopo di che lo rimuove; quando tutti i byte dei dati saranno stati letti, e quindi rimossi, il buffer sarà vuoto e Serial.available() restituirà il valore 0 (che in un test corrisponde a FALSO)
4 Ignora eventuali caratteri iniziali che non siano cifre e la ricerca viene interrotta quando viene letto un un carattere che non rappresenti una cifra (o “.” nel caso di Serial.parseFloat()).
5 Una stringa è una sequenza di caratteri come lettere, numeri e simboli.

Save
Cookies user preferences
We use cookies to ensure you to get the best experience on our website. If you decline the use of cookies, this website may not function as expected.
Accept all
Decline all
Read more
Analytics
Tools used to analyze the data to measure the effectiveness of a website and to understand how it works.
Google Analytics
Accept
Decline