ciao ragazzi, è la prima volta che scrivo qui anche perchè è da poco (2 giorni ) che utilizzo l'arduino 2009.
stavo realizzando un progetto per il presepe, con ciclo di giorno e notte, fin qui tutto bene, ma volevo inserire un led che con la funzione random imitava il fuoco, però il ciclo random se inserito nel LOOP, va ad interromperlo, praticamente il seguente ciclo deve essere infinito, mentre il ciclo principale deve scorrere
int fuoco;
fuoco = random (0,255);
analogWrite (11, fuoco);
Forse ti dico una cavolata perchè non ho capito tanto bene.. ma comunque potresti provare ad eseguire quelle istruzioni all'interno di una funzione che chiami quando vuoi tu
Esempio: ogni secondo faccio un'operazione e ogni loop ne faccio un'altra
unsigned long prevTime = 0, interval = 1000; // in millisecondi
void setup{
//dichiarazioni varie
}
void loop(){
if(millis() - prevTime > interval)
{
prevTime = millis();
// qui ci metti il codice che viene eseguito una volta ogni secondo
}
// qui ci metti il codice che vuoi sia eseguito in continuazione
}
lo stesso concetto lo puoi applicare anche se il tuo task non lo devi eseguire in modo temporizzato ma parte scatenato da un input esterno.
@Janos: ottimi consigli che tengono vivo il forum. clap clap
[OT] @Federico
Ho per caso scritto che non si può fare? Prima di parlare leggi bene...
Inoltre, invece ri fare le ripicche come i bambini piccini, se devi dirmi qualcosa dimmelo in faccia. Sono qui in attesa di critiche, purché siano costruttive.
Con questo Off topic per me il discorso finisce qui, anzi, alla prossima provocazione ti segnalo ad un moderatore per flame.
[/OT]
Ciasco, proprio perchè ti sei appena iscritto non meriti di essere liquidato con 2 parole, puoi fraintendere facilmente, visto che non è facile leggere tra le righe e cogliere le sfumature per uno che è agli inizi. E per me lo dimostra questo:
Ciasco:
ecco era questo che mi interessava, grazie =(
Janos: non voglio minimamente entrare in polemica con te, dato che non ti conosco non ne ho nessuna ragione! Era soltanto una sottolineatura scatenata dal reply di Ciasco e riferita a quanto hai detto in altri topic. Prendila pure come una frecciatina, ma l'ho fatto apertamente e direttamente. E non è una ripicca, le ripicche sono un'altra cosa.
Ciasco:
ciao ragazzi, è la prima volta che scrivo qui anche perchè è da poco (2 giorni ) che utilizzo l'arduino 2009.
stavo realizzando un progetto per il presepe, con ciclo di giorno e notte, fin qui tutto bene, ma volevo inserire un led che con la funzione random imitava il fuoco, però il ciclo random se inserito nel LOOP, va ad interromperlo, praticamente il seguente ciclo deve essere infinito, mentre il ciclo principale deve scorrere
int fuoco;
fuoco = random (0,255);
analogWrite (11, fuoco);
non so se avete capito :blush:
non capisco cosa intendi dicendo che si blocca. l'analogWrite è a tutti gli effetti indipendente dal loop perchè si basa sugli interrupt dei timer. (checcè ne dicano quei due. non è multithreading, sicuramente non parallelismo, ma qualcosa che ci si avvicina molto).
La prova è semplice: se metti l'analogWrite nel setup e poi lasci il loop vuoto, vedrai che il led rimane acceso all'intensità desiderata.
Quindi l'unico motivo per cui ti sembra che qualcosa si blocchi o il led si spenga deriva dal random. Per esempio, probabilmente il random dà molti valori < 100 vicini, e quindi il led sembra spento.
Oppure il loop di aggiornamento è troppo veloce: come sai il PWM è un segnale che inizia basso (o alto) e dopo tot ms si inverte, tanto velocemente da ingannare l'occhio umano e anche alcuni sensori. Ma probabilmnete il loop gira più velocemnte del ciclo PWM, resettandolo sempre PRIMA che possa fare il cambio variazione. prova a mettere un delay(100); e secondmo me tutto si risolverà da solo.
ti ringrazio per l'interesse, ho fatto una prova ma sembra non funzionare, ci ho ragionato qualche minuto ma non sono riuscito a trovare la causa del malfunzionamento, praticamente l'uscita 3 dovrebbe lampeggiare di continuo mentre la 11 dovrebbe accendersi lentamente, tutto questo contemporaneamente, ma invece la 3 fa un lampeggio e poi si alimenta la 11... inserisce le due uscite nel primo segmento, credo sia un problema di parentesi del for
unsigned long prevTime = 0, interval = 1000; // in millisecondi
void setup() {
}
void loop() {
if (millis() - prevTime > interval)
{
prevTime = millis();
analogWrite(3, 100);
delay (50);
analogWrite(3, 0);
}
for(int alba = 0 ; alba <= 100 ; alba +=1 ){
analogWrite(11, alba);
delay(100);
}
}
lesto:
non capisco cosa intendi dicendo che si blocca. l'analogWrite è a tutti gli effetti indipendente dal loop perchè si basa sugli interrupt dei timer. (checcè ne dicano quei due. non è multithreading, sicuramente non parallelismo, ma qualcosa che ci si avvicina molto).
La prova è semplice: se metti l'analogWrite nel setup e poi lasci il loop vuoto, vedrai che il led rimane acceso all'intensità desiderata.
Quindi l'unico motivo per cui ti sembra che qualcosa si blocchi o il led si spenga deriva dal random. Per esempio, probabilmente il random dà molti valori < 100 vicini, e quindi il led sembra spento.
Oppure il loop di aggiornamento è troppo veloce: come sai il PWM è un segnale che inizia basso (o alto) e dopo tot ms si inverte, tanto velocemente da ingannare l'occhio umano e anche alcuni sensori. Ma probabilmnete il loop gira più velocemnte del ciclo PWM, resettandolo sempre PRIMA che possa fare il cambio variazione. prova a mettere un delay(100); e secondmo me tutto si risolverà da solo.
mmm non proprio, avevo inserito il random nel ciclo loop, ad ogni ciclo il led assumeva un valore a caso e quindi il led sembrava come il fuoco, ma se inserisco altri oggetti nel ciclo naturalmente il tutto non funziona più, allora volevo un ciclo continuo a parte per il led e un altro per tutto il resto
ah è un erore di logica, pensavo il codice fosse solo il loop con analogwrite.
se usi il for, nel momento in cui inizi il for il loop rimane bloccato finchè non finisce(e sono 100 cicli da 100ms...). devi trovare un modo per NON usare il for, ma sfruttare il loop.
prova a sistemare il codice e ripostalo, così vediamo dove correggere.
usare il delay blocca il codice in quel punto, quindi se vuoi avere l'effetto di due cose che avvengono contemporaneamente, non devi più usare i delay ma entrare nell'ottica di usare solo la funzione millis().
Prova a ragionare su questa rivisitazione del tuo esempio. (non l'ho testato)
unsigned long prevTime = 0, interval = 1000; // in millisecondi
unsigned long prevFade = 0, Fadeinterval = 100;
boolean ledState = LOW;
int alba = 0;
void setup() {
}
void loop() {
if (millis() - prevTime > interval)
{
prevTime = millis();
ledState = !ledState; // inverte lo stato della variabile booleana
if(ledState == HIGH)
analogWrite(3, 100);
else
analogWrite(3, 0);
}
if(millis() - prevFade > Fadeinterval)
{
prevFade = millis()
analogWrite(11, alba);
alba++;
if(alba==256)
alba=0;
}
}