Ciao, ho una striscia led bianca la quale vorrei controllarla con arduno (parte hardware già costruita). Il mio scopo sarebbe quello di accendere e spegnere la striscia con 2 pulsanti (ognuno accende e spegne) e controllare la luminosità con altri due pulsanti, uno abbassa la luce mentre l'altro la alza. Per la prima parte dovrei esserci riuscito, per il controllo della luminosità invece non riesco a farla funzionare, non ho trovato neanche nessun esempio su internet.
Come potrei fare?
Controllare Led con diversi pulsanti
9 messaggi
• Pagina 1 di 1
0
voti
-

dadothebest
24 2 7 - Frequentatore

- Messaggi: 229
- Iscritto il: 25 nov 2013, 17:13
- Località: Ascoli Piceno
0
voti
E' proprio quello che sto facendo, ho collegato tali led all'uscita PWM e con un telecomando ir avevo in mente di abbassare la luminosità con un tasto e di alzarla con l'altro ma non riesco ad implementarlo via software.
-

dadothebest
24 2 7 - Frequentatore

- Messaggi: 229
- Iscritto il: 25 nov 2013, 17:13
- Località: Ascoli Piceno
0
voti
Puoi postare la parte di codice che fa il controllo PWM e/o il flow-chart che hai seguito? Ci sarebbe anche da verificare che il circuito sia montato correttamente. 
PS
Sai che non tutti i pin di uscita sono PWM?

PS
Sai che non tutti i pin di uscita sono PWM?
mark
0
voti
Preciso che non sono così ignorante in materia... ho collegato i led al pin 11 e ho già fatto delle prove di funzionamento accendendo e spegnendo i led ed a variare la luminosità modificando manualmente il valore del PWM dal codice e tutto funziona.
Allego tutto il codice che comprende anche il controllo dei led:
Tutto lo sketch funziona correttamente tranne questa parte del controllo dei led che riporto nello specifico:
Se premo il pulsante i led si accendono sembra a metà della luminosità, se premo un'altra volta il pulsante aumenta un po' di luce e se continuo a premere non succede più nulla, si blocca così
Allego tutto il codice che comprende anche il controllo dei led:
- Codice: Seleziona tutto
#include <Time.h>
#include <TimeAlarms.h>
#include <DS3231.h>
#include <DS3232RTC.h>
#include <Wire.h>
#include <IRremote.h>
#include <LEDFader.h>
DS3231 rtc(SDA, SCL);
Time t;
//DEFINISCO RICEVITORE E TRASMETTITORE IR
int RECV_PIN = 13;
IRrecv irrecv(RECV_PIN);
IRsend irsend;
decode_results results;
//DEFINISCO I PIN UTILIZZATI
#define router A0 //RELE' 1
#define voip A1 //RELE' 2
#define wii A3 //RELE' 3
// 3 //TRASMETTITORE IR
#define PC 4 //RELE' 4
#define led_sopra 11 //TRANSISTOR GRANDE
#define led_tv 6 //TRANSISTOR GRANDE
#define stereo 7 //RELE' 5
#define giradischi 8 //RELE' 6
// #define led_stato 5 //TRANSISTOR PICCOLO
#define ventola_alimentatore 10 //TRANSISTOR GRANDE
// 13 //RICEVITORE IR
#define lampada 12 //RELE' 7
#define ventola_generale 9 //TRANSISTOR GRANDE
#define amp_giradischi A2
//#define SVILUPPI FUTURI //RELE' 8, NON UTILIZZATO
#define pulsante A5
#define interr_3luci 2
//FADE LED
LEDFader led_stato = LEDFader(5);
//COSTANTI VOIP E ROUTER
unsigned long time;
unsigned long tempoCorrente_Router_Voip;
unsigned long tempo_Router_Voip=0;
int stato_Router_Voip = 0;
int Avvio_Router_Voip = 1;
int Riavvio_Router_Voip = 0;
//FUNZIONE LED
int stato_led_fade = 0;
int contatore_led_fade = 0;
int numero_fade = 0;
int stato_led_blink = 0;
int contatore_led_blink = 0;
int numero_blink = 0;
//INTERRUTTORE E PULSANTE
int lettura_interruttore_3luci;
//PULSANTI IR
#define ritardo_pulsante 500
int stato_wii = 0;
int lettura_pulsante_wii;
int valore_precedente_pulsante_wii = LOW;
unsigned long tempo_wii = 0;
unsigned long tempoCorrente_wii;
int stato_pc = 0;
int lettura_pulsante_pc;
int valore_precedente_pulsante_pc = LOW;
unsigned long tempo_pc = 0;
unsigned long tempoCorrente_pc;
int stato_stereo = 0;
int lettura_pulsante_stereo;
int valore_precedente_pulsante_stereo = LOW;
unsigned long tempo_stereo = 0;
unsigned long tempoCorrente_stereo;
unsigned long tempo_ir_stereo;
int stato_giradischi = 1;
int lettura_pulsante_giradischi;
int valore_precedente_pulsante_giradischi = LOW;
unsigned long tempo_giradischi = 0;
unsigned long tempoCorrente_giradischi;
int stato_riavvio_router_voip = 1;
int lettura_pulsante_riavvio_router_voip;
int lettura_pulsante_conferma_azione;
int valore_precedente_pulsante_conferma_azione = LOW;
unsigned long tempo_riavvio_router_voip = 0;
unsigned long tempoCorrente_riavvio_router_voip;
int stato_router = 0;
int stato_pulsante_modem = 1;
int lettura_pulsante_modem;
unsigned long tempo_riavvio_modem = 0;
unsigned long tempoCorrente_riavvio_modem;
int stato_voip = 0;
int stato_pulsante_voip = 1;
int lettura_pulsante_voip;
unsigned long tempo_riavvio_voip = 0;
unsigned long tempoCorrente_riavvio_voip;
int stato_riavvio = 1;
int lettura_pulsante_riavvio;
unsigned long tempo_riavvio= 0;
unsigned long tempoCorrente_riavvio;
int stato_led_sopra = 0;
int lettura_pulsante_led_sopra;
int valore_precedente_pulsante_led_sopra=LOW;
unsigned long tempo_led_sopra = 0;
unsigned long tempoCorrente_led_sopra;
int luminosita=0;
//FUNZIONE PER RIAVVIARE ARDUINO
void(* Riavvia)(void) = 0;
//--------------------------------------------------------------------------------------------------SETUP-------------------------------------------------------------------------------------------
void setup(){
TCCR1B = (TCCR1B & 0b11111000) | 0X01;
//AVVIO IR
irrecv.enableIRIn();
//IMPOSTAZIONE LE VARIABILI TEMPO
rtc.begin();
tempoCorrente_Router_Voip=millis();
tempoCorrente_wii=millis();
tempoCorrente_pc=millis();
tempoCorrente_stereo=millis();
tempoCorrente_giradischi=millis();
//IMPOSTAZIONE INGRESSI E USCITE
pinMode(router, OUTPUT);
pinMode(voip, OUTPUT);
pinMode(wii, OUTPUT);
pinMode(PC, OUTPUT);
pinMode(led_sopra, OUTPUT);
pinMode(led_tv, OUTPUT);
pinMode(stereo, OUTPUT);
pinMode(giradischi, OUTPUT);
pinMode(ventola_alimentatore, OUTPUT);
//pinMode(led_stato, OUTPUT);
pinMode(lampada, OUTPUT);
pinMode(ventola_generale, OUTPUT);
pinMode(amp_giradischi, OUTPUT);
pinMode(pulsante, INPUT);
pinMode(interr_3luci, INPUT);
//IMPOSTAZIONE DEI PIN ALL'AVVIO
digitalWrite(router, LOW ); //RELE' 1 -------- LOW
digitalWrite(voip, LOW ); //RELE' 2 -------- LOW
digitalWrite(wii, LOW ); //RELE' 3 -------- LOW
digitalWrite(PC, LOW ); //RELE' 4 -------- LOW
analogWrite(led_sopra, 0 );
analogWrite(led_tv, 0 );
digitalWrite(stereo, LOW ); //RELE' 5 -------- LOW
digitalWrite(giradischi, HIGH ); //RELE' 6 -------- HIGH
//analogWrite(led_stato, LOW );
analogWrite(ventola_alimentatore, LOW );
digitalWrite(lampada, HIGH ); //RELE' 7 -------- HIGH
analogWrite(ventola_generale, LOW );
//digitalWrite(SVILUPPI FUTURI, HIGH ); //RELE' 8 -------- HIGH
digitalWrite(amp_giradischi, LOW );
digitalWrite(2, INPUT_PULLUP);
digitalWrite(A5, INPUT_PULLUP);
}
void loop() {
//AVVIO RECEZIONE CODICI IR
{if (irrecv.decode(&results)) {Serial.println(results.value, HEX); irrecv.resume();}}
//AVVIO DEI PROGRAMMI
Router_Voip();
Fade_led();
Blink_led();
Wii();
Giradischi();
PC();
Stereo();
Pulsante_riavvio_router_voip();
Pulsante_modem();
Pulsante_voip();
Pulsante_riavvio();
// Led_sopra();
//PROGRAMMA RIAVVIO E SPEGNIMENTO DISPOSITIVI
t = rtc.getTime();
if (t.date == 1 && t.hour == 05 && t.min == 00 && t.sec == 00) {Riavvia();} //Riavvia arduino il 1 alle 05:00:00
if (t.date == 06 && t.hour == 13 && t.min == 33 && t.sec == 00) {Riavvio_Router_Voip = 1;} //Riavvia router e voip il 15 alle 05:00:00
if (t.date == 06 && t.hour == 13 && t.min == 32 && t.sec == 00) {stato_led_blink=1;numero_blink=1000;}
if (t.hour == 05 && t.min == 30 && t.sec == 00) {digitalWrite(PC, LOW ); digitalWrite(stereo, LOW ); digitalWrite(wii, LOW ); digitalWrite(giradischi, LOW );} //Spegne alle 05:30:00
//VENTOLA GENERALE
if (rtc.getTemp()<33) {analogWrite(ventola_generale, 0);}
if (rtc.getTemp()>33) {analogWrite(ventola_generale, 250);}
//VENTOLA ALIMENTATORE
if (stato_wii==0 & stato_giradischi==1){analogWrite(ventola_alimentatore, 0);}
if (stato_wii==1 & stato_giradischi==1){analogWrite(ventola_alimentatore, 200);}
if (stato_wii==0 & stato_giradischi==0){analogWrite(ventola_alimentatore, 150);}
if (stato_wii==1 & stato_giradischi==0){analogWrite(ventola_alimentatore, 250);}
//PULSANTI
lettura_interruttore_3luci = analogRead (interr_3luci);
lettura_pulsante_giradischi = results.value == 0xFF22DD;
lettura_pulsante_wii = results.value == 0xFFE21D;
lettura_pulsante_pc = results.value == 0xFF629D;
lettura_pulsante_stereo = results.value == 0xFFA25D;
lettura_pulsante_conferma_azione = results.value == 0xFF38C7;
lettura_pulsante_riavvio_router_voip = results.value == 0xFF906F;
lettura_pulsante_led_sopra = results.value == 0xFF4AB5;
// lettura_pulsante_DIMINUISCE_led_sopra = results.value == 0xFF4AB5;FF6897
lettura_pulsante_modem = results.value == 0xFFE01F;
lettura_pulsante_voip = results.value == 0xFFA857;
lettura_pulsante_riavvio = results.value == 0xFFC23D;
if (lettura_pulsante_led_sopra == 1)
{
if( luminosita<250)
{
luminosita=luminosita+5;
delay(200);
}
}
analogWrite(led_sopra, luminosita);
}
//---------------------------------------------------------------------------------------------------ALTRI PROGRAMMI---------------------------------------------------------------------------------------------
//PROGRAMMA AVVIO ROUTER E VOIP
void Router_Voip()
{if((Avvio_Router_Voip==1)||(Riavvio_Router_Voip==1)) {stato_Router_Voip=1; Avvio_Router_Voip=0; Riavvio_Router_Voip = 0; digitalWrite(router,LOW); digitalWrite(voip,LOW); stato_router = 0; stato_voip = 0; stato_led_fade=1;numero_fade=5;}
tempoCorrente_Router_Voip=millis();
if((tempoCorrente_Router_Voip-tempo_Router_Voip>=5000)&&stato_Router_Voip==1) {digitalWrite(router,HIGH); stato_router = 1; stato_Router_Voip=2; tempo_Router_Voip=millis();}
else if (stato_Router_Voip==2) {if(tempoCorrente_Router_Voip-tempo_Router_Voip>=2000) {digitalWrite(voip,HIGH); stato_voip = 1; stato_Router_Voip=0;}}}
//PROGRAMMA FADE LED DI STATO
void Fade_led()
{led_stato.update();
if ((led_stato.is_fading() == false)&&(stato_led_fade == 1))
{if (led_stato.get_value() == 255) {led_stato.fade(0, 1000);contatore_led_fade++;}
else {led_stato.fade(255, 1000);}}
if (contatore_led_fade == numero_fade){stato_led_fade = 0; contatore_led_fade = 0;}}
void Blink_led()
{led_stato.update();
if ((led_stato.is_fading() == false)&&(stato_led_blink == 1))
{if (led_stato.get_value() == 255) {led_stato.fade(0, 100);contatore_led_blink++;}
else {led_stato.fade(255, 100);}}
if (contatore_led_blink == numero_blink){stato_led_blink = 0; contatore_led_blink = 0;}}
void Wii()
{tempoCorrente_wii=millis();
if (lettura_pulsante_wii == HIGH && valore_precedente_pulsante_wii == LOW && tempoCorrente_wii - tempo_wii > ritardo_pulsante)
{if (stato_wii == 1) stato_wii = 0; else stato_wii = 1; tempo_wii = millis(); }
digitalWrite(wii, stato_wii);
valore_precedente_pulsante_wii = lettura_pulsante_wii;}
void PC()
{tempoCorrente_pc=millis();
if (lettura_pulsante_pc == HIGH && valore_precedente_pulsante_pc == LOW && tempoCorrente_pc - tempo_pc > ritardo_pulsante)
{if (stato_pc == 1) stato_pc = 0; else stato_pc = 1; tempo_pc = millis(); }
digitalWrite(PC, stato_pc);
valore_precedente_pulsante_pc = lettura_pulsante_pc;}
void Stereo()
{tempoCorrente_stereo=millis();
if (lettura_pulsante_stereo == HIGH && valore_precedente_pulsante_stereo == LOW && tempoCorrente_stereo - tempo_stereo > ritardo_pulsante)
{if (stato_stereo == HIGH) stato_stereo = LOW; else stato_stereo = HIGH; tempo_stereo = millis(); }
digitalWrite(stereo, stato_stereo);
valore_precedente_pulsante_stereo = lettura_pulsante_stereo;}
void Giradischi()
{tempoCorrente_giradischi=millis();
if (lettura_pulsante_giradischi == HIGH && valore_precedente_pulsante_giradischi == LOW && tempoCorrente_giradischi - tempo_giradischi > ritardo_pulsante)
{if (stato_giradischi == 1) stato_giradischi = 0; else stato_giradischi = 1; tempo_giradischi = millis(); }
digitalWrite(giradischi, stato_giradischi);
digitalWrite(amp_giradischi, !stato_giradischi);
valore_precedente_pulsante_giradischi = lettura_pulsante_giradischi;}
void Pulsante_riavvio_router_voip()
{if (stato_riavvio_router_voip == 1 && lettura_pulsante_riavvio_router_voip == HIGH){ tempo_riavvio_router_voip = millis() + 2000; stato_riavvio_router_voip = 2; led_stato.fade(255, 500);}
if (stato_riavvio_router_voip == 2 && lettura_pulsante_conferma_azione == HIGH && millis() < tempo_riavvio_router_voip) {stato_riavvio_router_voip = 3;}
if (stato_riavvio_router_voip == 2 && millis() > tempo_riavvio_router_voip) {stato_riavvio_router_voip = 4;}
if (stato_riavvio_router_voip == 3) {Riavvio_Router_Voip=1; stato_riavvio_router_voip = 1;}
if (stato_riavvio_router_voip == 4) {stato_riavvio_router_voip = 1; led_stato.fade(0, 500);}}
void Pulsante_modem()
{if (stato_pulsante_modem == 1 && lettura_pulsante_modem == HIGH){ tempo_riavvio_modem = millis() + 2000; stato_pulsante_modem = 2; led_stato.fade(255, 500);}
if (stato_pulsante_modem == 2 && lettura_pulsante_conferma_azione == HIGH && millis() < tempo_riavvio_modem) {stato_pulsante_modem = 3;}
if (stato_pulsante_modem == 2 && millis() > tempo_riavvio_modem) {stato_pulsante_modem = 4;}
if (stato_pulsante_modem == 3) {stato_pulsante_modem = 1;
{if (lettura_pulsante_conferma_azione == HIGH) {if (stato_router == 1) {digitalWrite(router, LOW); stato_router = 0;} else {digitalWrite(router, HIGH); stato_router = 1;}}}}
if (stato_pulsante_modem == 4) {stato_pulsante_modem = 1; led_stato.fade(0, 500);}}
void Pulsante_voip()
{if (stato_pulsante_voip == 1 && lettura_pulsante_voip == HIGH){ tempo_riavvio_voip = millis() + 2000; stato_pulsante_voip = 2; led_stato.fade(255, 500);}
if (stato_pulsante_voip == 2 && lettura_pulsante_conferma_azione == HIGH && millis() < tempo_riavvio_voip) {stato_pulsante_voip = 3;}
if (stato_pulsante_voip == 2 && millis() > tempo_riavvio_voip) {stato_pulsante_voip = 4;}
if (stato_pulsante_voip == 3) {stato_pulsante_voip = 1;
{if (lettura_pulsante_conferma_azione == HIGH) {if (stato_voip == 1) {digitalWrite(voip, LOW); stato_voip = 0;} else {digitalWrite(voip, HIGH); stato_voip = 1;}}}}
if (stato_pulsante_voip == 4) {stato_pulsante_voip = 1; led_stato.fade(0, 500);}}
void Pulsante_riavvio()
{if (stato_riavvio == 1 && lettura_pulsante_riavvio == HIGH){ tempo_riavvio = millis() + 2000; stato_riavvio = 2;led_stato.fade(255, 500);}
if (stato_riavvio == 2 && lettura_pulsante_conferma_azione == HIGH && millis() < tempo_riavvio) {stato_riavvio = 3;}
if (stato_riavvio == 2 && millis() > tempo_riavvio) {stato_riavvio = 4;}
if (stato_riavvio == 3) {Riavvia(); stato_riavvio = 1; led_stato.fade(0, 500);}
if (stato_riavvio == 4) {stato_riavvio = 1; led_stato.fade(0, 500);}}
Tutto lo sketch funziona correttamente tranne questa parte del controllo dei led che riporto nello specifico:
- Codice: Seleziona tutto
if (lettura_pulsante_led_sopra == 1)
{
if( luminosita<250)
{
luminosita=luminosita+5;
delay(200);
}
}
analogWrite(led_sopra, luminosita);
Se premo il pulsante i led si accendono sembra a metà della luminosità, se premo un'altra volta il pulsante aumenta un po' di luce e se continuo a premere non succede più nulla, si blocca così
-

dadothebest
24 2 7 - Frequentatore

- Messaggi: 229
- Iscritto il: 25 nov 2013, 17:13
- Località: Ascoli Piceno
0
voti
Mi sembra che la parte che fa il controllo PWM sia scritta bene (non ho letto tutto il codice). Hai provato a mettere solo quel pezzo di codice in uno sketch nuovo e vedere se la regolazione PWM funziona? Magari il programma si inchioda da qualche altra parte.. 
mark
-

dadothebest
24 2 7 - Frequentatore

- Messaggi: 229
- Iscritto il: 25 nov 2013, 17:13
- Località: Ascoli Piceno
0
voti
Io ho provato e pare che vada. Credo che il problema sia nella lettura del tasto ma non riesco a capire questa riga (non ho mai studiato Arduino seriamente
)
E' equivalente alla digitalRead?
Segue il codice che ho usato e lo schema
Buone prove
)- Codice: Seleziona tutto
lettura_pulsante_led_sopra = results.value == 0xFF4AB5;
E' equivalente alla digitalRead?
Segue il codice che ho usato e lo schema
- Codice: Seleziona tutto
#define led 11
#define pulsante 7
int lum = 100;
void setup() {
pinMode(led,OUTPUT); // Set pin 11 to be in output mode
pinMode(pulsante,INPUT); // Set pin 7 to be in input mode
}
void loop() {
if(digitalRead(pulsante) == HIGH){
if(lum<250){
lum+=25;
}
else lum = 0;
delay(200);
}
analogWrite(led,lum);
}
Buone prove

mark
0
voti
Ho scritto questo piccolo sketch, provato e funzionante. Ho aggiunto la seriale e ho messo i controlli nel caso il valore superasse il minimo e il massimo consentito dai pwn... sennò il valore va in negativo e succedono cose strane. Soprattutto devi mettere un delay di minimo 50 ogni lettura... se non lo fai appena tocchi il pulsante il valore sale alle stelle.
Ricordati sui pulsanti le resistenze da 10k collegate a massa.
Prova a mettere il contenuto del mio loop al posto di quello che ti da problemi e dovrebbe andare
- Codice: Seleziona tutto
int luminosita=500;
#define pulsante1 9
#define pulsante2 10
void setup() {
pinMode(11,OUTPUT);
Serial.begin(9600);
pinMode(9,INPUT);
pinMode(10,INPUT);
}
void loop() {
if(digitalRead(pulsante1)==HIGH){luminosita=luminosita-5;}
else if(digitalRead(pulsante2)==HIGH){luminosita=luminosita+5;}
else;
if(luminosita<0) luminosita=0;
if(luminosita>1023) luminosita=1023;
Serial.println(luminosita);
analogWrite(11,luminosita);
delay(50);
}
Ricordati sui pulsanti le resistenze da 10k collegate a massa.
Prova a mettere il contenuto del mio loop al posto di quello che ti da problemi e dovrebbe andare
9 messaggi
• Pagina 1 di 1
Chi c’è in linea
Visitano il forum: Nessuno e 4 ospiti

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)


