Temporizzatore con Arduino 1

Sono Giorgio Rizzatti, nuovo del forum, come tanti che si affacciano sono privo di esperienza e mi scuso di questo. Ho un problema che desidererei risolvere con arduino 1 (appena comperato e tutto da capire. ) Ho trovato nel sito :Arduino Playground - HomePage più o meno quello che mi serve. I contravers dovrebbero essere 2 per arrivare alla cifra 99. In uscita mi serve solo un relay da poter attivare con tempi da 1 sec. a 99 sec. tramite un tasto Start. Praticamente è un dosatore di sostanze per un setup di ricerca che tramite un temporizzatore mi fa aprire una piccola elettrovalvola. I contravers vanno benissimo perché posso vedere cosa ho impostato ( seza usare display) e soprattutto la ripetitività dei tempi è assicurata rispetto ad un semplice potenziometro che difficilmente si riesce a posizionare ssh valori precisi ogni volta che si cambiano. Credo per chi ha esperienza e gli piacciono le sfide, risolvere il problema sia un gioco da ragazzi ma per me è tutto nuovo anche perché in elettronica sono autodidatta e non sono più un ragazzino. Una stretta di mano a tutti ed un grazie anticipato a chi può aiutarmi.

Per primo incomincia a imparare le basi di Arduino con un tutorial o con un libro. Cosí sai le basi. Dopo Ti sono tante cose piú chiare.
Per esempio Tutorial in inglese su: http://arduino.cc/en/Tutorial/HomePage

Ciao Uwe

Facci sapere cosa ti blocca: se la parte di programmazione/impostazione del programma, se la lettura dei secondi dal contravers, se la parte "timer" o se la parte "hardware del controllo dell'elettrovalvola".

Sul contravers nulla da dire e ne capisco l'uso però in questo caso hai già 8 piedini occupati da questi cosi.... poi ti serve comunque un pulsante di start... e forse tra breve anche uno stop? e magari un'altro contravers per arrivare al 999? Se invece ti procuri un display standard hitaci ed un tastierino a 4 tasti la cosa potrebbe uscire più carina ed ambiziosa: dai! lo facciamo dopo il contravers :wink:

Sono già in crisi per imparare ad usare il forum . Ho scelto la via che mi permette di ottenere un risultato veloce ed a basso costo. L'idea dei contravers mi permette di avere la visuale del tempo impostato e di tenere allo stesso tempo una ripetibilità che un potenziometro non me lo concede. Per il momento mi accontenterei di trovare qualcuno che mi modifica lo sketch : www.arduino.cc/playground/Italiano/contraves ....... aggiungendo un secondo contravers per arrivare a 99 secondi e poi fare che l'uscita attivi un relay per il tempo impostato. Certo mi occorre anche un pulsante di start......
Con un display lcd sarebbe di lunga migliore ma devo imparare troppe cose in poco tempo e non sono più un ragazzino (62 primavere).
Vi spiego a cosa serve: In un setup di biologia dove si stimolano le cellule con diverse sostanze, queste sono dosate tramite una minuscola elettrovalvola a 12V per cui il tempo è un fattore importante per la corretta ripetitività dell'esperimento. Mia moglie è ricercatrice all'Università e come tutti i ricercatori sono in crisi economica visti i tempi.
Comunque tornando a noi....credo che se qualcuno ha già le mani in pasta non gli sarà complicato aggiustare lo sketch. Nel frattempo io mi istruisco . Una stretta di mano a tutti ciao

si però scriverti totalmente il codice da zero senza avere contavers e scheda per controllare non è esattamente facile... non so riesci ad accontentarti di uno "pseudocodice da correggere"?

// queste istruzioni leggono il primo contraves...supponiamo che tenga le decine...poi ho la moltiplicazione
  iBit1 = 1 - digitalRead( BIT1 );
  iBit2 = 1 - digitalRead( BIT2 );
  iBit4 = 1 - digitalRead( BIT4 );
  iBit8 = 1 - digitalRead( BIT8 );

  val = iBit8 * 8 + iBit4 * 4 + iBit2 * 2 + iBit1;
// qui scrivo io di getto... secondo contraves e calcolo del valore finale
 
   iBit1 = 1 - digitalRead( BITC2_1 );
  iBit2 = 1 - digitalRead( BITC2_2 );
  iBit4 = 1 - digitalRead( BITC2_4 );
  iBit8 = 1 - digitalRead( BITC2_8 );
  val = val * 10 + iBit8 * 8 + iBit4 * 4 + iBit2 * 2 + iBit1;
 // ora in val hai il valore dei due contaves

...casomai se domani sera ho tempo vedo per il timer... la funzione da usare e' il millis()..il programma non e' difficile ma ripeto senza debug e' complicato...

non ti servono i contravers , bastano dei ponticelli che simulino i livelli alto e basso in base alla cifra binaria1100011 per 99 e 0000001 per 1 per un totale di 7 ingressi. Sto ancora aspettando il libro dei primi passi con arduino......spero arrivi presto. In inglese mi arrangio un pochino ma faccio fatica. Ciao

Giorizzatti:
non ti servono i contravers , bastano dei ponticelli che simulino i livelli alto e basso in base alla cifra binaria1100011 per 99 e 0000001 per 1 per un totale di 7 ingressi. Sto ancora aspettando il libro dei primi passi con arduino......spero arrivi presto. In inglese mi arrangio un pochino ma faccio fatica. Ciao

spetta... ma fammi capire... tu a livello di programmazione come sei messo? cioè tu vorresti che il programma te lo facessi per intero io senza scheda eccetera eccetera?
... perchè pensavo ti bastasse un codice di idea e poi lo finivi te... se ti serve funzionante mi serve tempo libero e l'arduino: non ci piove.

Giorizzatti:
Sono Giorgio Rizzatti, nuovo del forum, come tanti che si affacciano sono privo di esperienza e mi scuso di questo. Ho un problema che desidererei risolvere con arduino 1 (appena comperato e tutto da capire. ) Ho trovato nel sito :Arduino Playground - HomePage più o meno quello che mi serve. I contravers dovrebbero essere 2 per arrivare alla cifra 99. In uscita mi serve solo un relay da poter attivare con tempi da 1 sec. a 99 sec. tramite un tasto Start. Praticamente è un dosatore di sostanze per un setup di ricerca che tramite un temporizzatore mi fa aprire una piccola elettrovalvola. I contravers vanno benissimo perché posso vedere cosa ho impostato ( seza usare display) e soprattutto la ripetitività dei tempi è assicurata rispetto ad un semplice potenziometro che difficilmente si riesce a posizionare ssh valori precisi ogni volta che si cambiano. Credo per chi ha esperienza e gli piacciono le sfide, risolvere il problema sia un gioco da ragazzi ma per me è tutto nuovo anche perché in elettronica sono autodidatta e non sono più un ragazzino. Una stretta di mano a tutti ed un grazie anticipato a chi può aiutarmi.

i contraves sono orribili :fearful:,
per impostare una cifra da zero a 99 basta e avanza un potenziometro lineare 10 giri

oppure 2 pulsantini per cifra uno incrementa e uno decrementa
oppure un encoder che costa molto meno di un potenziometro 10 giri

ci sono 1000 trucchi per poter ottimizzare tutto e hai 1024 memorie dove puoi memorizzare dei valori

gingardu:
i contraves sono orribili :fearful:,

Perché dici questo? Ai miei occhi hanno un fascino retrò molto forte. A me piacciono :slight_smile:

qsecofr:

Giorizzatti:
non ti servono i contravers , bastano dei ponticelli che simulino i livelli alto e basso in base alla cifra binaria1100011 per 99 e 0000001 per 1 per un totale di 7 ingressi. Sto ancora aspettando il libro dei primi passi con arduino......spero arrivi presto. In inglese mi arrangio un pochino ma faccio fatica. Ciao

spetta... ma fammi capire... tu a livello di programmazione come sei messo? cioè tu vorresti che il programma te lo facessi per intero io senza scheda eccetera eccetera?
... perchè pensavo ti bastasse un codice di idea e poi lo finivi te... se ti serve funzionante mi serve tempo libero e l'arduino: non ci piove.

vabbo... copia 'sta soppa qua:

const byte pinStart = 0;
const byte pin1Cont1 = 1;
const byte pin2Cont1 = 2;
const byte pin3Cont1 = 3;
const byte pin4Cont1 = 4;
const byte pin1Cont2 = 5;
const byte pin2Cont2 = 6;
const byte pin3Cont2 = 7;
const byte pin4Cont2 = 8;


const byte pinRelay = 9;

int val = 0;
long startMillis =0;
void setup() {
  // questo pone gli input
  int i;
  for (i=0; i<9; i++)
    pinMode(i,INPUT);

// lo start lo salta perchè mi fa andare schemo

  for (i=1; i < 9; i ++)
     digitalWrite( i, HIGH );

  // e fa l'output
  pinMode(pinRelay,OUTPUT);
  
}

int stato = 0;

void initConteggio()
{

  int iBit1 = 0; int iBit2 = 0; int iBit4 = 0; int iBit8 = 0;

  iBit1 = 1 - digitalRead( pin1Cont1 );
  iBit2 = 1 - digitalRead( pin2Cont1 );
  iBit4 = 1 - digitalRead( pin3Cont1 );
  iBit8 = 1 - digitalRead( pin4Cont1 );

  val = iBit8 * 8 + iBit4 * 4 + iBit2 * 2 + iBit1;

  iBit1 = 1 - digitalRead( pin1Cont2 );
  iBit2 = 1 - digitalRead( pin2Cont2 );
  iBit4 = 1 - digitalRead( pin3Cont2 );
  iBit8 = 1 - digitalRead( pin4Cont2 );


  val = val*10 + iBit8 * 8 + iBit4 * 4 + iBit2 * 2 + iBit1;

  startMillis = millis();
  digitalWrite(pinRelay, HIGH);

}


void loop() {

int tastoStart = digitalRead(pinStart);
if (tastoStart == HIGH) {
 while (tastoStart == HIGH) tastoStart = digitalRead(pinStart);
      if (stato == 0) {
  stato = 1;
  initConteggio();
      } else {    //premuto il bottone... procedo a fare lo stop.prima del tempo
      stato = 0;
      digitalWrite(pinRelay, LOW);

  
      };
  } ;
if (stato == 1) {
//counter in funzione
   if ((millis() - startMillis) > (val * 1000)) {
        stato = 0;
        digitalWrite(pinRelay, LOW);

   }
}






}

attento che ho messo i contracosi tra 1 e 4 e tra 5 e 8... 5 e 8 sono le unità.
i contracosi lavorano con resistenza di pullup attivata mentre ho messo il pulsante di start/stop
sul pin 0 ma senza resistenza di pullup attivata perchè è una cosa che mi manda in confusione il cervello specie alle 23 di notte e con un simulatore che non simila...
...relay di uscita sul piedino 9... ... l'ho chiamato relay ma tu ci attacchi un fotoaccoppiatore vero?

Grazie per lo sketch. Oggi mi è finalmente arrivato il libro dei primi passi. Ho iniziato a studiare e spero pian piano di diventare autonomo. A programmazione sono molto arrugginito, troppi anni a far cose diverse. La prossima settimana vado a Trieste a prendere il materiale che mi manca poi metto insieme tutto. So anch'io che altre soluzioni tipo display danno risultati migliori ma saranno futuri. Spero di non averti fatto perdere troppo tempo e ti ringrazio moltissimo.
A proposito : di dove sei?
Ciao Giorgio!

Ma utilizzando un display seriale tipo NSM 4000 ed i pulsanti per settare il tempo desiderato le cose potrebbero diventare più semplici ???
Ho visto la vostra discussione e l'accenno a linee occupate per i controlli !
Saluti a tutti .
Moreno

morenov:
Ma utilizzando un display seriale tipo NSM 4000 ed i pulsanti per settare il tempo desiderato le cose potrebbero diventare più semplici ???
Ho visto la vostra discussione e l'accenno a linee occupate per i controlli !
Saluti a tutti .
Moreno

il problema è che non tutti i display seriali prendono i livelli ttl... se non prendono i livelli ttl ti tocca riconvertirli e a quel punto l'affare si complica. Inoltre IMHO a livello di codice questa soluzione è proprio molto molto semplice: con un display ed un menu a questo punto il codice sarebbe sicuramente più complesso anche se ci sono delle librerie per gestire i menu

Per farlo ancora molto più semplice bastano due display 7 segmenti e un paio di pulsanti... ne sto facendo proprio uno ma a 4 cifre :wink: