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
isos1977
superstar
Messaggi: 1784
Iscritto il: 13/09/2011, 22:23
Reputation:
Località: Milano

Progetto timer fstop con Arduino

Messaggioda isos1977 » 09/01/2013, 12:24

Come dicevo in altro post, era un po' che volevo iniziare a programmare una scheda arduino e visto che volevo anche provare un timer che funziona in fstop, ho pensato di iniziare da questo.

Avevo bisogno di due cose: un timer che permettesse incrementi in fstop e un semplice cronometro da usare per lo sviluppo delle pellicole e per tenere il tempo di permanenza della carta nelle bacinelle di sviluppo, arresto e fissaggio.

il tutto funziona con 5 tasti normalmente aperti.
1)tasto selettore funzione timer e cronometro (a ogni pressione cambia modo)
2)tasto start/stop: funziona per tutti e due le funzioni. per il timer fa anche focusing (tenendo premuto il pulsante si accende la lampada, tenendolo ancora premuto la spegne)e da reset (se mentre il timer va, si tiene premuto, ferma il conteggio e ritorna al tempo iniziale impostato). con il cronometro, a una pressione parte il tempo, con un'altra pressione si ferma, con un'altra azzera e riparte.
3) tasto incrementi. a ogni pressione cambia l'incremento: 1 stop --> 1/2 stop --> 1/3 stop --> 1/6 stop --> lineare (1 secondo)
4 e 5) tasto up e down. Aumentano e diminuiscono il tempo del timer a scatti in base all'incremento impostato. ovviamente, in qualsiasi momento si può cambiare l'incremento (se prima voglio trovare un tempo di massima ragionando in 1/2 stop e poi lavorare di fino con 1/6 stop, lo posso fare)

ho utilizzato un display lcd con caratteri rossi. In modalità cronometro appare la scritta "cronometro" e il tempo espresso in mm:ss:dd. In modalità timer, appare l'incremento selezionato e sotto il tempo impostato.

Il timer, quando arriva a zero, spegne la lampada e ritorna sul tempo iniziale.

Non essendo un esperto di programmazione ho fatto di necessità virtù e ho fatto una cosa molto semplice.... ma accetto volentieri suggerimenti per aggiunte che potrebbero tornare molto utili!

L'ho sviluppato su breadbord e funziona.

ora sto studiando lo schema del prototipo. la cosa un po' più difficile è che lo sto facendo con un arduino "stand alone".. cioè replicare arduino semplificato (microcontrollore, quarzo, alimentazione partendo dalla 220v trasformata in 12v e regolata con un lm 7805). fatto questo si tratta solo di collegare i 5 pulsanti e un relè a stato solido al microcontrollore).

Ovviamente posso fornirvi il codice del programma, per darmi consigli su come migliorarlo o per usarlo a piacimento! se si usa una scheda arduino ci vuole veramente poco ad assemblare il timer!


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

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 » 09/01/2013, 14:44

vngncl61 ha scritto:Gli unici programmi su cui posso darti consigli, sono quelli dei canali dedicati ai bambini, cartoonito è fortissimo :ymblushing:
Ma, un ...azzo di coso che funzioni senza byte, bit, bot e cct non esiste? :D

:-*

P.S.

Il coso senza byte ecc... esiste, ce l'ho io, lm 324 +ne 555 + tester digitale 200 mV, se connetti l'uscita per il tester ad un ampli... suona pure :D


:D magari potrai aiutarmi sullo schema del circuito ;) Arduino è fatto da pochi pezzi...ma volendo alimentare il timer con la 220V la prudenza non è mai troppa!


"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 » 09/01/2013, 15:30

vngncl61 ha scritto:Costruire un alimentatore stabilizzato, a bassa tensione, è molto semplice ed economico, personalmente non amo molto quelli con i regolatori serie 78XX, preferisco zener e transistor di potenza, magari con protezione sia in tensione che in corrente.


pensavo di fare una cosa del genere. in questo modo dovrei evitare ogni rischio (autooscillazioni del microcontrollore, scarico dei condensatori, ecc...)
Immagine
ma, se ci sono alternative migliori, ben vengano i suggerimenti!

vngncl61 ha scritto:Per relè a stato solido intendi uno del tipo con fotoaccoppiatore e diodo controllato?

Si, mi sembrava la cosa più semplice.


"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 » 09/01/2013, 17:37

ho questo relè http://it.rs-online.com/web/p/rele-stato-solido/6665760/
che direi è anche sovradimensionato...

Nello schema dell'alimentazione che ho indicato vedi qualche difetto? se può andare, a questo punto userei questa.. per evitare di fare altri conti...

grazie!

:-h

P.S. oltre ai consigli tecnici, so ben accetti consigli pratici sulle funzionalità del timer! ditemi pure, poi vedo se sono capace di tradurle in codice ;)


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

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 » 09/01/2013, 18:10

vngncl61 ha scritto:Il tuo relè ha un difetto enorme... il prezzo :D , poi ti posto lo schema di un cosetto da pochi centesimi, che funziona meglio di quell'affare ;)
:-h


eh... si. Più o meno metà di quello che ho previsto di spendere per questo progetto andrebbe per quello :-)

avevo pensato di evitare di fare in casa un circuito con fotoaccoppiatore e triac... visto che c'è la 22OV...ma se hai qualche schema "collaudato" grazie! io uno di quei relè ce l'ho e comunque posso anche metterlo li dentro...ma magari per altri potrà essere utile!


P.S.
stasera posto il codice e, appena è pronto, lo schema di tutto il timer.


"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 » 09/01/2013, 22:30

ecco il codice. Per chi si accontenta, funziona. Basta caricarlo su una scheda Arduino.
Come dicevo, non sono un programmatore, quindi ogni suggerimento è ben accetto!

Codice: Seleziona tutto

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

LiquidCrystal lcd(2, 3, 5,6,7,4);
Button bottone_start_stop= Button(8,PULLUP);
Button bottone_up = Button (9,PULLDOWN);
Button bottone_down = Button (10,PULLDOWN);
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;
int sec = 0;
String fstop(10);

// 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

long test;
long start_test;
long stop_test;


void setup ()
{
  pinMode(pinRele, OUTPUT);
  digitalWrite(pinRele, releVal);
  lcd.begin(16,2);
  Serial.begin(9600);
}

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;
    sec = 1;
    fstop= "lineare  ";

  }

  switch (status) {
  case 0:
    lcd.setCursor(0,0);
    lcd.print(fstop);
    lcd.setCursor(0, 1);
    //convertTime(tempo);
    lcd.print(tempo, 1);
    lcd.print("        ");
    Serial.print(test);
    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<=4) countButton=countButton+1; 
      else countButton=0;
      statoButton = laststatoButton;
      status = 0;
    }
    if (bottone_up.isPressed()) {
      tempo=(float)((tempo*incremento)+sec);
      status = 0;
      delay(debounce);
    }
    if (bottone_down.isPressed()) {
      tempo= (float)((tempo/incremento) - sec);
      status = 0;
      delay(debounce);
    } 
    if (tempo < 1) {
      tempo = 1;
    }
    break;
  case 2:
    digitalWrite(pinRele, HIGH);
    start_test=millis();
    millis_start=millis();
    prev_cron=0;
    status = 3;
    break;
  case 3:
    cron= (float) (millis()-millis_start)/1000;

    if (prev_cron!=cron) {

      status=4;

    }
    if (cron>=tempo) {
      status=5;
    }
    break;
  case 4:
    cron= (float) (millis()-millis_start)/1000;
    lcd.setCursor(0,1);
    //convertTime(tempo-cron);
    lcd.print(tempo-cron, 1);
    lcd.print("         ");
    prev_cron=cron;
    status=3;
    break;
  case 5:
    digitalWrite(pinRele, LOW);
    stop_test = millis();
    test = (stop_test - start_test)/1000;
    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);
}



"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 » 09/01/2013, 22:44

e giusto per "vedere" com'è su breadboard... per il prototipo ho un altro display rosso e in queste foto al posto del relè a stato solido c'è un led.

crono-timer1.JPG
funzione timer

crono-timer2.JPG
funzione cronometro


"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 » 10/01/2013, 9:41

Sicuramente si possono unire le forze e fare un unico progetto più completo e funzionale.

appena ho finito lo schema elettrico in "bella copia" lo posto.

:-h

P.S.
è bello inventarsi le cose da soli, ma... in questo vecchio post ho appena visto un progetto già fatto con tutte le indicazioni per realizzarlo!

progetto-timer-da-camera-oscura-con-il-pc-t507-10.html

integra display lcd e tastierino, da la possibilità di programmare le mascherarature/bruciature in stop e poi lui ti calcola i tempi e gestisce la lampada. L'unica cosa è che questo timer mi sembra già un po' troppo complesso.. no?

e poi... eviterei di usare una board arduino e integrerei una "standalone" nel circuiti stampato... complica le cose (sia HW che SW), ma è più economico e forse anche un po' meno ingombrante.


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

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

Re: Progetto timer fstop con Arduino

Messaggioda luca_dega » 10/01/2013, 12:19

Arduino è veramente...carino :D
io, che dal basso della mia scemaggine posso dire poco, ho però "sulle spalle" una altisonante qualifica di programmatore C/C++ e con Arduino et similia mi ci sbizzarrivo un pochino: puoi farci gran belle cose. Unico limite: la fantasia. detto questo: non vorrei aver letto male (frettolosamente, in effetti..) ma....che 'azzo state ad inventare ? per pilotare carichi a 220V ci sono relè "fatti apposta" da 10 Euro spediti....

http://www.ebay.it/itm/Due-2-Rele-Board ... 2511wt_968


http://www.ebay.it/itm/Relais-5V-zu-230 ... 2165wt_727

io ho un'Arduino con appiccicata una scheda motor drive per pilotare motorini, anche bidirezionali, da 4.5-36 V: per Arduino si trova di tutto....



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

Re: Progetto timer fstop con Arduino

Messaggioda DanieleLucarelli » 10/01/2013, 13:57

Io non capisco i vantaggi operativi e di risultato nell'utilizzare un timer f-stop. Sia per la provinatura, che per l'esposizione intera, che per le eventuali maschere/bruciature.
Vedo tutto il sistema macchinoso e lento... mi potreste spiegare (magari mi convinco).





  • Advertisement

Torna a “Accessori vari per camera oscura”

Chi c’è in linea

Visitano il forum: Nessuno e 0 ospiti