Buongiorno a tutti,
tratto automazione industriale da un pò di tempo ma ultimamente ho deciso di dedicarmi alla programmazione su Arduino. Dato che questo è il mio primo sketch completo mi piacerebbe avere dei suggerimenti per migliorare il codice oppure dei consigli su come renderlo più efficiente.
Questo progetto è un'integrazione standart per qualsiasi altro progetto che necessiti di un potenziometro e di una visualizzazione dinamica della potenza applicata da esso, con la differenza che i Led essendo collegati su delle uscite PWM variano la loro intensità.
Il codice è il seguente:
/*
Autore: Andrea Verardi,
Data: 16/08/2017,
Titolo: Visualizzazione Potenza su 7 LED
Progetto per Arduino UNO, modificabile per tutti i modelli.
Descrizione: Codice da integrare per la visualizzazione dinamica
della potenza applicata da un potenziometro 10kOhm su 6 LED
collegati su PWM. LON indica "Out of Range" se il valore è 0 oppure
"Potenza Massima" se il valore raggiunge il fondoscala.
*/
const int Pot = A0; // Ingresso Potenziometro Modificabile
const int L1 = 3; // Uscite PWM Modificabili in base al Modello
const int L2 = 5;
const int L3 = 6;
const int L4 = 9;
const int L5 = 10;
const int L6 = 11;
const int LON = 12;
int PageON = 0; //PageON è il debug in Locale
void setup()
{
pinMode(Pot, INPUT); //Setup dei Pin
pinMode(L1, OUTPUT);
pinMode(L2, OUTPUT);
pinMode(L3, OUTPUT);
pinMode(L4, OUTPUT);
pinMode(L5, OUTPUT);
pinMode(L6, OUTPUT);
pinMode(LON, OUTPUT);
Serial.begin(9600); //Setup Monitor
Serial.println("*Sistema Inizializzato*"); //Messaggio di Monitor ON
}
void loop()
{
int PotValue = map(analogRead(Pot), 0, 1023, 0, 1020);//Mappatura Variabile del Potenziometro per renderla divisibile per 6
int L1A; //Stabilisco le Variabili Rimappate in base all' if
int L2A;
int L3A;
int L4A;
int L5A;
int L6A;
if (PotValue <= 0){ //Se il valore non è compreso nella scala da OUT OF RANGE
PageON = 8;
}
if ((PotValue <= 170)&&(PotValue != 0)) { //L1 ON
L1A = map(PotValue, 0, 170, 0, 255);
PageON = 1;
analogWrite(L1, L1A);
digitalWrite(L2, LOW);
digitalWrite(L3, LOW);
digitalWrite(L4, LOW);
digitalWrite(L5, LOW);
digitalWrite(L6, LOW);
digitalWrite(LON, LOW);
}
if ((PotValue > 170)&&(PotValue <=340)) { //L2 ON
L2A = map(PotValue, 171, 340, 0, 255);
PageON = 2;
analogWrite(L2, L2A);
digitalWrite(L1, HIGH);
digitalWrite(L3, LOW);
digitalWrite(L4, LOW);
digitalWrite(L5, LOW);
digitalWrite(L6, LOW);
digitalWrite(LON, LOW);
}
if ((PotValue > 340)&&(PotValue <=510)) { //L3 ON
L3A = map(PotValue, 341, 510, 0, 255);
PageON = 3;
analogWrite(L3, L3A);
digitalWrite(L1, HIGH);
digitalWrite(L2, HIGH);
digitalWrite(L4, LOW);
digitalWrite(L5, LOW);
digitalWrite(L6, LOW);
digitalWrite(LON, LOW);
}
if ((PotValue > 510)&&(PotValue <=680)) { //L4 ON
L4A = map(PotValue, 511, 680, 0, 255);
PageON = 4;
analogWrite(L4, L4A);
digitalWrite(L1, HIGH);
digitalWrite(L2, HIGH);
digitalWrite(L3, HIGH);
digitalWrite(L5, LOW);
digitalWrite(L6, LOW);
digitalWrite(LON, LOW);
}
if ((PotValue > 681)&&(PotValue <=850)) { //L5 ON
L5A = map(PotValue, 681, 850, 0, 255);
PageON = 5;
analogWrite(L5, L5A);
digitalWrite(L1, HIGH);
digitalWrite(L2, HIGH);
digitalWrite(L3, HIGH);
digitalWrite(L4, HIGH);
digitalWrite(L6, LOW);
digitalWrite(LON, LOW);
}
if ((PotValue > 851)&&(PotValue < 1020)) { //L6 ON
L6A = map(PotValue, 850, 1020, 0, 255);
PageON = 6;
analogWrite(L6, L6A);
digitalWrite(L1, HIGH);
digitalWrite(L2, HIGH);
digitalWrite(L3, HIGH);
digitalWrite(L4, HIGH);
digitalWrite(L5, HIGH);
digitalWrite(LON, LOW);
}
if (PotValue >= 1020){ //Potenza Massima
PageON = 7;
digitalWrite(LON, HIGH);
digitalWrite(L1, HIGH);
digitalWrite(L2, HIGH);
digitalWrite(L3, HIGH);
digitalWrite(L4, HIGH);
digitalWrite(L5, HIGH);
digitalWrite(L6, HIGH);
}
/*
FUNZIONE DI DEBUG:
Cancellare le seguenti stringe se non utilizzate
e rimpiazzare il } alla fine della stringa riportata
qua sopra. Il tempo di reazione dei LED è influenzato dallo Switch
per rendere il debug più efficiente.
*/
switch (PageON){
case 0 :
Serial.println("N/D");
delay(2000);
break;
case 1 :
Serial.print("L1: ");
Serial.print(L1A, DEC);
Serial.print(" Valore Letto:");
Serial.println(PotValue, DEC);
digitalWrite(LON, LOW);
delay(2000);
break;
case 2 :
Serial.print("L1: ");
Serial.println("ON ");
Serial.print("L2: ");
Serial.print(L2A, DEC);
Serial.print(" Valore Letto:");
Serial.println(PotValue, DEC);
delay(2000);
break;
case 3 :
Serial.print("L1: ");
Serial.println("ON ");
Serial.print("L2: ");
Serial.println("ON ");
Serial.print("L3: ");
Serial.print(L3A, DEC);
Serial.print(" Valore Letto:");
Serial.println(PotValue, DEC);
delay(2000);
break;
case 4 :
Serial.print("L1: ");
Serial.println("ON ");
Serial.print("L2: ");
Serial.println("ON ");
Serial.print("L3: ");
Serial.println("ON ");
Serial.print("L4: ");
Serial.print(L4A, DEC);
Serial.print(" Valore Letto:");
Serial.println(PotValue, DEC);
delay(2000);
break;
case 5 :
Serial.print("L1: ");
Serial.println("ON ");
Serial.print("L2: ");
Serial.println("ON ");
Serial.print("L3: ");
Serial.println("ON ");
Serial.print("L4: ");
Serial.println("ON ");
Serial.print("L5: ");
Serial.print(L5A, DEC);
Serial.print(" Valore Letto:");
Serial.println(PotValue, DEC);
delay(2000);
break;
case 6 :
Serial.print("L1: ");
Serial.println("ON ");
Serial.print("L2: ");
Serial.println("ON ");
Serial.print("L3: ");
Serial.println("ON ");
Serial.print("L4: ");
Serial.println("ON ");
Serial.print("L5: ");
Serial.println("ON ");
Serial.print("L6: ");
Serial.print(L6A, DEC);
Serial.print(" Valore Letto:");
Serial.println(PotValue, DEC);
delay(2000);
break;
case 7 :
Serial.println("Potenza Massima");
delay(2000);
break;
case 8 :
digitalWrite(L1, LOW);
digitalWrite(L2, LOW);
digitalWrite(L3, LOW);
digitalWrite(L4, LOW);
digitalWrite(L5, LOW);
digitalWrite(L6, LOW);
digitalWrite(LON, HIGH);
Serial.println("Out of Range");
delay(2000);
break;
}
}