Salve
Ho un piccolo problema con la programmazione di un metronomo (eccessivamente complicato per quello che deve fare un metronomo ma vabbè).
Quando richiamo la funzione millis() per contare l'intervallo di tempo tra una battuta e la successiva, se associo un metronomo di un app sul telefono (affidabile), il metronomo realizzato con arduino perde "un po' il conto del tempo" in modo lineare:
più semplicemente mantiene un conteggio costante del tempo, ma un millisecondo contato dall'arduino è più lento di un millisecondo reale. Volevo sapere se è un errore dovuto al modo in cui è realizzato il codice (funzioni che in qualche modo "rallentano arduino") o se è la scheda arduino originale ad essere non perfettamente funzionante.
premetto che non sono proprio per niente un esperto in programmazione, e che l'ho testato anche su una scheda arduino nano non originale e dava lo stesso problema.
allego il codice, non è ultimato e per realizzarlo voglio integrare tutti i "void" all'interno del void loop
//LIBRERIE**************************************************************************
#include<Wire.h>
#include<LiquidCrystal_I2C.h>
//IMPOSTAZIONI INIZIALI E VARIABILI GLOBALI********************************************
LiquidCrystal_I2C LCD(0x27, 16, 2);
int BPM = 25;
int prevBPM = 25;
int BEAT = 1;
int currentBEAT = 1;
int DIVISION = 1;
long unsigned currentTime = 0;
long unsigned previousTime = 0;
//PIN MAPPING***********************************************************************
const int BUZZER = 2;
const int RLED = 5;
const int GLED = 3;
const int BLED = 4;
const int POTENZIOMETRO = A0;
const int PULSANTE1 = 6;
const int PULSANTE2 = 7;
const int PULSANTE3 = 8;
const int PULSANTE4 = 9;
const int PULSANTE5 = 10;
const int PULSANTE6 = 11;
const int PULSANTE7 = 12;
//SETUP*****************************************************************************
void setup() {
LCD.begin();
LCD.backlight();
pinMode(PULSANTE1, INPUT);
pinMode(PULSANTE2, INPUT);
pinMode(PULSANTE3, INPUT);
pinMode(PULSANTE4, INPUT);
pinMode(PULSANTE5, INPUT);
pinMode(PULSANTE6, INPUT);
pinMode(PULSANTE7, INPUT);
pinMode(RLED, OUTPUT);
pinMode(BLED, OUTPUT);
pinMode(GLED, OUTPUT);
pinMode(BUZZER, OUTPUT);
}
//LOOP*****************************************************************************
void loop() {
LEGGI(); //legge gli ingressi (pulsanti e potenziometro)
ATTUA(); //esegue le azioni (suoni e luci)
STAMPA(); //stampa un output (schermo)
}
//STAMPA***************************************************************************
void STAMPA() {
LCD.setCursor(0, 0);
LCD.print(BPM); LCD.print(" BPM in "); LCD.print(BEAT); LCD.print("/"); LCD.print(DIVISION); LCD.print(" ");
LCD.setCursor((currentBEAT -1), 1); LCD.print(currentBEAT); LCD.print(" ");
}
//ATTUA*****************************************************************************
void ATTUA() {
float Intervallo = 60000 / BPM;
currentTime = millis();
if(currentTime - previousTime >= Intervallo){
digitalWrite(GLED, HIGH);
previousTime = currentTime;
}
else {
digitalWrite(GLED, LOW);
}
}
//LEGGI*****************************************************************************
void LEGGI() {
int StateBPMa1 = digitalRead(PULSANTE1);
int StateBPMa5 = digitalRead(PULSANTE2);
int StateBPMt1 = digitalRead(PULSANTE3);
int StateBPMt5 = digitalRead(PULSANTE4);
int StateABILITA = digitalRead(PULSANTE5);
int StateDIVISION = digitalRead(PULSANTE6);
int StateBEAT = digitalRead(PULSANTE7);
if(StateABILITA == HIGH) {
int Cursore = analogRead(POTENZIOMETRO);
BPM = map(Cursore, 5, 1020, 25, 260);
}
else {
BPM = prevBPM;
}
if(StateBPMa1 == HIGH) {
BPM = BPM + 1;
delay(100);
}
if(StateBPMa5 == HIGH) {
BPM = BPM + 5;
delay(100);
}
if(StateBPMt1 == HIGH) {
BPM = BPM - 1;
delay(100);
}
if(StateBPMt5 == HIGH) {
BPM = BPM - 5;
delay(100);
}
if(BPM >= 261) {
BPM = 260;
}
if(BPM <= 25) {
BPM = 25;
}
prevBPM = BPM;
if(StateDIVISION == HIGH) {
DIVISION = DIVISION + 1;
delay(100);
}
if(StateBEAT == HIGH) {
BEAT = BEAT + 1;
delay(100);
}
if(DIVISION >= 17 || DIVISION <= 0) {
DIVISION = 1;
}
if(BEAT <= 0 || BEAT >= DIVISION+1) {
BEAT = 1;
}
}