Ciao Michele,
ti ringrazio per il consiglio, dopo queste mie righe inserisco il pezzo di programma che ho realizzato e che avevo già postato tempo addietro senza però riuscire ad avere indicazioni terra terra da essere capite anche me.
Premetto che la mia idea è utilizzare 6 valori di "L" e 6 valori di "C" con rapporti 1, 2, 4, 8, 16, 32 da inserire scalini.
la mia idea è:
se un valore calcolato (calcRos) è superiore ad una soglia inserisco uno scalino della serie "L",
continuo ad inserire scalini fino a quando il valore calcolato scende,
quando verifico che il valore calcolato anzichè scendere, dopo l'ultimo inserimento, è salito vorrei disinserire il primo scalino inserito, quello con valore più piccolo, della serie "L",
continuo a togliere scalini fino a quando il valore calcolato risale,
a questo punto dovrei valuatere se reinserire o meno lo scalino che è stato appena disinserito, sempre in base al valore calcolato
dopo di che questo 'giro' sarebbe ultimato.
In questo punto va inserito un criterio di scelta, sempre riferito al valore calcolato, che valuti se inserire lato TX oppure lato antenna la serie "C".
Con lo stesso criterio dovrei inserire i vari scalini della serie "C"
/*
*******************************
Accorda0106 TEST
*******************************
Inserisce uscite se ROS>1.5 e disinserisce l'ultima se ros aumentato invece che diminuire!!!
*/
#define NUMREADINGS0 10 // 10 valori da leggere
#define NUMREADINGS1 10 // 10 valori da leggere
#define inputPin0 3 // Sensore collegato al pin analogico 3 POT. RIFLESSA filo verde
#define inputPin1 5 // Sensore collegato al pin analogico 5 POT. DIRETTA filo blu
// #include <LiquidCrystal.h> // INCLUDE LA LIBRERIA
int readings0[NUMREADINGS0]; // Letture da input analogico
int readings1[NUMREADINGS1]; // Letture da input analogico
int index0 = 0; // Indice della lettura0 corrente
int index1 = 0; // Indice della lettura1 corrente
int total0 = 0; // Totale letture0
int total1 = 0; // Totale letture1
int saltoind = 0; // seleziona cosa fare salto0 variabile il cui valore indica dove swicciare x ind
int saltocap = 0; // seleziona cosa fare salto0 variabile il cui valore indica dove swicciare x cap
float average0 = 0; // Media0 RIFLESSA, int non visualizza decimali, float visualizza due decimali
float average1 = 0; // Media1 DIRETTA, int non visualizza decimali, float visualizza due decimali
float average0old = 0; // Media0old RIFLESSA
float average1old = 0; // Media1old DIRETTA
float calcRos = 0; // Ros calcolato
float calcRosold = 0; // vecchio valore di Ros
float calcRosold1 = 0; // vecchio vecchio valore di Ros per il disinserimento degli scalini dopo averne inseriti troppi
float calcPot =0; // Potenza calcolata
float calcPotOld =0;
// LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // INIZIALIZZA LA LIBRERIA LCD
int led1 = 13; // SELEZIONA PIN 13
int led2 = 12; // SELEZIONA PIN 12
int led3 = 11; // SELEZIONA PIN 11
int led4 = 10; // SELEZIONA PIN 10
int led5 = 9; // SELEZIONA PIN 9
int led6 = 8; // SELEZIONA PIN 8
int led7 = 7; // SELEZIONA PIN 7
int led8 = 6; // SELEZIONA PIN 6
int led9 = 5; // SELEZIONA PIN 5
int led10 = 4; // SELEZIONA PIN 4
int led11 = 3; // SELEZIONA PIN 3
int led12 = 2; // SELEZIONA PIN 2
int led13 = 1; // SELEZIONA PIN 1
int led14 = 0; // SELEZIONA PIN 0
long previousMillis = 0; // ******************** ritardo
long interval = 1000; // ******************** tempo di ritardo
void setup()
{
{
pinMode (13, OUTPUT);
pinMode (12, OUTPUT);
pinMode (11, OUTPUT);
pinMode (10, OUTPUT);
pinMode (9, OUTPUT);
pinMode (8, OUTPUT);
pinMode (7, OUTPUT);
pinMode (6, OUTPUT);
pinMode (5, OUTPUT);
pinMode (4, OUTPUT);
pinMode (3, OUTPUT);
pinMode (2, OUTPUT);
pinMode (1, OUTPUT);
pinMode (0, OUTPUT);
}
for (int i = 0; i < NUMREADINGS0; i++){
readings0[i] = 0; //Mette tutti 0 nell'array
}
for (int a = 0; a < NUMREADINGS1; a++) {
readings1[a] = 0; //Mette tutti 0 nell'array
}
}
void loop()
{
{
total0 -= readings0[index0]; //Sottrae l'ultima lettura
readings0[index0] = analogRead(inputPin0); //Legge i valori provenienti dal sensore e li salva nell'array
total0 += readings0[index0]; //Aggiunge la lettura al totale
index0 = (index0 + 1); //Incrementa l'indice
}
if (index0 >= NUMREADINGS0) {
index0 = 0; //Alla fine dell'array resetta l'indice a 0
average0 = total0 / NUMREADINGS0; // Calcola la media DELLA RIFLESSA
}
{
total1 -= readings1[index1]; //Sottrae l'ultima lettura
readings1[index1] = analogRead(inputPin1); //Legge i valori provenienti dal sensore ??? e li salva nell'array
total1 += readings1[index1]; //Aggiunge la lettura al totale
index1 = (index1 + 1); // Incrementa l'indice
}
if (index1 >= NUMREADINGS1) {
index1 = 0; // Alla fine dell'array resetta l'indice a 0
average1 = total1 / NUMREADINGS1; // Calcola la media DELLA DIRETTA
}
{
// CALCOLO ROS
calcRos = ((1 + ( average0 / average1)) / (1 - ( average0 / average1)));
}
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
// da queste parti bisogna inserire la scelta se andare a saltoind o saltare a saltocond (???)
// poi verificare se sono stati fatti tutti i giri di controllo e visualizzare il risultato
// LED Verde OK, LED Rosso se il valore del ROS è > del valore di soglia!
{
if(calcRos>=1.5) saltoind++; // se ROS >= a 1.5 incrementa di 1 saltoind
if(calcRosold>calcRos) if(saltoind<7) saltoind=7; // se ultima lettura > lettura precedente saltoind=7
if(calcRosold>calcRos)saltoind++; // se ROSnuovo > ROS vecchio, inserito troppa IND inizia a spegnere le uscite da led1
calcRosold=calcRos; // manca il controllo in spegnimento delle uscite !!!!!!!!!!!!
// bisogna verificare come NON aggiornare il valore di calcRosold fino al miglior calcRos.
}
switch (saltoind) {
case 1: // Inserisco primo scalino ind
digitalWrite(led1, HIGH);
break;
case 2: // Inserisco scalino 2 ind
digitalWrite(led2, HIGH);
break;
case 3: // Inserisco scalino 3 ind
digitalWrite(led3, HIGH);
break;
case 4: // Inserisco scalino 4 ind
digitalWrite(led4, HIGH);
break;
case 5: // Inserisco scalino 5 ind
digitalWrite(led5, HIGH);
break;
case 6: // Inserisco scalino 6 ind
digitalWrite(led6, HIGH);
break;
case 7: // Non fa' nulla!!!
break;
case 8: //disinserisco primo scalino ind ************ SPEGNIMENTI *******************
digitalWrite(led1, LOW);
break;
case 9: // Inserisco scalino 3 ind
digitalWrite(led2, LOW);
break;
case 10: // Inserisco scalino 4 ind
digitalWrite(led3, LOW);
break;
case 11: // Inserisco scalino 5 ind
digitalWrite(led4, LOW);
break;
case 12: // Inserisco scalino 6 ind
digitalWrite(led5, LOW);
break;
case 13: // Inserisco scalino 6 ind
digitalWrite(led6, LOW);
saltoind=0; // pone a 0 il valore della variabile per avitare che continui nel vuoto
break;
// 000
case 50:
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
digitalWrite(led5, LOW);
digitalWrite(led6, LOW);
saltoind=0; // dopo aver spento tutto riporta saltoind=0
break;
case 100:
break;
}
}
}
spero di essere riuscito a spiegare quale è la mia idea
grazie
Andrea