Esempi con TINKERPAD
INPUT/OUTPUT DIGITALE: Esempio PUSHBUTTON+LED
PROBLEMA 1: Costruire un circuito composto da 8 Led. Mediante un pushButton cambiare la combinazione dei led accesi scegliendo tra 2 possibili combinazioni.
Soluzione:
I LED sono oggetti pilotati in corrente ed hanno tensioni
che variano con il colore. I led rossi hanno tensioni variabili da 1,7V ad 1,9V,
led gialli / arancioni 2V, i led verdi 2,1V, i led bianchi e i led blu hanno
tensioni ancora maggiori. Garantita quella tensione, è la corrente a determinane
la luminosità. Tipicamente la corrente raccomandata è di 10-20 mA. La tensione
d’uscita a livello alto delle porte della scheda Arduino UNO è di
5V, quindi per limitare la corrente che attraversa il
LED a 10mA dobbiamo collegargli in serie una resistenza con un valore pari a
R= (5V – Vled)/10mA. Supponiamo di considerare un led rosso (ma
poco cambia in realtà anche per gli altri colori) con una Vled = 1,9V si avrà R
= (5-1.9)/0,01 = 310 Ohm. Per comodità scegliamo una resistenza da 330
Ohm.
Il piedino più lungo oppure quello con la gobbetta rappresenta l'anodo (+) e pertanto va connesso sulla porta a 5V mentre l'altro alla terra (grd)
Per quanto riguarda il pushButton i piedini A e C sono sempre connessi fra loro, così anche i piedini B e D. Quando il pulsante viene premuto tutti i piedini risultano connessi.
.
Immaginando di voler implementare un bottone che accende un led possiamo utilizzare il pushButton con una di queste configurazioni:
Il circuito che ci serve è il seguente (il led blu è stato inserito solo per verificare il corretto funzionamento del pushbutton!):
Codice Sorgente
const byte pushButton = 2; // Pin connesso al PushButton const byte stato1=0b01010101; // 1° combinazione che accende solo i led rossi const byte stato2=0b10101010; // 2° combinazione che accende solo i led verdi int statoattivo; // contiene la combinazione attiva ovvero quella associata ai led attualmente accesi int IsON; // contiene 1 appena premo il pushbutton - evita l'autorepeat nel caso di pressione prolungata del pulsante void setup() // Fase di inizializzazione { IsON=0; statoattivo=-1; // -1 indica uno staso indefinito che corrisponde a tutti i led spenti pinMode(pushButton, INPUT); // Pongo a INPUT il pin del pulsante for (int i=3 ; i<=10 ; i++) // Spengo tutti gli 8 led { pinMode(i, OUTPUT); // Imposto come OUTPUT i pin degli 8 led ... digitalWrite(i,LOW); // ... e poi li spengo } } void loop() // Fase ripetuta { byte b, i; int buttonState = digitalRead(pushButton); // leggo il bottone if ( (buttonState==HIGH) && (IsON==0) ) // se è la prima pressione... { IsON=1; // memorizzo che è la pressione iniziale, evitando i problemi derivanti da una pressione prolungata del bottone if (statoattivo==stato1) // Scambio gli stati statoattivo=stato2; else statoattivo=stato1; for (i=3 ; i<=10 ; i++) // Scorre i led e li accendo o spengo a secondo della combinazione da applicare { b=bitRead(statoattivo,i-3); digitalWrite(i,b); } } else if (buttonState==LOW) // quando rilascio il bottone azzero IsON in modo da gestire correttamente IsON=0; // la successiva pressione del bottone }
Provala sul simulatore cliccando qui
PROBLEMA 2: Costruire un circuito composto da 2 pushButton: uno per incrementare un contatore l'altro per decrementarlo. Ad ogni pressione di uno dei 2 pushbutton nel serial monitor dovrà apparire il valore corrente del contatore.
Soluzioni:
Il circuito che ci serve è il seguente (si osservi come viene impostata la lettura della pressione del pushbutton - filo verde):
Codice Sorgente
const byte pushBtnUP = 2; // pin btn incremento const byte pushBtnDOWN = 3; // pin btn decremento int conta; // Contatore int UpPressed; // Segna che il pulsante è stato premuto evitando gli effetti di una pressione prolungata int DwPressed; // come ad esempio continuare a stampare il numero incrementandolo ad ogni void setup() { // put your setup code here, to run once: conta=0; UpPressed=0; DwPressed=0; Serial.begin(9600); pinMode(pushBtnUP, INPUT); pinMode(pushBtnDOWN, INPUT); } void loop() { int hoschiacciato=0; int buttonState = digitalRead(pushBtnUP); if ((buttonState==HIGH) && !UpPressed) { UpPressed=1; hoschiacciato=1; conta++; } else if (buttonState==LOW) UpPressed=0; buttonState = digitalRead(pushBtnDOWN); if ( (buttonState==HIGH) && !DwPressed) { DwPressed=1; hoschiacciato=1; conta--; } else if (buttonState==LOW) DwPressed=0; if (hoschiacciato==1) Serial.println(conta); }
Provala sul simulatore cliccando qui
PROBLEMA 3: Costruire un circuito che visualizza in sequenza su un 7Segment le cifre in ordine crescente o decrescente a seconda dello stato di un interruttore a scorrimento (slideswitch). Ad esempio se il cursore dell'interruttore è posto a destra il conteggio cresce altrimenti decresce.
Soluzioni:
Il circuito che ci serve è il seguente:
Codice Sorgente
// ---------------------------------------------------------- // Definisco la mappatura tra pin e i segmenti del 7Segment // ---------------------------------------------------------- int segDP = 4; // Quinto PIN del display 7Segment : PIN 7SEGMENT PIN ARDUINO int segC = 5; // Quarto PIN del display 7Segment : int segD = 6; // Secondo PIN del display 7Segment : -9A- -10- int segE = 7; // Primo PIN del display 7Segment : 7F | | 10B 9| |11 int segG = 8; // Sesto PIN del display 7Segment : |-6G-| |--8-| int segF = 9; // Settimo PIN del display 7Segment : 1E | | 4C 7| |5 int segA = 10; // Nono PIN del display 7Segment : -2D- .5DP --6- .4 int segB = 11; // Decimo PIN del display 7Segment static const byte Cifre[] = { // Segmenti: ABCDEFG - mappa del 7-segment B00111111, // 0 "0" AAA B00000110, // 1 "1" F B B01011011, // 2 "2" F B B01001111, // 3 "3" GGG B01100110, // 4 "4" E C B01101101, // 5 "5" E C B01111101, // 6 "6" DDD B00000111, // 7 "7" B01111111, // 8 "8" B01101111 // 9 "9" }; const int slideSwitch =2; byte n; // cifra da visualizzare void ScriviSul7Segment(int c) { digitalWrite(segA,bitRead(Cifre[c],0)); //scrive sul pin 4 il bit 0 del codice puntato da c digitalWrite(segB,bitRead(Cifre[c],1)); //scrive sul pin 5 il bit 1 del codice puntato da c digitalWrite(segC,bitRead(Cifre[c],2)); //scrive sul pin 6 il bit 2 del codice puntato da c digitalWrite(segD,bitRead(Cifre[c],3)); //scrive sul pin 7 il bit 3 del codice puntato da c digitalWrite(segE,bitRead(Cifre[c],4)); //scrive sul pin 8 il bit 4 del codice puntato da c digitalWrite(segF,bitRead(Cifre[c],5)); //scrive sul pin 9 il bit 5 del codice puntato da c digitalWrite(segG,bitRead(Cifre[c],6)); //scrive sul pin 10 il bit 6 del codice puntato da c } void setup() { //assegnamento pin di input e di output pinMode(segA,OUTPUT); pinMode(segB,OUTPUT); pinMode(segC,OUTPUT); pinMode(segD,OUTPUT); pinMode(segE,OUTPUT); pinMode(segF,OUTPUT); pinMode(segG,OUTPUT); pinMode(segDP,OUTPUT); pinMode(slideSwitch,INPUT); // Inizializzazione variabili n=0; } void loop() { if (digitalRead(slideSwitch)==HIGH) // Cursore dell'interruttore è posto a dx n = (n+1) % 10; // incremento il contatore else n =(n==0 ? 9 : n-1); // decremento il contatore ScriviSul7Segment(n); delay(1000); }
Provala sul simulatore cliccando qui
PROBLEMA 4: Costruire un circuito composto da un display LCD 16x2 ed un sensore di temperatura (TMP36 - L'integrato TMP36 è un sensore di temperatura di precisione alimentabile a bassa tensione. Fornisce una tensione di uscita che è linearmente proporzionale alla temperatura in gradi Celsius. Il sensore non richiede nessuna regolazione esterna per fornire precisioni tipiche di ± 1 ° C a +25 ° C e ± 2 ° C nel range compreso tra i -40 ° C e i +125 ° C) che visualizzi la temperatura e la tensione in uscita dal sensore.
Soluzione:
Il circuito che ci serve è il seguente:
Codice Sorgente
/* ----------------------------------------------------------------------------------- Esempio che mostra l'utilizzo del display LCD senza uso del potenziometro. La libreria LiquidCrystal lavora con tutti i display LCD compatibili con il driver Hitachi HD44780 driver (interfaccia a 16/14 pin) Nel mio circuito i pin dell'LCD sono connessi a quelli di Arduino in questo modo: * Pin R/W dell LCD => pin GND * Pin V0 dell LCD => pin GND * Pin RS dell LCD => pin digitale 2 * Pin E dell LCD => pin digitale 3 * Pin D4 dell LCD => pin digitale 4 * Pin D5 dell LCD => pin digitale 5 * Pin D6 dell LCD => pin digitale 6 * Pin D7 dell LCD => pin digitale 7 -------------------------------------------------------------------------------------- */ #include <LiquidCrystal.h> // Libreria per gestire il Display LCD /* -------------------------------------------------------------- Inizializzo la libreria con il comando LiquidCrystal impostando i contatti secondo il circuito che ho costruito: LiquidCrystal(rs, enable, d4, d5, d6, d7) LiquidCrystal(rs, rw, enable, d4, d5, d6, d7) LiquidCrystal(rs, enable, d0, d1, d2, d3, d4, d5, d6, d7) LiquidCrystal(rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7) --------------------------------------------------------------- */ LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Ho usato la 1^ sintassi const int Pin_TMP36 = A0; //variabile lettura sensore void MostraTemperature(float Tlet,float Vlet) { lcd.setCursor(0,0); lcd.print("Celsius :"); lcd.print(Tlet); lcd.setCursor(0,1); lcd.print("Tensione:"); lcd.print(Vlet); } void setup() { // Imposto il nr di colonne e righe del Display lcd.begin(16, 2); lcd.clear(); // Pulisce l'LCD e pone il cursore all'inizio } void loop() { // -------------------------------------- // Legge il valore dalla porta analogica // -------------------------------------- int val_Adc = analogRead(Pin_TMP36); //Converte il valore letto in tensione float voltage = (val_Adc /1024.0) * 5.0; //Converte il valore di tensione in temperatura float temp = (voltage - .5) * 100; MostraTemperature(temp,voltage); delay(20); }
Provala sul simulatore cliccando qui
PROBLEMA 5: Costruire un circuito composto da: un display LCD 16x2, un sensore di temperatura TMP36, 2 push button e un led che accenda il led quando la temperatura raggiunge o supera un valore di soglia che può essere impostato mediante i 2 push button. Il valore di soglia di default è 40°.
Soluzione:
Il circuito che ci serve è il seguente:
Codice Sorgente
/* ----------------------------------------------------------------------------------- Esempio che mostra l'utilizzo del display LCD senza uso del potenziometro. La libreria LiquidCrystal lavora con tutti i display LCD compatibili con il driver Hitachi HD44780 driver (interfaccia a 16/14 pin) Nel mio circuito i pin dell'LCD sono connessi a quelli di Arduino in questo modo: * Pin R/W dell LCD => pin GND * Pin V0 dell LCD => pin GND * Pin RS dell LCD => pin digitale 2 * Pin E dell LCD => pin digitale 3 * Pin D4 dell LCD => pin digitale 4 * Pin D5 dell LCD => pin digitale 5 * Pin D6 dell LCD => pin digitale 6 * Pin D7 dell LCD => pin digitale 7 -------------------------------------------------------------------------------------- */ #include <LiquidCrystal.h> // Libreria per gestire il Display LCD /* -------------------------------------------------------------- Inizializzo la libreria con il comando LiquidCrystal impostando i contatti secondo il circuito che ho costruito: LiquidCrystal(rs, enable, d4, d5, d6, d7) LiquidCrystal(rs, rw, enable, d4, d5, d6, d7) LiquidCrystal(rs, enable, d0, d1, d2, d3, d4, d5, d6, d7) LiquidCrystal(rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7) --------------------------------------------------------------- */ LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Ho usato la 1^ sintassi const int Pin_TMP36 = A0; //variabile lettura sensore temperatura const int PinTp=11; // pin pushbutton di incremento const int PinTs=10; // pin pushbutton di decremento const int Pinledverde=9; // pin LED int soglia; int giuTp,giuTs; void MostraTemperature(float Tlet,int Soglia) { lcd.setCursor(0,0); lcd.print("Celsius:"); lcd.print(Tlet); lcd.print(" "); lcd.setCursor(0,1); lcd.print("Soglia :"); lcd.print(Soglia); lcd.print(" "); } void setup() { // Imposto il nr di colonne e righe del Display lcd.begin(16, 2); lcd.clear(); // Pulisce l'LCD e pone il cursore all'inizio giuTp=0; // imposto che il pulsante di incremento non è mai stato premuto giuTs=0; // imposto che il pulsante di decremento non è mai stato premuto pinMode(Pinledverde,OUTPUT); soglia=40; // valore di default sulla soglia } void loop() { int Tp=digitalRead(PinTp); int Ts=digitalRead(PinTs); //lettura bottone di incremento if (Tp==HIGH && giuTp==0) { //se schiaccio il pulsante di incremento per la prima volta if (soglia<125) soglia++; } if (Tp==HIGH) // segno che il pulsante di incremento è stato premuto giuTp=1; // evitando un incremento continuo del valore di soglia else // se continuo a tenere premuto giuTp=0; //lettura bottone di decremento if (Ts==HIGH && giuTs==0) //schiaccio il pulsante per la prima volta { if (soglia>-40) soglia--; } if (Ts==HIGH) // segno che il pulsante di decremento è stato premuto giuTs=1; // evitando un decremento continuo del valore di soglia else // se continuo a tenere premuto giuTs=0; // -------------------------------------- // Legge il valore dalla porta analogica // -------------------------------------- int val_Adc = analogRead(Pin_TMP36); //Converte il valore letto in tensione float voltage = (val_Adc /1024.0) * 5.0; //Converte il valore di tensione in temperatura float temp = (voltage - .5) * 100; if (temp>=soglia) digitalWrite(Pinledverde,HIGH); else digitalWrite(Pinledverde,LOW); MostraTemperature(temp,soglia); delay(20); }
Provala sul simulatore cliccando qui