Assegnare valore ad analogread

Ciao a tutti...

Ho un forte dubbio su come gestire un analogread in una mia applicazione... praticamente ho un potenziometro che mi da valori da 0 a 1024... per eliminare lo zero sommo 1 ottenendo così un range 1-1025...
Ho bisogno però questo renge sia fissato ad una scala non lineare dove il minimo (1) corrisponde al valore '10' e il massimo (1025) corrisponde a '35'....

Come potrei fare?

ciao max95 :slight_smile:

Se ho capito bene devi far corrispondere i questo modo i valori :

1 → 10
1025 → 35
più i suoi valori intermedi .

se è così allora devi usare la funzione map() : link

se hai dubbi su come funziona dimmelo :slight_smile:

MD

1025/35 =29,28571428571429
prendi il numero che ottieni dall'analog +29,28 diviso per 29,28 e ne prendi solo l'intero

Per primo il convertitore analogico digitale Ti da valori da 0 a 1023.
Per secondo per trasformare la lettura in valori con una funzione non lieare dobbiamo conoscere la funzione.
Percui una volta trovata la funzione si puó calcolare da un valore dato il valore corrispondente.
Altra possiilitá é una tabella di valori (array) dove hai memorizzato i valori che corrispondono al valore di input.

Che funzione di trasformazione hai?

Ciao Uwe

uwefed:
Per primo il convertitore analogico digitale Ti da valori da 0 a 1023.
Per secondo per trasformare la lettura in valori con una funzione non lieare dobbiamo conoscere la funzione.
Percui una volta trovata la funzione si puó calcolare da un valore dato il valore corrispondente.
Altra possiilitá é una tabella di valori (array) dove hai memorizzato i valori che corrispondono al valore di input.

Che funzione di trasformazione hai?

Ciao Uwe

Ciao e grazie per la risposta… Praticamente necessito di produrre in uscita la forma d’onda quadra allegata.

Al mio sistema ho collegato due potenziometri per la gestione di T e di T1, dove hanno i seguenti valori

T minimo= 10ms massimo 35ms
T1 minimo= 1ms massimo 4ms

T2 lo ricavo dalla differenza T - T1

con map potrebbe funzionare?

sí, map funziona

Ciao Uwe

OK ho appena provato ed effettivamente funziona senza problemi

  tcaricams = map(tcarica, 0, 1023, 1, 4);

  tperiodoms = map(tperiodo, 0, 1023, 10, 37);

noto che però l'avanzamento è unitario, ad esempio tcaricams è composto da 1,2,3,4.... è possibile avere un avanzamento non unitario? ad esempio valori da 1 a 4 con avanzamento di 0.5 o 0.2?

puo assere una valida soluzione questa secondo voi?

//imposto ingresso trimmer periodo (n°giri) e tempo di carica
int periodo = A0;
int carica = A1;
//imposto uscita led e mosfet
int led = 13;
int mos = 13;
//imposto variabili inizio loop
int tcarica = 0;
float tcaricams = 0;
int tperiodo = 0;
float tperiodoms = 0;
int tscaricams = 0;


void setup() {                
  pinMode(led, OUTPUT);   
  pinMode(mos, OUTPUT);   
  pinMode(periodo, INPUT);   
  pinMode(tcarica, INPUT);   
}

void loop() {
  
  //ottengo parametro di carica
  tcarica = analogRead(carica);
  tcaricams = map(tcarica, 0, 1023, 100, 400);
  tcaricams = (tcaricams/100);
  //ottengo parametro di periodo totale
  tperiodo = (analogRead(periodo));
  tperiodoms = map(tperiodo, 0, 1023, 1000, 3700);
  tperiodoms = (tperiodoms/100);
  //ottengo parametro di scarica
  tscaricams = (tperiodoms - tcaricams);

//genero onda quadra
  digitalWrite(led, HIGH);
  digitalWrite(mos, HIGH);
  delay(tcaricams);               
  digitalWrite(led, LOW);   
  digitalWrite(mos, LOW);   
  delay(tscaricams);   

}

ci sono 2 problemi:

tperiodoms = (tperiodoms/100.0);

delay() fa solo valori interi. Devi usare delayMicroseconds()

Non so se il Tuo raggionamento é giusto visto che non hai spiegato cosa ne vuoi fare.

Ciao Uwe