Timer ingranditore con Keypad

Discussioni sui vari accessori necessari in camera oscura (tank, termometri, marginatori, taglierine, focometri, timer, esposimetri, etc..)

Moderatore: etrusco

Avatar utente
DanieleLucarelli
guru
Messaggi: 1154
Iscritto il: 12/08/2010, 16:56
Reputation:
Località: Livorno
Contatta:

Timer ingranditore con Keypad

Messaggio da DanieleLucarelli »

Chi di voi non conosce Arduino? Io non lo conoscevo fino a quando mio figlio non si è invaghito di robotica ludica (minisumo, line follower, ecc.).
Dopo la realizzazione del primo robot evita ostacoli su piattaforma Arduino e dopo il post sulla realizzazione del timer per ingranditori mi è venuta voglia di provarci.

Il timer per adesso è pensato molto semplice; 2 modalità di funzionamento:

UP - alla pressione del pedale accensione ingranditore e conto in avanti con beep ogni secondo, nuova pressione per spengere l'ingranditore e mettere in pausa il conteggio (una nuova pressione riaccende e fa ripartire il conto da dove eravamo rimasti), tasto dedicato per il reset del conteggio.

doun (Down ma il display non sa scrivere la W e la d maiuscola) - Si imposta un tempo (precisione al decimo di secondo e tempo massimo di 999.9 secondi), il solito tasto per eventuale reset, si preme il pedale e parte il conto alla rovescia con solito beep ad ogni secondo. Un'ulteriore pressione del pedale mette in pausa il conto e spegne l'ingranditore. Se si arriva a fine conteggio si spenge l'ingranditore e il timer si riposiziona sull'ultimo tempo impostato.

Unico controllore un tastierino numerico a 12 tasti.

Personalizzato per Analogica.it :)

Appena pronto regalo a chiunque: Schema elettrico, lista della spesa, software.

Il bello di Arduino è che si programma attaccandolo USB al PC.
Il bello di Arduino è che è tutto italiano.

La realizzazione a prova di incapace (visto che lo sto facendo io).

Specifiche tecniche:
- Timer programmabile da 0,1 a 999,9 secondi con precisione di un decimo di secondo. Funzione di Count UP e Count Down.
- Errore + o - 4 microsecondi (inutile ma la scheda questo da).
- L'intervento del pedale è sempre al rilascio (si schiaccia e non succede niente, si rilascia e si effettua l'azione), questo mi pare funzionale in quanto si può cercare il pedale al buio e premerlo con anticipo rilasciandolo quando serve).
- Tempo di interrvento del pedale 1/20 di secondo.
- Funzione count up e count down con beep diversi (count up fa un beep acuto mentre down lo fa grave).
- Solo un tastierino numerico per fare tutto e nessun tasto multifunzione inserire qualsiasi tempo è immediato.
- Carico interrompibile 2200 Watt.
- Display a luminosità regolabile.
- Possibilità di personalizzare le funzioni con aggiornamenti firmware collegando semplicemente il timer al pc via usb.

Lo schema e i componenti: http://www.analogica.it/timer-ingrandit ... 03-13.html
Il video del prototipo appena abbozzato: http://www.farefoto.net/appo4u/Timerino.avi
Il video del funzionamento in Full-HD:

Il video del prodotto finito: http://www.farefoto.net/appo4u/Timerino2.avi
Ultima modifica di DanieleLucarelli il 14/06/2013, 8:23, modificato 8 volte in totale.



Telegram Vieni a scoprire il canale telegram di analogica.it - tantissime offerte su materiale fotografico analogico nuovo ed usato Offerte materiale analogico


Avatar utente
DanieleLucarelli
guru
Messaggi: 1154
Iscritto il: 12/08/2010, 16:56
Reputation:
Località: Livorno
Contatta:

Re: Timerino... della serie: proviamoci anche noi.

Messaggio da DanieleLucarelli »

Dimenticavo il video del prototipo appena abbozzato:

http://www.farefoto.net/appo4u/Timerino.avi

Notare la bellezza dell'accensione con la citazione del forum a scorrimento.

Notate che se impostato UP non si riesce a impostare il tempo e il timer scocciato ci ricorda che siamo in modalità UP.

Notate l'inserimento del tempo con ingresso da destra verso sinistra (per impostare 10 sec. e 5 dec. bisogna scrivere 105).

Avatar utente
etrusco
moderatore
Messaggi: 4657
Iscritto il: 08/12/2009, 12:16
Reputation:
Località: Viterbo
Contatta:

Re: Timerino... della serie: proviamoci anche noi.

Messaggio da etrusco »

Il bello di arduino è che è un'idea tutta italiana ... Giusto per rimarcare il concetto che le menti brillanti, in Italia , ci sono sempre state

Scusate l'ot ma in periodo di crisi e di fuga di cervelli mi piacere sottolineare certe cose :-)


Etrusco.

Sent from my iPhone using Tapatalk.
ImmaginePssss, Hei! ... Ti sei ricordato di registrare la tua camera oscura su darkroom locator?

pensando - offerte sconti

Avatar utente
DanieleLucarelli
guru
Messaggi: 1154
Iscritto il: 12/08/2010, 16:56
Reputation:
Località: Livorno
Contatta:

Re: Timerino... della serie: proviamoci anche noi.

Messaggio da DanieleLucarelli »

Appena finito questo ho già progettato:

- Film-ino = Sviluppatrice automatizzata motorizzata
- Stamp-ino = Timer per trattamento stampe con agitatore motorizzato e gestione sviluppo fattoriale.

All'inizio avevo pensato di utilizzare una sola scheda Arduino che a secoda di dove era collegata gestiva l'apparecchio ma non sono sicuro di farcela. Se ci riuscissi il prezzo della scheda sarebbe ammortizzato su più strumenti.

Daniele.

P.S.
Ho notato che tutti i progetti realizzati con Arduino hanno un nome che termina in INO e mi sono adeguato.

Sent from Etrusco's iPhone that I have stolen 5 minutes ago. B-) =))

Avatar utente
franny71
superstar
Messaggi: 2635
Iscritto il: 21/11/2011, 12:53
Reputation:
Località: Anzio (RM)

Re: Timerino... della serie: proviamoci anche noi.

Messaggio da franny71 »

grande Daniele!
io non ci capisco una cioffola, ma sono contento per te e per altri utenti che si vorranno cimentare... ;)
Franco
il mio Flickr

Я родилась даже не узнал

Avatar utente
mjrndr
guru
Messaggi: 1261
Iscritto il: 21/06/2012, 10:19
Reputation:
Località: Bergamo

Re: R: Timerino... della serie: proviamoci anche noi.

Messaggio da mjrndr »

DanieleLucarelli ha scritto: Sent from Etrusco's iPhone that I have stolen 5 minutes ago. B-) =))
Era ora che qualcuno glielo rubasse :D :D :D

Sempre a farci pesare che lui ha un iphone e usa tapatalk :D :D

Ma la scritta "posso chiederti come ci hai trovato" la scrivi tutte le volte o ce l'hai in firma? :D :D


Andrea

Avatar utente
hUMANtORCH
guru
Messaggi: 328
Iscritto il: 28/10/2012, 17:38
Reputation:

Re: Timerino... della serie: proviamoci anche noi.

Messaggio da hUMANtORCH »

DanieleLucarelli ha scritto:Dimenticavo il video del prototipo appena abbozzato:

http://www.farefoto.net/appo4u/Timerino.avi

Notare la bellezza dell'accensione con la citazione del forum a scorrimento.

Notate che se impostato UP non si riesce a impostare il tempo e il timer scocciato ci ricorda che siamo in modalità UP.

Notate l'inserimento del tempo con ingresso da destra verso sinistra (per impostare 10 sec. e 5 dec. bisogna scrivere 105).
Io non vedo il video :(

Grande Idea :D
amo il mio opposto,il mio negativo,il mio veleno è il migliore dei miei antidoti....è sbagliato....è impossibile....ma è vero,è reale!


http://www.flickr.com/photos/_humantorch_/

http://500px.com/_hUMANtORCH_

luca_dega
superstar
Messaggi: 1506
Iscritto il: 17/11/2011, 13:34
Reputation:

Re: Timerino... della serie: proviamoci anche noi.

Messaggio da luca_dega »

hUMANtORCH ha scritto:
Io non vedo il video :(
scarica VLC media player: è A GRATIS e legge qualsiasi cosa, anche file danneggiati.

Avatar utente
etrusco
moderatore
Messaggi: 4657
Iscritto il: 08/12/2009, 12:16
Reputation:
Località: Viterbo
Contatta:

Re: Timerino... della serie: proviamoci anche noi.

Messaggio da etrusco »

Molto spiritosi ... Complimenti!




Etrusco.

Sent from 'cà nisciun è fess'
ImmaginePssss, Hei! ... Ti sei ricordato di registrare la tua camera oscura su darkroom locator?

pensando - offerte sconti

Avatar utente
DanieleLucarelli
guru
Messaggi: 1154
Iscritto il: 12/08/2010, 16:56
Reputation:
Località: Livorno
Contatta:

Re: Timerino... della serie: proviamoci anche noi.

Messaggio da DanieleLucarelli »

Finito ieri... pensavo fosse più difficile.


Oggi gitarella a Bologna... lunedì posto schemi, componenti.

Intanto il codice:

Codice: Seleziona tutto

#include <SoftwareSerial.h>
#include <Keypad.h>
SoftwareSerial Serial7Segment(2, 12); //RX pin, TX pin

// Costanti
const byte ROWS = 4; //4 righe
const byte COLS = 3; //3 colonne
//const byte ledPin = 13; //Pin a cui è collegato il LED
const byte buzPin = 9; //Pin a cui è collegato il Buzzer
const byte pedPin = 13; //Pin a cui è collegato il Pedale
const byte relPin = 10; //Pin a cui è collegato il Relé

//Variabili
int scroll = 300;
int ncifra = 0;
int tempo;
int appo_tempo;
long old_mil = 0;
long errlet = 0;
int buttonState = 0;         // Stato del pedale
int lastButtonState = LOW;     // Appoggio per lo stato precedente del pedale
boolean up = true;
boolean avviato = false;
boolean premuto = false;

char tempString[4]; //Appoggio per sprintf
char key;
char benvenuto[12] = {'A', 'N', 'A', 'L', 'O', 'G', 'I', 'C', 'A', '.', 'I', 'T'};
char keys[ROWS][COLS] = {  //Mappatura keypad
	{'1','2','3'},
	{'4','5','6'},
	{'7','8','9'},
	{'*','0','#'}
	};
byte rowPins[ROWS] = {5, 4, 3, 2}; //pin a cui sono connessi gli output di riga del keypad
byte colPins[COLS] = {8, 7, 6}; //pin a cui sono connessi gli output di colonna del keypad
	
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup() {
  Serial.begin(9600);
  Serial.println(">>> Debug attivo <<<");
//  pinMode(ledPin, OUTPUT);      // led pin in Output
  pinMode(buzPin, OUTPUT);      // Buzzer pin in Output
  pinMode(relPin, OUTPUT);      // Relé pin in Output
  pinMode(pedPin, INPUT);       // Pedale pin in Input

  // Setup 7SegmentDisplay
  Serial7Segment.begin(9600); //Connessione con il display via Seriale a 9600 bps
  Serial7Segment.write('v'); //Reset del display - si forza il cursore ad andare al primo carattere
  Serial7Segment.write(0x7A);  // Brightness control command
  Serial7Segment.write((byte) 16);  // dimmest value (must type-def 0)


  Serial7Segment.write('A');
  delay(scroll);
  Serial7Segment.write('N');
  delay(scroll);
  Serial7Segment.write('A');
  delay(scroll);
  Serial7Segment.write('L');
  delay(scroll);
  Serial7Segment.write('N');
  Serial7Segment.write('A');
  Serial7Segment.write('L');  
  Serial7Segment.write('O');
  delay(scroll);
  Serial7Segment.write('A');
  Serial7Segment.write('L');  
  Serial7Segment.write('O');
  Serial7Segment.write('G');
  delay(scroll);
  Serial7Segment.write('L');  
  Serial7Segment.write('O');
  Serial7Segment.write('G');
  Serial7Segment.write('I');
  delay(scroll);
  Serial7Segment.write('O');
  Serial7Segment.write('G');
  Serial7Segment.write('I');
  Serial7Segment.write('C');
  delay(scroll);
  Serial7Segment.write('G');
  Serial7Segment.write('I');
  Serial7Segment.write('C');
  Serial7Segment.write('A');
  Serial7Segment.write(0x77);
  Serial7Segment.write(0b00001000);
  delay(scroll);
  Serial7Segment.write('I');
  Serial7Segment.write('C');
  Serial7Segment.write('A');
  Serial7Segment.write(0x77);
  Serial7Segment.write(0b00000100);
  Serial7Segment.write('I');  
  delay(scroll);
  Serial7Segment.write('C');
  Serial7Segment.write('A');
  Serial7Segment.write(0x77);
  Serial7Segment.write(0b00000010);
  Serial7Segment.write('I');  
  Serial7Segment.write('T');
  delay(scroll);
  delay(scroll);
  delay(scroll);
  Serial7Segment.write('A');
  Serial7Segment.write(0x77);
  Serial7Segment.write(0b00000001);
  Serial7Segment.write('I');  
  Serial7Segment.write('T');
  Serial7Segment.write(' ');  
  delay(scroll);
  Serial7Segment.write(0x77);
  Serial7Segment.write(0b01000000);
  Serial7Segment.write('I');  
  Serial7Segment.write('T');
  Serial7Segment.write(' ');  
  Serial7Segment.write(' ');    
  delay(scroll);
  Serial7Segment.write('T');
  Serial7Segment.write(' ');  
  Serial7Segment.write(' ');    
  Serial7Segment.write('0');      
  delay(scroll);
  Serial7Segment.write(' ');  
  Serial7Segment.write(' ');    
  Serial7Segment.write('0');      
  Serial7Segment.write('0');      
  delay(scroll);
  Serial7Segment.write(' ');  
  Serial7Segment.write('0');    
  Serial7Segment.write('0');      
  Serial7Segment.write('0');      
  delay(scroll);
  reset();
  delay(scroll);
  delay(scroll);
  say_up();
  errlet = millis();
  digitalWrite(relPin, LOW); // Spengo il Relé
}

void loop() {
  
  
  if (millis() - errlet <= 100) {
    
  } else {
    
    buttonState = digitalRead(pedPin);
    
    if (buttonState != lastButtonState) {
              Serial.println("Cambio Stato");
   
      if (buttonState == LOW) {     
        // Il pedale ha cambiato stato ed è stato rilasciato scateno l'inferno
                Serial.println("Rilasciato");
  
        premuto = true; 
      }
    }
    
    lastButtonState = buttonState;  
    errlet = millis();
    
  }


  if (avviato) {
    if (premuto) {
      //Spengi e pausa il timer
      digitalWrite(relPin, LOW); // Spengo il Relé
      premuto = false; // Mi preparo ad una nuova pressione
      avviato = false; // Metto ad avviato lo stato
            
    } else {
      if (up) {
        conta_up();
      } else {
        conta_down();
      }
    }

  } else {
    if (premuto) {
      if (up) {
        digitalWrite(relPin, HIGH); // Accende il Relé
        premuto = false; // Mi preparo ad una nuova pressione
        avviato = true; // Metto ad avviato lo stato
        old_mil = millis(); // Azzero il parziale dei millisecondi
        conta_up(); 
      } else {
        if (tempo > 0) {
            digitalWrite(relPin, HIGH); // Accende il Relé
          }
          premuto = false; // Mi preparo ad una nuova pressione
          avviato = true; // Metto ad avviato lo stato
          old_mil = millis(); // Azzero il parziale dei millisecondi
          conta_down();
      }
    } else {
     // Leggi tastiera
     gest_key();
    }
  }
}

void conta_down() {
  if (tempo > 0) {
    if (millis() - old_mil >= 100) {
      old_mil = millis();
      tempo = tempo - 1;
      scrivi_tempo();
      if (tempo == 0) {
        digitalWrite(relPin, LOW); // Accende il Relé  
        avviato = false;
        tempo = appo_tempo;
        scrivi_tempo();
      }
      if (tempo%10 == 0) {
        beep(200, 50);
      }    
    }  
  }
}

void conta_up() {
  if (millis() - old_mil >= 100) {
    old_mil = millis();
    tempo = tempo + 1;
    scrivi_tempo();
    if (tempo%10 == 0) {
      beep(400, 50);
    }    
  }
}

void say_up(){
  Serial7Segment.write('v'); //Reset display
  Serial7Segment.write('U');
  Serial7Segment.write('p');
  Serial7Segment.write(' ');
  Serial7Segment.write(' ');
  up = true;
  beep(400, 200);
  delay(1000);
  reset();
}

void say_down(){
  Serial7Segment.write('v');
  Serial7Segment.write('D');
  Serial7Segment.write('o');
  Serial7Segment.write('u');  
  Serial7Segment.write('N');
  up = false;
  beep(200, 200);  
  delay(1000);
  reset();  
}

void reset() {
  Serial7Segment.write('0');  
  Serial7Segment.write('0');    
  Serial7Segment.write('0');      
  Serial7Segment.write('0');    
  Serial7Segment.write(0x77);
  Serial7Segment.write(0b00000100);
}

void beep(int nota, int durata){  //Funzione di beep devo tenere conto della durata???
  tone(buzPin, nota, durata);
}

void gest_key() {  
  key = keypad.getKey();
  if (key) {
    switch (key){
      case '#':  //Cambio modalità da Count-Up a Count-Down
         if (up){
          say_down();
          ncifra = 0;
          tempo = 0;
        } else {
          say_up();
          ncifra = 0;        
          tempo = 0;
        }
        break;
      case '*': // Reset
      reset();
        ncifra = 0;
        tempo = 0;
        break;
       default:
         if (up){
           say_up();
         } else {
           switch (ncifra) {
             case 0:
               tempo = tempo + (key-48);
               ncifra++;
               break;
             case 1:
               tempo = tempo * 10 + (key-48);
               ncifra++;
               break;
             case 2:
               tempo = tempo * 10 + (key-48);
               ncifra++;
               break;
             case 3:
               tempo = tempo * 10 + (key-48);
               ncifra++;
               break;
             default:
               // Non faccio nulla
               break;
           }
         }
         appo_tempo = tempo;
         scrivi_tempo();
         }
  }
}

void scrivi_tempo() {
//   Serial7Segment.write('v'); //Reset display
   Serial7Segment.write(0x77); //Codice per invio funzioni specifiche
   Serial7Segment.write(0b00000100); //Accendo la virgola per 1 cifra decimale
   sprintf(tempString, "%04i", tempo); //Converte il tempo in una striga con gli zeri in testa
   Serial7Segment.write(tempString); // Stampo il tempo
}

Telegram Vieni a scoprire il canale telegram di analogica.it - tantissime offerte su materiale fotografico analogico nuovo ed usato Offerte materiale analogico


Rispondi