Archivi tag: rgb

Arduino – Uso di LED RGB – approfondimento

Scrivo questa lezione come approfondimento della guida realizzata tempo fa: Arduino – lezione 09: uso di LED RGB in cui mostravo come funzionano e come si gestiscono i LED RGB con Arduino. Negli esercizi proposti utilizzavo un LED ad ANODO comune. In questa nuova lezione utilizzerò un diodo a CATODO comune e mostrerò tre esempi, nel primo ripropongo in una modalità diversa l’esercizio della prima lezione in cui faccio alcuni approfondimenti sull’uso della direttiva #define, mentre nel secondo e terzo esercizio viene mostrato come impostare il colore emesso dal LED RGB mediante input da tastiera su Serial Monitor richiamando con questi esempi l’uso del qualificatore const per una variabile e l’utilizzo della funzione parseInt(). Come sempre nei commenti, all’interno del codice, trovate la spiegazione del funzionamento di ogni parte dello sketch.

Esempio 01

Variazione colore continuo di un LED RGB secondo lo schema:

ROSSO > VERDE, VERDE > BLU, BLU > ROSSO

Scema di collegamento

/*  Prof. Maffucci Michele
    06.01.2021

    Esempio 01
    Variazione colore continuo
    di un LED RGB secondo lo schema:

    ROSSO > VERDE, VERDE > BLU, BLU > ROSSO

*/

/* Utilizzo della direttiva #define per definire una costante
   La direttiva viene utilizzata per definire una MACRO ovvero
   un simbolo.

   La sintassi per la definizione di una macro è:
   #define nome-MACRO  valore_MACRO

   Per convenzione il nome della macro viene scritta in maiuscolo.

   Il preprocessore legge la definizione di ogni MACRO e ogni volta che
   ne incontra il nome all'interno del programma (file sorgente) sostituisce
   al simbolo il valore corrispondente, senza che venga effettuata la verifica
   della correttezza sintattica dell'espressione risultante.
*/

#define VERDE 9
#define BLU 10
#define ROSSO 11

// tempo di dissolvenza tra i colori
#define tempoRitardo 10

void setup()
{
  // impostazione ad OUTPUT dei pin
  pinMode(ROSSO, OUTPUT);
  pinMode(VERDE, OUTPUT);
  pinMode(BLU, OUTPUT);

  // all'avvio viene emesso il colorore ROSSO
  digitalWrite(BLU, LOW);
  digitalWrite(VERDE, LOW);
  digitalWrite(ROSSO, HIGH);
}

// definizione di variabili
int valoreRosso;
int valoreVerde;
int valoreBlu;

void loop()
{
  // Impostazioni variabili per avere partire con LED:
  // ROSSO accesso, VERDE spento, BLU spento.
  valoreRosso = 255;
  valoreVerde = 0;
  valoreBlu = 0;

  // partendo dal ROSSO si sfuma al VERDE pieno quando i = 255
  for (int i = 0; i < 255; i += 1)
  {
    valoreRosso -= 1;
    valoreVerde += 1;

    // L'intensità del ROSSO viene diminuita ad ogni ciclo, mentre
    // l'intensità del VERDE viene aumentata ad ogni ciclo
    analogWrite(ROSSO, valoreRosso);
    analogWrite(VERDE, valoreVerde);
    delay(tempoRitardo);
  }

  // Impostazioni variabili per avere partire con LED:
  // ROSSO spento, VERDE acceso, BLU spento.
  valoreRosso = 0;
  valoreVerde = 255;
  valoreBlu = 0;

  // partendo dal VERDE si sfuma al BLU pieno quando i = 255
  for (int i = 0; i < 255; i += 1)
  {
    valoreVerde -= 1;
    valoreBlu += 1;

    // L'intensità del VERDE viene diminuita ad ogni ciclo, mentre
    // l'intensità del BLU viene aumentata ad ogni ciclo
    analogWrite(VERDE, valoreVerde);
    analogWrite(BLU, valoreBlu);
    delay(tempoRitardo);
  }

  // Impostazioni variabili per avere partire con LED:
  // ROSSO spento, VERDE spento, BLU acceso.
  valoreRosso = 0;
  valoreVerde = 0;
  valoreBlu = 255;

  // partendo dal BLU si sfuma al ROSSO pieno quando i = 255
  for (int i = 0; i < 255; i += 1)
  {
    valoreBlu -= 1;
    valoreRosso += 1;

    // L'intensità del BLU viene diminuita ad ogni ciclo, mentre
    // l'intensità del ROSSO viene aumentata ad ogni ciclo
    analogWrite(BLU, valoreBlu);
    analogWrite(ROSSO, valoreRosso);
    delay(tempoRitardo);
  }
}

Esempio 02

Inserimento da Serial Monitor dei valori di intensità del colore. La stringa di richiesta inserimento dei valori RGB viene ripetuta una sola volta e ad ogni nuovo inserimento non viene stampato sulla serial monitor il valore inserito.

Lo schema di collegamento è il medesimo dell’esempio 01.

/*  Prof. Maffucci Michele
    06.01.2021

    Esempio 02
    Inserimento da Serial Monitor dei valori
    di intensità del colore.
    La stringa di richiesta inserimento viene ripetuta una sola volta.
    Ad ogni nuovo inserimento non viene stampato sulla serial monitor
    il valore inserito.

    L'inserimento dei tre valori potrà essere effettuato
    in una delle due modalità:
    1. separando i tre numeri con spazio
    2. separando i tre numeri con la virgola
*/

/*
   Una variabile const indica al compilatore che il valore della
   variabile non può essere modificato durante l'esecuzione del programma.
   Una variabile const viene inizializzata nel momento della dichiarazione,
   se ciò viene fatto in un momento successivo il compilatore rileverà un
   errore che segnalerà anche errore in ogni operazione che comportano la
   modifica del valore dell avariabile definita come const
*/

const byte pinRosso = 11;
const byte pinBlu = 10;
const byte pinVerde = 9;

void setup() {
  // Inizializzazione della comunicazione seriale
  Serial.begin(9600);

  // Impostazione dei pin come OUTPUT
  pinMode(pinRosso, OUTPUT);
  pinMode(pinBlu, OUTPUT);
  pinMode(pinVerde, OUTPUT);

  // Messaggio sulla serial monitor
  Serial.println("Inserisci i valori R G B (es. 125, 50, 255)");
  Serial.println("-------------------------------------------");
  delay(1000);
}

void loop() {

  // Controlla se è disponibile almeno un carattere sulla seriale
  // La Serial.available() restituisce
  // 1 se presente un cattere,
  // 0 se non è presente un carattere

  // per maggior informazioni sull'uso di parseInt() consultare il link:
  // https://wp.me/p4kwmk-4Ah

  if (Serial.available()) {
    // memorizzazione dei colori nelle variabili
    int rosso = Serial.parseInt();
    int verde = Serial.parseInt();
    int blu = Serial.parseInt();

    // impostazione del PWM
    analogWrite(pinRosso, rosso);
    analogWrite(pinVerde, verde);
    analogWrite(pinBlu, blu);
  }
}

Esempio 3

Inserimento da Serial Monitor dei valori di intensità del colore.
Il valore inserito verrà stampato sulla Serial Monitor e ad ogni invio verrà richiesto di inserire un nuovo valore.

Lo schema di collegamento è il medesimo dell’esempio 01.

/*  Prof. Maffucci Michele
    06.01.2021

    Esempio 03
    Inserimento da Serial Monitor dei valori
    di intensità del colore.
    Il valore inserito verrà stampato sulla Serial Monitor e ad ogni
    invio verrà richiesto di inserire un nuovo valore.

    L'inserimento dei tre valori potrà essere effettuato
    in una delle due modalità:
    1. separando i tre numeri con spazio
    2. separando i tre numeri con la virgola
*/

/*
   Una variabile const indica al compilatore che il valore della
   variabile non può essere modificato durante l'esecuzione del programma.
   Una variabile const viene inizializzata nel momento della dichiarazione,
   se ciò viene fatto in un momento successivo il compilatore rileverà un
   errore che segnalerà anche errore in ogni operazione che comportano la
   modifica del valore dell avariabile definita come const
*/

const byte pinRosso = 11;
const byte pinBlu = 10;
const byte pinVerde = 9;

// per stampare una sola volta il messaggio sulla Serial Monitor
bool abilitaMessaggio = 0;

void setup() {
  // Inizializzazione della comunicazione seriale
  Serial.begin(9600);

  // Impostazione dei pin come OUTPUT
  pinMode(pinRosso, OUTPUT);
  pinMode(pinBlu, OUTPUT);
  pinMode(pinVerde, OUTPUT);
}

void loop() {
  // consente di visualizzare sulla Serial Monitor
  // una sola stampa delle stringa
  if (abilitaMessaggio == 0) {
    // ritardo che evita la doppia stampa del messaggio
    delay(200);
    Serial.print("Inserisci i valori R G B (es. 125, 50, 255): ");
    abilitaMessaggio = 1;
  }

  // Controlla se è disponibile almeno un carattere sulla seriale
  // La Serial.available() restituisce
  // 1 se presente un cattere,
  // 0 se non è presente un carattere

  // per maggior informazioni sull'uso di parseInt() consultare il link:
  // https://wp.me/p4kwmk-4Ah


  if (Serial.available()) {
    // memorizzazione dei colori nelle variabili
    int rosso = Serial.parseInt();
    int verde = Serial.parseInt();
    int blu = Serial.parseInt();
    Serial.print(rosso);
    Serial.print(", ");
    Serial.print(verde);
    Serial.print(", ");
    Serial.println(blu);
    Serial.println("-------------------------------------------");

    // impostazione del PWM
    analogWrite(pinRosso, rosso);
    analogWrite(pinVerde, verde);
    analogWrite(pinBlu, blu);

    // abilita alla stampa di una nuova stringa:
    // "Inserisci il ritardo in millisecondi: "
    abilitaMessaggio = 0;
  }
}

Esercizi per i miei studenti

Esercizio 1

Utilizzare tre pulsanti che funzionino come interruttori che permettono di accendere e spegnere un solo LED alla volta:

  • pulsante 1: LED ROSSO
  • pulsante 2: LED VERDE
  • pulsante 3: LED BLU

Ogni cambiamento di stato deve essere segnalato sulla Serial Monitor.

Esercizio 2

Utilizzare due pulsanti in gredo di realizzare la seguente automazione:

  • pulsante 1: attivare/disattivare la modalità di variazione continua del colore, così come esposta nell’esempio 01
  • pulsante 2: attivare/disattivare la generazione casuale di un colore

Ogni cambiamento di stato deve essere segnalato sulla Serial Monitor.

Esercizio 3

Utilizzando la Serial Monitor come unico strumento per inviare comandi ad Arduino, realizzare un menù di selezione che permette di impostare le funzionalità dell’esercizio 01 e dell’esercizio 03.

Due papà ansiosi dal barbiere ed una striscia led per la mente

Questo è il post delle piccole ansie di un papà… ðŸ™‚

striscia-led01

Il consueto appuntamento mensile dal barbiere Luigi per il taglio di capelli. Incontro Albino, entrambi abbiamo i figli della stessa età che frequentano il medesimo Liceo. Inevitabile i discorsi di scuola e problemi adolescenziali, primo tra tutti la difficoltà nel trovare una passione o ampliare le proprie relazioni al di fuori della scuola.
Un’adolescente in casa insegna molte cose. Osservavo in queste serate, guardando mio figlio che studia, la modalità con cui al liceo vengono propinate le materie scientifiche: fisica, chimica, biologia… tutte categoricamente su carta, esercizi sui moti uniformemente accelerati, studio di molecole e composti organici… solo su carta mannaggia… il laboratorio e luogo sconosciuto, per non parlare dell’informatica… lasciamo perdere.
Non voglio incominciare il solito discorso disfattista e lamentoso su taglio delle ore dei laboratori e mancanza di denaro e se pur impegnato a scuola nel trovare soluzioni, incominciano a stancarmi i ragionamenti sui massimi sistemi e sulla funzione docente, sono più concentrato sulle soluzioni e dare possibilità, nel limite delle mie forze, ai ragazzi che mostrano interesse.
Il carico di studio elevatissimo (che noto al liceo) e la quasi assenza di materie svolte in laboratorio fanno perdere nei ragazzi la percezione del senso degli argomenti che stanno studiando provocando disagio, a ciò si aggiunge il periodo di “scombussolamento ormonale” che provoca stati d’animo estremamente controversi… sicuro che mi procurerò l’ira dei colleghi del liceo… ma poco importa.
Come genitore ci si interroga continuamente e si cercano strategie che possano favorire l’accensione di quella “fiammella” di passione nei propri figli, attivando, si spera, il volano che porta al desiderio di scoperta… insomma ansie da genitori.
Tutto ciò per dire, che siano esperimenti di elettronica, osservazioni astronomiche con un telescopio, l’uso di un microscopio, è importante insegnare a dare forma fisica ai propri progetti, potranno nascere da un copia ed incolla visto su internet, ma è così che si impara , se non ci si ferma al copia ed incolla ovviamente, comprendere, rielaborare.
Nella mente di mio figlio, ora piena di poemi Omerici, Epica Latina e tra poco anche dei Promessi Sposi, sto cercando di inserire anche la materia “progetta e costruisci”.
Con stampante 3D e tanta elettronica che gira per casa da qualche tempo abbiamo incominciato con Arduino, robotica ed automazione in genere e come per i miei studenti anche per questo, “particolare studente” 🙂 Arduino svolge egregiamente la funzione di “facilitatore” e mi sta rendendo la vita da padre un po’ più serena.

Corsi su Arduino ovunque online a scuola e nei FabLab… ora è giunta l’ora di farli anche alla famiglia 🙂 la figlia più piccola costruisce piccolo alberi di Natale con LED, il grande programmazione ed elettronica.

Con il liceale siamo giunti in queste serate alla realizzazione di un semplice controllo di una striscia RGB che abbiamo utilizzato per adornare la zona in cui è collocato l’albero di Natale, poiché lo sketch è di interesse per alcuni miei allievi di 5’, pubblico e lascio a chi vorrà la possibilità di migliorarlo.

La spiegazione nei commenti dello sketch.

Nello sketch che è l’ultima versione sviluppata dal giovane studente, trovate commentate alcune parti di codice che potrete attivare e che svolgono funzioni diverse.

1. Cambio colore graduale (in accensione ed in spegnimento) casuale nella scelta del colore:

  • solo bianco
  • solo rosso
  • solo verde
  • solo blu
  • variazione continua di tutti i colori

2. Variazione di una sola delle modalità del punto 1

Compiti per Natale:

3. inserimento di un sensore ad ultrasuoni che percepisce il passaggio di persone davanti all’Albero di Natale emettendo una luce intensa bianca
4. Controllo remoto con telecomando
5. Controllo remoto con cellulare (per questo però credo che ci penserà il papà)

materiale sufficiente per fare qualcosa di creativo durante le prossime vacanze di Natale 🙂

Lista componenti:

  • Arduino UNO R3
  • N. 3 transistor BD 709 (quelli che avevo a disposizione)
  • N.3 resistori da 220 Ohm

Striscia LED alimentata a 12V.
Si è utilizzato un alimentatore esterno a 12V per l’alimentazione della scheda e della striscia LED.
L’alimentazione a 12V della striscia LED è presa direttamente dalla Vin della scheda.

strip-led-rgb

/* Pilotaggio striscia LED
 Mattia Maffucci
 ...con lo zampino di suo papà Michele
 20.12.14
 */

// pin a cui è collegata la striscia LED
#define pinRosso 5
#define pinVerde 6
#define pinBlu 3

// velocità tra un'intensità luminosa e la successiva.
// Per rallentare il fade aumentare il valore
int velocitaFadeBianco = 60;

// velocità tra un'intensità luminosa e la successiva.
// Per rallentare il fade aumentare il valore
int velocitaFadeRosso = 60;

// velocità tra un'intensità luminosa e la successiva.
// Per rallentare il fade aumentare il valore
int velocitaFadeVerde = 60;

// velocità tra un'intensità luminosa e la successiva.
// Per rallentare il fade aumentare il valore
int velocitaFadeBlu = 60;

// velocità tra un'intensità luminosa e la successiva.
// Per rallentare il fade aumentare il valore
int velocitaFadeContinuo = 60;

// attesa prima della partenza della successiva accensione
int attesaFinaleBianco = 2000;
int attesaFinaleRosso = 2000;
int attesaFinaleVerde = 2000;
int attesaFinaleBlu = 2000;
int attesaFinaleContinuo = 2000;

// intensità massima di bianco. Per 
// rallentare il fade aumentare il valore
int limiteBianco = 30;

// intensità massima di rosso. Per 
// rallentare il fade aumentare il valore
int limiteRosso = 30;

// intensità massima di verde. Per 
// rallentare il fade aumentare il valore
int limiteVerde = 30;

// intensità massima di blu. Per 
// rallentare il fade aumentare il valore
int limiteBlu = 30;

// intensità massima dei colori. Per 
// rallentare il fade aumentare il valore
// massimo 255
int limiteContinuo = 100;

// per rallentare il fade aumentare il valore
int limiteFadeRandom = 120;

// numero massimo di colori scelto in
// maniera casuale
int randomColor = 5;

void setup() {
  pinMode(pinRosso, OUTPUT);
  pinMode(pinVerde, OUTPUT);
  pinMode(pinBlu, OUTPUT);
}

void loop() {

  // --- accensione solo bianco alla massima luminosità ---

  /*
  analogWrite(pinRosso, 255);
   analogWrite(pinRossoDue, 255);
   analogWrite(pinVerde, 255);
   analogWrite(pinVerdeDue, 255);
   analogWrite(pinBlu, 255);
   analogWrite(pinBluDue, 255);
   */

  // ------------------------------------------------------   

  /*
// --- variazione luminosità bianco ---
   
   variazioneBianco();
   
   // ------------------------------------------------------
   */

  // --- casuale nella scelta del colore ---

  casuale();

  // ------------------------------------------------------ 

  /*
// --- variazione continua colori incluso il bianco ---
   
   variazioneContinua();
   
   // ------------------------------------------------------
   */

}

// funzioni esterne per la variazione continua del colore

// -- casuale

void casuale() {
  int sceltaSequenza=random(randomColor);
  switch (sceltaSequenza) {
  case 0:
    variazioneBianco(limiteBianco, velocitaFadeBianco, attesaFinaleBianco);
    break;
  case 1: 
    variazioneRosso(limiteRosso, velocitaFadeRosso, attesaFinaleRosso);
    break;
  case 2:
    variazioneVerde(limiteVerde, velocitaFadeVerde, attesaFinaleVerde);
    break;
  case 3:
    variazioneBlu(limiteBlu, velocitaFadeBlu, attesaFinaleBlu);
    break;
  case 4:
    variazioneContinua(limiteContinuo, velocitaFadeContinuo, attesaFinaleContinuo);
    break;
  default:
    {
      // nulla
    }
  }
}

// --- variazione contina del colore

void variazioneContinua(int limiteContinuo, int velocitaFadeContinuo, int attesaFinaleContinuo) {
  int rosso, verde, blu;
  // fade da blu a viola
  for (rosso = 0; rosso < limiteContinuo; rosso++) {      analogWrite(pinRosso, rosso);     delay(velocitaFadeContinuo);   }    // fade da viola a rosso   for (blu = limiteContinuo; blu > 0; blu--) { 
    analogWrite(pinBlu, blu);
    delay(velocitaFadeContinuo);
  } 
  // fade da rosso a giallo
  for (verde = 0; verde < limiteContinuo; verde++) {      analogWrite(pinVerde, verde);     delay(velocitaFadeContinuo);   }    // fade da giallo a verde   for (rosso = limiteContinuo; rosso > 0; rosso--) { 
    analogWrite(pinRosso, rosso);
    delay(velocitaFadeContinuo);
  } 
  // fade da verde a bianco
  for (blu = 0; blu < limiteContinuo; blu++) {      analogWrite(pinBlu, blu);     delay(velocitaFadeContinuo);   }    // fade da bianco a blu   for (verde = limiteContinuo; verde > 0; verde--) { 
    analogWrite(pinVerde, verde);
    delay(velocitaFadeContinuo);
  }
}

// --- variazione intensità luminosa del bianco ---

void variazioneBianco(int limiteBianco, int velocitaFadeBianco, int attesaFinaleBianco) {

  for (int fade = 0; fade < limiteBianco; fade++) {     analogWrite(pinRosso, fade);     analogWrite(pinVerde, fade);     analogWrite(pinBlu, fade);     delay(velocitaFadeBianco);   }   for (int fade = limiteRosso; fade >= 0; fade--) {
    analogWrite(pinRosso, fade);
    analogWrite(pinVerde, fade);
    analogWrite(pinBlu, fade); 
    delay(velocitaFadeBianco);
    delay(attesaFinaleBianco);
  }
}

// --- variazione luminosità del rosso

void variazioneRosso(int limiteRosso, int velocitaFadeRosso, int attesaFinaleRosso) {

  analogWrite(pinVerde, 0);
  analogWrite(pinBlu, 0);

  for (int fade = 0; fade < limiteRosso; fade++) {     analogWrite(pinRosso, fade);     delay(velocitaFadeRosso);   }   for (int fade = limiteRosso; fade >= 0; fade--) {
    analogWrite(pinRosso, fade);
    delay(velocitaFadeRosso);
    delay(attesaFinaleRosso);
  }
}

// --- variazione luminosità del verde

void variazioneVerde(int limiteVerde, int velocitaFadeVerde, int attesaFinaleVerde) {

  analogWrite(pinRosso, 0);
  analogWrite(pinBlu, 0);

  for (int fade = 0; fade < limiteVerde; fade++) {     analogWrite(pinVerde, fade);     delay(velocitaFadeVerde);   }   for (int fade = limiteVerde; fade >= 0; fade--) {
    analogWrite(pinVerde, fade);
    delay(velocitaFadeVerde);
    delay(attesaFinaleVerde);
  }
}

// --- variazione luminosità del blu

void variazioneBlu(int limiteBlu, int velocitaBlu, int attesaFinaleBlu) {

  analogWrite(pinRosso, 0);
  analogWrite(pinVerde, 0);

  for (int fade = 0; fade < limiteBlu; fade++) {     analogWrite(pinBlu, fade);     delay(velocitaFadeBlu);   }   for (int fade = limiteBlu; fade >= 0; fade--) {
    analogWrite(pinBlu, fade);
    delay(velocitaFadeBlu);
    delay(attesaFinaleBlu);
  }
}

Arduino – lezione 09: uso di LED RGB

Mi viene continuamente richiesto da molti lettori di questo blog di inserire le lezioni che svolgo a scuola con i miei studenti quindi dopo questa tirata d’orecchie che mi viene fatta 🙂 spessissimo riprendo questa attività.

Per dare ordine al percorso di apprendimento, riprendo i contenuti sviluppati nelle mie slide di dominio pubblico e quanto già scritto in una mia precedente attività pratica svolta con gli studenti: Arduino: effetti luminosi per rendere attraente la lezione

Agendo in questo modo i miei colleghi, che desiderano implementare una didattica in cui viene utilizzo Arduino, si troveranno una sequenza ordinata di lezioni dove gli argomenti e gli esercizi sono scelti per sviluppare ed approfondire aspetti particolari della programmazione, quindi perdonate le ripetizioni (fisime da Prof. bacchettone), ma l’ordine è fondamentale  se si desidera spiegare e quindi faccio ordine 🙂

Parliamo dei LED RGB, uno dei componenti che suscita negli studenti sempre molto interesse, soprattutto perché si presta a molteplici attività creative i LED RGB.

Quanto scritto è ripreso dalle mie slide che sono di dominio pubblico a queste aggiungerò ulteriori esercizi.

I led RGB sono led capaci di produrre 3 differenti lunghezze d’onda:

  • Rosso (R, red)
  • Verde (G, green)
  • Blu (B, blue)

arduino-led-rgb-01

Posseggono 4 terminali e si possono presentare in due tipi di configurazione:

  • 1 anodo e 3 catodi (RGB ad anodo comune)
  • 3 anodi e 1 catodo (RGB a catodo comune)

La mescolanza dei tre colori dà luogo ad una luce di un determinato colore che dipende dall’intensità di ciascuno dei tre colori originari (si veda la composizione RGB) Continua a leggere

Due chiacchere su Arduino Esplora

arduino-esplora
Mettendo ordine tra la mia library di sketch ho ritrovato alcune bozze di tutorial per Arduino Esplora che avevo incominciato a scrive nel mese di novembre durante il viaggio di rientro in treno da Verona (JobOrienta). Condivido con voi quanto da me velocemente elaborato, sperando che possa essere utile anche ad altri.
L’attività di creazione dei tutorial incomincia ovviamente dagli esempi resi disponibili da Arduino e quello che vi allego e lo sketch per il rilievo della temperatura e la scrittura sul TFT.
Ho aggiunto alla soluzione dell’esempio standard modifiche alla modalità di visualizzazione su TFT, allarme nel caso di superamento di una temperatura di soglia, variazione di colore del led rgb e avvisi sonori.
Poiché lo sketch è destinato agli studenti, all’interno di esso, in modalità di commento trovate le spiegazioni delle funzioni di libreria in cui metto in evidenza (anche in maniera ripetuta) funzionalità, parametri e valori restituiti.
Vi allego inoltre una versione dello stesso sketch con meno commenti in modo che per i più esperti sia possibile vedere la struttura generale del codice.
Lo sketch non è stato ottimizzato e nasce come primo esempio su cui gli studenti dovranno poi effettuare modifiche e miglioramenti.

/*

 Rilevatore di temperatura con Esplora TFT - V03
 
 Questo esempio è per il TFT collegato ad Arduino Esplora.
 
 Questo sketch e tratto dal tutorial disponibile su sito Arduino
 
 la cui prima versione è stata creata il 15 aprile 2013 da Scott Fitzgerald
 la potete trovare al seguente indirizzo
 
 http://arduino.cc/en/Tutorial/EsploraTFTTemp
 
 modified 23 November 2013
 by Michele Maffucci
 https://www.maffucci.it
 
 La variante proposta permette di segnalare un allarme
 se viene superata una temperatura di soglia fissata dall'utente,
 inoltre a titolo didattico sono stati aggiunti commenti di spiegazione
 alle funzioni utilizzate.
 
 */

// inclusione delle librerie necessarie per
// il funzionamento di Esplora, del TFT

#include #include <Esplora.h>  
#include <TFT.h>
#include <SPI.h>

char tempPrintout[3];  // array in cui memorizzare i valori di temperatura in gradi C
char tempPrintoutF[3]; // array in cui memorizzare i valori di temperatura in gradi F

// temperatura di allarme
const int maxTemp = 22;

void setup() {

  // begin()
  // Inizializzazione dell'LCD
  // istanza della classe TFT quando si usa la scheda Esplora.
  // Se si usa il display deve essere presente.

  // parametri
  // nessuno

  // restituisce
  // nulla

  // EsploraTFT.background(0,0,0);
  // Cancella lo schermo con uno sfondo nero

  EsploraTFT.begin();

  //--

  // Cancella tutto quello che attualmente visualizzata sullo schermo LCD
  // con il colore indicato. Può essere utilizzato nel loop() per cancellare lo schermo.
  // La funzione background() accetta valori a 8 bit per ognuno dei canali rosso, verde e blu
  // però lo schermo non visualizza con questa fedeltà.
  // I valori di rosso e blu sono scalati a 5 bit e il verde a 6 bit.

  // sintassi
  // screen.background(red, green, blue);

  // parametri
  // red: int da 0 a 255
  // green: int da 0 a 255
  // blu: int da 0 a 255

  // restituisce
  // nulla

  EsploraTFT.background(0,0,0);

  //---

  // stroke()
  // La funzione stroke() accetta valori a 8 bit per ognuno dei canali rosso, verde e blu
  // però lo schermo non visualizza con questa fedeltà.
  // I valori di rosso e blu sono scalati a 5 bit e il verde a 6 bit.

  // sintassi
  // screen.stroke(red, green, blue);

  // parametri
  // red: int da 0 a 255
  // green: int da 0 a 255
  // blu: int da 0 a 255

  // restituisce
  // nulla

  // EsploraTFT.stroke(255,0,0);
  // imposta il colore delle line e delle forme a rosso

  EsploraTFT.stroke(255,0,0);

  //---

  // setTextSize();
  // Imposta la dimensione del testo che segue
  // La dimensione di default è 1.
  // Ogni aumento di dimensione di una unità corrisponde ad un aumento di 10 pixel.
  // Quindi dimensione 1 = 10 pixel, dimensione 2 = 20 pixel e così via.

  // sintassi
  // screen.setTextSize(size);

  // parametri
  // size: intero da 1 a 5

  // restituisce
  // nulla

  // EsploraTFT.setTextSize(2);
  // imposta la dimensione del testo a 2 (20 px)

  EsploraTFT.setTextSize(2);

  // il testo viene posizionato in alto a sinistra dello schermo
  // il testo rimane permanente sullo schermo
  // la prima riga alle coordinate (0,0)
  // la seconda riga alle coordinate (0,20)

  //---

  // .text();

  // sintassi
  // screen.text(text, xPos, yPos);

  // parametri
  // text : array di tipo char in cui viene memorizzato il testo da visualizzare sul display
  // xPos : variabile int, coordinata x del testo da scrivere
  // yPos : variabile int, coordinata y del testo da scrivere

  // restituisce
  // nulla

  // scrive il testo tra virgolette alle coordinate (0, 0)
  // scrive il testo tra virgolette alle coordinate (0, 20)

  EsploraTFT.text("Gradi\n ",0,0);
  EsploraTFT.text("centigradi:\n ",0,20);

  // il testo che segue, all'interno del loop, vine impostato a 5 (50 px)
  EsploraTFT.setTextSize(5);
}

void loop() {

  // viene letta la temperatura in Celcius e memorizzata come stringa
  // il metodo readTemperature permette di restituire la temperatura in gradi Celsius
  // oppure in gradi Faherenheit, dipende dal parametro che viene passato, nell'esempio
  // DEGREES_C gradi centigradi. L'intervallo in gradi oscilla da -40 °C a 150 °C

  // readTemperature()
  // Legge la temperatura ambiente rilevata dal sensore su Esplora
  // e in funzione del parametro passato restituisce il valore
  // in gradi Celsius che Fahrenheit

  // parametri
  // scale: la scala scelta per l'output.
  // può asumere i valori: DEGREES_C e DEGREES_F

  // restituisce
  // un valore intero che rappresenta la temperatura in gradi Celsius o Fahrenheit.
  // L'intervallo di temperatura in gradi Celsius è da -40°C a 150°C
  // L'intervallo di temperatura in gradi Fahrenheit è da -40°F a 302°F.

  String temperature = String(Esplora.readTemperature(DEGREES_C));
  String temperatureF = String(Esplora.readTemperature(DEGREES_F));

  //--

  // toCharArray();
  // Copia la stringa di caratteri nel buffer

  // sintassi
  // string.toCharArray(buf, len)

  // parametri
  // string: variabile di tipo string
  // buf: il buffer dove copiare la stringa di caratteri (char [])
  // len: la dimensione del buffer (unsigned int)

  // converte la stringa in array di caratteri

  temperature.toCharArray(tempPrintout, 3);
  temperatureF.toCharArray(tempPrintoutF, 3);

  controlTemp();

}

void controlTemp(){

  // controlliamo se la temperatura è maggiore del valore fissato maxTemp
  if (Esplora.readTemperature(DEGREES_C)>maxTemp){

    // imposta il colore del testo a bianco
    EsploraTFT.stroke(255,0,0);


    // scrive la temperatura in gradi Celsius nelle linee sottostante alle coordinate indicate
    EsploraTFT.setTextSize(5);
    EsploraTFT.text(tempPrintout, 0, 50);

    // scrive i caratteri "." e "C" alle coordinate indicate
    EsploraTFT.text(".", 55, 25);
    EsploraTFT.text("C", 80, 50);

    // scrive la temperatura in gradi Fahrenheit nelle linee sottostante alle coordinate indicate
    EsploraTFT.setTextSize(1);
    EsploraTFT.text(tempPrintoutF, 110, 78);

    // scrive i caratteri "." e "F" alle coordinate indicate
    EsploraTFT.text(".", 121, 73);
    EsploraTFT.text("F", 126, 78);

    // imposta il testo a 2
    EsploraTFT.setTextSize(2);
    // imposta il colore del testo
    EsploraTFT.stroke(255,255,0);

    // scrive il testo sottostante alle coordinate indicate
    EsploraTFT.text("Attenzione:\n ",0,90);
    EsploraTFT.text("troppo caldo!:\n ",0,110);

    // funzione che consente di effettuare il blink del led sulla scheda Esplora 
    blinkLedOn();

    // tone()
    // La funzione genera un'onda quadra di frequenza e durata stabilita dal buzzer di Esplora
    // La durata è espressa in milliseconds, se non è specificata nessuna durata l'emissione
    // del tono prosegue fino a quando non viene incontrata una finzione Esplora.noTone().
    // Attenzione che l'uso di tone() interferisce con il fading del red rosso.

    // sintassi
    // Esplora.tone(frequency, duration) 

    // parametri
    // frequency: un unsigned int che rappresenta la frequenza espressa in hertz 
    // duration: un unsigned long che rappresenta la durata in millisecondi (ozionale) del tono

    // emissione di un tono di allarme. Nota LA per 1 secondo
    Esplora.tone(440, 1000);

    // ripristina il testo a 5 per il prossimo ciclo di controllo
    // EsploraTFT.setTextSize(5);

    // persistenza del messaggio per 1 secondo
    // prima che venga effettuato il successivo controllo

    delay(1000);

    // cancella il testo prima di avviare il successivo loop
    EsploraTFT.stroke(0,0,0);

    // imposta il testo ad una dimensione di 2 cioè 20 px
    EsploraTFT.setTextSize(2);

    // scrive il testo alle coordinate indicate
    EsploraTFT.text("Attenzione:\n ",0,90);
    EsploraTFT.text("troppo caldo!:\n ",0,110);

    // imposta il testo ad una dimensione di 5 cioè 50 px
    EsploraTFT.setTextSize(5);

    // stampa il valore della temperatura in gradi Celsius alle coordinate indicate
    EsploraTFT.text(tempPrintout, 0, 50);

    // imposta il testo ad una dimensione di 1 cioè 10 px
    EsploraTFT.setTextSize(1);

    // stampa il valore della temperatura in gradi Fahrenheit alle coordinate indicate
    EsploraTFT.text(tempPrintoutF, 110, 78);

  }
  else{
    // nel caso in cui la temperatura è al di sotto dei 22 gradi Celsius
    // viene impostato il colore di linee e forme a bianco

    // spegne LED esterno
    blinkLedOff();

    // imposta il colore del testo a bianco
    EsploraTFT.stroke(255,255,255);

    // scrive la temperatura in gradi Celsius nelle linee sottostante alle coordinate indicate

    // imposta il testo ad una dimensione di 5 cioè 50 px
    EsploraTFT.setTextSize(5);

    // stampa il valore della temperatura in gradi Celsius alle coordinate indicate
    EsploraTFT.text(tempPrintout, 0, 50);

    // scrive i caratteri "." e "C" alle coordinate indicate
    EsploraTFT.text(".", 55, 25);
    EsploraTFT.text("C", 80, 50);

    // imposta il testo ad una dimensione di 1 cioè 10 px
    EsploraTFT.setTextSize(1);

    // stampa il valore della temperatura in gradi Fahrenheit alle coordinate indicate
    EsploraTFT.text(tempPrintoutF, 110, 78);

    // scrive i caratteri "." e "F" alle coordinate indicate
    EsploraTFT.text(".", 121, 73);
    EsploraTFT.text("F", 126, 78);

    delay(1000);

    // cancella il testo prima di avviare il successivo loop
    EsploraTFT.stroke(0,0,0);

    // imposta il testo ad una dimensione di 2 cioè 20 px
    EsploraTFT.setTextSize(2);

    // scrive i caratteri "Attenzione:" (con ritorno a capo) e "troppo caldo!:" (con ritorno a capo) alle coordinate indicate
    EsploraTFT.text("Attenzione:\n ",0,90);
    EsploraTFT.text("troppo caldo!:\n ",0,110);

    // imposta il testo ad una dimensione di 5 cioè 50 px
    EsploraTFT.setTextSize(5);

    // stampa il valore della temperatura in gradi Celsius alle coordinate indicate
    EsploraTFT.text(tempPrintout, 0, 50);

    // imposta il testo ad una dimensione di 1 cioè 10 px
    EsploraTFT.setTextSize(1);

    // stampa il valore della temperatura in gradi Fahrenheit alle coordinate indicate
    EsploraTFT.text(tempPrintoutF, 110, 78);
  }
}

// funzione che permette di far lampeggiare in diversi colori il led di Esplora
void blinkLedOn(){

  // writeRGB()
  // Consente di controllare la luminosità di un determinato colore del led rgb di Esplora.

  // sintassi
  // Esplora.writeRGB(red, green, blue)

  // parametri
  // red, variabile int imposta la luminosità del rosso. Intervallo da 0 a 255.
  // green, variabile int imposta la luminosità del verde. Intervallo da 0 a 255.
  // blue, variabile int imposta la luminosità del blu. Intervallo da 0 a 255.

  // restituisce
  // nulla

  Esplora.writeRGB(255,0,0);    // LED rosso
  delay(1000);                  // attesa di 1 sec
  Esplora.writeRGB(0,255,0);    // LED verde
  delay(1000);                  // attesa di 1 sec
  Esplora.writeRGB(0,0,255);    // LED blu
  delay(1000);                  // attesa di 1 sec
  Esplora.writeRGB(255,255,0);  // LED giallo
  delay(1000);                  // attesa di 1 sec
  Esplora.writeRGB(0,255,255);  // LED ciano
  delay(1000);                  // attesa di 1 sec
  Esplora.writeRGB(255,0,255);  // LED magenta
  delay(1000);                  // attesa di 1 sec
  Esplora.writeRGB(255,255,255);// LED bianco
  delay(1000);                  // attesa di 1 sec
}

void blinkLedOff(){
  Esplora.writeRGB(0,0,0);    // spegne il LED
}

Questa la versione con meno commenti:
Continua a leggere

Arduino: effetti luminosi per rendere attraente la lezione

Ormai è da tempo che svolgo i mie corsi su Arduino e gli allievi stanno diventando sempre più esigenti. Mi accorgo che andando avanti con le lezioni, gli allievi hanno l’esigenza, legittime, di realizzare esperienze di laboratorio sempre più attinenti al mondo reale che loro conoscono. Qualche anno fa era sufficiente mostrare come era semplice variare il colore di un diodo led RGB per avere interesse ed attenzione duratura, ciò mi permetteva di conseguenza di dettagliare alcuni aspetti di programmazione che se non spiegati con Arduino sarebbero risultati più difficili da comprendere, ma ora per mantenere lo stesso livello di attenzione è necessario aggiungere altri elementi di sensibilizzazione.

Maggiori pretese e quindi fin dalle prime lezioni si vuole “la sorpresa tecnologica”…

mamma mia quanto è faticoso fare l’insegnante!

Sono in quel periodo del corso in cui si accendono il led con Arduino in tutte le maniere possibili, dal blink al fade, in sequenza e in molti altri modi, ma alla lunga, mi rendo conto, la cosa può diventare un po’ “noiosetta”, vorrei evitare il più possibile l’effetto “sbadiglio” 🙂 e quindi ho pensato di modificare le prime esperienze con qualcosa di più coreografico.

Tutto nasce da alcune idee che ho sulla realizzazione di una struttura semplificata (ad incastro) per la realizzazione di un kit robotico basato su Arduino da usare a scuola e da realizzare con materiali di basso costo di facile reperibilità, sto costruendo alcuni prototipi usando il plexiglass.

E proprio mentre manipolavo il plexiglass ho avuto l’idea di utilizzare questo materiale per nuove esperienze che fanno uso di led.

Ho voluto condividere questa bozza di lezione con voi in modo che se vorrete potrete darmi suggerimenti o alternative che potranno essere in futuro sfruttate a scuola.

Tutti sapete che quando la luce passa attraverso due materiali diversi, come tra l’aria e l’acqua oppure tra l’aria e la plastica, subisce rifrazione, effetto tipico che potete notare quando ad esempio mettete una cannuccia in un bicchiere d’acqua, si nota che la cannuccia nell’acqua sembra piegata.
Sfruttiamo questo fenomeno per far cambiare direzione alla luce che attraversa uno strato di plexiglass e la variazione di percorso della luce viene realizzata incidendo (graffiando) la superficie di plastica, così facendo i raggi luminosi prodotti da diodi led che colpiscono la zona incisa si rifletteranno (cambiano direzione) provocando un effetto visivo molto bello.

Poiché siamo in periodo natalizio l’idea potrebbe essere quella di realizzare una piccola insegna su cui scrivere “Buone Feste” facendo variare il suo colore in maniera ciclica.

Scopo dell’esperienza:

reciclando materiali di uso comune reperibili a scuola, realizzare un’insegna luminosa che auguri “Buone Feste” ai visitatori della scuola.
Tempo di realizzazione 3 ore (max).

Materiali:

  • plexiglass (misure a piacere nel mio caso inferiori alla lunghezza massima di una breadboard)
  • piccolo trapano con punta per incisione
  • breadboard
  • Arduino UNO
  • 2 diodi RGB (nel mio caso ad anodo comune)
  • 4 resistenze da 82 ohm
  • 2 resistenze da 150 ohm
  • porta diodi (per evitare la saldatura diretta su millefori dei LED)
  • millefori
  • mammut (usati come supporto a scorrimento – vedi foto)
  • pezzi metallici per blocco insegna (ho usato delle punte da saldatore)

Vi state chiedendo perché ho usato i mammut e le punte da saldatore?
Perché nel magazzino della scuola ho trovato una scorta infinita e quindi mi sembrava uno spreco non usarli 🙂

Continua a leggere