sensore crepuscolare

ciao, sto provando a realizzare un comando per l'accensione e lo spegnimento di un led... il punto è, che il led deve accendersi e spegnersi gradualmente dalla pwm controllato da un sensore crepuscolare
(potenziometro collegato all'analog 0). il circuito crepuscolare però deve poter essere bypassato da un pulsante che prende ''priorità'' e accende e spegne il led normalmente... sto provando da ore ma niente... qualche aiuto??? grazie mille :slight_smile:

posta quello il codice che hai scritto fino ad ora cosi ti diamo una mano a modificarlo :wink:

grazie mille
ecco:

const int sensoreLucePin = 0;
const int buttonCortilePin = 9;
const int ledPinA = 3;
const int ledPinB = 5;
const int ledPinC = 6;

int buttonCortilePin = 9;
int sensoreLuceValue = 0;
int sensoreLuceMin = 0;
int sensoreLuceMax = 1023;
int buttonCortileCounter = 1;
int buttonCortileState = 0;
int lastButtonCortileState = 0;

void setup() {

pinMode(buttonCortilePin, INPUT);

pinMode(3, OUTPUT);
digitalWrite(3, HIGH);
pinMode(5, OUTPUT);
digitalWrite(5, HIGH);
pinMode(6, OUTPUT);
digitalWrite(6, HIGH);

sensoreLuceValue = analogRead(sensoreLucePin);
if (sensoreLuceValue > sensoreLuceMax) {
sensoreLuceMax = sensoreLuceValue;
}

if (sensoreLuceValue < sensoreLuceMin) {
sensoreLuceMin = sensoreLuceValue;
}

digitalWrite (3, LOW);
digitalWrite (5, LOW);
digitalWrite (6, LOW);
}

void loop() {

sensoreLuceValue = analogRead(sensoreLucePin);
sensoreLuceValue = map(sensoreLuceValue, sensoreLuceMin, sensoreLuceMax, 0, 255);
sensoreLuceValue = constrain(sensoreLuceValue, 0, 255);

analogWrite(ledPinA, sensoreLuceValue);
analogWrite(ledPinB, sensoreLuceValue);
analogWrite(ledPinC, sensoreLuceValue);

buttonCortileState = digitalRead(buttonCortilePin);
if (buttonCortileState != lastButtonCortileState) {
if (buttonCortileState == HIGH) {
buttonCortileCounter++;
}
lastButtonCortileState = buttonCortileState;
}

if (buttonCortileCounter % 2 == 0) {

}
else {
analogWrite(sensoreLuceValue,0);
}

}

prova con questo e dimmi :slight_smile: magari ce qualche errorino dato che l'ho scritto al volo :wink:

int sensoreLucePin = 0;
int buttonCortilePin = 9;// normalmente a 0
int ledPinA = 3;        
int ledPinB = 5;
int ledPinC = 6;

void setup() {

 pinMode(ledPinA, OUTPUT);
 pinMode(ledPinB, OUTPUT);
 pinMode(ledPinC, OUTPUT);
}

void loop() {

if(digitalRead(buttonCortilePin)==0){

analogWrite(ledPinA, (analogRead(sensoreLucePin)/4))
analogWrite(ledPinB, (analogRead(sensoreLucePin)/4))
analogWrite(ledPinC, (analogRead(sensoreLucePin)/4))}

else{
analogWrite(ledPinA, 255)
analogWrite(ledPinB, 255)
analogWrite(ledPinC, 255)
}

}

sensoreLuceValue = analogRead(sensoreLucePin);
if (sensoreLuceValue > sensoreLuceMax) {
sensoreLuceMax = sensoreLuceValue;
}

if (sensoreLuceValue < sensoreLuceMin) {
sensoreLuceMin = sensoreLuceValue;
}

questo è inutile perche il valore minimo non verrà m ai settato in quanto non puo scendere sotto 0 e il valore massimo aumneta solo di 1 (1024>1023 per farti capire)

per il resto ve bene anche se potresti provare a leggere il valore mapparlo con map() e controllare il tasto mettendolo a 1 o 0 senza fare tanti incrementi e poi accendere con analogwrite() il led.
tra 30 minuti poso il codice tempo di cambiare pc ed arrivare a casa

vi ringrazio per le risposte... allora per quanto riguarda quello che dice milionario ci ho già provato, ma niente... (forse sbaglio qualche passaggio)

ho provato il programma di camba e il crepuscolare è ok, solo che il pulsante non mantiene accese le luci, ma le accende solo durante la pressione... a me servirebbero fisse quando premi il pulsante...
tnks

allora dovrai modificare il codice per memorizzare l'ultimo stato del pulsante ed implementare un flip flop software. :wink:
P.S.
Per rimuovere l'overdrive manuale sarà necessario ripremere il tasto

emh :-?..... e come lo faccio un flip flop software? (scusate)

con una logica del tipo
se ultimostatopulsante = 0 allora statopulsante = 1
se ultimostatopulsante = 1 allora statopulsante = 0

prova cosi .. nn avevo capito come lo velevi :wink:

int sensoreLucePin = 0;
int buttonCortilePin = 9;// normalmente a 0
int ledPinA = 3;        
int ledPinB = 5;
int ledPinC = 6;
int i=0;

void setup() {

 pinMode(ledPinA, OUTPUT);
 pinMode(ledPinB, OUTPUT);
 pinMode(ledPinC, OUTPUT);
}

void loop() {
if(i==0){
if(digitalRead(buttonCortilePin)==0){

analogWrite(ledPinA, (analogRead(sensoreLucePin)/4));
analogWrite(ledPinB, (analogRead(sensoreLucePin)/4));
analogWrite(ledPinC, (analogRead(sensoreLucePin)/4));}

else {
i=1;
}}

else{
analogWrite(ledPinA, 255);
analogWrite(ledPinB, 255);
analogWrite(ledPinC, 255);
if(if(digitalRead(buttonCortilePin)==0){
i=0;}
}
}

ok ragazzi tra una cosa e l'altra mi avete aiutato tantissimo.... ho solo un ultimo problema... avete presente il programma tra gli esempi ''tone melody'' ???
ecco, dovrei far partire la melodia premendo un pulsante (non interruttore) quindi forse bisogna fare un flip flop come diceva brain, e farla fermare ripremendo quel pulsante... qualche idea ???