Observe, Collect, Draw!

La frase che più di frequente ripeto durante i miei corsi è: “materializzazione della competenza” orami sta diventando un meme 🙂 , un modo per dire che attraverso l’azione pratica in laboratorio l’allievo prende coscienza della propria competenza, l’oggetto fisico diventa elemento per percepire gli obiettivi raggiunti. Più volte mi accorgo però che lo studente non è consapevole di ciò che ha raggiunto con lo studio e i giudizi che da su se stesso sono molto spesso estremi: non ho capito nulla, oppure mi è tutto chiaro.

Fornire strumenti di Personal Knowledge Management e gestione del tempo lavoro, aiuta certamente nello svolgimento di tutte le progettazioni sia di studio che di lavoro, ma credo a ciò si debbano aggiungere strumenti che permettano al ragazzo di realizzare un diario visivo che permetta di visualizzare i dati della propria vita e le sue azioni elementari, trasformando questi dati in infografiche, l’obiettivo è creare uno strumento di autoesame. Questa fase essenziale porterà ad una maggior consapevolezza di se donando sicurezza per le scelte future.

Questa idea è nata durante l’azione formativa presso la Fondazione Golinelli, durante il workshop Dear Data, ispirato alla ricerca di Giorgia Lupi, artista e information designer di fama internazionale. Nel suo lavoro professionale e artistico è interessata all’approccio umanistico ai dati, sfidando l’impersonalità dei dati attraverso la creazione di narrative visuali che collegano i numeri alle storie, alle persone, alle idee. Il suo lavoro è estremamente affascinante, i dati rilevati della propria vita vengono trasformati in opere artistiche.

Quindi se i dati raccolti diventano una rappresentazione artistica creata dallo studente, allora il ragazzo guardando la propria infografica, potrebbe percepirsi in modo più consapevole e vedere l’armonia delle proprie azioni; tutto ciò lo ritengo estremamente affascinante.

Giorgia Lupi e Stefanie Posavec nel libro Observe, Collect, Draw! mostrano come possiamo raccogliere tutti i tipi di dati su noi stessi, sui nostri comportamenti e sul nostro ambiente e ci mostrano come trasformarli in interessanti ed elaborati disegni, in sostanza opere d’arte.

  • Cosa impariamo su noi stessi quando misuriamo i nostri livelli di gratitudine, fiducia e distrazione?
  • Che informazione ci fornisce l’analisi grafica sulle nostre collezioni (i nostri libri, la musica, i vestiti che indossiamo?) su chi siamo?
  • Come mi vesto?
  • Quanto mi lamento?
  • Quanto uso i social e quali social utilizzo?
  • Quante volte dico grazie?
  • Quante volte abbraccio i miei gentitori?

Il libro è una risorsa utilissima per imbastire percorsi di educazione civica, all’affettività, orientamento o per intraprendere percorsi per la gestione dei conflitti, sul recupero e la rimotivazione.
Quindi, liberi di crescere conoscendosi attraverso i dati.

Cosa sto facendo?

  • mediante alcune app sul mio smartphone, non troppo invasive, analizzo alcune mie abitudini di vita
  • sto trasformando le proposte del libro in azioni didattiche concrete.

Il libro funziona come un mini-corso di design dell’informazione, accessibile e coinvolgente sia ai principianti che per i designer dell’informazione esperti, e sicuramente utilissimo per ogni insegnante.

Buon Making mentale a tutti 🙂

MASTERCLASS for STEAM – Grazie Fondazione Golinelli


Dal 17 al 21 luglio scorso ho partecipato ad un’esperienza formativa fuori dal comune che mi ha donato una grande quantità di idee ed approcci didattici che favoriranno la realizzazione di nuovi progetti a partire da settembre prossimo.

La formazione a cui faccio riferimento è quella organizzata annualmente dalla Fondazione Golinelli e Confindustria Emilia Area Centro: MASTERCLASS for STEAM la summer school che per 5 giorni di intense attività creative e coinvolgenti ci ha condotto in un ricco percorso laboratoriale condotto da formatori estremamente preparati in una città affascinate: Bologna.

Quindi una formazione residenziale basata su un approccio pratico, dove in ogni giornata sono state svolte attività esperienziali che sono diventate il punto di partenza per workshop di riflessione e brainstorming.

I temi trattati sono stati tantissimi: dal mindset dinamico per la progettazione delle STEAM, all’analisi dell’errore come valore, analisi dei dati ambientali e Citizen Science, dati partecipazione e linguaggi, IA experience, realtà aumentata e virtuale nelle attività laboratoriali e molto altro.

Attraverso varie strategie di facilitazione, tutte le azioni hanno incentivato una profonda riflessione sugli approcci progettuali, puntando a una progettazione più completa, integrata e olistica valorizzando non solo competenze specifiche, ma anche capacità trasversali e interpersonali, il tutto mirando a rafforzare gli strumenti e le metodologie didattiche, tenendo sempre a mente gli obiettivi STEAM al fine di renderci più consapevoli del nostro ruolo come creatori di esperienze formative.

Sto riguardando gli appunti e i risultati dei laboratori svolti, mi stanno fornendo una grande quantità di idee che sto trasformando in un diario di azioni.

Porto con me il valore del confronto con i colleghi che hanno partecipato all’attività formativa, appassionati, motivati e propensi allo scambio di idee.

Il mio grazie va agli organizzatori, ai formatori ai colleghi.

Buon Making a tutti 😊

Realizziamo un orologio con l’RTC di Arduino UNO R4 WiFi

Arduino UNO R4 WiFi possiede un RTC interno facilmente programmabile che ci consentirà di mantenere costantemente traccia dell’ora e della data corrente.

Per chi ha iniziato da poco le sperimentazioni elettroniche ricordo che un Real-Time Clock (RTC), o Orologio in Tempo Reale, è un tipo di orologio costituito da un circuito elettronico utilizzato per tracciare il tempo in tempo reale. Questo significa che tiene traccia del giorno della settimana, della data e dell’ora corrente, dei minuti, dei secondi, proprio come un orologio normale, inoltre è possibile impostare un RTC per gestire l’ora legale e l’ora solare.

Nelle versione precedente di Arduino, UNO R3 non era presente un RTC pertanto bisognava utilizzare un apposito circuito elettronico esterno così come dettagliato nel post su questo sito: Utilizzare un orologio RTC con Arduino – Modulo Tiny RTC I2C, modulo RTC dotato di un integrato DS1307 cuore fondamentale della scheda.

L’utilizzo dell’RTC su Arduino UNO R4 WiFi avviene utilizzando la libreria RTC che consente di impostare oppure ottenere l’orario o ancora gestire allarmi per attivare interrupt.

Come accennato ad inizio post l’RTC integrato dispone di un pin VRTC, che viene utilizzato per mantenere in funzione l’RTC, anche quando l’alimentazione della scheda viene interrotta. Per utilizzare questa funzione è sufficiente fornire una tensione compresa tra 1,6 e 3,6 V al pin VRTC. In un post successivo mostrerò come utilizzare il pin VRTC.

Facendo riferimento agli esempi disponibili sul sito Arduino e nell’IDE analizziamo le fasi di configurazione dell’RTC.

Impostazione della data e dell’ora

RTCTime startTime(01, Month::AUGUST, 2023, 20, 49, 00, DayOfWeek::TUESDAY, SaveLight::SAVING_TIME_ACTIVE)

RTC.setTime(startTime)

Per impostare l’orario bisogna creare un oggetto RTCTime, in cui deve essere specificato il giorno, il mese, l’anno, l’ora, il minuto, il secondo, il giorno della settimana e l’attivazione dell’ora legale se prevista nella nazione in cui si sta utilizzando la scheda, quindi per impostare l’orario bisogna usare il metodo startTime.

Per chi incomincia con la programmazione il concetto di metodo appartiene alla programmazione ad orientata agli oggetti come ad esempio in C++, quando si programma in C è meglio parlare di funzione, ma spesso i due concetti vengono usati in modo alternativo.

Il primo sketch non fa altro che impostare l’ora corrente:

// inclusione della libreria RTC
#include "RTC.h"

void setup() {

  // impostazione della velocità della serial monitor
  Serial.begin(9600);

  // avvio dell'RTC
  RTC.begin();

  // creazione dell'oggetto RTCTime (possiamo assegnare un nome a piacimento)
  // data del giorno, mese, anno, ore, minuti, secondi, giorno della settimana, attivazione passaggio all'ora legale
  RTCTime startTime(2, Month::AUGUST, 2023, 9, 15, 00, DayOfWeek::WEDNESDAY, SaveLight::SAVING_TIME_ACTIVE);

  // impostazione dell'RTC con la data e lora configurate per RTCTime
  RTC.setTime(startTime);
}

// il loop non contiene nulla
void loop() {
}

Continua a leggere

Arduino UNO R4 WiFi – Visualizzare il livello di una grandezza fisica mediante una barra incrementale sulla matrice LED di Arduino

Come anticipato nelle scorse lezioni vediamo in questo tutorial come visualizzare il livello di una grandezza fisica mediante una barra incrementale sulla matrice LED dell’Arduino UNO R4 WiFi.
Gli esempi mostrati possono essere adattati per qualsiasi tipologia di sensore, per semplicità e rapidità di realizzazione ho scelto di rilevare l’intensità luminosa mediante un LDR. Lascio a voi correzioni e miglioramenti a quanto ho scritto.

La matrice, come sapete è costituita da 8 righe di LED, Il numero di linee LED attive sarà proporzionale all’intensità luminosa rilevata:

  • Livello minimo di intensità = accensione della sola riga 7
  • Livello massimo di intensità = accensione di tutte le righe della matrice

I 6 sketch di esempio che seguono sono molto simili, tutti eseguono la calibrazione del sensore, basata sullo sketch standard che trovate all’interno degli esempi dell’IDE di Arduino. Il codice di calibrazione prevede 5 secondi di analisi che permettono di impostare il livello minimo e massimo della grandezza da misurare. Ho aggiunto per ognuno dei 6 esempi alternative diverse per mostrare sulla matrice di LED il timer di 5 secondi.

Il funzionamento di ogni parte del codice dei 6 sketch, è dettagliato mediante commenti, se avete necessità di chiarimenti non esitate a contattarmi.

Circuito

Il circuito prevede l’utilizzo di:

  • Arduino UNO R4 WiFi
  • LDR
  • Resitore da 10 KOhm

Esempio 01

Il trascorrere del tempo di calibrazione è mostrato dall’accensione sequenziale dei primi 5 LED posti sulla riga n. 7, terminata la fase di calibrazione, dopo 0,5 secondi l’array della matrice viene azzerato e viene poi avviata la rilevazione.

sketch01

// Prof. Maffucci Michele
// 31/07/23
// Visualizzazione livello luminoso su matrice LED Uno R4 WiFi
// con calibrazione sensore e visualizzazione timer di calibrazione
// con l'accensione di 5 LED della matrice

// Esercizio 01

// inclusione della libreria per la gestione della matrice
#include "Arduino_LED_Matrix.h"

// creazione dell’oggetto matrix
ArduinoLEDMatrix matrix;

// inizializzazione dell'array per inizializzare lo stato della matrice
uint8_t frame[8][12] = { 0 };

// pin a cui collegare il sensore
int pinSensore = A0;

// variabile in cui memorizzare il valore letto dal sensore
int valoreSensore = 0;

// variabili per calibrazione lovello minimo e massimo luce ambiente
int sensoreMin = 1023;  // valore minimo sensore
int sensoreMax = 0;     // valore massimo sensore

// contatore passi di calibrazione
int contatore = 0;

// valore del millis al passo precedente
unsigned long millisPrecedente = 0;
// valore del millis attuale
unsigned long millisCorrente = 0;

// intervallo in millisecondi per l'accensione di una riga di LED
const long intervallo = 1000;

// riga LED precedentemente accesa
int precedenteLivello = 0;

void setup() {
  // inizializzazione della velocità della serial monitor
  Serial.begin(115200);

  // avvio della matrice di LED
  matrix.begin();

  // calibrazione del sensore nei primi 5 secondi di avvio di Arduino
  while (millis() < 5000) {

    // memorizzazione dle valore attuale del millis
    millisCorrente = millis();

    // lettura valore
    valoreSensore = analogRead(pinSensore);

    // registra il valore massimo rilevato dal sensore
    if (valoreSensore > sensoreMax) {
      sensoreMax = valoreSensore;
    }

    // registra il valore minimo rilevato dal sensore
    if (valoreSensore < sensoreMin) {
      sensoreMin = valoreSensore;
    }

    // timer
    if (millisCorrente - millisPrecedente >= intervallo) {
      millisPrecedente = millisCorrente;
      frame[7][contatore] = 1;
      matrix.renderBitmap(frame, 8, 12);
      contatore++;
    }
  }
  // accensione dell'ultimo LED al 5' secondo
  frame[7][4] = 1;
  matrix.renderBitmap(frame, 8, 12);

  // attesa di 0,5 secondi prima di spegnere tutti i LED
  delay(500);

  // spegnimento di tutti i LED della matrice
  uint8_t frame[8][12] = { 0 };
  matrix.renderBitmap(frame, 8, 12);
}

// Accensione linee matrice (dalla riga 7)
// maggiore e' il valore numeriico di "livello" (riga LED) più bassa sarà l'intensità luminosa
// minore e' e' il valore numeriico di "livello" (riga LED) più alta sarà l'intensità luminosa

// Livello minimo di intensità = accensione della sola riga 7
// Livello massimo di intensità = accensione di tutte le linee della matrice

void barra(int livello) {
  // spegnimento della riga "livello"
  if (livello > precedenteLivello) {
    for (int y = livello; y >= precedenteLivello; y--) {
      // spegnimento dei 12 LED della riga "livello"
      for (int x = 0; x < 12; x++) {
        frame[y][x] = 0;
      }
      matrix.renderBitmap(frame, 8, 12);
      delay(1);
    }
    // accensione della riga "livello"
  } else {
    for (int y = 7; y >= precedenteLivello; y--) {
      for (int x = 0; x < 12; x++) {
        frame[y][x] = 1;
      }
      matrix.renderBitmap(frame, 8, 12);
      delay(1);
    }
  }
  precedenteLivello = livello;
}

void loop() {

  // per evitare sprechi di memoria viene utilizzata usata una stessa variabile: valoreSensore
  // per memorizzare ad ogni passo valori diversi

  // lettura del valore del sensore
  valoreSensore = analogRead(pinSensore);

  // Forzare il valore all'interno del valore minimo e del massimo nel caso di errori di lettura.
  // Nel caso non si aggiungesse il "constrain" nel caso di errore si blocca l'esecuzione
  valoreSensore = constrain(valoreSensore, sensoreMin, sensoreMax);

  // Il valore minimo di lettura è associato all'accensione della riga 7
  // quindi si rimappa tra 7 e 0
  valoreSensore = map(valoreSensore, sensoreMin, sensoreMax, 7, 0);

  // barra(valoreSensore) è la funzione che gestisce l'accensione delle linee di LED
  barra(valoreSensore);
}

Continua a leggere

Arduino UNO R4 WiFi – usare la matrice LED per esercitarsi con i cicli for

Come segnalato nei precedenti, post sto realizzando le prime lezioni sull’uso di Arduino UNO R4 WiFi per i miei studenti, ma ho pensato di mostrare su queste pagine gli sketch di base che poi utilizzerò per implementare esercitazioni più estese. Gli esempi che seguono hanno l’obiettivo di mostrare l’utilizzo ed il risultato di cicli for annidati che hanno come obiettivo la realizzazioni di semplici animazioni sulla matrice di LED di Arduino, strutture di codice che potranno essere sfruttate ad esempio per visualizzare lo stato di un sensore, il valore di una variabile e molto altro.

Utilizzerò per questi esercizi il “Modo 1” indicato nella lezione precedente in cui veniva creato un array bidimensionale che inizializza e rappresenta lo stato della matrice di LED, se ricordate la struttura da includere all’inizio del codice era la seguente:

byte frame[8][12] = {
  { 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0 },
  { 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0 },
  { 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 },
  { 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0 },
  { 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0 },
  { 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0 },
  { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
};

Per rendere leggibile e più snello il codice scriverò in altro modo la matrice sopra:

uint8_t frame[8][12] = {0};

Esercizio 1

In questo esercizio vedremo come effettuare il blink della 7 linea di LED sulla matrice, per intenderci la base inferiore della matrice. Le inizializzazioni per l’utilizzo della matrice sono le medesime per tutti gli sketch che seguono.

Vengono definite due funzioni: barraOn() e barraOff() che si occupano di accendere e spegnere la linea 7 della matrice. Il ciclo for incluso nelle due funzioni itererà per 12 volte ponendo ad 1 il valore della linea 7, come potete notare viene vincolata a 7 la y della matrice: frame[7][x]. Nel loop verranno richiamate le due funzioni barraOn() e barraOff() con un delay di 1 secondo. Ricordate che è essenziale ad ogni modifica dello stato della matrice invocare la funzione: matrix.renderBitmap(frame, 8, 12); altrimenti non vedrete nulla sulla matrice

// Prof. Maffucci Michele
// 27/07/23
// Blink striscia led (linea 7) su matrice
// Esercizio 01

#include "Arduino_LED_Matrix.h"

ArduinoLEDMatrix matrix;

void setup() {
  Serial.begin(115200);
  matrix.begin();
}

uint8_t frame[8][12] = {0};

// accensione linea 7 della matrice
void barraOn() {
  //barra
  for (int x=0; x<12; x++){
    frame[7][x] = 1;
  }
}

// spegnimento linea 7 della matrice
void barraOff() {
  //barra
  for (int x=0; x<12; x++){
    frame[7][x] = 0;
  }
}

void loop() {
  barraOn();
  matrix.renderBitmap(frame, 8, 12);

  delay(1000);
  barraOff();

  matrix.renderBitmap(frame, 8, 12);
  delay(1000);
}

Esercizio 2

In questo secondo esercizio l’accensione dei LED dell’ultima line avviene in modo sequenziale da sinistra verso destra e successivamente questi saranno spenti sempre da sinistra verso destra dando l’impressione che il “serpente” esce dallo schermo da destra e rientri da sinistra.

Nell’esempio che segue sono state definite due funzioni: barraOn() e barraOff() in cui vincolata la linea 7 viene modificata in modo ciclico la coordinata x del LED. Per dare la sensazione di movimento l’accensione e lo spegnimento di ogni songolo LEd è stato posto a 100 millisecondi. Nel loop vengono richiamate ciclicamente le due funzioni.

// Prof. Maffucci Michele
// 27/07/23
// Accensione/spegnimento in una direzione striscia led (linea 7) su matrice
// Esercizio 02

#include "Arduino_LED_Matrix.h"

ArduinoLEDMatrix matrix;

void setup() {
  Serial.begin(115200);
  matrix.begin();
}

uint8_t frame[8][12] = {0};

// accensione linea 7 della matrice
void barraOn() {
  for (int x=0; x<12; x++){
    frame[7][x] = 1;
    matrix.renderBitmap(frame, 8, 12);
    delay(100);
  }
}

// spegnimento linea 7 della matrice
void barraOff() {
  //barra
  for (int x=0; x<12; x++){
    frame[7][x] = 0;
    matrix.renderBitmap(frame, 8, 12);
    delay(100);
  }
}

void loop() {
  barraOn();
  barraOff();
}

Esercizio 3

In questo esempio la barra posta sulla linea 7 simula il comportamento di incremento o decremento di una variabile per cui la barra aumenta e diminuisce da un valore minimo ad un valore massimo in modo sequenziale, ma immaginate di modificare questo sketch collegandolo ad esempio alla variazione di un valore analogico. La differenza rispetto allo sketch precedente consiste solamente nel fatto che lo spegnimento dei LED avviene partendo dai LED maggiore.

// Prof. Maffucci Michele
// 27/07/23
// Accensione/spegnimento in due direzioni striscia led (linea 7) su matrice
// Esercizio 03

#include "Arduino_LED_Matrix.h"

ArduinoLEDMatrix matrix;

void setup() {
  Serial.begin(115200);
  matrix.begin();
}

uint8_t frame[8][12] = {0};

// accensione linea 7 della matrice
void barraOn() {
  for (int x=0; x<12; x++){
    frame[7][x] = 1;
    matrix.renderBitmap(frame, 8, 12);
    delay(100);
  }
}

// spegnimento linea 7 della matrice
void barraOff() {
  for (int x=11; x>=0; x--){
    frame[7][x] = 0;
    matrix.renderBitmap(frame, 8, 12);
    delay(100);
  }
}

void loop() {
  barraOn();
  barraOff();
}

Esercizio 4

L’idea di questo quarto sketch nasce dalla necessità di realizzare un indicatore per misurare ad esempio il livello di luminosità, sonoro o l’umidità presente nel terreno. Come potete notare le linee della matrice vengono attivate una alla volta dal basso verso l’alto e poi spente dall’alto verso il basso. Le due funzioni barraOn() e barraOff() includono due cicli for annidati, quello più esterno consente di fissare la linea della matrice, mentre quello più interno permette di accendere o spegnere i LED sulla stessa linea. Nel loop le due funzioni vengono richiamata ciclicamente.

// Prof. Maffucci Michele
// 27/07/23
// Accensione/spegnimento in due direzioni (linea) BASSO>ALTO ALTO>BASSO matrice led
// Esercizio 04

#include "Arduino_LED_Matrix.h"

ArduinoLEDMatrix matrix;

void setup() {
  Serial.begin(115200);
  matrix.begin();
}

uint8_t frame[8][12] = {0};

// accensione linea BASSO>ALTO (dalla linea 7)
void barraOn() {
  for (int y = 8; y >= 0; y--) {
    for (int x = 0; x < 12; x++) {
      frame[y][x] = 1;
    }
    matrix.renderBitmap(frame, 8, 12);
    delay(100);
  }
}

// spegnimento linea ALTO>BASSO (dalla linea 0)
void barraOff() {
  for (int y = 0; y <=8 ; y++) {
    for (int x = 11; x >= 0; x--) {
      frame[y][x] = 0;
    }
    matrix.renderBitmap(frame, 8, 12);
    delay(100);
  }
}

void loop() {
  barraOn();
  barraOff();
}

Esercizio 5

Lo sketch che segue ha il medesimo obiettivo del precedente, ma in questo caso l’accensione e lo spegnimento della matrice avviene per colonne, accensione da sinistra verso destra e spegnimento da destra verso sinistra. Le due funzioni barraOn() e barraOff(), costittuite entrambe da due cicli for annidati funzionano in modalità opposta allo sketch precedente, in questo caso il for più esterno vincola la colonna e quello più interno accende/spegne i LED della colonna.

// Prof. Maffucci Michele
// 27/07/23
// Accensione/spegnimento in due direzioni SX>DX DX>SX (partenza colonna 0) matrice led
// Esercizio 05

#include "Arduino_LED_Matrix.h"

ArduinoLEDMatrix matrix;

void setup() {
  Serial.begin(115200);
  matrix.begin();
}

uint8_t frame[8][12] = {0};

// accensione colonna SX>DX (dalla colonna 0)
void barraOn() {
  for (int x = 0; x < 12; x++) {
    for (int y = 0 ; y < 8; y++) {
      frame[y][x] = 1;
    }
    matrix.renderBitmap(frame, 8, 12);
    delay(100);
  }
}

// spegnimento colonna DX>SX (dalla colonna 11)
void barraOff() {
  for (int x = 11; x >= 0 ; x--) {
    for (int y = 7 ; y >= 0; y--) {
      frame[y][x] = 0;
    }
    matrix.renderBitmap(frame, 8, 12);
    delay(100);
  }
}

void loop() {
  barraOn();
  barraOff();
}

Esercizio 6

In questo esercizio si vuole mostrare come spostare, “far cadere”, un puntino dall’alto verso il basso eseguendo questa operazione per ogni colonna da sinistra verso destra. La funzione puntino() è costituita da due cicli for, il più esterno vincola la colonna su cui movimentare il LED, mentre quello più interno accende e spegne in modo sequenziale i LED della colonna selezionata dal for più esterno.

// Prof. Maffucci Michele
// 27/07/23
// Accensione e spegnimento sequenziale dall'alto al basso - matrice led
// Esercizio 06

#include "Arduino_LED_Matrix.h"

ArduinoLEDMatrix matrix;

void setup() {
  Serial.begin(115200);
  matrix.begin();
}

uint8_t frame[8][12] = { 0 };

// puntino cadente
void puntino() {
  for (int x = 0; x < 12; x++) {
    for (int y = 0; y < 8; y++) {
      frame[y][x] = 1;
      matrix.renderBitmap(frame, 8, 12);
      delay(20);
      frame[y][x] = 0;
      matrix.renderBitmap(frame, 8, 12);
      delay(20);
    }
  }
}

void loop() {
  puntino();
}

Esercizio 7

Comportamento identico al precedente ma in questo caso lo spostamento del puntino avviene per righe dall’alto al basso ed accensione e spegnimento da destra verso sinistra. In questo vaso il for più esterno vincola la riga mentre quello più interno si occupa di accendere e spegnere i LED della riga selezionata.

// Prof. Maffucci Michele
// 27/07/23
// Accensione e spegnimento sequenziale SX > DX dall'alto al basso - matrice led
// Esercizio 07

#include "Arduino_LED_Matrix.h"

ArduinoLEDMatrix matrix;

void setup() {
  Serial.begin(115200);
  matrix.begin();
}

uint8_t frame[8][12] = { 0 };

// puntino cadente
void puntino() {
  for (int y = 0; y < 8; y++) {
    for (int x = 0; x < 12; x++) {
      frame[y][x] = 1;
      matrix.renderBitmap(frame, 8, 12);
      delay(20);
      frame[y][x] = 0;
      matrix.renderBitmap(frame, 8, 12);
      delay(20);
    }
  }
}

void loop() {
  puntino();
}

Esercizio 8

In questo esercizio viene vincolato lo spostamento del puntino luminoso sulla riga quattro simulando uno spostamento sinistra/destra e destra/sinistra dando l’impressione di un rimbalzo sulle pareti. Per rendere più chiara la lettura da parte degli studenti ho realizzato due funzioni separate che si occupano dei due movimenti.

// Prof. Maffucci Michele
// 27/07/23
// Puntino che rimbalza SX > DX - DX > SX - matrice led
// Esercizio 08

#include "Arduino_LED_Matrix.h"

ArduinoLEDMatrix matrix;

void setup() {
  Serial.begin(115200);
  matrix.begin();
}

uint8_t frame[8][12] = { 0 };

// puntino rimbalza su riga 4
void puntinoSxDx() {
  for (int x = 0; x < 12; x++) {
    frame[4][x] = 1;
    matrix.renderBitmap(frame, 8, 12);
    delay(50);
    frame[4][x] = 0;
    matrix.renderBitmap(frame, 8, 12);
    delay(50);
  }
}

void puntinoDxSx() {
  for (int x = 11; x >= 0; x--) {
    frame[4][x] = 1;
    matrix.renderBitmap(frame, 8, 12);
    delay(50);
    frame[4][x] = 0;
    matrix.renderBitmap(frame, 8, 12);
    delay(50);
  }
}

void loop() {
  puntinoSxDx();
  puntinoDxSx();
}

Buon Making a tutti 🙂