Problema uscità relè con encoder

Salve a tutti, io devo comandare due uscire relè utilizzando un encoder. Ho utilizzato uno sketch usato qui http://www.mauroalfieri.it/elettronica/arduino-rotary-encoder.html, però io voglio un'uscita non regolata , cioè voglio solo un ON OFF impostato, perché se collego un relè non riesco a comandarlo. Come posso fare? Grazioe

Ciao,
non avendolo ancora fatto, ti chiederei di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione … possibilmente evitando di scrivere solo una riga di saluto) e di leggere con attenzione il REGOLAMENTO … Grazie. :slight_smile:

Guglielmo

Semplicemente, nel punto in cui nell'esempio che hai riportato c'è la "analogWrite(ledPin1,encoderValue);", la togli e metti un confronto con dei valori limite che ti interessano.

Mi spiego, in quel punto, la variabile "encoderValue" ha un valore compreso tra 0 e 255 ... tu decidi quale è il valore per cui la consideri ON ed al disotto del quale la consideri OFF e fai un:

if (encoderValue > tuoLimite) {
  ... qui dentro sei sopra al valore limite
}
else {
  ... qui dentro sei sotto al valore limite
}

... tutto qui ... se ho capito cosa volevi ::)

Guglielmo

Grazie per la risposta . Adesso ho impostato come da lei scritto if (encoderValue > 20); else

Però il led si accende lo stesso appena l'encoder arriva a 2, poi pian piano che si avvicina al 20 aumenta la sua luminosità... Io vorrei che si accendesse solo quando si arriva a 20.. C'è qualche modo? Grazie

Dato che NON abbiamo la palla di vetro e con DUE righe di codice non possiamo certo immaginare come è fatto il tuo programma … metti TUTTO il codice (… mi raccomando, racchiuso tra i tag CODE che, in fase di edit, ti inserisce il bottone </> … primo a sinistra) e vediamo cosa fai … ::slight_smile:

Guglielmo

int encoderPin1 = 2;
int encoderPin2 = 3;
int ledPin1     = 5; 

volatile int lastEncoded = 0;
volatile long encoderValue = 0;

long lastencoderValue = 0;

int lastMSB = 0;
int lastLSB = 0;

void setup() {
  Serial.begin (9600);

  pinMode(encoderPin1, INPUT);
  pinMode(encoderPin2, INPUT);
  pinMode(ledPin1, OUTPUT);

  digitalWrite(encoderPin1, HIGH); //turn pullup resistor on
  digitalWrite(encoderPin2, HIGH); //turn pullup resistor on
  digitalWrite (ledPin1,LOW);

  attachInterrupt(0, updateEncoder, HIGH);
  attachInterrupt(1, updateEncoder, LOW);

}

void loop(){
  Serial.println(encoderValue);
  if ( encoderValue < 25 );
  else 
  
  analogWrite(ledPin1,encoderValue);
  
}

void updateEncoder(){
  int MSB = digitalRead(encoderPin1); //MSB = most significant bit
  int LSB = digitalRead(encoderPin2); //LSB = least significant bit

  int encoded = (MSB << 1) |LSB; //converting the 2 pin value to single number
  int sum  = (lastEncoded << 2) | encoded; //adding it to the previous encoded value

  if(sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) encoderValue ++;
  if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) encoderValue --;

  lastEncoded = encoded; //store this value for next time
}

Emmm … in effetti qui siamo proprio alle basi …
… che ne dici, prima di proseguire, magari di dedicare un po’ di tempo per studiarti un po’ meglio la programmazione di Arduino? … perché poi ti riavvicinerai, sicuramente più produttivo, al tuo programma :wink:

Magari puoi cominciare con QUESTO e magari cercare in libreria qualche buon testo di programmazione C su Arduino.

Comunque …

  1. se vuoi accendere e spegnere (ON/OFF) NON usi la analogWrite(), usi la digitalWrite()

  2. ovviamente la devi mettere DENTRO l’IF …
    … la sintassi, come ti avevo già indicato è:

if (condizione) {
 cosa fare se vero
}
else {
 cosa fare se falso
}

Guglielmo

Grazie per la risposta. Ho provato a leggere la guida che mi hai indicato... Però non riesco a capire cosa devo mettere nella parentesi graffa per la condizione di cosa fare quando è vero o quando è falso il valore...

La guida dovresti proprio STUDIARLA così come dovresti prenderti un buon libro di ‘C’ e STUDIARE anche quello …

Perché io posso anche dirti che, ad esempio, puoi scrivere:

if ( encoderValue < 25 ) {
  digitalWrite (ledPin1,LOW);
}
else {
  digitalWrite (ledPin1,HIGH);
}

ma al prossimo passo, se non studi almeno le basi, sono sicuro che sarai qui di nuovo a chiedere come fare ::slight_smile:

Guglielmo