codice di un neofita

prima di tutto mi scuso con i moderatori ma non sapevo cosa scrivere nell’oggetto.

come ho detto nella presentazione ho 16 anni e sto iniziando ad avvicinarmi ad arduino.

Per adesso ho un arduino uno e un servo (voglio solo imparare a scrivere i programmi, anche se seguo il forum da almeno tre mesi)

Ho scritto un po’ di codice ma non funziona come vorrei

Volevo solo far ruotare il mio servo in una direzione e che quando arriva al termine invertisse da solo la direzione ma solo quando tengo premuto un pulsante. Questo bene o malo l’ho ottenuto, ache se il mio codice mi sembra un po’ prolisso (voi che siete bravi con una riga fate molte cose, ma io non ci sono riuscito).

Ho provato a mettere un altro pulsamte e fare in modo che dopo una pressione su quest’ultimo il servo invertisse la direzione. A volte funziona a volte no, va un po’ random

Vorrei che la direzione di rotazione si potesse impostare anche se il servo non è attivo invece non ci sono riuscito. Funziona solo se il primo pulsante (quello che fa funzionare il servo) è premuto. Se metto la parte di codice relativa al pulsante dell’impostazione della direzione fuori dal funzionamento del servo, questa parte viene ignorata.

Dove sbaglio?

Ecco il mio codice:

#include <Servo.h>

Servo myservo; 
int posiz;
int pulsante;
int direz;
int pdir;


void setup() {
 Serial.begin(9600);
pinMode(2,INPUT);
pinMode(3,INPUT);
  myservo.attach(9);
  direz = 1;
  posiz =myservo.read();

}

void loop() {

 pulsante = digitalRead(2);
 pdir = digitalRead(3);


 if ( pulsante == LOW)
 {
 if (pdir == LOW){
   direz = !direz;
   }
    posiz =myservo.read();
    if (posiz == 180){
          direz = 1;
     }
     else if (posiz == 0){
         direz = 0;
     }
     if (direz == 0){
         posiz= posiz + 1;
     }
     else if(direz == 1){
         posiz= posiz - 1;
     }
 }
myservo.write(posiz);

delay(20);
}

Grazie a tutti

Il codice devi racchiuderlo nei tag code, vedi sezione 7 del regolamento, spiega bene come fare ( pulsante </> ).
Altrimenti parte del codice può essere visualizzata male o mancare perchè interpretato come attributo del testo stesso.

Funziona solo se il primo pulsante (quello che fa funzionare il servo) è premuto

Certo, infatti hai scritto:

if ( pulsante == LOW)
 {
    if (pdir == LOW)

controlli il secondo pulsante solo se il primo è premuto, avendo messo l'if relativo a pdir dentro l'if relativo a pulsante.

Presumo ovviamente che i pulsanti siano collegati in modo da dare LOW quando sono premuti.
Mostraci lo schema dei collegamenti.

Piccolo suggerimento:
verifica, come hai già fatto, la pressione dei pulsanti all'inizio del loop.
Se pdir è premuto, inverti la direzione.
Se pulsante è premuto, avanza o retrocedi a seconda della direzione.
Ci sarebbero altre cose da sistemare, ma meglio fare le cose a poco a poco.

Sì i pulsanti sono sul pin 2 per il controllo del funzionamento e sul pin 3 per la direzione. Li ho messi che si attivassero LOW mettendo una resistenza da 1M collegata tra in pin e il positivo, il pulsante è collagto tra il pin e il negativo. Senza la resistenza non era affidabile, il valore oscillava tra High e Low casualmente

per il controllo

Ho provato anche a metterlo fuori così:

 if (pdir == LOW){
    direz = !direz;
    }

  if ( pulsante == LOW)
  {

in questo modo posso premere i pulsanti in modo indipendente, ma rimane il problema che se tengo premuto un po' di più la variabile direz diventa casuale. Lo so, è perchè il loop di arduino ripercorre più volte il codice.

Come ovviare a questo?

Allora serve un'altra variabile contenente il valore della lettura precedente, e si esegue il cambio direzione solo quando si verifica la condizione precedente==HIGH e attuale==LOW. Poi si aggiorna precedente=attuale in modo che la attuale diventi la precedente del ciclo che verrà dopo.

Non ho capito molto bene ...scusa

Immagina di avere dir = 1.
Premi il pulsante, dir diventa dir = 0.
Ma il loop è - come hai detto - un loop quindi tu hai ancora il dito sul pulsante e dir diventa di nuovo 1.

Rimedio: devi far capire al loop se la tua pressione sul pulsante è una nuova pressione o si tratta del dito che è rimasto sul pulsante.
Come fare: come ti è stato suggerito, prendi una variabile che chiami vecchiopdir dove memorizzi la lettura del pulsante ad ogni loop e puoi così confrontare la lettura con la lettura fatta al precedente loop. Se sono entrambe LOW, vuol dire che si tratta del tuo dito che è rimasto sul pulsante.
Se la precedente è HIGH e la nuova lettura è LOW, invece, vuol dire che hai premuto il pulsante adesso.