Esempi con TINKERPAD

http://www.tinkerpad.com

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