mettendo su analog 0 un filo che va a Vcc. Non capisco come mai mi vengono i valori negativi... dove sbaglio?
Vi ringrazi per il tempo che vorrete dedicargli... ora torno al mio problema.
In sostanza vorrei pilotare un pwm per una ventola in funzione della tensione su analog0... al momento ci ho messo un potenziometro ma in futuro dovrebbe esser qualcos'altro.
int Pin_dove_attacco_il_potenziometro=0;
int Pin_dove_attacco_il_controllo_ventola_PWM=11;
long int valore_letto_dalla_posizione_potenziometro=0;
unsigned long casting_del_valore_che_comanda_il_PWM=0;
void setup ()
{Serial.begin(9600);
pinMode (Pin_dove_attacco_il_controllo_ventola_PWM,OUTPUT);
}
void loop ()
{ analogReference(DEFAULT);
valore_letto_dalla_posizione_potenziometro = analogRead(Pin_dove_attacco_il_potenziometro);
long int cont= valore_letto_dalla_posizione_potenziometro*255;
Serial.print("cont:");
Serial.println(cont);
float valore = cont/1023;
casting_del_valore_che_comanda_il_PWM=(int)valore;
Ciao, aldilà del fatto che non userei nomi così lunghi ma questa è una questione personale...
Ti consiglio di "diminuire" il tipo delle variabili per occupare meno spazio in memoria flash e SRAM.
int Pin_dove_attacco_il_potenziometro=0;
int Pin_dove_attacco_il_controllo_ventola_PWM=11;
long int valore_letto_dalla_posizione_potenziometro=0;
unsigned long casting_del_valore_che_comanda_il_PWM=0;
diventano
int valore_letto_dalla_posizione_potenziometro=0;
long casting_del_valore_che_comanda_il_PWM=0; // o forse basta un int
Bisogna fare molta attenzione a questo per non "intasare" in fretta le memorie di Arduino.
void loop ()
{ analogReference(DEFAULT);
valore_letto_dalla_posizione_potenziometro = analogRead(Pin_dove_attacco_il_potenziometro);
long int cont= valore_letto_dalla_posizione_potenziometro*255;
Serial.print("cont:");
Serial.println(cont);
Cosa è DEFAULT?
Perchè moltiplichi il valore letto per 255?
float valore = cont/1023;
casting_del_valore_che_comanda_il_PWM=(int)valore;
Non ho capito come mai dividi valore per 1023 e poi lo fai diventare un int.
In questi casi, comunque, non usare altre variabili ma riutilizza le stesse.
Ultima cosa. Ho imparato a mie spese che usare il "delay" non è il massimo se non proprio per scketch brevi e di debug...
Consiglio spassionato: studia la funzione millis() e sostituiscila al posto di delay.
Ne trattai vantaggi "simulando" un comportamento multitasking del Arduino...
Spero di esserti stato utile.
Sull'uso delle variabili cercherò di fare più attenzione, grazie delle dritte.
DEFAULT per la funzione analogReference è un modo per settare il fondo scala della conversione analogico digitale.
Divido per 1023 per normalizzare ad 1 la conversione analogico digitale su 10 bit, moltiplico per 255 per mettermi su una scala a 8 bit.
Eseguo il Casting perché per pilotare il PWM servono valori interi se non ho capito male.
Nell'esempio che ho messo all'inizio mi uscivano dei valori negativi... ho applicato più di una pezza, qualcosa di troppo forse. Dico questo "forse" perché a leggere meglio nel Reference di analogWrite il casting pare superfluo.
Ok per riusare le stesse variabili.
Come mai dici che Millis sia meglio di Delay? Inoltre non ho ben capito cosa intendi per Multitasking: mentre sto facendo interagendo con la ventola posso interagire con altri azionamenti?
Ciao duomi, scrivi pure quando vuoi, figurati.
Per "impaginare il codice" basta che, sul messaggio, premi il cancelletto "#"
Ti appariranno dei TAG di tipo CODE. Mettici il codice dentro
Per il casting io lo uso molto poco e di solito il codice funziona bene ugualmente.
Ci son rari casi dalla mia (per altro scarsa) esperienza per i quali è estremamente necessaria...
Ma tant'è.
I numeri negativi penso che derivano dal fatto che vai oltre la "portata" della variabile.
Se può arrivare a 255 e tu gli assegni 256 inizia ad avere comportamenti strani...
Per quanto riguarda il millis è mille volte meglio del delay ed anche io l'ho scoperto da poco.
Il delay vuol dire "fermati per tot millisecondi"
La funzione millis conta i millisecondi.
Questo vuol dire che:
Accende un led (ammesso che in PIN ci sia un led) e aspetta un secondo. Poi lo spegne...
Ma in questo caso si blocca per un secondo e non può fare altro...
Al contrario:
unsigned long time;
byte mem=0;
void setup(){
...
time=millis();
....
}
void loop(){
if(millis>time+1000){
digitalWrite(PIN,!mem);
}
fai altro nel frattempo...
}
In tal caso, la funzione controlla che siano passati 1000 millisecondi prima di dare un valore HIGH o LOW al digitalWrite ma nel frattempo continua a ciclare.
Spero di esserti stato utile.
NB: il codice non è testato. Lo sto scrivendo al volo in ufficio per cui qualche imprecisione ci potrebbe essere.
Nel frattempo questo we mi sono studiato le strategie di "multitasking" su Arduino e anche se non mi è chiaro tutto ciò che mi sono visto, tu sei stato chiarissimo. Grazie delle dritte!
ciao nathanvi!!
volevo chiederti riguardo il codice che hai scritto, la variabile time nel tuo codice si aggiorna? nel senso
if(millis>time+1000){
digitalWrite(PIN,!mem);
}
fai altro nel frattempo...
}
quando quando millis diventa maggiore di 1000 la prima volta, dal quel momento in poi time non dovrebbe diventare 1000?
è la stessa cosa usare analogwrite all'interno di quell'if? ovviamente non usando mem!
Ciao,
sono un pippone io... Come ho scritto, di giorno sono in ufficio e non ho la possibilità di testarlo ;D
Hai ragione, time si deve aggiornare.
Del tipo:
void loop(){
if(millis>time+1000){
digitalWrite(PIN,!mem);
time=millis();
}
fai altro nel frattempo...
}
Ovviamente, alla tua seconda domanda, la risposta è si: vale anche con analogWrite.
Ovviamente non puoi usare quella sintassi.
Se scrivi digitalWrite(PIN,!mem); gli dici di scrivere l'opposto di mem quindi o 1 o 0.
Questo va bene solo se l'uscita è digitale.
Per analogWrite devi fare qualcosa di leggermente differente ma la tecnica è la stessa.
Come dicevo nei precedenti post "simuli" se i guru mi passano il termine, una sorta di multitasking.
Quello che ancora non ho capito benissimo è quando va in OVERFLOW la variabile e cosa fare in tali casi.
Mi spiego: ad un certo punto, essendo time un unsigned long andrà in overflow...
Ecco devo capire, come fare a prevenire e come rattoppare....
Per evitare di riavviare l'arduino ogni tot giorni :-/
A breve, proverò a fare un post ad hoc...
Spero di esserti stato utile
Sei stato perfetto!!Ti assicuro che anche io sono un pippone e se facciamo a gara vinco io!! ;D....comunque sai per la mia applicazione che è di circa 1 ora non dovrebbero esserci problemi di overflow (o almeno spero!!:P)grazie infinite!!
PS:se hai un minutino ho postato un altro problema che ho avuto sul 1-wire!!finche mi si parla di analogico ancora ancora riesco a cavarmela ma sul digitale sono un ignorante!!