aiuto programmazione

Salve a tutti chiedo a voi un aiuto non essendo molto pratico ancora di questo mondo
Sto cercando di realizzare un regolatore per motori 12v
Per un totale di 3 ma semplicemente comandati da 3 pulsanti .
Mi spiego meglio
2 pulsanti servono a aumentare e diminuire la velocita
Il terzo serve per selezionare a quale motore eseguire il comando di aumento e diminuizione velocita e qui mi blocco per ora sono riuscito a comandare un solo motore ma non so come comandarne altei due vi posto il mio skreth

// Regola la potenza di un motorino // attraverso con 2 pulsanti // by Pretato Kevin const int Motor = 3; //collegamento del motorino const int pdown = 11; //collegamento pulsante - const int pup = 10; //collegamento pulsante + int Pot = 0; //valore della potenza del motorino void setup() {    pinMode(Motor, OUTPUT); //PIN come uscita   pinMode(pdown, INPUT); //pin in uscita   pinMode(pup, INPUT); //pin in ingresso   digitalWrite(pdown, HIGH); //resistenza pull-up on   digitalWrite(pup, HIGH); //resistenza pull-up on } void loop() { if (digitalRead (pup) ==LOW) {   Pot = Pot +1 ; //aumenta la potenza   if (Pot == 255) {       Pot = 254;   } } if (digitalRead (pdown) ==LOW) {   Pot = Pot -1 ; //diminuiscie la potenza   if (Pot == 0) {       Pot = 1;   } } analogWrite(Motor, Pot); delay(100); }

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento: Regolamento

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

@nid69ita

Questa volta mi sono fermato in tempo (prima di duplicare la risposta) :smiley: :smiley: :smiley: :smiley: :smiley: :smiley:

Attilio

@ombra984

Dopo che avrai seguito le indicazioni di "nid69ita", in particolare presentazione e regolamento, ripubblica lo sketch (questa volta negli appositi tag) e dai una occhiata quì:

// Regola la potenza di un motorino 
// attraverso con 2 pulsanti 
// by Pretato Kevin 

const int Motor = 3; //collegamento del motorino 
const int pdown = 11; //collegamento pulsante - 
const int pup = 10; //collegamento pulsante + 
int Pot = 0; //valore della potenza del motorino 

void setup() 
{    
  pinMode(Motor, OUTPUT); //PIN come uscita   
  pinMode(pdown, INPUT); //pin in uscita   
  pinMode(pup, INPUT); //pin in ingresso   
  digitalWrite(pdown, HIGH); //resistenza pull-up on   
  digitalWrite(pup, HIGH); //resistenza pull-up on 
} 

void loop() 
{ 
  if (digitalRead (pup) ==LOW) 
  {   
    Pot = Pot +1 ; //aumenta la potenza   
    if (Pot == 255) 
    {       
      Pot = 254;   
    } 
  } 

  if (digitalRead (pdown) ==LOW) 
  {   
    Pot = Pot -1 ; //diminuiscie la potenza   
    if (Pot == 0) 
    {       
      Pot = 1;   
    } 
  } 

  analogWrite(Motor, Pot); 
  delay(100); 
}

Se non ho commesso errori quello sopra è il tuo sketch (dentro ai tag). :grin: :grin:

Prova a modificarlo così:

1- definisci tre pin, uno per ogni motore (Motor1, Motor2, Motor3)
2- nel loop metti un controllo che conti quante volte viene premuto il pulsante di selezione e memorizza il risultato in una variabile. Se hai tre motori conti fino a 3 e poi lo rimetti a 1
3- usa switch case per selezionare il motore in base al contatore di selezione e di conseguenza esegui la relativa analogwrite(MotorX, port) dove "X" sarà 1, 2 o 3.

Prova, spero di essermi spiegato, in caso contrario chiedi :smiley:

Attilio

PS. Io le resistenze di pullup/pulldown preferisco metterle esterne e non usare quelle interne di Arduino, ma è solo una mia fissazione, vedi tu.

Ok grazie procedo con la presentazione e grazie delle info

Eccomi qui ho modificato come mi havete detto ma ora non so come inserire il comando del pulsante selezione
E il comando switch case

const int Motor1 = 3; //pompa1   
const int Motor2 = 5; //pompa2
const int Motor3 = 6; //pompa3
const int pdown = 11; // pulsante -  
const int pup = 10; // pulsante +         
const int setp= 9; // pulsante selezione
int Pot = 0; //

void setup() 
{    
  pinMode(Motor, OUTPUT);
  pinMode(pdown, INPUT);
  pinMode(pup, INPUT);
  pinMode(setp, INPUT);
  digitalWrite(pdown, HIGH);
  digitalWrite(pup, HIGH);
}   

void loop() 
{ 
  if (digitalRead (pup) ==LOW) 
  {   
    Pot = Pot +1 ; //aumenta la potenza   
    if (Pot == 255) 
    {       
      Pot = 254;   
    } 
  } 

  if (digitalRead (pdown) ==LOW) 
  {   
    Pot = Pot -1 ; //diminuiscie la potenza   
    if (Pot == 0) 
    {       
      Pot = 1;   
    } 
  } 

  analogWrite(Motor, Pot); 
  delay(100); 
}

Quì sotto ti ho indicato in linea di massima gli interventi sul codice.
Prova a scriverli, io ora vado di corsa, poi se non ti riesce pazienta un pochino e qualche aiuto arriverà.

Mi raccomando non aprire altri post sullo stesso argomento. >:(

const int Motor1 = 3; //pompa1   
const int Motor2 = 5; //pompa2
const int Motor3 = 6; //pompa3
const int pdown = 11; // pulsante -  
const int pup = 10; // pulsante +         
const int setp= 9; // pulsante selezione
int Pot = 0; //
/*
aggiungi quì una variabile per contare le volte che hai premuto
il pulsante di selezione. Inizializzala a 0.
*/

void setup() 
{    
  pinMode(Motor, OUTPUT);
  pinMode(pdown, INPUT);
  pinMode(pup, INPUT);
  pinMode(setp, INPUT);
  digitalWrite(pdown, HIGH);
  digitalWrite(pup, HIGH);
}   

void loop() 
{ 
  if (digitalRead (pup) ==LOW) 
  {   
    Pot = Pot +1 ; //aumenta la potenza   
    if (Pot == 255) 
    {       
      Pot = 254;   
    } 
  } 

  if (digitalRead (pdown) ==LOW) 
  {   
    Pot = Pot -1 ; //diminuiscie la potenza   
    if (Pot == 0) 
    {       
      Pot = 1;   
    } 
  } 

  /*
  in questo punto metti il controllo del pulsante di selezione
  se è premuto incrementi la variabile di 1 poi controlli il valore
  se è > 3 lo metti a 1
  NB. Ricordati che se vuoi un conteggio preciso devi gestire una
        procedura di debounce (antirimbalzo)
  */

  /*
  in questo punto metti lo switch case per controllare il
  valore della variabile incrementata dal pulsante di selezione.
  In base al valore assunto controlli Motor1, Motor2 o Motor3.
  */

  analogWrite(Motor, Pot); 
  delay(100); 
}

Attilio

modifica eseguita con tutti gli errori ora devo provare sperando funzioni voi che ne dite ?
mi mancano ancora delle variabili che non so come iserirle aspetto info grazie a tutti

const int Motor1 = 3; //pompa1   
const int Motor2 = 5; //pompa2
const int Motor3 = 6; //pompa3
const int pdown = 11; // pulsante -  
const int pup = 10; // pulsante +         
const int setp= 9; // pulsante selezione
int Pot = 0; //
/*
aggiungi quì una variabile per contare le volte che hai premuto
il pulsante di selezione. Inizializzala a 0.
*/

void setup() 
{    
  pinMode(Motor1, OUTPUT);
  pinMode(Motor2, OUTPUT);
  pinMode(Motor3, OUTPUT);
  pinMode(pdown, INPUT);
  pinMode(pup, INPUT);
  pinMode(setp, INPUT);
  digitalWrite(pdown, HIGH);
  digitalWrite(pup, HIGH);
}   

void loop() 
{ 
  if (digitalRead (pup) ==LOW) 
  {   
    Pot = Pot +1 ; //aumenta la potenza   
    if (Pot == 255) 
    {       
      Pot = 254;   
    } 
  } 

  if (digitalRead (pdown) ==LOW) 
  {   
    Pot = Pot -1 ; //diminuiscie la potenza   
    if (Pot == 0) 
    {       
      Pot = 1;   
    } 
  } 
  
switch (setp) {

case 1:
  analogWrite(Motor1, Pot);
  delay(10);
  break;

case 2:
  analogWrite(Motor2, Pot);
  delay(10);
  break;

case 3:
  analogWrite(Motor3, Pot);
  delay(10);
  break;
  }
  
  /*
  in questo punto metti il controllo del pulsante di selezione
  se è premuto incrementi la variabile di 1 poi controlli il valore
  se è > 3 lo metti a 1
  NB. Ricordati che se vuoi un conteggio preciso devi gestire una
        procedura di debounce (antirimbalzo)
  */

  /*
  in questo punto metti lo switch case per controllare il
  valore della variabile incrementata dal pulsante di selezione.
  In base al valore assunto controlli Motor1, Motor2 o Motor3.
  */

  analogWrite(Motor1, Pot); 
  delay(1);
  analogWrite(Motor2, Pot); 
  delay(1);
  analogWrite(Motor3, Pot);
  delay(1);
}

Prova così.
Spero di non aver scritto cavolate ma vado di corsa. Comunque l'idea è questa vedi se ti ci raccapezzi.

const int Motor1 = 3; //pompa1   
const int Motor2 = 5; //pompa2
const int Motor3 = 6; //pompa3
const int pdown = 11; // pulsante -  
const int pup = 10; // pulsante +         
const int setp= 9; // pulsante selezione
int Pot = 0; //
int SelMotor = 0; //variabile per selezionare il motore

void setup() 
{    
  pinMode(Motor1, OUTPUT);
  pinMode(Motor2, OUTPUT);
  pinMode(Motor3, OUTPUT);
  pinMode(pdown, INPUT);
  pinMode(pup, INPUT);
  pinMode(setp, INPUT);
  digitalWrite(pdown, HIGH);
  digitalWrite(pup, HIGH);
}   

void loop() 
{ 
  if (digitalRead (pup) ==LOW) 
  {   
    Pot = Pot +1 ; //aumenta la potenza   
    if (Pot == 255) 
    {       
      Pot = 254;   
    } 
  } 

  if (digitalRead (pdown) ==LOW) 
  {   
    Pot = Pot -1 ; //diminuiscie la potenza   
    if (Pot == 0) 
    {       
      Pot = 1;   
    } 
  } 

  /* Controllo se è stato premuto il pulsante di selezione.	
     Ho ipotizzato una resistenza di pulldown sul pulsante
     e quindi controllo la condizione HIGH.
     Se usi una resistenza di pullup controlla la condizione
     LOW.
  */
  if (digitalRead (setp) == HIGH)
  {
    SelMotor ++; // incremento di 1 la variabile SelMotor
    delay(50); // delay antirimbalzo (estremamente rudimentale, si può fare di meglio)
    if (SelMotor > 3) // se sono arrivato a 4 riparto da 1 (ciclo tra i 3 motori)
    {
      SelMotor = 1;
    }
  }   
  switch (SelMotor)
  {
    case 1:
      analogWrite(Motor1, Pot);
      delay(10);
      SelMotor = 0; // metto a zero SelMotor così evito di continuare a variare lo stesso motore
      break;

    case 2:
      analogWrite(Motor2, Pot);
      delay(10);
      SelMotor = 0; // metto a zero SelMotor così evito di continuare a variare lo stesso motore
      break;

    case 3:
      analogWrite(Motor3, Pot);
      delay(10);
      SelMotor = 0; // metto a zero SelMotor così evito di continuare a variare lo stesso motore
      break;
  }
}

Ciao

Attilio

Grazie lho provato ma mi da dei piccoli problemi lho provato con dei led e appena aumento il primo parte subito a 100% cioe e non cbia case rimane sul primo cosa puo essere ?

Trovato l'inghippo :smiley: :smiley:

Ora funziona

const int Motor1 = 3; //pompa1   
const int Motor2 = 5; //pompa2
const int Motor3 = 6; //pompa3
const int pdown = 11; // pulsante -  
const int pup = 10; // pulsante +         
const int setp= 9; // pulsante selezione
int Pot = 0; //
byte SelMotor = 0; //variabile per selezionare il motore
byte Varia = 0; // switch che abilita variazione motori

void setup() 
{    
  pinMode(Motor1, OUTPUT);
  pinMode(Motor2, OUTPUT);
  pinMode(Motor3, OUTPUT);
  pinMode(pdown, INPUT);
  pinMode(pup, INPUT);
  pinMode(setp, INPUT);
  digitalWrite(pdown, HIGH);
  digitalWrite(pup, HIGH);
  digitalWrite(setp, LOW);    
}   

void loop() 
{ 
  if (digitalRead (pup) ==LOW) 
  {   
    Pot = Pot +1 ; //aumenta la potenza   
    if (Pot == 255) 
    {       
      Pot = 254;   
    } 
  } 

  if (digitalRead (pdown) ==LOW) 
  {   
    Pot = Pot -1 ; //diminuiscie la potenza   
    if (Pot == 0) 
    {       
      Pot = 1;   
    } 
  } 

  /* Controllo se è stato premuto il pulsante di selezione.    
     Ho ipotizzato una resistenza di pulldown sul pulsante
     e quindi controllo la condizione HIGH.
     Se usi una resistenza di pullup controlla la condizione
     LOW.
  */

  if (digitalRead (setp) == HIGH)
  {
    Varia = 1;
    SelMotor ++; // incremento di 1 la variabile SelMotor
    delay(50); // delay antirimbalzo (estremamente rudimentale, si può fare di meglio)
    if (SelMotor > 3) // se sono arrivato a 4 riparto da 1 (ciclo tra i 3 motori)
    {
      SelMotor = 1;
    }
  }

  if (Varia == 1)
  {   
    switch (SelMotor)
    {
      case 1:
        analogWrite(Motor1, Pot);
        delay(10);
        Varia = 0; // metto a zero Varia così evito di continuare a variare lo stesso motore
        break;

      case 2:
        analogWrite(Motor2, Pot);
        delay(10);
        Varia = 0; // metto a zero Varia così evito di continuare a variare lo stesso motore
        break;

      case 3:
        analogWrite(Motor3, Pot);
        delay(10);
        Varia = 0; // metto a zero Varia così evito di continuare a variare lo stesso motore
        break;
    }
  }
}

Esamina il codice e vedi se trovi dove era l'errore.
In caso chiedi e ti spiego l'arcano :grin:

Attilio

E cambiato i segnali e i byte proviamo cosi con una resistenza da 10k come puldown grazie per la pazienza
Lo dovo poi inserire nel aquario per delle pompe peristaltiche e poter regolare la velocita individualmente

Ma la resistenza di pul up o donw secondo voi devo metterla anche sui pulsanti di regolazione della velocita? Perche mi fa uno scherzetto che come premo la regolazione parte al 100%

Anzi a dir la verita non regola proprio la velocita passa da 1 a 100% dando un impulso ma solo do il comando piu o meno e poi seleziono il motore
E quando cambio motore per selezzionare la velocita si porta dietro la memoria del motore prima portandolo anche lui da 0 a 100 o viceversa

ombra984:
Ma la resistenza di pul up o donw secondo voi devo metterla anche sui pulsanti di regolazione della velocita? Perche mi fa uno scherzetto che come premo la regolazione parte al 100%

Si le resistenze vanno su tutti i pulsanti.

Poi dovresti implementare anche un anti rimbalzo se vuoi che non vengano letti valori errati.

Dai una letta quì

http://playground.arduino.cc/Learning/SoftwareDebounce

oppue cerca con google "debounce arduino" o "antirimbalzo con arduino"

Ciao

Attilio

Perfetto il problema e stato risolto ora lunica cosa e la regolazione della velocita che se la regolo in negativo o in positivo va in loop continuo e quando arrivo a 1 cioe 0 % ritorna a 254

Trovato larcano ma non so come scriverlo per farlo funzionare allora devo impostare che se il valore Pot e uguale a 0 non riceve piu input dal pin mode imput non so se mi spiego

ombra984:
Perfetto il problema e stato risolto ora lunica cosa e la regolazione della velocita che se la regolo in negativo o in positivo va in loop continuo e quando arrivo a 1 cioe 0 % ritorna a 254

Posta lo sketch aggiornato e vediamo.

Attilio

Ok stasera posto lo sketch aggiornato cosi vi chiedo un aiuto in piu

eccolo
e poi ho un problemino legato allo start cioe appea si accende vorrei che tutti i motori partissero da 1 con gia selezzionato il case 1

const int Motor1 = 3; //pompa1   
const int Motor2 = 5; //pompa2
const int Motor3 = 6; //pompa3
const int pdown = 11; // pulsante -  
const int pup = 10; // pulsante +         
const int setp= 9; // pulsante selezione
const int led1= 7;
const int led2= 8;
const int led3= 12;
int Pot1 = 0;
int Pot2 = 0;
int Pot3 = 0;
byte SelMotor = 0;
byte Varia = 0;

void setup() 
{    
  pinMode(Motor1, OUTPUT);
  pinMode(Motor2, OUTPUT);
  pinMode(Motor3, OUTPUT);
  pinMode(pdown, INPUT);
  pinMode(pup, INPUT);
  pinMode(setp, INPUT);
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  digitalWrite(pdown, HIGH);
  digitalWrite(pup, HIGH);
  digitalWrite (setp, LOW);
  
}   

void loop() {
    


    
   
  /* Controllo se è stato premuto il pulsante di selezione.	
      Ho ipotizzato una resistenza di pulldown sul pulsante
     e quindi controllo la condizione HIGH.
     Se usi una resistenza di pullup controlla la condizione
     LOW.
  */
  if (digitalRead (setp) == HIGH)
  {
    Varia = 1;
    SelMotor ++; // incremento di 1 la variabile SelMotor
    delay(50); // delay antirimbalzo (estremamente rudimentale, si può fare di meglio)
    if (SelMotor > 3) // se sono arrivato a 4 riparto da 1 (ciclo tra i 3 motori)
    {
      SelMotor = 1;
    }
  } 
    if (Varia == 1)  
  {
    switch (SelMotor)
  {
    case 1:
    if (digitalRead (pup) ==LOW) {
    Pot1 = Pot1 +1;
    
    if (Pot1 == 255) {
        Pot1 = 254;
  }
}
    if (digitalRead (pdown) ==LOW){
    Pot1 = Pot1 -1;
  
    if (Pot1 == 0){
        Pot1 = 1;
    
    }
}
      analogWrite(Motor1, Pot1);
      delay(200);
      Varia = 1; // metto a zero SelMotor così evito di continuare a variare lo stesso motore
      digitalWrite(led1, HIGH);
      digitalWrite(led2, LOW);
      digitalWrite(led3, LOW);
      break;

    case 2:
   if (digitalRead (pup) ==LOW) {
    Pot2 = Pot2 +1;
    
    if (Pot2 == 255) {
        Pot2 = 254;
  }
}
    if (digitalRead (pdown) ==LOW){
    Pot2 = Pot2 -1;
  
    if (Pot2 == 0){
        Pot2 = 1;
    
    }
}
      analogWrite(Motor2, Pot2);
      delay(200);
      Varia = 1; // metto a zero SelMotor così evito di continuare a variare lo stesso motore
      digitalWrite(led1, LOW);
      digitalWrite(led2, HIGH);
      digitalWrite(led3, LOW);
      break;

    case 3:
   if (digitalRead (pup) ==LOW) {
    Pot3 = Pot3 +1;
    
    if (Pot3 == 255) {
        Pot3 = 254;
  }
}
    if (digitalRead (pdown) ==LOW){
    Pot3 = Pot3 -1;
  
    if (Pot3 == 0){
        Pot3 = 1;
    
    }
}                         
      analogWrite(Motor3, Pot3);
      delay(200);
      Varia = 1; // metto a zero SelMotor così evito di continuare a variare lo stesso motore
      digitalWrite(led1, LOW);
      digitalWrite(led2, LOW);
      digitalWrite(led3, HIGH);
      break;
  }
  }
  }