ho ridotto l’array da 38 righe a 5 per poterlo postare:
/*questo programma usa un encoder rotativo per selezionare una voce di menù, e alla pressione del pulsante
invia ad un modulo DDS un set di frequenze a seconda del programma scelto, alla fine del programma memorizza
la voce di menù usata nella EEPROM*/
#include <EEPROM.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <LiquidCrystal.h>
#include <DDS.h> /* descrizione: http://m0xpd.blogspot.com/2014/03/dds-and-duedds-libraries.html
download: https://github.com/m0xpd/DDS */
const int Stop = 3; // Pin Pulsante di stop
const int Buzzer = 2; // Pin Buzzer
const int rs = 7, e = 8, d4 = 9, d5 = 10, d6 = 11, d7 = 12; // costanti pin per display LCD
const int W_CLK = A3, FQ_UD = A2, DATA = A1, RESET = A0; // costanti pin per modulo DDS
LiquidCrystal lcd(rs, e, d4, d5, d6, d7); // assegno i pin al display LCD
DDS dds(W_CLK, FQ_UD, DATA, RESET); // assegno i pin al modulo DDS
//prima riga del menù sul display
char* Menu[] = {"", "Menu1 ", "Menu2 ", "Menu3 ",
"Menu4 ", "Menu5 "
};
//Array contenente i valori di frequenza caricati nella memoria Flash usando PROGMEM
const uint32_t Frequenze[38][10] PROGMEM = {
{555, 827, 919, 1009, 1407, 7767, 16628, 18670, 19566, 28729},
{700, 5690, 7250, 30000, 55540, 93500, 322060, 515700, 689930, 970500},
{152, 442, 751, 797, 1011, 1146, 8146, 20313, 571000, 2596255},
{60, 1330, 5270, 10890, 90000, 379930, 425000, 571000, 829000, 932000},
{727, 1000, 2128, 25000, 30000, 35000, 45000, 50000, 60000, 75000}
};
int freq;
int encoder = EEPROM.read (0); // posizione di start dell'encoder memorizzato nella EEPROM
bool letturaPrec = HIGH; // Variabile lettura encoder
unsigned long startTime; // Variabile inizio conteggio
unsigned long contTempo; // Variabile di conteggio tempo
unsigned long WorkTime = 180000; // Variabile di preset del tempo
unsigned long stampa; // variabile che contiene i valori di frequenza da stampare su lcd
void setup() {
pinMode (W_CLK, OUTPUT);
pinMode (FQ_UD, OUTPUT);
pinMode (DATA, OUTPUT);
pinMode (RESET, OUTPUT);
pinMode (2, OUTPUT);
pinMode (3, INPUT);
pinMode (4, INPUT_PULLUP); // pin DT encoder
pinMode (5, INPUT_PULLUP); // pin CLK encoder
pinMode (6, INPUT_PULLUP); // pin pulsante encoder
lcd.begin(16, 2); // inizializza LCD
dds.init(); // inizializza modulo DDS
dds.trim(125000000); /*opzionale per la taratura fine della frequenza dell'oscillatore
rispetto alla reale frequenza del quarzo. Esempio: (125000017)*/
}
void loop() {
if (digitalRead(4) == LOW || digitalRead(5) == LOW) { // Se l'encoder viene ruotato
lcd.setCursor(0, 1);
lcd.print(" "); // Cancella la seconda riga del display
}
if (digitalRead(6) == HIGH) {
byte n = digitalRead(5); // assegna alla variabile "n" il livello letto dal pin CLK dell'encoder
if ((letturaPrec == HIGH) && (n == LOW)) // rileva rotazione dell'encoder (fronte discesa CLK)
{
if (digitalRead(4) == HIGH) { // se il pin DT è alto direzione decremento
encoder--; // decrementa il valore di encoder
if (encoder == 0) encoder = 38; // decrementa circolarmente da 38 a 1
} else {
encoder = (encoder % 38) + 1; // incrementa circolarmente da 1 a 38
}
}
letturaPrec = n;
if (digitalRead(6) == HIGH) // se il pulsante non è premuto
lcd.setCursor(0, 0);
lcd.print(Menu[encoder]); /* Stampo nella prima riga la voce di menù
corrispondente alla posizione dell'encoder */
if (digitalRead(6) == LOW) // se il pulsante viene premuto
for (freq = 0; freq < 10;) { // ciclo di lettura della riga
lcd.setCursor(0, 1);
lcd.print("RUN Hz"); // Stampa Prefisso e suffisso sulla seconda riga lcd
stampa = (pgm_read_dword(& Frequenze[encoder - 1][freq])); /* Legge il valore di frequenza dalla matrice
e lo assegna alla variabile "stampa"*/
lcd.setCursor(4, 1); // Posiziona il cursore dopo il prefisso
lcd.print(stampa); // Stampa la frequenza in uso
dds.setFrequency(stampa); // Invia la frequenza al modulo DDS
startTime = millis(); // Resetta il tempo di inizio conteggio
contTempo = startTime + WorkTime; // Assegna il tempo di lavoro
while (millis() < contTempo && digitalRead(Stop) == LOW); /* fino a che non raggiunge il tempo impostato o
non viene premuto il pulsante di stop */
int fineriga = freq + 1; // Crea una variabile per l'if di "FINE PROGRAMMA"
freq++; // Incrementa la variabile del ciclo "for"
lcd.setCursor(0, 1);
lcd.print(" "); // Cancella la seconda riga
if (fineriga == 10) { // Se "fineriga" raggiunge il valore 10
lcd.setCursor(0, 1);
lcd.print(" FINE PROGRAMMA "); // Stampa su lcd che il ciclo è finito
digitalWrite(Buzzer, HIGH);
delay(3000); // Fa suonare il Buzzer
digitalWrite(Buzzer, LOW);
EEPROM.update(0, encoder); // Memorizza la voce di menù nella EEPROM solo se è cambiata
dds.init(); // Resetta il modulo DDS
}
}
}
}