Utente:Daniel Gostoli/Arduino
Incremento e decremento di un numero in un display a 7 segmenti in base a tasto
modificaIl progetto che segue è pensato per la realizzazione di un conta-click, comandato da due pulsanti (uno per incrementare e uno per decrementare il numero), in grado di mostrare su uno schermo LCD a sette segmenti tutti i numeri naturali compresi tra 0 e 9.
Descrizione del progetto
modificaIl sistema è composto da:
- Pulsanti, hanno il compito di incrementare e decrementare il valore del contatore.
- Display LCD a sette segmenti a catodo comune, mostra i numeri compresi tra 0 e 9 del contatore.
Schema elettrico
modificaSchema di montaggio
modificaSono state implementate due resistenza a ridosso dei pulsanti per limitare la corrente ed evitare di bruciare i pin d'ingresso.
Codice
modificaPer la realizzazione del progetto è stato utilizzato il seguente codice:
int pinA = 2;
int pinB = 3;
int pinC = 4;
int pinD = 5;
int pinE = 6;
int pinF = 7; //definiamo le variabili
int pinG = 8;
int pinButton = 9;
int pinButton2 = 10;
int counter = 0;
int valButtonOld = LOW;
int valButtonOld2 = LOW;
void setup() {
pinMode(pinA, OUTPUT);
pinMode(pinB, OUTPUT);
pinMode(pinC, OUTPUT);
pinMode(pinD, OUTPUT);
pinMode(pinE, OUTPUT); //impostiamo i pin come OUTPUT o INPUT
pinMode(pinF, OUTPUT);
pinMode(pinG, OUTPUT);
pinMode(pinButton, INPUT);
pinMode(pinButton2, INPUT);
digitalWrite(pinA,HIGH);
digitalWrite(pinB,HIGH);
digitalWrite(pinC,HIGH);
digitalWrite(pinD,HIGH); //assegnamo lo stato dei pin
digitalWrite(pinE,HIGH);
digitalWrite(pinF,HIGH);
digitalWrite(pinG,HIGH);
}
void loop() {
int valButton = digitalRead(pinButton);
if(valButton==HIGH&&valButtonOld==LOW) //il pulsante è stato premuto
{
counter=counter+1; //incremento del contatore
}
valButtonOld=valButton; //aggiornamento del valore della variabile
int valButton2 = digitalRead(pinButton2);
if(valButton2==HIGH&&valButtonOld2==LOW) //il pulsante 2 è stato premuto
{
counter=counter-1; //decremento del contatore
}
valButtonOld2=valButton2; //aggiornamento del valore della variabile
if (counter==0)
{
digitalWrite(pinA,HIGH);
digitalWrite(pinB,HIGH);
digitalWrite(pinC,HIGH);
digitalWrite(pinD,HIGH); //scrittura numero 0
digitalWrite(pinE,HIGH);
digitalWrite(pinF,HIGH);
digitalWrite(pinG,LOW);
}
if (counter==1)
{
digitalWrite(pinA,LOW);
digitalWrite(pinB,HIGH);
digitalWrite(pinC,HIGH);
digitalWrite(pinD,LOW); //scrittura numero 1
digitalWrite(pinE,LOW);
digitalWrite(pinF,LOW);
digitalWrite(pinG,LOW);
}
if (counter==2)
{
digitalWrite(pinA,HIGH);
digitalWrite(pinB,HIGH);
digitalWrite(pinC,LOW);
digitalWrite(pinD,HIGH); //scrittura numero 2
digitalWrite(pinE,HIGH);
digitalWrite(pinF,LOW);
digitalWrite(pinG,HIGH);
}
if (counter==3)
{
digitalWrite(pinA,HIGH);
digitalWrite(pinB,HIGH);
digitalWrite(pinC,HIGH);
digitalWrite(pinD,HIGH); //scrittura numero 3
digitalWrite(pinE,LOW);
digitalWrite(pinF,LOW);
digitalWrite(pinG,HIGH);
}
if (counter==4)
{
digitalWrite(pinA,LOW);
digitalWrite(pinB,HIGH);
digitalWrite(pinC,HIGH);
digitalWrite(pinD,LOW); //scrittura numero 4
digitalWrite(pinE,LOW);
digitalWrite(pinF,HIGH);
digitalWrite(pinG,HIGH);
}
if (counter==5)
{
digitalWrite(pinA,HIGH);
digitalWrite(pinB,LOW);
digitalWrite(pinC,HIGH);
digitalWrite(pinD,HIGH); //scrittura numero 5
digitalWrite(pinE,LOW);
digitalWrite(pinF,HIGH);
digitalWrite(pinG,HIGH);
}
if (counter==6)
{
digitalWrite(pinA,HIGH);
digitalWrite(pinB,LOW);
digitalWrite(pinC,HIGH);
digitalWrite(pinD,HIGH); //scrittura numero 6
digitalWrite(pinE,HIGH);
digitalWrite(pinF,HIGH);
digitalWrite(pinG,HIGH);
}
if (counter==7)
{
digitalWrite(pinA,HIGH);
digitalWrite(pinB,HIGH);
digitalWrite(pinC,HIGH);
digitalWrite(pinD,LOW); //scrittura numero 7
digitalWrite(pinE,LOW);
digitalWrite(pinF,LOW);
digitalWrite(pinG,LOW);
}
if (counter==8)
{
digitalWrite(pinA,HIGH);
digitalWrite(pinB,HIGH);
digitalWrite(pinC,HIGH);
digitalWrite(pinD,HIGH); //scrittura numero 8
digitalWrite(pinE,HIGH);
digitalWrite(pinF,HIGH);
digitalWrite(pinG,HIGH);
}
if (counter==9)
{
digitalWrite(pinA,HIGH);
digitalWrite(pinB,HIGH);
digitalWrite(pinC,HIGH);
digitalWrite(pinD,LOW); //scrittura numero 9
digitalWrite(pinE,LOW);
digitalWrite(pinF,HIGH);
digitalWrite(pinG,HIGH);
}
if (counter==10)
{ //reset del contatore
counter = 0;
}
if (counter==-1)
{ //reset del contatore
counter = 0;
}
}
Conclusioni
modificaIn conclusione, questo progetto funziona come un conta-click: quando si preme il pulsante a destra il numero aumenta mentre se si preme quello a sinistra il numero diminuisce.
Progetto realizzato da Daniel Gostoli.
Motore DC regolabile tramite potenziometro
modificaIl progetto che segue è pensato per la creazione di una ventola, realizzata con un motore DC controllato da un transistor, in grado di azionarsi tramite un pulsante e regolabile attraverso un potenziometro.
Descrizione del progetto
modificaIl sistema è composto da:
- Motore DC, che ruotando fa girare una ventola;
- Transistor NPN;
- Pulsante;, che aziona o ferma il motore;
- Potenziometro, che regola la velocità del motore DC.
Schema elettrico
modificalo schema elettrico del circuito effettuato è il seguente.
Alla scheda di Arduino vengono collegati i componenti utilizzando sia i pin analogici, per il potenziometro, sia i pin pwm, per il motore DC
Schema di montaggio
modificaCodice
modificaPer la realizzazione del progetto è stato utilizzato il seguente codice:
int pinMotore = 3;
int pinPulsante = 4;
int pinPotenziometro = A0;
int bootTime = 300;
Definisco le variabili e i pin dei componenti, più il boot time, ossia la velocità massima del motore alla sua accensione, indipendentemente dal potenziometro.
bool enabled = false;
int lastEnableValue = LOW;
unsigned long startTime = 0;
Creo delle variabili per la lettura dello stato del pulsante, e utilizziamo "unsigned long" per memorizzare il tempo in cui il motore è rimasto acceso.
int velocitàMotore = map(analogRead(pinPotenziometro), 0, 1023, 70, 255);
int enableValue = digitalRead(pinPulsante);
La velocità del motore viene impostata attraverso la lettura del potenziometro. I pin però restutiscono un valore da 0 a 1023, non compatibili con i pin pwm (da 0 a 255) quindi attraverso la funzione map effettuo una conversione proporzionale (70 è il valore minimo sotto il quale il motore smette di girare).
void setup(){
pinMode(pinMotore, OUTPUT);
pinMode(pinPulsante, INPUT);
}
void loop(){
if(enableValue != lastEnableValue && enableValue == HIGH){
if(!enabled){
startTime = millis();
}
enabled = !enabled;
}
Leggo il valore del pulsante, se esso è cambiato ed è uguale a HIGH, impostiamo il tempo attuale nella variabile startTime
lastEnableValue = enableValue;
if(enabled){
if((millis()-startTime) > bootTime){
analogWrite(pinMotore, velocitàMotore);
}else{
analogWrite(pinMotore, 255);
}
}else{
analogWrite(pinMotore, 0);
}
delay(50);
}
Dopo aver aggiornato la variabile che verrà utilizzata nella if successiva, se il motore era acceso, dopo il tempo di accensione, viene letto il valore del potenziometro e si imposta la velocità del motore. Se siamo ancora nella fase inziale impostiamo il valore a 255 indipendentemente dal potenziometro. Se invece viene premuto il pulsante di nuovo impostiamo la velocità a 0.
Conclusioni
modificaIn conclusione, la realizzazione di questo circuito permette, grazie ad un pulsante, l'accensione e lo spegnimento del motore DC; la velocità del motore DC è regolata da un potenziometro, realizzando così una ventola.
Progetto è stato realizzato da Daniel Gostoli e Sasha Fasolo Massoli.