Software

Salve ragazzi sono nuovo del forum per cui non so se sto scrivendo nel posto giusto.
Vorrei chiedervi una mano. Premetto che sono un principiante in programmazione. Per l'esame di stato vorrei portare un progettino ed ho bisogno di programmarè arduino affinché ogni volta che premo un pulsante mi muova il pimo motore per 1 secondo , ogni 26 volte che premo il pulsante mi muova anche il secondo motore per 1 secondo ed ogni 676 volte che premo il pulsante mi muova anche il tetzo motore per un secondo

NO, non stai scrivendo nel posto giusto ...
... nella sezione dove avevi messo il post c'è chiaramente scritto, in grassetto, di non postare nulla ... quindi, per favore, la prossima volta presta più attenzione, poi, essendo questo il tuo primo post, ti chiedo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione) e di leggere con attenzione il REGOLAMENTO ... Grazie.

Guglielmo

P.S.: Il tuo post è stato spostato nell'opportuna sezione del forum

Scusami il regolamento lo avevo letto ma ieri internet mi dava problemi e non riuscivo ad aprire la pagina giusta

Che tipo di motori hai collegato? Come? Puoi fare uno schema dei collegamenti e mettere anche il codice che hai scritto fino ad ora (… mi raccomando, racchiuso tra i tag CODE che, in fase di edit, ti inserisce il bottone </> … primo a sinistra)?

Guglielmo

Hai giá incominciato a scrivere un sketch?
Cosa sono i Tuoi problemi?
Ciao Uwe

Stai ricostruendo Enigma? :smiley:

Si sto ricostruendo enigma.
Quando vado a casa posto tutto
Grazie

const int  buttonPin = 2;     
const int motore1Pin = 8;         
const int motore2Pin = 9;        
const int motore3Pin = 10;       
 
// Variables will change:  
int buttonPushCounter = 0;   // counter for the number of button presses  
int buttonState = 0;         // current state of the button  
int lastButtonState = 0;     // previous state of the button  
 
void setup() {  
 // initialize the button pin as a input:  
 pinMode(motore1Pin, OUTPUT);       // imposta il pin digitale come output  
 pinMode(motore2Pin, OUTPUT);       // imposta il pin digitale come output 
 pinMode(motore3Pin, OUTPUT);       // imposta il pin digitale come output 
 pinMode(buttonPin, INPUT); 
 // initialize serial communication:  
 Serial.begin(9600);  
}  
 
void loop() {  
 // read the pushbutton input pin:  
 buttonState = digitalRead(buttonPin);  
 
 // compare the buttonState to its previous state  
 if (buttonState != lastButtonState) {  
   // if the state has changed, increment the counter  
   if (buttonState == HIGH) {  
     // if the current state is HIGH then the button  
     // wend from off to on:  
     buttonPushCounter++;  
     Serial.println("on");  
     Serial.print("number of button pushes:  ");  
     Serial.println(buttonPushCounter, DEC);  
   }  
   else {  
     // if the current state is LOW then the button  
     // wend from on to off:  
     Serial.println("off");  
   }  
 
   // save the current state as the last state,  
   //for next time through the loop  
   lastButtonState = buttonState;  
 }  
 
 // turns on the LED every four button pushes by  
 // checking the modulo of the button push counter.  
 // the modulo function gives you the remainder of  
 // the division of two numbers:  
 if (buttonPushCounter % 676 == 0) {  
 digitalWrite(motore1Pin, HIGH);  // accende il LED  
   digitalWrite(motore2Pin, HIGH);  // accende il LED
   digitalWrite(motore3Pin, HIGH);  // accende il LED    
   delay(500);              // aspetta un secondo  
   digitalWrite(motore1Pin, LOW);  // accende il LED  
   digitalWrite(motore2Pin, LOW);  // accende il LED
   digitalWrite(motore3Pin, LOW);  // accende il LED 
   delay(500);              // aspetta un secondo  
  } else {
    if (buttonPushCounter%26 ==0) {
     digitalWrite(motore1Pin, HIGH);  // accende il LED  
   digitalWrite(motore2Pin, HIGH);  // accende il LED
   digitalWrite(motore3Pin, LOW);  // accende il LED    
   delay(500);              // aspetta un secondo  
   digitalWrite(motore1Pin, LOW);  // accende il LED  
   digitalWrite(motore2Pin, LOW);  // accende il LED
   digitalWrite(motore3Pin, LOW);  // accende il LED 
   delay(500);              // aspetta un secondo  
    } else {
    digitalWrite(motore1Pin, HIGH);  // accende il LED  
   digitalWrite(motore2Pin, LOW);  // accende il LED
   digitalWrite(motore3Pin, LOW);  // accende il LED    
   delay(500);              // aspetta un secondo  
   digitalWrite(motore1Pin, LOW);  // accende il LED  
   digitalWrite(motore2Pin, LOW);  // accende il LED
   digitalWrite(motore3Pin, LOW);  // accende il LED 
   delay(500);              // aspetta un secondo  
    }
  }
  
 
}

Questo è il programma che ho fatto riadattando uno che ho trovato. Ovviamente non funziona.

:frowning:

@Antoniospa: … eppure eri stato invitato a leggere con attenzione il regolamento e …
… in conformità al regolamento, punto 7, devi editare il tuo post (in basso a destra del post, bottone More → Modify) e racchiudere il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone fatto così: </>, tutto a sinistra).

Guglielmo

Non funziona perchè hai inserito tutto nel loop() principale, quindi ti accedne e spegne di continuo i led anche se non premi il tasto
Suddividi in due parti, loop principale e richiami la routine dei led solo quando premi il tasto
in pratica aggiungi il richiamo alla routine

      buttonPushCounter++;
       controlla(); // esegue solo quando il pulsante cambia di stato
      etc etc

e dividi la parte dei led

void controlla() {
  // turns on the LED every four button pushes by
  // checking the modulo of the button push counter.
  // the modulo function gives you the remainder of
  // the division of two numbers:
  if (buttonPushCounter % 676 == 0) {
  etc etc

ovviamente aggiungi una graffa alla fine del loop principale

Se stai ricostruendo Enigma, probabilmente saprai che i dischi si muovevano per archi precisi (ogni rotazione spostava il disco dell'arco preciso fra due contatti), e che il sistema prevedeva anche l'uso di piu di 3 dischi (ma questo decidi tu se implementarlo o no), quindi non ti basta "muovere il motore per 1 secondo", se vuoi costruire un'oggetto funzionante, ti serve un sistema per "dire" ad arduino "quando" il disco si e' mosso dell'arco giusto ... quindi piu che muovere i motori per "tot" tempo, sarebbe meglio che tu usassi un qualche tipo di sensori ...

Ad esempio, e rimanendo sul semplice, potresti usare alcune forcelle ottiche, posizionate in modo che il bordo dei dischi, quando inseriti, vada a finire all'interno della corrispondente forcella ... a quel punto basterebbe che tu facessi 26 tagli lungo il bordo, fatti in modo che si trovino al centro della forcella quando i contatti sono posizionati correttamente, ed avresti un sistema dal funzionamento molto piu sicuro che usando solo i tempi ... :wink:

la rotazione dei dischi la regolo una volta montato il tutto

Non so se ho sbagliato qualcosa ma non funziona ancora

const int  buttonPin = 2;     
const int motore1Pin = 8;         
const int motore2Pin = 9;        
const int motore3Pin = 10;       
  
// Variables will change:  
int buttonPushCounter = 0;   // counter for the number of button presses  
int buttonState = 0;         // current state of the button  
int lastButtonState = 0;     // previous state of the button  
  
void setup() {  
  // initialize the button pin as a input:  
  pinMode(motore1Pin, OUTPUT);       // imposta il pin digitale come output  
  pinMode(motore2Pin, OUTPUT);       // imposta il pin digitale come output 
  pinMode(motore3Pin, OUTPUT);       // imposta il pin digitale come output 
  pinMode(buttonPin, INPUT); 
  // initialize serial communication:  
  Serial.begin(9600);  
}  
  
void loop() {  
  // read the pushbutton input pin:  
  buttonState = digitalRead(buttonPin);  
  
  // compare the buttonState to its previous state  
  if (buttonState != lastButtonState) {  
    // if the state has changed, increment the counter  
    if (buttonState == HIGH) {  
      // if the current state is HIGH then the button  
      // wend from off to on:  
      buttonPushCounter++;
      controlla();  
      Serial.println("on");  
      Serial.print("number of button pushes:  ");  
      Serial.println(buttonPushCounter, DEC);  
    }  
    else {  
      // if the current state is LOW then the button  
      // wend from on to off:  
      Serial.println("off");  
    }  
  
    // save the current state as the last state,  
    //for next time through the loop  
    lastButtonState = buttonState;  
  }  
  }
 void controlla() {
  // turns on the LED every four button pushes by  
  // checking the modulo of the button push counter.  
  // the modulo function gives you the remainder of  
  // the division of two numbers:  
  if (buttonPushCounter % 676 == 0) {  
  digitalWrite(motore1Pin, HIGH);  // accende il LED  
    digitalWrite(motore2Pin, HIGH);  // accende il LED
    digitalWrite(motore3Pin, HIGH);  // accende il LED    
    delay(500);              // aspetta un secondo  
    digitalWrite(motore1Pin, LOW);  // accende il LED  
    digitalWrite(motore2Pin, LOW);  // accende il LED
    digitalWrite(motore3Pin, LOW);  // accende il LED 
    delay(500);              // aspetta un secondo  
   } else {
     if (buttonPushCounter%26 ==0) {
      digitalWrite(motore1Pin, HIGH);  // accende il LED  
    digitalWrite(motore2Pin, HIGH);  // accende il LED
    digitalWrite(motore3Pin, LOW);  // accende il LED    
    delay(500);              // aspetta un secondo  
    digitalWrite(motore1Pin, LOW);  // accende il LED  
    digitalWrite(motore2Pin, LOW);  // accende il LED
    digitalWrite(motore3Pin, LOW);  // accende il LED 
    delay(500);              // aspetta un secondo  
     } else {
     digitalWrite(motore1Pin, HIGH);  // accende il LED  
    digitalWrite(motore2Pin, LOW);  // accende il LED
    digitalWrite(motore3Pin, LOW);  // accende il LED    
    delay(500);              // aspetta un secondo  
    digitalWrite(motore1Pin, LOW);  // accende il LED  
    digitalWrite(motore2Pin, LOW);  // accende il LED
    digitalWrite(motore3Pin, LOW);  // accende il LED 
    delay(500);              // aspetta un secondo  
     }
   }
   
  
}

Ma una resistenza di PullDown l'hai messa sul pin dove è collegato il pulsante ?

si di 1 K

praticamente se premo il pulsante smette di contare.
a pulsante rilasciato invece conta di continuo.

Appunto, hai collegato male il pulsante e la resistenza

la resistenza va' tra il GND e il pin 2 e il pin2 è connesso a un capo del pulsante
all'altro capo del pulsante va' collegato il +5V

Antoniospa:
... Per l'esame di stato vorrei portare un progettino ... ogni 676 volte che premo il pulsante mi muova anche il tetzo motore

Mi immagino uno studente che preme un pulsante 676 volte durante l'esame di Stato, con la commissione che guarda grattandosi e lo studente: "..click... 201 ... click... 202... click... ora ci arriviamo, abbiate pazienza, ... click... 203... ops ho perso il conto, resetto..."

Se non l'avevi gia trovato, questo magari ti puo interessare, anche per dettagli storici