Ciao a tutti,sto realizzano un circuito composto da un led RGB , un MOC3021 e un ricevitore a infrarossi TSOP31238. Sto utilizzando arduino uno, e gli sketch che sto usando sono in parte fatti da me.
Ecco quello che deve fare arduino:
-accendo la scheda e subito si attiva il moc
-sul telecomando ir ho 2 pulsanti in modalità "toggle button", uno accende/spegne il moc , l'altro accende/spegne il loop del led RGB(il led RGB crea un effetto rainbow in dissolvenza ).
i due sketch funzionano perfettamente se li tengo separati, ma quando li unisco per fare lo sketch definitivo e faccio partire il tutto, se premo il pulsante del MOC funziona ma quando premo l'altro il led si accende facendo il loop ma dopo non sono più in grado di spegnerlo e/o di comandare l'altro pulsante, è come se una volta dentro il loop non riesca più ad uscirne. Probabilmente sbaglio o ignoro qualcosa.
Vi allego i due sketch:
#include <IRremote.h> // use the library
int receiver = 11; // pin 3 of IR receiver to Arduino digital pin 11
IRrecv irrecv(receiver); // create instance of 'irrecv'
decode_results results;
int moc = 4;
int val = 0;
int vecchio_val = 0;
int stato = 0;
void setup()
{
Serial.begin(9600); // for serial monitor output
irrecv.enableIRIn(); // Start the receiver
pinMode(10, OUTPUT); // Verde
pinMode(5, OUTPUT);// Blu
pinMode(6, OUTPUT);// Rosso
pinMode(4, OUTPUT);// MOC
digitalWrite(moc,HIGH);
}
void loop()
{
if (irrecv.decode(&results)) // have we received an IR signal?
{
Serial.println(results.value, HEX); // display it on serial monitor in hexadecimal
irrecv.resume();// receive the next value
}
val=results.value == 0x20DF8877; // pulsante 1 del telecomando
if ((val == HIGH) && (vecchio_val == LOW)){
stato = 1 - stato;
delay(15); // attesa di 15 millisecondi
}
vecchio_val = val; // ricordiamo il valore precedente di val
if (stato == 1) {
digitalWrite(moc, LOW); // disattiva il MOC
}
else {
digitalWrite(moc, HIGH); // attiva il MOC
}
}
E' da settimane che sono fermo a questo punto facendo molte prove e cercando in internet ma niente , per questo sto chiedendo aiuto qui.
Voi come unireste i due sketch per fare quello che ho detto sopra? avete qualche consiglio da darmi?
Grazie mille in anticipo!
probabilmente il problema è che internamente le due libreire usano gli stessi timer. Bel problema, o trovi una versione alternativa di libreria, o adatti una libreria, o riscrivi il codice di una libreria.
Io per ora scrivere da zero o modificare le librerie non sono capace... Non c'è un modo per aggirare questa cosa? se serve sono anche disposto a cambiare o modificare sia il codice sia l'hardware, non ci sono problemi.
Ad esempio tu come faresti (escludendo il discorso libreria) ?
La IRRemote usa il timer 2 di default, che significa che si perdono le funzionalità PWM sui pin 11 e 3.
Siccome andrea2000 usa i pin 5/6/10 non dovrebbe avere interferenze causate dalla libreria.
Penso piuttosto ad un errore di codice, potresti pubblicare lo sketch che ti da problemi (quello che è la fusione dei 2)?
#include <IRremote.h> // use the library
int receiver = 11; // pin 3 of IR receiver to Arduino digital pin 11
IRrecv irrecv(receiver); // create instance of 'irrecv'
decode_results results;
int moc = 4;
int val = 0;
int vecchio_val = 0;
int stato = 0;
int val1 = 0;
int vecchio_val1 = 0;
int stato1 = 0;
int blu = 5;
int verde = 10;
int rosso = 6;
void setup()
{
Serial.begin(9600); // for serial monitor output
irrecv.enableIRIn(); // Start the receiver
pinMode(10, OUTPUT); // Verde
pinMode(5, OUTPUT);// Blu
pinMode(6, OUTPUT);// Rosso
pinMode(4, OUTPUT);// MOC
digitalWrite(moc,HIGH);
}
void loop()
{
if (irrecv.decode(&results)) // have we received an IR signal?
{
Serial.println(results.value, HEX); // display it on serial monitor in hexadecimal
irrecv.resume();// receive the next value
}
val=results.value == 0x20DF8877; // pulsante 1 del telecomando
if ((val == HIGH) && (vecchio_val == LOW)){
stato = 1 - stato;
delay(15); // attesa di 15 millisecondi
}
vecchio_val = val; // ricordiamo il valore precedente di val
if (stato == 1) {
digitalWrite(moc, LOW); // disattiva il MOC
}
else {
digitalWrite(moc, HIGH); // attiva il MOC
}
val1=results.value == 0x20DF48B7; // pulsante 2 del telecomando
if ((val1 == HIGH) && (vecchio_val1 == LOW)){
stato1 = 1 - stato1;
delay(15); // attesa di 15 millisecondi
}
vecchio_val1 = val1; // ricordiamo il valore precedente di val1
if (stato1 == 1) {
fade(); // attiva il loop del led rgb
}
else {
analogWrite(rosso, 0); // metto a 0 il PWM
analogWrite(verde, 0);
analogWrite(blu, 0);
}
}
void fade() {
for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=1) {
analogWrite(rosso, fadeValue);
delay(30);
}
for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=1) {
analogWrite(verde, fadeValue);
delay(30);
}
for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=1) {
analogWrite(rosso, fadeValue);
delay(30);
}
for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=1) {
analogWrite(blu, fadeValue);
delay(30);
}
for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=1) {
analogWrite(verde, fadeValue);
delay(30);
}
for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=1) {
analogWrite(rosso, fadeValue);
delay(30);
}
for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=1) {
analogWrite(verde, fadeValue);
delay(30);
}
for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=1) {
analogWrite(verde, fadeValue);
analogWrite(blu, fadeValue);
analogWrite(rosso, fadeValue);
delay(30);
}
}
Nel frattempo ho fatto altre prove e ho corretto degli errori poi ho visto che ora lo sketch in parte funziona,cioè nello spegnimento(quando premo OFF) devo aspettare che finisca il loop RGB prima che funzionino gli altri comandi che ho dato nel frattempo , forse ho capito il problema... il delay() mi rallenta il programma, ho ragione?
Ciao, ho guardato l'esempio BlinkWithoutDelay e l'ho inserito nel mio codice, ma non mi funziona, ho fatto molte prove cambiando anche l'ordine ma niente. Lo sketch qua sotto è il risultato migliore che sono riuscito a fare... si accende il rosso di colpo (0-100%) e poi resta acceso e non succede più niente, invece dovrebbe fare la dissolvenza. Ho notato che cambiando il long interval = 30; con altri valori aumenta solo il ritardo all'accensione e per il resto fa sempre come ho già detto prima. Cosa sbaglio ?