Ciao a tutti,
sto leggendo da un ingresso analogico a cui è collegato un potenziometro; il progetto è una radio FM, il potenziometro fa la funzione di ricerca della stazione.
Utilizzo esp32, ma non cambia nulla rispetto ad arduino; il problema è che il valore che leggo non rimane stabile, con conseguenza che se saltella da un valore al successivo e viceversa, si ha continuamente il cambio della stazione.
Ho messo un filtro RC lato hardware ed ho fatto anche 10 letture consecutive nell'arco di 100 ms, ma non mi cambia la situazione, ho anche ridotto la lettura ADC a 10 bit (1024)
Uso la funzione MAP per convertire i 1024 bit letti in 210, che sono tutte le frequenze possibili da 87 a 108, a passi di 100 Khz. Per le prove sto utilizzando un potenziometro normale da 1 giro, ma a progetto definito dovrei utilizzare un 10 giri di precisione, ma non credo di risolvere con quello.
Sto sbagliando modalità? Quà sotto lo sketch, grazie ![]()
#include <RDA5807.h> // libreria modulo radio
#define MAX_DELAY_RDS 80 // 40ms - polling method
#define MAX_DELAY_STATUS 2000
#define POT 4 // pin potenziometro
int pot = 0; // ci salvo lettura analogica
byte pos_pot = 0; // ci salvo valore lettura potenz
byte pos_po = 0; // ci salvo valore lettura potenz
byte old_pos_pot = 0; // vecchia lettura potenz
byte conta_pot = 0; // per contare letture
byte pos [10]; // ci salvo letture potenz
int totale = 0; // ci salvo totale letture per media
char aux[80];
char *rdsMsg;
char *stationName;
char *rdsTime;
unsigned long rds_elapsed = millis();
unsigned long status_elapsed = millis();
unsigned long t_lett = 0; // tempo millis per lettura
RDA5807 rx;
int freq[] = {8700, 8710, 8720, 8730, 8740, 8750, 8760, 8770, 8780, 8790,
8800, 8810, 8820, 8830, 8840, 8850, 8860, 8870, 8880, 8890,
8900, 8910, 8920, 8930, 8940, 8950, 8960, 8970, 8980, 8990,
9000, 9010, 9020, 9030, 9040, 9050, 9060, 9070, 9080, 9090,
9100, 9110, 9120, 9130, 9140, 9150, 9160, 9170, 9180, 9190,
9200, 9210, 9220, 9230, 9240, 9250, 9260, 9270, 9280, 9290,
9300, 9310, 9320, 9330, 9340, 9350, 9360, 9370, 9380, 9390,
9400, 9410, 9420, 9430, 9440, 9450, 9460, 9470, 9480, 9490,
9500, 9510, 9520, 9530, 9540, 9550, 9560, 9570, 9580, 9590,
9600, 9610, 9620, 9630, 9640, 9650, 9660, 9670, 9680, 9690,
9700, 9710, 9720, 9730, 9740, 9750, 9760, 9770, 9780, 9790,
9800, 9810, 9820, 9830, 9840, 9850, 9860, 9870, 9880, 9890,
9900, 9910, 9920, 9930, 9940, 9950, 9960, 9970, 9980, 9990,
10000, 10010, 10020, 10030, 10040, 10050, 10060, 10070, 10080, 10090,
10100, 10110, 10120, 10130, 10140, 10150, 10160, 10170, 10180, 10190,
10200, 10210, 10220, 10230, 10240, 10250, 10260, 10270, 10280, 10290,
10300, 10310, 10320, 10330, 10340, 10350, 10360, 10370, 10380, 10390,
10400, 10410, 10420, 10430, 10440, 10450, 10460, 10470, 10480, 10490,
10500, 10510, 10520, 10530, 10540, 10550, 10560, 10570, 10580, 10590,
10600, 10610, 10620, 10630, 10640, 10650, 10660, 10670, 10680, 10690,
10700, 10710, 10720, 10730, 10740, 10750, 10760, 10770, 10780, 10790,
10800
};
void setup()
{
Serial.begin(9600);
pinMode(POT, INPUT); // mette il pin come ingresso
Serial.println();
Serial.println("test radio");
Serial.println();
analogReadResolution(10);
delay(100); // attendo alimentazioni
pot = analogRead(POT); // lettura del potenz
pos_pot = (map(pot, 0, 1023, 0, 255)); // faccio scala
old_pos_pot = pos_pot; // salvo il valore
rx.setup(); // default parametri 32.768kHz passive crystal
// rx.setup(CLOCK_32K, OSCILLATOR_TYPE_ACTIVE); // 32.768kHz Active Crystal
// rx.setup(CLOCK_12M, OSCILLATOR_TYPE_PASSIVE);
// rx.setup(CLOCK_38_4M, OSCILLATOR_TYPE_PASSIVE);
rx.setBand(0); // imposta banda 87–108 MHz (world wide)
rx.setRDS(false); // disabilito RDS
rx.setVolume(15); // imposto volume al max
delay(100);
//rx.setFrequency(9950); // imposta freq 99.5 MHz
rx.setFrequency(freq[pos_pot]); // imposta freq
rx.setGpio(3, 1); // Mono/Stereo indicator. When Stereo, the GPIO03 (pin 15 of the RDA5807FP) becomes high
rx.setAFC(true); // Sets Automatic Frequency Control
Serial.print("pot val:");
Serial.print(pot);
Serial.print(" posiz:");
Serial.println(pos_pot);
sprintf(aux, "\nFreq: %u MHz", rx.getFrequency());
Serial.println(aux);
t_lett = millis(); // azzero millis
}
void loop()
{
if ((millis() - t_lett) >= 10) // ogni 10 ms leggo potenz
{
pot = analogRead(POT); // lettura del potenz
pos_po = (map(pot, 0, 1023, 0, 255)); // faccio scala
if (conta_pot < 10) // fino a che non ho 10 letture
{ // conta fino a 9, ma finisce col contatore a 10
pos[conta_pot] = pos_po; // salvo la lettura
conta_pot ++; // aumento il contatore di 1
}
if (conta_pot >= 10) // quando ho 10 letture
{
totale = 0; // azzero totale
for (byte i = 0; i < 10; i++) // sommo tutte le 10 letture
{
totale = totale + pos[i]; // sommo tutte le 10 letture
}
pos_pot = totale / 10; // divido per 10 le letture (media)
conta_pot = 0; // azzero contatore
}
t_lett = millis(); // azzero millis
}
if (pos_pot != old_pos_pot)
{
if (pos_pot > 210)
{
rx.setFrequency(10800); // imposta freq massima
}
else
{
rx.setFrequency(freq[pos_pot]); // imposta freq
Serial.print("posiz:");
Serial.print(pos_pot);
Serial.print(" ");
}
old_pos_pot = pos_pot; // salvo il valore
sprintf(aux, "\nFreq: %u MHz", rx.getFrequency());
Serial.println(aux);
}
if (Serial.available() > 0)
{
char key = Serial.read();
switch (key)
{
case 'S':
rx.seek(RDA_SEEK_WRAP, RDA_SEEK_UP, showStatus); // cerca canale sup che riceve
break;
case 's':
rx.seek(RDA_SEEK_WRAP, RDA_SEEK_DOWN, showStatus);// cerca canale inf che riceve
break;
default:
break;
}
showStatus();
}
} // OOOOOOOOO FINE LOOP OOOOOOOOOOO
void showStatus()
{
sprintf(aux, "\nFreq: %u MHz", rx.getFrequency());
Serial.print(aux);
status_elapsed = millis();
}