Progetto timer fstop con Arduino

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

Moderatore: isos1977

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

Re: Progetto timer fstop con Arduino

Messaggioda DanieleLucarelli » 10/01/2013, 18:10

Se non prendi Arduino per il timer, devi prendere Arduino per programmare un microcontrollore per fargli fare Arduino. Se hai intenzione di fare 3 timer ci guadagni altrimenti ci rimetti e ti conviene prendere subito Arduino.

Io non mi sono capito ma forse qualcosa ho detto.



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

Re: Progetto timer fstop con Arduino

Messaggioda franny71 » 10/01/2013, 22:17

io aspetto che qualcuno lo finisca e poi mi spedisca il pacchettino per provarlo... :D


Franco
il mio Flickr

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

Avatar utente
isos1977
superstar
Messaggi: 1784
Iscritto il: 13/09/2011, 22:23
Reputation:
Località: Milano

Re: Progetto timer fstop con Arduino

Messaggioda isos1977 » 11/01/2013, 14:50

Ecco lo schema con i contributi di Nicola (magari verifica che abbia riportato correttamente i tuoi schemi!)

volendo partire da una scheda arduino, basta collegare il display (compatibile con driver Hitachi HD44780), il relè (uno già fatto o uno fatto in casa secondo lo schema di Nicola) e i 5 bottoni rispettando i pin che sono riportati sul microcontrollore.

In questi giorni sto litigando con arduino per caricare lo sketch sul microcontrollore (da buon ligure, per risparmiare qualche euro, sto cercando di caricarlo su un ATmega 328 PU... mentre quello montato su arduino UNO è un ATmega 328 P... )

quando ho superato questo problema, mi posso dedicare a cambiare i due tast up/down con un multigiro...

:-h

P.S. Nicola, per sdebitarmi del tuo aiuto. Se vuoi, appena ho risolto il problema, ti posso "preparare" un controllore e mandartelo, così devi solo preoccuparti della parte Hardware.
Allegati
arduino_crono_timer.pdf
(40.45 KiB) Scaricato 621 volte
Ultima modifica di isos1977 il 13/01/2013, 17:38, modificato 2 volte in totale.


"Se il fotografo non vede, la macchina fotografica non lo farà per lui" - Kenro Izu

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

Re: Progetto timer fstop con Arduino

Messaggioda DanieleLucarelli » 11/01/2013, 14:55

Tristezza non si ammattisce e qui c'è già tutto pronto: http://www.brodie-tyrrell.org/fstoptimer/

Tra l'altro già segnalato qui: http://www.analogica.it/progetto-timer-da-camera-oscura-con-il-pc-t507-17.html



Advertisement
Avatar utente
isos1977
superstar
Messaggi: 1784
Iscritto il: 13/09/2011, 22:23
Reputation:
Località: Milano

Re: Progetto timer fstop con Arduino

Messaggioda isos1977 » 11/01/2013, 17:05

DanieleLucarelli ha scritto:Tristezza non si ammattisce e qui c'è già tutto pronto: http://www.brodie-tyrrell.org/fstoptimer/

Tra l'altro già segnalato qui: http://www.analogica.it/progetto-timer-da-camera-oscura-con-il-pc-t507-17.html


mah.. si, lo segnalavo anch'io qualche post sopra. Però, come dicevo, lo trovo un po' troppo complicato (va bene ragionare in fstop, ma io cercavo qualcosa di semplice...giusto un timer con la possibilità di fare due conti al posto mio...) e comunque realizzarlo dagli schemi richiede più lavoro di quello che ci vuole a questo punto per questo progettino....


"Se il fotografo non vede, la macchina fotografica non lo farà per lui" - Kenro Izu

Avatar utente
isos1977
superstar
Messaggi: 1784
Iscritto il: 13/09/2011, 22:23
Reputation:
Località: Milano

Re: Progetto timer fstop con Arduino

Messaggioda isos1977 » 12/01/2013, 22:03

vngncl61 ha scritto:Isos da un'occhiata veloce agli schemi, pare che manchi il collegamento al comune del 7805, poi pensavo che forse si potrebbe innalzare, di qualche volt, la tensione di alimentazione. Tu che ne pensi?

:-*


c'era un filo "penzolante"! ho corretto il file e l'ho sostituito.

per l'alimentazione, francamente, l'esperto sei tu. Quello che posso dire è che da quello che ho letto in giro, la tensione va bene così per un circuito così semplice (la scheda deve solo pilotare un interrutore e il display...e assorbe poco...)


"Se il fotografo non vede, la macchina fotografica non lo farà per lui" - Kenro Izu

Avatar utente
isos1977
superstar
Messaggi: 1784
Iscritto il: 13/09/2011, 22:23
Reputation:
Località: Milano

Re: Progetto timer fstop con Arduino

Messaggioda isos1977 » 12/01/2013, 22:13

P.S. ho caricato su un atmega 328 standalone il programma e l'ho montato su breadbord. Se si seguono con attenzione tutti i passaggi è semplicissimo (c'ho perso una sera perchè sbagliavo una stupidaggine :wall: )

ecco una foto
IMG-20130112-00073.jpg

prossimo passo. Ho un vecchio mouse che non funziona. lo smonto e ci prendo il multigiri per provare a sostituire i bottoni up/down

:-h


"Se il fotografo non vede, la macchina fotografica non lo farà per lui" - Kenro Izu

Avatar utente
isos1977
superstar
Messaggi: 1784
Iscritto il: 13/09/2011, 22:23
Reputation:
Località: Milano

Re: Progetto timer fstop con Arduino

Messaggioda isos1977 » 22/02/2013, 9:38

un piccolo aggiornamento.
sono riuscito a recuperare un encoder e ho modificato il progetto per utilizzarlo. Quando ho un attimo modifico lo schema elettrico e posto il codice.

volevo anche aggiungere un buzzer e volevo un parere

avrei pensato due possibilità:
1) un beep ogni secondo
2) un beep a ogni incremento fstop
3) un beep con un tono ogni secondo e un altro tono diverso per ogni incremento

Per la soluzione 2 e 3 avrei una mezza idea di come farlo, ma sicuramente è un po' più complicato che un beep ogni secondo... ne vale la pena?

:-h

P.S. lato HW ho iniziato a preparare su basetta millefori il trasformatore e il relè come da schema di Nicola. funziona tutto; ancora grazie a Nicola!


"Se il fotografo non vede, la macchina fotografica non lo farà per lui" - Kenro Izu

Avatar utente
isos1977
superstar
Messaggi: 1784
Iscritto il: 13/09/2011, 22:23
Reputation:
Località: Milano

Re: Progetto timer fstop con Arduino

Messaggioda isos1977 » 07/04/2013, 15:37

ho completato e assemblato il timer definitivo con rotary encoder per modificare i tempi.
Ho anche aggiunto un beep ogni secondo e un beep di tonalità diversa ogni "decremento" f-stop (il decremento è in funzione del f-stop impostato:1, 1/2, 1/3; 1/6; 1/12)

allego lo schema elettrico
arduino_crono_timer_encoder.pdf
(43.09 KiB) Scaricato 238 volte

e il codice.

Codice: Seleziona tutto

#include <LiquidCrystal.h>;
#include <Button.h>

LiquidCrystal lcd(9, 10, 5,6,7,4);
Button bottone_start_stop= Button(8,PULLUP);
Button bottone_fstop= Button(11,PULLDOWN);
Button bottone_mode= Button(13,PULLDOWN);

#define pinRele 12

#define debounce 20 // tempo del debounce per evitare letture accidentali dei tasti

//gruppo variabili per definizione mode

int statoBottone_mode     = 0;      // stato del pulsante mode (inizialmente non premuto) 
int laststatoBottone_mode = 0;      // ultimo stato del pulsante mode (per ora non premuto) 
boolean mode     = false;      // Conteggio del bottone mode

// variabili per bottone start_stop timer
int stato_start_stop = 0; // valore lettura bottone
int stato_start_stopLast = 0; // valore lettura precendente bottone
long btnDnTime; // tempo in cui il bottone è tenuto premuto
long btnUpTime; // tempo in cui il bottone è rilasciato
#define holdTime 1000 // quanto tempo il bottone deve rimanere premuto per caso hold
boolean ignoreUp = false;

// variabile per stato rele
boolean releVal = false;

//variabili per bottone modifica incrementi

int statoButton     = 0;      // stato del pulsante fstop (inizialmente non premuto) 
int lastStatoButton = 0;      // ultimo stato del pulsante fstop (per ora non premuto) 
int countButton     = 0;      // Conteggio del bottone fstop
int laststatoButton = 0;       //conteggio del bottone al giro precedente
float incremento;
float sec = 0;
String fstop(10);

//Gruppo variabili per encoder
 int encoderPinA = 2;
 int encoderPinB = 3;
 int encoderPinALast = HIGH;
 int n = HIGH;


// gruppo variabili per funzione timer
int status=0;
float millis_start=0;
float tempo=1;
float cron=0;
//float prev_cron=0;



//gruppo variabili per cronometro
int value = LOW;                    // previous value of the LED
int Stato_start_stop_crono = 0;                    // variable to store button state
int lastStato_start_stop_crono= 0;                // variable to store last button state
int avviato;                       // condition for blinking - timer is timing
int frameRate = 1;                // the frame rate (frames per second) at which the stopwatch runs - Change to suit
long interval = (1000/frameRate);   // blink interval
long previousMillis = 0;            // variable to store last time LED was updated
long startTime ;                    // start time for stop watch
long tempoPassato ;                  // elapsed time for stop watch
char charTime[13];

// test errore di misura tempo

unsigned long test;
unsigned long start_test;
unsigned long stop_test;

// buzzer
int buzzer = 14;
int incremento_int;
int cron_beep;
int prev_cron_beep;
float tempo_beep;
void setup ()
{
  pinMode(pinRele, OUTPUT);
  pinMode(buzzer, OUTPUT);
  digitalWrite(pinRele, releVal);
  lcd.begin(16,2);
  Serial.begin(9600);
  pinMode (encoderPinA,INPUT);
   pinMode (encoderPinB,INPUT);
     attachInterrupt(0, encoder, CHANGE);
}

void loop ()
{
  statoBottone_mode = bottone_mode.isPressed();
  delay (200);
  if( statoBottone_mode != laststatoBottone_mode)
  { 
    // Aspetto 15ms per far alzare il dito all'utente 

      mode =! mode;
    statoBottone_mode = laststatoBottone_mode;
    lcd.clear();
    status = 0;
  }
  if (mode==false) timer();
  else cronometro();

}
void timer ()
{


  stato_start_stop =bottone_start_stop.isPressed();

  if (stato_start_stop == LOW && stato_start_stopLast == HIGH && (millis() - btnUpTime) > long(debounce))
  {
    btnDnTime = millis();
  }


  if (stato_start_stop == HIGH && stato_start_stopLast == LOW && (millis() - btnDnTime) > long(debounce))
  {
    if (ignoreUp == false)
    {
   
      status= 2;
    }
    else ignoreUp = false;
    btnUpTime = millis();
  }


  if (stato_start_stop == LOW && (millis() - btnDnTime) > long(holdTime))
  {
    event2();
    status = 1;
    cron = tempo;
    lcd.setCursor(0,1);
    lcd.print(tempo, 1);
    ignoreUp = true;
    btnDnTime = millis();
  }

  stato_start_stopLast = stato_start_stop;

  if (countButton==0)  {
    incremento = 2;
    sec = 0;
    fstop= "1   stop";
  }
  if (countButton==1)  {
    incremento = 1.414213562;
    sec = 0;
    fstop= "1/2 stop";
  }

  if (countButton==2) {
    incremento = 1.25992105;
    sec = 0;
    fstop= "1/3 stop";
  }

  if (countButton == 3) {
    incremento = 1.189207115;
    sec = 0;
    fstop= "1/6 stop";

  }   
 
  if (countButton == 4) {
    incremento = 1.14869835499704;
    sec = 0;
    fstop= "1/12 stop  ";

  }
  if (countButton == 5) {
    incremento = 1;
    sec = 1;
    fstop= "lineare  ";

  }


  switch (status) {
  case 0:
    lcd.setCursor(0,0);
    lcd.print(fstop);
    lcd.setCursor(0, 1);
    lcd.print(tempo, 1);
    lcd.print("        ");
    Serial.print(test,1);
    status =1;
    break;
  case 1:
    statoButton = bottone_fstop.isPressed();
    delay (200);
    if( statoButton != laststatoButton)
    { 
       

      // Cambio l'ultimo stato del bottone   
      // Aumento il count del bottone 
      if(countButton<=5) countButton=countButton+1; 
      else countButton=0;
      statoButton = laststatoButton;
      status = 0;
    }
     
    break;
  case 2:
    digitalWrite(pinRele, HIGH);
    start_test=millis();
    millis_start=millis();
  //  prev_cron=0;
    prev_cron_beep=0;
    tempo_beep = (float) tempo;
    status = 3;
    break;
  case 3:
    cron= (float) (millis()-millis_start)/1000;
      cron_beep =  (millis() - millis_start) ;
     

    if (cron>=tempo) {

      status=5;
    }
    else
    {
      status=4;
    }
    break;
  case 4:
    lcd.setCursor(0,1);
    lcd.print(tempo-cron, 1);
    lcd.print("         ");
 
     
   if ((tempo - cron) < (tempo_beep/incremento))
             {
                if (sec == 0)   
                   {
                     tone(14, 1000, 50);
                     tempo_beep = tempo_beep/incremento;
                   }
             } 
   else
{   
    if ((cron_beep - prev_cron_beep)>950)
            {
            tone(14, 4000, 20);
            prev_cron_beep = cron_beep;
            }
  }
 

   // prev_cron=cron;
    status=3;
    break;
  case 5:
    digitalWrite(pinRele, LOW);
   tempo_beep = tempo;
   // stop_test = millis();
   // test = (stop_test - start_test)/1000;
   // lcd.setCursor(5,1);
   // lcd.print(test, 1);
    status=0;
    break;
  }
}


void convertTime(unsigned long longTime)
{
  unsigned int ss;
  unsigned int mm;
  unsigned int hh;
  mm = (longTime / 60) % 60; //Convert longTime to minutes and store
  ss = longTime % 60; //Store remaining seconds after conversion to minutes
  hh = floor(longTime / 3600); //Convert minutes to hours and store result;
  sprintf(charTime, "%.2d:%.2d:%.2d", hh, mm, ss);
}

void cronometro()
{
  lcd.setCursor(0,1);
  lcd.print("cronometro");

  Stato_start_stop_crono = bottone_start_stop.isPressed(); // Check for button press, read the button state and store

  // check for a high to low transition if true then found a new button press while clock is not running - start the clock   
  if (Stato_start_stop_crono == LOW && lastStato_start_stop_crono == HIGH  &&  avviato == false)
  {
    startTime = millis();                               // store the start time
    avviato = true;                                  // turn on blinking while timing
    delay(10);                                         // short delay to debounce switch
    lastStato_start_stop_crono = Stato_start_stop_crono;                    // store buttonState in lastButtonState, to compare next time
  }

  // check for a high to low transition if true then found a new button press while clock is running - stop the clock and report
  else if (Stato_start_stop_crono == LOW && lastStato_start_stop_crono == HIGH && avviato == true){
    avviato = false;                                    // turn off blinking, all done timing
    lastStato_start_stop_crono = Stato_start_stop_crono;                       // store buttonState in lastButtonState, to compare next time

    // Routine to report elapsed time           
    tempoPassato =   (millis() - startTime)/1000;                // store elapsed time
    convertTime(tempoPassato);
    lcd.setCursor(0,0);
    lcd.print(charTime);
  }
  else {
    lastStato_start_stop_crono = Stato_start_stop_crono;                  // store buttonState in lastButtonState, to compare next time
  }



  if ( (millis() - previousMillis > interval) ) {

    if (avviato == true){
      previousMillis = millis();                   

      tempoPassato=   (millis() - startTime)/1000;       
      convertTime(tempoPassato);
      lcd.setCursor(0,0);
      lcd.print(charTime);

    }

  }
}


void event2()
//con tasto hold
{
  releVal = !releVal;
  digitalWrite(pinRele, releVal);
}

void encoder()
{
  n = digitalRead(encoderPinA);
   if ((encoderPinALast == LOW) && (n == HIGH)) {
     if (digitalRead(encoderPinB) == LOW) {
        tempo= (float)((tempo*incremento) + sec);
        digitalWrite(pinRele, LOW);
      status = 0;
       
     } else {
       
       tempo=(float)((tempo/incremento)-sec);
       digitalWrite(pinRele, LOW);
      status = 0;
     }
   }
   encoderPinALast = n;
     
    if (tempo < 1) {
      tempo = 1;
    }
}

ovviamente sono a disposizione per ulteriori spiegazioni e per dettagli
:-h


"Se il fotografo non vede, la macchina fotografica non lo farà per lui" - Kenro Izu



  • Advertisement

Torna a “Accessori vari per camera oscura”

Chi c’è in linea

Visitano il forum: Nessuno e 0 ospiti