anche con la modifica fatta non spegne
non capisco il discorso della luminosità (lumi), se io l'ho definita all'inizio, nel momento che la richiamo dovrebbe funzionare, o no?
chiedo 'lumi' :):) in merito
P.S.: scusate il pessimo gioco di parole
anche con la modifica fatta non spegne
non capisco il discorso della luminosità (lumi), se io l'ho definita all'inizio, nel momento che la richiamo dovrebbe funzionare, o no?
chiedo 'lumi' :):) in merito
P.S.: scusate il pessimo gioco di parole
Nella seconda versione che hai postato, lumi la inizializzi, la aumenti/diminuisci a seconda del tasto del remote.
Ma poi NON la usi, non c'e' più nessun analogWrite (r1, lumi); !!!
un consiglio, per fare debug e vedere da te dove stai passando nel programma.
Nella setup, come prime istruzioni aggiungi:
delay(1000);
Serial.begin(9600);
Questo permette di inviare dei dati al monitor di arduino IDE
Ora nel modo0:
void modo0()
{ if (PP==HIGH)
{ analogWrite (r1, lumi);
analogWrite (g1, lumi);
analogWrite (b1, lumi);
analogWrite (r2, lumi);
analogWrite (g2, lumi);
analogWrite (b2, lumi);
Serial.print("Modo 0: lumi="); Serial.println(lumi);
}
else
{ analogWrite (r1, 0);
analogWrite (g1, 0);
analogWrite (b1, 0);
analogWrite (r2, 0);
analogWrite (g2, 0);
analogWrite (b2, 0);
Serial.print("Modo 0: spento");
}
}
Altro suggerimento, creati anche una costante per il numero di modi:
const K_MAXMODI=3;
nel codice:
if(modo <3) => diventa if(modo<K_MAXMODI)
anche nell'altro punto
modo = 3; => diventa modo=K_MAXMODI;
in effetti hai ragione nel secondo sketch postato non c'è
analogWrite (r1, LOW);
analogWrite (g1, LOW);
analogWrite (b1, LOW);
analogWrite (r2, LOW);
analogWrite (g2, LOW);
analogWrite (b2, LOW);
ma nell'IDE l'avevo messa
analogWrite (r1, lumi);
analogWrite (g1, lumi);
analogWrite (b1, lumi);
analogWrite (r2, lumi);
analogWrite (g2, lumi);
analogWrite (b2, lumi);
ecco il perchè della mia domanda, cmq la luminosità non funziona lo stesso
EDIT: aggiunto il monitor seriale, lumi comincia da 255 si abbassa di 20 come da sketch, arriva a 235 e poi si 'impalla' fino al reset manuale
quando ripremo play per spegnere, nel monitor seriale non mi scrive spento però smette di trasmettere il valore di lumi
Io ti ho fatto aggiungere solo 2 punti in cui mandare valori/segnali al monitor.
Ti conviene aggiungerne in ogni funzione modex e non solo
if (irrecv.decode(&results))
{ //play/pausa premuto
if(results.value == Kplay)
{ if(PP==LOW)
{ PP=HIGH;
Serial.println("remote: PLAY ACCESO");
}
else
{ PP=LOW;
Serial.println("remote: PLAY SPENTO");
}
...
}
Stavo pensando la stessa cosa, ora vedo di aggiungerli
grazie per i suggerimenti
EDIT:
aggiunto ed in effetti nel monitor da spento, ma le luci non si spengono
Anche con il primo sketch non ti si spegnevano, vero?
Quello non credo sia un problema di software ma di hardware. Non so bene come consigliarti.
Mi sembra di aver letto che per spegnere non basta portare a 0.
Prova comunque a fare i vari analogWrite (r1, 1); non proprio a 0 ma quasi per spegnere. E' una prova.
Dopo i vari suggerimenti, sarebbe meglio allegassi di nuovo la tua ultima versione.
Mi sono un pò perso, forse ho visto un errore ma non son sicuro.
Con il primo sketch era l'unica cosa che funzionava
ecco la nuova versione del codice
/*
PeenieLamp v0.4
Lampada RGB con telecomando Apple
Codici Apple Remote
+ 2011287595
- 2011279403
frw 2011238443
play pause 2011242539
ffw 2011291691
menu 2011250731
tenuti premuti 4294967295
° Play/Pause accende e spegne
° "+" e "-" regolano luminosità
° "<<" e ">>" Cambiano modalità
° "menu" luce bianca
Modalità:
modo0 - Bianco
modo1 - Viola
modo2 - Verde
modo3 - Rosso
modo4 -
modo5 -
ultima modifica 02-05-2012
*/
#include <IRremote.h>
const byte r1=3; //pin dei colori
const byte g1=5;
const byte b1=6;
const byte r2=9;
const byte g2=10;
const byte b2=11;
int RECV_PIN=12; // pin del ricevitore
int K_MAXMODI=3; //costante per i modi
///Costanti per codici ricevitore
const unsigned long Kpiu = 2011287595;
const unsigned long Kmeno = 2011279403;
const unsigned long Krew = 2011238443;
const unsigned long Kplay = 2011242539;
const unsigned long Kffw = 2011291691;
const unsigned long Kmenu = 2011250731;
IRrecv irrecv(RECV_PIN);
decode_results results;
int PP = 0 ; //conteggio di quanto volte è stato premuto "Play/Pausa"
int lumi = 255; //luminosità iniziale
int modo = 0; // inizio da modo 0
int passo=3; //aumento per cambio colori
int vel=10; //velocità cambio colori
///SETUP///
void setup()
{
delay(1000);
Serial.begin(9600);
irrecv.enableIRIn();// attiva il ricevitore
pinMode (r1,OUTPUT);
pinMode (g1,OUTPUT);
pinMode (b1,OUTPUT);
pinMode (r2,OUTPUT);
pinMode (g2,OUTPUT);
pinMode (b2,OUTPUT);
analogWrite (r1, lumi);
analogWrite (g1, lumi);
analogWrite (b1, lumi);
analogWrite (r2, lumi);
analogWrite (g2, lumi);
analogWrite (b2, lumi);
}
///MODALITA'///
void modo0()
{ if (PP==HIGH)
{ analogWrite (r1, lumi);
analogWrite (g1, lumi);
analogWrite (b1, lumi);
analogWrite (r2, lumi);
analogWrite (g2, lumi);
analogWrite (b2, lumi);
Serial.print("Modo 0: lumi="); Serial.println(lumi);
delay(500);
}
else
{ analogWrite (r1, 0);
analogWrite (g1, 0);
analogWrite (b1, 0);
analogWrite (r2, 0);
analogWrite (g2, 0);
analogWrite (b2, 0);
Serial.print("Modo 0: spento");
}
}
void modo1() {
analogWrite (r1, 255);
analogWrite (g1, 0);
analogWrite (b1, 255);
analogWrite (r2, 255);
analogWrite (g2, 0);
analogWrite (b2, 255);
}
void modo2 () {
analogWrite(r1,0);
analogWrite(g1,255);
analogWrite (b1,0);
analogWrite(r2,0);
analogWrite(g2,255);
analogWrite (b2,0);
}
void modo3 (){
analogWrite(r1,255);
analogWrite(g1,0);
analogWrite (b1,0);
analogWrite(r2,255);
analogWrite(g2,0);
analogWrite (b2,0);
}
///MAIN LOOP///
void loop() {
if (irrecv.decode(&results)) {
//play/pausa premuto
if(results.value == Kplay) {
if(PP==LOW){
PP=HIGH;
Serial.println("remote: PLAY ACCESO");
}
else {
PP=LOW;
Serial.println("remote: PLAY SPENTO");
}
}
//tasto + premuto
if (results.value == Kpiu && lumi<255){
lumi = lumi+20;
}
//tasto - premuto
if (results.value == Kmeno && lumi>0){
lumi=lumi -20;
}
// tasto << premuto
if (results.value == Krew){
if(modo>K_MAXMODI) {
modo = modo-1;
}
else{
modo = K_MAXMODI;
}
}
// tasto>>premuto
if (results.value== Kffw){
if(modo< K_MAXMODI ){
modo = modo +1;
}
else{
modo = 0;
}
}
irrecv.resume();
}
switch (modo) {
case 0:
if (PP==HIGH){
modo0();
}
break;
case 1:
if(PP==HIGH){
modo1();
}
break;
case 2 :
if(PP==HIGH){
modo2();
}
break;
case 3 :
if(PP==HIGH){
modo3();
}
}
}
Bene, allora avevo visto giusto:
...
switch (modo) {
case 0:
if (PP==HIGH){
modo0();
}...
Dai, dimmi dove hai scritto la strunzata... prova a ragionartela
sta in quelle righe, ricorda come è fatta la modo0()
Anche questo non mi risulta molto:
if(modo>K_MAXMODI)
{ modo = modo-1;
}
else
{ modo = K_MAXMODI;
}
invece cosi si:
modo = modo-1;
if(modo<0) modo = K_MAXMODI; // puoi anche scrivere tutti su riga senza {} se solo 1 istruzione
if(modo< K_MAXMODI )
{ modo=modo+1;
}
else
{ modo=0;
}
modo=modo+1; // puoi anche scrivere: modo++;
if(modo>K_MAXMODI) modo=0;
Grandioso, così mi piace.
Si impara meglio, si allena il cervello a ragionare ed è molto più divertente :D:D:D
.....nello switch devo dirgli di spegnere, e così per tutti i colori giusto?
No, ti aiuto.
La modo0 cosa fa per prima cosa?
void modo0()
{ if (PP==HIGH)
{ analogWrite (r1, lumi);
...
}
else
{ analogWrite (r1, 0);
...
}
}
...
switch (modo) {
case 0:
if (PP==HIGH)
{ modo0();
}
...
Metti tutto insieme, cioè prova a pensare che tutto quello scritto in modo() stà nel if di quel case... e ....
la modo0 per prima cosa verifica lo stato del tasto play
poi se è HIGH, cioè premuto, accende tutti i colori
altrimenti (else) li spegne
nello switch rimanda al modo0 se PP è premuto
con questo codice accende e spegne tutti i modox
/*
PeenieLamp v0.6
Lampada RGB con telecomando Apple
Codici Apple Remote
+ 2011287595
- 2011279403
frw 2011238443
play pause 2011242539
ffw 2011291691
menu 2011250731
tenuti premuti 4294967295
° Play/Pause accende e spegne
° "+" e "-" regolano luminosità
° "<<" e ">>" Cambiano modalità
° "menu" luce bianca
Modalità:
modo0 - Bianco
modo1 - Viola
modo2 - Verde
modo3 - Rosso
modo4 -
modo5 -
ultima modifica 02-05-2012
*/
#include <IRremote.h>
const byte r1=3; //pin dei colori
const byte g1=5;
const byte b1=6;
const byte r2=9;
const byte g2=10;
const byte b2=11;
int RECV_PIN=12; // pin del ricevitore
int K_MAXMODI=3; //costante per i modi
///Costanti per codici ricevitore
const unsigned long Kpiu = 2011287595;
const unsigned long Kmeno = 2011279403;
const unsigned long Krew = 2011238443;
const unsigned long Kplay = 2011242539;
const unsigned long Kffw = 2011291691;
const unsigned long Kmenu = 2011250731;
IRrecv irrecv(RECV_PIN);
decode_results results;
int PP = 0 ; //conteggio di quanto volte è stato premuto "Play/Pausa"
int lumi = 255; //luminosità iniziale
int modo = 0; // inizio da modo 0
int passo=3; //aumento per cambio colori
int vel=10; //velocità cambio colori
///SETUP///
void setup()
{
delay(1000);
Serial.begin(9600);
irrecv.enableIRIn();// attiva il ricevitore
pinMode (r1,OUTPUT);
pinMode (g1,OUTPUT);
pinMode (b1,OUTPUT);
pinMode (r2,OUTPUT);
pinMode (g2,OUTPUT);
pinMode (b2,OUTPUT);
analogWrite (r1, 0);
analogWrite (g1, 0);
analogWrite (b1, 0);
analogWrite (r2, 0);
analogWrite (g2, 0);
analogWrite (b2, 0);
}
///MODALITA'///
void modo0()
{
if (PP==HIGH)
{
analogWrite (r1, lumi);
analogWrite (g1, lumi);
analogWrite (b1, lumi);
analogWrite (r2, lumi);
analogWrite (g2, lumi);
analogWrite (b2, lumi);
Serial.print("Modo:");
Serial.println(modo);
Serial.print("lumi=");
Serial.println(lumi);
delay(500);
}
}
void modo1() {
analogWrite (r1, lumi);
analogWrite (g1, 0);
analogWrite (b1, lumi);
analogWrite (r2, lumi);
analogWrite (g2, 0);
analogWrite (b2, lumi);
Serial.print("Modo:");
Serial.println(modo);
Serial.print("lumi=");
Serial.println(lumi);
delay(500);
}
void modo2 () {
analogWrite(r1,0);
analogWrite(g1,255);
analogWrite (b1,0);
analogWrite(r2,0);
analogWrite(g2,255);
analogWrite (b2,0);
Serial.print("Modo:");
Serial.println(modo);
Serial.print("lumi=");
Serial.println(lumi);
delay(500);
}
void modo3 (){
analogWrite(r1,255);
analogWrite(g1,0);
analogWrite (b1,0);
analogWrite(r2,255);
analogWrite(g2,0);
analogWrite (b2,0);
Serial.print("Modo:");
Serial.println(modo);
Serial.print("lumi=");
Serial.println(lumi);
delay(500);
}
///MAIN LOOP///
void loop() {
if (irrecv.decode(&results)) {
//play/pausa premuto
if(results.value == Kplay) {
if(PP==LOW){
PP=HIGH;
Serial.println("remote: PLAY ACCESO");
}
else {
PP=LOW;
Serial.println("remote: PLAY SPENTO");
}
}
//tasto + premuto
if (results.value == Kpiu && lumi<255){
lumi = lumi+15;
}
//tasto - premuto
if (results.value == Kmeno && lumi>0){
lumi=lumi -15;
}
// tasto << premuto
if (results.value == Krew){
modo = modo-1;
if(modo<0) modo = K_MAXMODI;
}
// tasto>>premuto
if (results.value== Kffw){
modo=modo+1; // puoi anche scrivere: modo++;
if(modo>K_MAXMODI) modo=0;
}
irrecv.resume();
switch (modo) {
case 0:
if (PP==HIGH){
modo0();
}
else
{
analogWrite (r1, 0);
analogWrite (g1, 0);
analogWrite (b1, 0);
analogWrite (r2, 0);
analogWrite (g2, 0);
analogWrite (b2, 0);
}
break;
case 1:
if(PP==HIGH){
modo1();
}
else
{
analogWrite (r1, 0);
analogWrite (g1, 0);
analogWrite (b1, 0);
analogWrite (r2, 0);
analogWrite (g2, 0);
analogWrite (b2, 0);
}
break;
case 2 :
if(PP==HIGH){
modo2();
}
else
{
analogWrite (r1, 0);
analogWrite (g1, 0);
analogWrite (b1, 0);
analogWrite (r2, 0);
analogWrite (g2, 0);
analogWrite (b2, 0);
}
break;
case 3 :
if(PP==HIGH){
modo3();
}
else
{
analogWrite (r1, 0);
analogWrite (g1, 0);
analogWrite (b1, 0);
analogWrite (r2, 0);
analogWrite (g2, 0);
analogWrite (b2, 0);
}
}
}
}
Ovvero a questo punto nella modo0() è inutile ri-verificate il valore di PP
Per semplificare,
...
switch (modo) {
case 0:
if (PP==HIGH)
{ /// modo0();
if (PP==HIGH)
{ analogWrite (r1, lumi);
...
}
else
{ analogWrite (r1, 0);
...
}
}
Non potrai mai spegnere i led, perchè l'if più interno ovvero quello dentro alla modo0() non verrà mai testato
Facevi troppe volte il test di PP. Se il test viene fatto dentro la modo0(), non serve farlo anche prima di chiamare la modo0()
Anzi, io metterei il test su PP=HIGH dentro a tutte le varie modox() e lo toglierei dallo switch
Ecco fatto
ci ho messo un pochino a capire ma alla fine ho sistemato con i tuoi suggerimenti
/*
PeenieLamp v0.7
Lampada RGB con telecomando Apple
Codici Apple Remote
+ 2011287595
- 2011279403
frw 2011238443
play pause 2011242539
ffw 2011291691
menu 2011250731
tenuti premuti 4294967295
° Play/Pause accende e spegne
° "+" e "-" regolano luminosità
° "<<" e ">>" Cambiano modalità
° "menu" luce bianca
Modalità:
modo0 - Bianco
modo1 - Viola
modo2 - Verde
modo3 - Rosso
modo4 -
modo5 -
ultima modifica 02-05-2012
*/
#include <IRremote.h>
const byte r1=3; //pin dei colori
const byte g1=5;
const byte b1=6;
const byte r2=9;
const byte g2=10;
const byte b2=11;
int RECV_PIN=12; // pin del ricevitore
int K_MAXMODI=3; //costante per i modi
///Costanti per codici ricevitore
const unsigned long Kpiu = 2011287595;
const unsigned long Kmeno = 2011279403;
const unsigned long Krew = 2011238443;
const unsigned long Kplay = 2011242539;
const unsigned long Kffw = 2011291691;
const unsigned long Kmenu = 2011250731;
IRrecv irrecv(RECV_PIN);
decode_results results;
int PP = 0 ; //conteggio di quanto volte è stato premuto "Play/Pausa"
int lumi = 255; //luminosità iniziale
int modo = 0; // inizio da modo 0
int passo=3; //aumento per cambio colori
int vel=10; //velocità cambio colori
///SETUP///
void setup()
{
delay(1000);
Serial.begin(9600);
irrecv.enableIRIn();// attiva il ricevitore
pinMode (r1,OUTPUT);
pinMode (g1,OUTPUT);
pinMode (b1,OUTPUT);
pinMode (r2,OUTPUT);
pinMode (g2,OUTPUT);
pinMode (b2,OUTPUT);
analogWrite (r1, 0);
analogWrite (g1, 0);
analogWrite (b1, 0);
analogWrite (r2, 0);
analogWrite (g2, 0);
analogWrite (b2, 0);
}
///MODALITA'///
void modo0()
{
if (PP==HIGH)
{
analogWrite (r1, lumi);
analogWrite (g1, lumi);
analogWrite (b1, lumi);
analogWrite (r2, lumi);
analogWrite (g2, lumi);
analogWrite (b2, lumi);
Serial.print("Modo:");
Serial.println(modo);
Serial.print("lumi=");
Serial.println(lumi);
delay(500);
}
else{
analogWrite (r1, 0);
analogWrite (g1, 0);
analogWrite (b1, 0);
analogWrite (r2, 0);
analogWrite (g2, 0);
analogWrite (b2, 0);
}
}
void modo1() {
if (PP==HIGH){
analogWrite (r1, lumi);
analogWrite (g1, 0);
analogWrite (b1, lumi);
analogWrite (r2, lumi);
analogWrite (g2, 0);
analogWrite (b2, lumi);
Serial.print("Modo:");
Serial.println(modo);
Serial.print("lumi=");
Serial.println(lumi);
delay(500);
}
else{
analogWrite (r1, 0);
analogWrite (g1, 0);
analogWrite (b1, 0);
analogWrite (r2, 0);
analogWrite (g2, 0);
analogWrite (b2, 0);
}
}
void modo2 () {
if (PP==HIGH){
analogWrite(r1,0);
analogWrite(g1,255);
analogWrite (b1,0);
analogWrite(r2,0);
analogWrite(g2,255);
analogWrite (b2,0);
Serial.print("Modo:");
Serial.println(modo);
Serial.print("lumi=");
Serial.println(lumi);
delay(500);
}
else{
analogWrite (r1, 0);
analogWrite (g1, 0);
analogWrite (b1, 0);
analogWrite (r2, 0);
analogWrite (g2, 0);
analogWrite (b2, 0);
}
}
void modo3 (){
if (PP==HIGH){
analogWrite(r1,255);
analogWrite(g1,0);
analogWrite (b1,0);
analogWrite(r2,255);
analogWrite(g2,0);
analogWrite (b2,0);
Serial.print("Modo:");
Serial.println(modo);
Serial.print("lumi=");
Serial.println(lumi);
delay(500);
}
else{
analogWrite (r1, 0);
analogWrite (g1, 0);
analogWrite (b1, 0);
analogWrite (r2, 0);
analogWrite (g2, 0);
analogWrite (b2, 0);
}
}
///MAIN LOOP///
void loop() {
if (irrecv.decode(&results)) {
//play/pausa premuto
if(results.value == Kplay) {
if(PP==LOW){
PP=HIGH;
Serial.println("remote: PLAY ACCESO");
}
else {
PP=LOW;
Serial.println("remote: PLAY SPENTO");
}
}
//tasto + premuto
if (results.value == Kpiu && lumi<255){
lumi = lumi+15;
}
//tasto - premuto
if (results.value == Kmeno && lumi>0){
lumi=lumi -15;
}
// tasto << premuto
if (results.value == Krew){
modo = modo-1;
if(modo<0) modo = K_MAXMODI;
}
// tasto>>premuto
if (results.value== Kffw){
modo=modo+1; // puoi anche scrivere: modo++;
if(modo>K_MAXMODI) modo=0;
}
irrecv.resume();
switch (modo) {
case 0:
modo0();
break;
case 1:
modo1();
break;
case 2 :
modo2();
break;
case 3 :
modo3();
}
}
}
Ora devo sistemare la questione luminosità
Per semplificare ancora: fai una unica funzione Spegni() e la chiami dove serve
...
void Spegni()
{ analogWrite (r1, 0);
analogWrite (g1, 0);
analogWrite (b1, 0);
analogWrite (r2, 0);
analogWrite (g2, 0);
analogWrite (b2, 0);
Serial.println("Spento");
}
...
void modo3 ()
{ if (PP==HIGH){
analogWrite(r1,255);
analogWrite(g1,0);
analogWrite (b1,0);
analogWrite(r2,255);
analogWrite(g2,0);
analogWrite (b2,0);
Serial.print("Modo:");
Serial.println(modo);
Serial.print("lumi=");
Serial.println(lumi);
delay(500);
}
else
{ Spegni();
}
}
...
Lo switch puoi anche compattarlo un pò:
switch (modo)
{ case 0: modo0(); break;
case 1: modo1(); break;
case 2: modo2(); break;
case 3: modo3(); break;
}
fatto e funzionante.
EDIT:
anche lo switch.
Più problematico sarà fare gli effetti di fade-in, fade-out mentre in contemporanea leggi se arrivano comandi dal remote.
Ma per ora...
si si ora a letto anche io
domani a mente fresca provo a far andare la luminosità
grazie mille dei consigli e buonanotte