Modellino casa domotica

Salve a tutti, sto realizzando un progetto di un modellino di una casa domotica. Questa casa dovrebbe avere 3 funzioni:
aprire la porta di casa con un servomotore
aprire la porta del garage con un motore stepper, e un sistema di allarme con il sensore pir.
Io utilizzo un arduino mega 2560 quindi dovrebbero bastarmi i pin.
Il problema è che quando carico il codice i pulsanti e i motori non rispondono ai comandi. Ad esempio il servo motore ripete la sua parte sempre senza mai fermarsi eppure dovrebbe funzionare solo quando c'è tensione nel pulsante. Come posso fare? E' fattibile questo progetto solo con un arduino mega?
allego qua sotto il codice:


digita o inc#include <Servo.h>
#include <Stepper.h>
#define pulsante 13
#define pulsante2 8
const int stepsPerRevolution = 2048;
Stepper myStepper(stepsPerRevolution, 5, 3, 4, 2);

Servo servo;
#define servo_PIN 10
#define pulsante_PIN 7
 
int i=0;
 
void setup(){
pinMode(pulsante_PIN,INPUT);
servo.attach(10);
servo.write(0);
myStepper.setSpeed(10);
}
 
void loop(){
  if(digitalRead(pulsante_PIN) == HIGH){
for(i=0;i<90;i ++){
servo.write(i);
delay(20);
}delay(2500);

for(i=89;i>=0;i --){
servo.write(i);
delay(20);
}

 if(digitalRead(pulsante) == HIGH){
  myStepper.step(2048);
  delay(500);
 }
 if(digitalRead(pulsante2)==HIGH){
   myStepper.step(-2048);
   delay(500);
 }

  }   
  
} 

Questo è il forum inglese e la maggior parte delle persone non capisce l'italiano. Prova un'altra sezione.

Si la mega è ottima per questo progetto.
Il problema sembra essere legato alla modalità di input del pin. Normalmente si usa:

pinMode(pulsante_PIN, INPUT_PULLUP);

In questo modo una resistenza interna alla MCU viene collegata da un lato al pin e dall'altro a 5V. Questa resistenza assegna un riferimento stabile al pin che viene letto HIGH pertanto il pulsante deve essere collegato a GND, di modo che chiudendo il contatto alla pressione del pulsante verrà letto LOW.

Inoltre devi prendere coscienza del fatto che i contatti meccanici soffrono di rimbalzi detti bounce e da questo termine nasce la tecnica chiamata debounce per leggere in modo stabile lo stato di un pulsante.

Io ti consiglio di mettere da parte il progetto al momento e per adesso scontrarti con la dura realtà e cioè che non è così semplice come si pensi. Considera anche l'uso di una libreria per la gestione dei pulsanti la quale gestisce in automatico il debounce. Cercando "button library" ne troverai tante, io per iniziare ti consiglio JC_Button.

Per prendere confidenza potresti semplicemente fare accendere/spegnere il led integrato.
Inizialmente il led è spento. Dopo la pressione e rilasci del pulsante il led si accende. Una seconda pressione e rilasci spegne il led. Così via per successive pressioni e rilascio del pulsante.

Ciao.

Grazie mille per la risposta. Però provando a mettere la resistenza pullup e aggiungere la libreria il risultato non cambia è sempre quello di prima. Grazie mille
allego sketch:

#include <JC_Button.h>

#include <Servo.h>

#include <Stepper.h>
#define pulsante 13
#define pulsante2 8
const int stepsPerRevolution = 2048;
Stepper myStepper(stepsPerRevolution, 5, 3, 4, 2);

Servo servo;
#define servo_PIN 10
#define pulsante_PIN 7
 
int i=0;
 
void setup(){
pinMode(pulsante_PIN,INPUT_PULLUP);
pinMode(pulsante,INPUT_PULLUP);
pinMode(pulsante2,INPUT_PULLUP);
servo.attach(10);
servo.write(0);
myStepper.setSpeed(10);
}
 
void loop(){
  if(digitalRead(pulsante_PIN) == HIGH){
for(i=0;i<90;i ++){
servo.write(i);
delay(20);
}delay(2500);

for(i=89;i>=0;i --){
servo.write(i);
delay(20);
}

 if(digitalRead(pulsante) == HIGH){
  myStepper.step(2048);
  delay(500);
 }
 if(digitalRead(pulsante2)==HIGH){
   myStepper.step(-2048);
   delay(500);
 }

  }   
  
}

:warning:

@Mark_00: Ti segnalo che, nella sezione in lingua Inglese, si può scrivere SOLO in Inglese ... quindi, per favore, la prossima volta presta più attenzione in quale sezione metti i tuoi post; questa volta esso è stato spostato, da un moderatore della sezione di lingua Inglese, nella sezione di lingua Italiana ... la prossima volta potrebbe venire direttamente eliminato. Grazie.

Si vedo che non ci siamo capiti.

void loop() {
  if(digitalRead(pulsante_PIN) == LOW) {
      for(i=0;i<90;i ++) {
          servo.write(i);
          delay(20);
      }  

Se il pulsante e connesso da un lato a GND e dall'altro al pin 7, deve funzionare.
Quindi si dice che la logia risulta invertita, cioè pulsante premuto digitalRead() restituisce LOW, e HIGH con pulsante non premuto.

Riguardo alla libreria JC_Button non basta includerla, ma occorre seguire gli esempi inclusi per vedere cosa scrivere per usarla correttamente.

Ciao.

Aggiungo: l'indentazione (incolonnamento) del codice è scombinata, così non solo è difficile da leggere, ma sfuggono (o si commettono) tanti errori di logica. Se non si vuole incolonnare correttamente a mano c'è sempre la formattazione automatica dell'IDE CTRL +T

Per la libreria stavo per fare l'esempio di acquistare un biglietto dell'autobus e non salirci... non si va da nessuna parte :upside_down_face:

1 Like

Bisogna anche evitare, però, di mandare inutilmente segnali sporchi al microcontrollore e risolvere con il software quando basta mettere un condensatore! Metti 100nF in parallelo al pulsante e risolvi il problema dei rimbalzi!
Questo metodo non è applicabile solo quando si hanno molti pulsanti e si fa una matrice leggendola poi con una scansione, oppure quando usa un ingresso analogico con più pulsanti su un partitore resistivo.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.