Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1

    Semplicissimo timer con arduino

    mi servirebbe un timer con sensibilità di 1s e che lavori dell'ordine di 20-30 secondi per "pilotare" un ingranditore fotografico. visto che in commercio si trovano a partire da un centinaio di euro, ho pensato di costruirlo da me con poche monete, sfruttando arduino.
    io ho già steso il programma, ma visto che non sono molto esperto chiederei gentilmente a qualcuno che se ne intende più di me se può darci un'occhiata.


    codice:
    //Timer per Ingranditori 2.0 . Tale timer offre la possibilità di azionare un qualsiasi utilizzatore per un certo numero di secondi (min 1s), mediante l'utilizzo di
    //Arduino e di una scheda di comando per relè da collegarsi al pin 13. Il programma prevede l'utilizzo di 6 pulsanti: A(pin 2) per entrare nell'opzione di modifica, B(pin 3) per modificare il 
    //Tempo di un secondo, C(pin 4) per modificare il tempo di 10 secondi), D(pin 5) per resettare tutte le impostazioni, E(pin 6) per azionare il timer con le impostazioni correnti, F(pin 7)
    //che funge come interruttore continuo per il timer.
    
    int t=0; //valore tempo
    int a; //modalità modifica
    int b; //modifica 1 sec
    int c; //modifica 10 sec
    int d; //cancella tutto "reset"
    int e; //start
    int f; //continua
    boolean g; 
    
    
    void setup ()
    {
      pinMode(2, INPUT); //modalità modifica
      pinMode(3, INPUT); //modifica 1 sec
      pinMode(4, INPUT); //modifica 10 sec
      pinMode(5, INPUT); //cancella tutto "reset"
      pinMode(6, INPUT); //start
      pinMode(7, INPUT);
      pinMode(13, OUTPUT); //relè  
      g=false;
    }
    
    
    void loop ()
    {
      a=digitalRead(2);
      b=digitalRead(3);
      c=digitalRead(4);
      d=digitalRead(5);
      e=digitalRead(6);
      f=digitalRead(7);
      
      //Impostazioni di modifica
       if (a==HIGH)
       {
         if (b=HIGH)
         {
          t=t+1000;
         delay(1000); 
         }
         if (c=HIGH)
         {
           t=t+10000;
           delay (1000);
         }
       }
     
     //reset
       if (d==HIGH)
       {
        t=0;
        g=false;
       delay (1000); 
       }
       
       //start
       if (e==HIGH)
       {
        digitalWrite(13, HIGH);
        delay (t);
        digitalWrite(13, LOW); 
       }
      
      //corrente continua
       if (f=false)
       {
        digitalWrite(13, HIGH);
        f=true;
        delay (1000);
        }
       if (f=true)
       {
        digitalWrite(13, LOW);
        f=false;
        delay(1000);
       }
    }

    spero di non aver sbagliato la categoria!
    grazie mille in anticipo!
    Sellione98

  2. #2
    Ciao, sicuramente le ultime due if() sono sbagliate gli operatori = e == non sono uguali.
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  3. #3
    ho apportato la modifica che mi hai suggerito ed inoltre ho rimosso un pulsante che non era essenziale (quello di modifica). ecco il nuovo codice, dimmi se trovi errori!

    codice:
    //Timer per Ingranditori 2.0 di Doniselli Simone. Tale timer offre la possibilità di azionare un qualsiasi utilizzatore per un certo numero di secondi (min 1 s), mediante l'utilizzo di//Arduino e di una scheda di comando per relè da collegarsi al pin 13. La scheda prevede l'utilizzo di 5 pulsanti: B(pin 3) per modificare il 
    //Tempo di un secondo, C(pin 4) per modificare il tempo di 10 secondi), D(pin 5) per resettare tutte le impostazioni, E(pin 6) per azionare il timer con le impostazioni correnti, F(pin 7)
    //che funge come interruttore continuo per il timer.
    
    
    int t=0; //valore tempo
    int b; //modifica 1 sec            pulsante B
    int c; //modifica 10 sec           pulsante C
    int d; //cancella tutto "reset"    pulsante D
    int e; //start                     pulsante E
    int f; //continua                  pulsante F
    boolean g; 
    
    
    void setup ()
    {
      pinMode(3, INPUT); //modifica 1 sec
      pinMode(4, INPUT); //modifica 10 sec
      pinMode(5, INPUT); //cancella tutto "reset"
      pinMode(6, INPUT); //start
      pinMode(7, INPUT);
      pinMode(13, OUTPUT); //relè  
      g=false;
    }
    
    
    void loop ()
    {
      b=digitalRead(3);
      c=digitalRead(4);
      d=digitalRead(5);
      e=digitalRead(6);
      f=digitalRead(7);
      
      //Impostazioni di modifica
         if (b=HIGH)
         {
          t=t+1000;
         delay(1000); 
         }
         if (c=HIGH)
         {
           t=t+10000;
           delay (1000);
         }
     
     //reset
       if (d==HIGH)
       {
        t=0;
        g=false;
       delay (1000); 
       }
       
       //start
       if (e==HIGH)
       {
        digitalWrite(13, HIGH);
        delay (t);
        digitalWrite(13, LOW); 
       }
      
      //corrente continua
       if (f==false)
       {
        digitalWrite(13, HIGH);
        f=true;
        delay (1000);
        }
       if (f==true)
       {
        digitalWrite(13, LOW);
        f=false;
        delay(1000);
       }
    }
    Sellione98

  4. #4
    anzi ho rivoluzionato ancora il progetto:
    inizialmente volevo seguire questo schema
    PilotaRele1.gif
    per collegare il relè... poi ho scoperto il mitico "relay module" che mi ha evitato mille fatiche, ha aumentato la sicurezza e mi ha anche fatto risparmiare, allora ho modificato il codice:

    codice:
    //Timer per Ingranditori 2.0 . Tale timer offre la possibilità di azionare un qualsiasi utilizzatore per un certo numero di secondi (min 1 s), mediante l'utilizzo di
    //Arduino e di una scheda di comando per relè ("relay module") da collegarsi al pin 13 e attaccare al pin 12 in Vcc. La scheda prevede l'utilizzo di 5 pulsanti: B(pin 3) per modificare il 
    //Tempo di un secondo, C(pin 4) per modificare il tempo di 10 secondi), D(pin 5) per resettare tutte le impostazioni, E(pin 6) per azionare il timer con le impostazioni correnti, F(pin 7)
    //che funge come interruttore continuo per il timer.
    
    
    int t=0; //valore tempo
    int b; //modifica 1 sec            pulsante B
    int c; //modifica 10 sec           pulsante C
    int d; //cancella tutto "reset"    pulsante D
    int e; //start                     pulsante E
    int f; //continua                  pulsante F
    boolean g; 
    
    
    void setup ()
    {
      pinMode(3, INPUT); //modifica 1 sec
      pinMode(4, INPUT); //modifica 10 sec
      pinMode(5, INPUT); //cancella tutto "reset"
      pinMode(6, INPUT); //start
      pinMode(7, INPUT);
      pinMode(13, OUTPUT); //relè  
      pinMode(12, OUTPUT);
      digitalWrite(12, HIGH);
      g=false;
    }
    
    
    void loop ()
    {
      b=digitalRead(3);
      c=digitalRead(4);
      d=digitalRead(5);
      e=digitalRead(6);
      f=digitalRead(7);
      
      //Impostazioni di modifica
         if (b=HIGH)
         {
          t=t+1000;
         delay(1000); 
         }
         if (c=HIGH)
         {
           t=t+10000;
           delay (1000);
         }
     
     //reset
       if (d==HIGH)
       {
        t=0;
        g=false;
       delay (1000); 
       }
       
       //start
       if (e==HIGH)
       {
        digitalWrite(13, HIGH);
        delay (t);
        digitalWrite(13, LOW); 
       }
      
      //corrente continua
       if (f==false)
       {
        digitalWrite(13, HIGH);
        f=true;
        delay (1000);
        }
       if (f==true)
       {
        digitalWrite(13, LOW);
        f=false;
        delay(1000);
       }
    }
    e rifatto i collegamenti:
    timer v2.2.jpg

    ... devo solo aspettare che arrivi la busta dalla cina e vi faccio sapere
    Sellione98

  5. #5
    Dovresti prevedere una qualche funzione "anti-rimbalzo" per i pulsanti, altrimenti saranno quasi inutilizzabili.
    Le connessioni elettriche non mi sembrano corrette, se alimenti la scheda con 9V va bene usare il pin VIN, ma per i 5V (stabilizzati) devi usare il pin 5V.
    I moduli rele vanno alimentati collegandoli al pin 5V dell'arduino, ed al GND. Mantenendo il collegamento al pin 13 per il solo azionamento.
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  6. #6
    per l' anti-rimbalzo avevo pensato a quel "delay (1000);" in modo che dopo il primo impulso ricevuto non accettasse altri impulsi per un secondo... in alternativa mi consigli questo? dici che il mio sistema non funziona?

    per quanto riguarda l'alimentazione ho risolto (alimento a 5V dal jack)

    invece per quanto riguarda ho collegato il relè al pin GND, al 13 e al 12 che lascio HIGH fisso (guarda sotto "void setup"... dici che non va bene?)
    Sellione98

  7. #7
    Il delay() di solito non è una soluzione efficace, se lo provi te ne renderai conto.
    Un metodo più efficace è, rilevata la pressione di uno dei pulsanti, usare un ciclo che aspetti il rilascio del pulsante stesso.

    Ma intendi programmarlo utilizzarlo alla "cieca" ?
    Un lcd che mostra quanti secondi hai impostato, e altre info sarebbe molto utile.
    L'ideale è usare uno shield per arduino come questo :
    arduinolcdkeypadforstore3.jpg
    con circa 4€ (dalla cina con furore) hai un lcd 16x2 5 pulsanti (+1 per il reset hardware), e diversi pin disponibili per pilotare il rele o altro. Lo innesti sopra Arduino e il tutto diventa molto compatto
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  8. #8
    il problema è che il timer deve gestire un ingranditore fotografico, uno strumento che si usa in camera oscura che, come dice il nome stesso, deve essere oscura: meno luce c'è, meglio è... tanto non sarà un problema: con la luce di sicurezza (molto scura e di colore rosso, che si può usare, riuscirò a vedere più o meno i pulsanti e con molta calma imposterò il tempo... quindi si, alla cieca
    Sellione98

  9. #9
    quindi per quanto riguarda i pulsanti intendi dire una cosa così?

    codice:
    if (b=HIGH)
         {
         while (digitalRead(b)==HIGH)
          {
          }
          t=t+1000;
         delay(1000); 
         }
         if (c=HIGH)
         {
           t=t+10000;
           delay (1000);
         }
    Sellione98

  10. #10
    anzi scusa, ci ho messo delle cose inutili XD in questo modo se B viene premuto (if b=HIGH) dovrebbe aspettare (fare ciò che c'è scritto nel while, cioè nulla) mentre b=HIGH , poi, quando non è più HIGH (rilasciato il pulsante) eseguire t=t+1000 ... giusto? o ci va anche il delay?
    if(b=HIGH)
    {
    while(digitalRead(b)==HIGH)
    {
    }
    t
    =t+1000;
    Sellione98

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.