Auito su codice per lettura potenziometro e relè

Buon pomeriggio a tutti.
Dopo il vostro prezioso aiuto ricevuto in questo post: Consiglio su sensore - Hardware - Arduino Forum sono finalmente riuscito nel mio intento.
Ho quindi acquistato un potenziometro rotativo 10k ohm 10 giri come questo: http://it.rs-online.com/web/p/potenziometri/4867093/ ed ho scritto subito il codice che però non fa esattamente ciò che voglio.
Questo è il mio codice:

const double sensore = 0;
double Ohm=0;
double giri = 0.0;

void setup() {
  Serial.begin(9600);
}
void loop() {
  Serial.print("Lettura: ");
  Ohm=(map(analogRead(sensore),0,1023,0,10000));
  Serial.print(Ohm);
  Serial.print(" Ohm");
  Serial.print(" equivalenti a ");
  giri=Ohm/1000;
  Serial.print(giri);
  Serial.print(" giri ");
  Serial.print(map((Ohm/1000),0,7.165,0,100));
  Serial.println("% di apertura");
  delay(200);
}

Questo è l'output:

Lettura: 0.00 Ohm equivalenti a 0.00 giri 0% di apertura
Lettura: 29.00 Ohm equivalenti a 0.03 giri 0% di apertura
Lettura: 68.00 Ohm equivalenti a 0.07 giri 0% di apertura
Lettura: 117.00 Ohm equivalenti a 0.12 giri 0% di apertura
Lettura: 156.00 Ohm equivalenti a 0.16 giri 0% di apertura
Lettura: 205.00 Ohm equivalenti a 0.20 giri 0% di apertura
Lettura: 254.00 Ohm equivalenti a 0.25 giri 0% di apertura
...

Lettura: 899.00 Ohm equivalenti a 0.90 giri 0% di apertura
Lettura: 948.00 Ohm equivalenti a 0.95 giri 0% di apertura
Lettura: 997.00 Ohm equivalenti a 1.00 giri 0% di apertura
Lettura: 1055.00 Ohm equivalenti a 1.05 giri 14% di apertura
Lettura: 1085.00 Ohm equivalenti a 1.09 giri 14% di apertura
Lettura: 1124.00 Ohm equivalenti a 1.12 giri 14% di apertura
...

Lettura: 1915.00 Ohm equivalenti a 1.91 giri 14% di apertura
Lettura: 1964.00 Ohm equivalenti a 1.96 giri 14% di apertura
Lettura: 2023.00 Ohm equivalenti a 2.02 giri 28% di apertura
Lettura: 2072.00 Ohm equivalenti a 2.07 giri 28% di apertura
Lettura: 2121.00 Ohm equivalenti a 2.12 giri 28% di apertura
...
Lettura: 2903.00 Ohm equivalenti a 2.90 giri 28% di apertura
Lettura: 2961.00 Ohm equivalenti a 2.96 giri 28% di apertura
Lettura: 3010.00 Ohm equivalenti a 3.01 giri 42% di apertura
Lettura: 3049.00 Ohm equivalenti a 3.05 giri 42% di apertura
...

Lettura: 3939.00 Ohm equivalenti a 3.94 giri 42% di apertura
Lettura: 3988.00 Ohm equivalenti a 3.99 giri 42% di apertura
Lettura: 4027.00 Ohm equivalenti a 4.03 giri 57% di apertura
Lettura: 4056.00 Ohm equivalenti a 4.06 giri 57% di apertura
...

Lettura: 4936.00 Ohm equivalenti a 4.94 giri 57% di apertura
Lettura: 4985.00 Ohm equivalenti a 4.99 giri 57% di apertura
Lettura: 5053.00 Ohm equivalenti a 5.05 giri 71% di apertura
Lettura: 5102.00 Ohm equivalenti a 5.10 giri 71% di apertura
...

Lettura: 5923.00 Ohm equivalenti a 5.92 giri 71% di apertura
Lettura: 5972.00 Ohm equivalenti a 5.97 giri 71% di apertura
Lettura: 6031.00 Ohm equivalenti a 6.03 giri 85% di apertura
Lettura: 6099.00 Ohm equivalenti a 6.10 giri 85% di apertura
...

Lettura: 6950.00 Ohm equivalenti a 6.95 giri 85% di apertura
Lettura: 6989.00 Ohm equivalenti a 6.99 giri 85% di apertura
Lettura: 7038.00 Ohm equivalenti a 7.04 giri 100% di apertura
Lettura: 7096.00 Ohm equivalenti a 7.10 giri 100% di apertura

Da ciò si evince primo che non è estremamente preciso e secondo che mancano molte altre percentuali stampando solo infatti queste: 0%, 14%,28%, 42%, 57%, 71%, 85% e 100%.

Il secondo problema che incontro invece è che per far aprire e chiudere la tenda mi sono collegato in parallelo ai già esistenti pulsanti con due relè. Uno per il segnale di apertura ed uno per quello di chiusura.
Mi sono però accorto che premendo i pulsanti arriva il segnale alla tenda solo dopo circa tre secondi. Se durante il movimento (salita o discesa) pigio nuovamente il pulsante per un tempo inferiore ai tre secondi mi interrompe l'avanzamento e si ferma nella posizione da me desiderata.
Questo però non è possibile con arduino perchè inviando per esempio il segnale di apertura mi eccita per tre secondi il relè per poi diseccitarlo subito dopo (per non avere il pulsante sempre sotto tensione).

digitalWrite(RCH2, HIGH);
delay(2500);
digitalWrite(RCH2, LOW);

Come faccio quindi ad aprire la tenda solo parzialmente? Devo calcolare quanto tempo impiega ad aprirsi totalmente e da lì inviare il segnale solo per N secondi corrispondenti a quanti centimetri voglio che si apra?
Grazie infinite per i vostri preziosi consigli.

Purtroppo hai fatto un acquisto errato: il potenziometro è di tipo logaritmico e non lineare.

E' del tutto normale che al 5° giro non segni il 50% ma un valore diverso (70%).

Per evitare di comprare un altro (costoso!) potenziometro, puoi compensare la curva logaritmica con una crescita anti logaritmica, ma è un po' complicato, senza conoscere il tipo di curva (sul datasheet è indicato solo la crescita per il tipo lineare).

Dovrebbe essere di tipo naturale, quindi logaritmo in base "e".

Bentrovato ziopippo,se il potenziometro che hai acquistato è proprio quello del link ha ragione cyberhs,è un logaritmico....

Guardando bene i valori a me sembra però che il potenziomentro sia lineare.......

Lettura: 997.00 Ohm equivalenti a 1.00 giri 0% di apertura
Lettura: 2023.00 Ohm equivalenti a 2.02 giri 28% di apertura
Lettura: 3010.00 Ohm equivalenti a 3.01 giri 42% di apertura
Lettura: 7096.00 Ohm equivalenti a 7.10 giri 100% di apertura

Come si vede da quì, quando il potenziometro ha compiuto 1 giro ha 1K,quando ne ha compiuti 7 di giri ha come valore 7K....
Il fatto che leggi solo alcune delle percentuali da te attese

Da ciò si evince primo che non è estremamente preciso e secondo che mancano molte altre percentuali stampando solo infatti queste: 0%, 14%,28%, 42%, 57%, 71%, 85% e 100%

dipende dalla mappa che hai creato ovvero

Serial.print(map((Ohm/1000),0,7.165,0,100));

hai diviso un valore di 100 per 7,165 =14,28. Quindi ogni valore di soglia della mappa è pari a circa 14 che arrotondando per difetto diventa 28,42,56,70,84,98.
Quindi secondo me devi solo modificare la mappa...
Ciao

Innanzi tutto grazie per le risposte.
tonid ha centrato proprio in pieno il mio problema.
Il link che ho messo (haimè da ignorante in elettronica) non è il modello che ho io ma quello che più gli assomigliava esteticamente :blush:
Quando l'ho acquistato il negoziante mi chiese se lo volevo lineare o logaritmico ma come si dice... "non sapendo ne leggere ne scrivere" ho chiesto il lineare e credo mi abbia dato quello. Provandolo con un tester infatti un giro corrispondeva a 1k e mezzo a 0.5K.
Forse cyberhs è stato tratto in inganno sicuramente dall'errato link ma credo anche dal fatto che non ho trascritto tutti i valori dell'output durante il movimento della tenda per non far diventare il post chilometrico. Ho optato infatti di trascrivere solo due coppie di dati tra un cambio e l'altro delle percentuali.
Credo quindi che l'errore sia proprio nella mappa ed è questo l'aiuto che avevo chiesto :stuck_out_tongue:

tonid:
dipende dalla mappa che hai creato ovvero

Serial.print(map((Ohm/1000),0,7.165,0,100));

hai diviso un valore di 100 per 7,165 =14,28. Quindi ogni valore di soglia della mappa è pari a circa 14 che arrotondando per difetto diventa 28,42,56,70,84,98.
Quindi secondo me devi solo modificare la mappa...
Ciao

L'asta della tenda dove è collegato il potenziometro, quando è tutta aperta fa circa 7,5 giri. Ho pensato quindi di urare questa mappa poichè secondo me il mio 100% equivale a 7,5 giri ovvero 7.50 che poi ho modificato in 7.165 essendo l'ultimo valore letto da arduino.

Ciao,io farei una proporzione così 7500ohm stanno a 10000ohm come 100% sta a "x"%
x=(10000x100)/7500=133,3 %
In pratica leggendo il potenziometro al suo massimo valore(10K) otterrai 133% mentre se il valore del pot è ad esempio 2,5K sarà 33,3%,a 5K sarà 66,6%,a 7,5K sarà 99,9%.
La mappa sarà quindi : Serial.print(map((Ohm),0,10000,0,133.3));
ed otterrai una lettura ogni (10000/133=) 75ohm sul valore del pot.
Spero ti sia utile :wink:
Ciao

$) GRANDIOSO! Funziona alla perfezione grazie mille! Però ho impostato il valore così Serial.print(map((Ohm),0,10000,0,140)); altrimenti al massimo valore non mi dava il 100% ma arrivava solo al 99%.
Grazie ancora!!!

Ora mi resta solo di capire come risolvere il problema dell'apertura parziale e mettere tutto su pachube.
A tutto questo accrocco ho anche infatti collegato due DHT11 uno per l'interno ed uno per l'esterno di cui uno (quello esterno) sicuramente lo cambierò con il DHT22. Voglio quindi capire come fare per mandare i valori a pachube visto che negli esempi si parla sempre di settare i pin analogici e solo per max due valori mentre io vorrei inviare sia la temperatura che l'umidità per entrambi i sensori. :stuck_out_tongue:

GRANDIOSO! Funziona alla perfezione grazie mille! Però ho impostato il valore così Serial.print(map((Ohm),0,10000,0,140)); altrimenti al massimo valore non mi dava il 100% ma arrivava solo al 99%.
Grazie ancora!!

Figurati !
Per l'apertura parziale cosa avevi in mente,ovvero come volevi gestire la cosa?

Non ho postato il codice completo ma ho preso spunto dall'app DomoticHome di Bl4d3 che però mi da molti problemi specialmente con due sensori e con la versione 4 (Icecream ) di android.
Ho quindi adattato il codice alle mie esigente per creare un app (per ora senza grafica) per il mio telefono. Funziona tutto correttamente e appena ho un pochino di tempo in più mi dedico anche alla grafica ed a renderlo più generalizzato, nel senso che per ora se aggiungo un sensore sono costretto a riscrivere l'app.

Ho capito.
Per la gestione da parte di arduino nei confronti della tenda dicevi che avevi dei problemi ma non ho ben capito la storia del segnale.

tonid:
Ho capito.
Per la gestione da parte di arduino nei confronti della tenda dicevi che avevi dei problemi ma non ho ben capito la storia del segnale.

cosa non ti è chiaro?

Il secondo problema che incontro invece è che per far aprire e chiudere la tenda mi sono collegato in parallelo ai già esistenti pulsanti con due relè. Uno per il segnale di apertura ed uno per quello di chiusura.
Mi sono però accorto che premendo i pulsanti arriva il segnale alla tenda solo dopo circa tre secondi. Se durante il movimento (salita o discesa) pigio nuovamente il pulsante per un tempo inferiore ai tre secondi mi interrompe l'avanzamento e si ferma nella posizione da me desiderata.
Questo però non è possibile con arduino perchè inviando per esempio il segnale di apertura mi eccita per tre secondi il relè per poi diseccitarlo subito dopo (per non avere il pulsante sempre sotto tensione).

Code:
digitalWrite(RCH2, HIGH);
delay(2500);
digitalWrite(RCH2, LOW);

Come faccio quindi ad aprire la tenda solo parzialmente? Devo calcolare quanto tempo impiega ad aprirsi totalmente e da lì inviare il segnale solo per N secondi corrispondenti a quanti centimetri voglio che si apra?
Grazie infinite per i vostri preziosi consigli.

Quello che non mi è molto chiaro è
-se premi il pulsante per aprire la tenda e lo rilasci subito,la tenda inizia il movimento ?
-oppure dopo che son trascorsi i 3 secondi con il pulsante mantenuto premuto?
-quando la tenda è partita e desideri che si fermi ,basta premere un qualunque pulsante o quello che avevi premuto prima ?
-hai per caso a disposizione un filo nella centralina che dia una qualche uscita che ti possa far capire che il motore è in movimento ?

Credo di aver capito che la tenda parte dopo 3 secondi che tieni premuto il pulsante (come fosse una sicurezza) e se tu ecciti il relè ed aspetti un qualche feedback di partenza motore dalla centralina (se lo hai) puoi usarlo per disattivare il relè che simula la pressione del pulsante ed inizi a leggere il potenziomentro fino ad arrivare al valore % di apertura/chiusura che desideri simulando una pressione del pulsante al momento giusto.
Il problema è riuscire a dire alla tenda fino a che punto deve muoversi ma visto che devi farti un'applicazione dovresti crearti una variabile grafica che abbia un valore compreso tra 0% e 100% ed appena la tenda inizia il movimento possa confrontare la variabile grafica con quella della lettura analogica del potenziometro .
In questo modo prima di far partire il comando apri/chiudi,setti il valore della variabile e poi mandi il comando alla tenda.

tonid:
Quello che non mi è molto chiaro è
-se premi il pulsante per aprire la tenda e lo rilasci subito,la tenda inizia il movimento ?
-oppure dopo che son trascorsi i 3 secondi con il pulsante mantenuto premuto?
-quando la tenda è partita e desideri che si fermi ,basta premere un qualunque pulsante o quello che avevi premuto prima ?
-hai per caso a disposizione un filo nella centralina che dia una qualche uscita che ti possa far capire che il motore è in movimento ?

Credo di aver capito che la tenda parte dopo 3 secondi che tieni premuto il pulsante (come fosse una sicurezza) e se tu ecciti il relè ed aspetti un qualche feedback di partenza motore dalla centralina (se lo hai) puoi usarlo per disattivare il relè che simula la pressione del pulsante ed inizi a leggere il potenziomentro fino ad arrivare al valore % di apertura/chiusura che desideri simulando una pressione del pulsante al momento giusto.
Il problema è riuscire a dire alla tenda fino a che punto deve muoversi ma visto che devi farti un'applicazione dovresti crearti una variabile grafica che abbia un valore compreso tra 0% e 100% ed appena la tenda inizia il movimento possa confrontare la variabile grafica con quella della lettura analogica del potenziometro .
In questo modo prima di far partire il comando apri/chiudi,setti il valore della variabile e poi mandi il comando alla tenda.

La tenda parte solo dopo circa tre secondi dalla pressione del tasto, se lo premo solo per pochi secondi non accade nulla.
Quando la tenda è partita è sufficiente premere uno dei due tasti (salita o discesa) per arrestare il movimento.
Da quello che ho potuto notare dalla centralina arrivano in casa tre fili: un comune, uno per la salita ed uno per la discesa. Basta mettere a massa uno dei due fili (salita o discesa) con il comune per iniziare il movimento. Non so quindi se ne esiste uno che mi comunica se è in movimento o meno (proprio per questo ho deciso di collegarci il potenziometro).
Settare una variabile grafica non so se potrebbe essere una buona soluzione in quanto via wireless o soprattutto via internet (fuori casa) presumo che i tempi di risposta non siano in tempo reale per cui perderei "tempo prezioso" per arrestare il movimento.

La tenda parte solo dopo circa tre secondi dalla pressione del tasto, se lo premo solo per pochi secondi non accade nulla.
Quando la tenda è partita è sufficiente premere uno dei due tasti (salita o discesa) per arrestare il movimento.
Da quello che ho potuto notare dalla centralina arrivano in casa tre fili: un comune, uno per la salita ed uno per la discesa. Basta mettere a massa uno dei due fili (salita o discesa) con il comune per iniziare il movimento. Non so quindi se ne esiste uno che mi comunica se è in movimento o meno (proprio per questo ho deciso di collegarci il potenziometro).
Settare una variabile grafica non so se potrebbe essere una buona soluzione in quanto via wireless o soprattutto via internet (fuori casa) presumo che i tempi di risposta non siano in tempo reale per cui perderei "tempo prezioso" per arrestare il movimento.

Bhe era una idea su come si poteva impostare la cosa.....non ho mai fatto applicazioni di questo tipo ma credo che i dati,una volta iniziata la trasmissione, arrivino velocemente e mandando prima i dati relativi alla variabile e poi lo start non ci dovrebbe essere il problema ma come ti dicevo non ho esperienza diretta quindi non so darti certezza.