codice intervallometro reflex

ciao ho realizzato un intervallometro con arduino. selezionando il tempo (0-60 secondi) da 32 secondi la reflex scatta solo la prima volta e poi non va più.
ho anche un problema con il pulsante, con l' aumentare dei secondi, premendo il pulsante non fa partire subito il ciclo ma bisogna premerlo più volte per farlo funzionare.

P.S. ho usato solo i componenti dello starter kit

grazie in anticipo :grinning:

        #include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 6, 5, 4, 3);


int potValue1=0;
int potValue2=0;
int potValue3=0;
int puls;
int Apuls=0;


void setup() {
    lcd.begin(16, 2); 
    lcd.print("Interv. Scatto"); 
    pinMode(7,OUTPUT); // fotoaccoppiatore 2
    pinMode(2,INPUT);  // pulsante
    pinMode(8,OUTPUT); // fotoaccoppiatore 1
    pinMode(9,OUTPUT); // led 
}

void loop() {
  
      potValue1 = analogRead(0) / 17,05; 
    potValue2 = potValue1;  
    potValue3 = potValue1 * 1000; 
         
    lcd.setCursor(0, 1);
    lcd.print(potValue2);
    lcd.print(" secondi");
    delay(100);
  
     puls=digitalRead(2);
   
  if ((puls==HIGH) and (Apuls==0)) {
     Apuls=1;
     delay(100);
  }
  
   else if ((puls==HIGH) and (Apuls==1)) {
     Apuls=0;
     delay(100);
   }
   else if (Apuls==1) { 
     digitalWrite(8,HIGH);
     digitalWrite(9,HIGH);
    delay(1000);
    digitalWrite(7,HIGH);
    delay(1000);
    digitalWrite(8,LOW);
    digitalWrite(7,LOW);
    digitalWrite(9,LOW);
    delay(potValue3);
   }
   
   else if (Apuls==0) { 
    digitalWrite(8,LOW);
    digitalWrite(7,LOW); 
    digitalWrite(9,LOW);

   }
   
}

potValue3 = potValue1 * 1000;

é un int che puó contenere numeri da ca -32000 a 32000. Usa una Variabile unsigned long

Ciao Uwe

come faccio?

FabioLazzarotto:
come faccio?

:o :o :o ... siamo ai fondamenti del C eh ! :smiling_imp:

Invece che

int potValue3=0;

metti

unsigned long potValue3 = 0;

Guglielmo

Ho modificato lo sketch ma mi da ancora lo
stesso problema

FabioLazzarotto:
Ho modificato lo sketch ma mi da ancora lo
stesso problema

Ridacci il Sketch modificato.
Ciao Uwe

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 6, 5, 4, 3);


int potValue1=0;
int potValue2=0;
unsigned long potValue3=0;
int puls;
int Apuls=0;


void setup() {
    lcd.begin(16, 2); 
    lcd.print("Interv. Scatto"); 
    pinMode(7,OUTPUT); // fotoaccoppiatore 2
    pinMode(2,INPUT);  // pulsante
    pinMode(8,OUTPUT); // fotoaccoppiatore 1
    pinMode(9,OUTPUT); // led 
}

void loop() {
  
      potValue1 = analogRead(0) / 17,05; 
    potValue2 = potValue1;  
    potValue3 = potValue1 * 1000; 
         
    lcd.setCursor(0, 1);
    lcd.print(potValue2);
    lcd.print(" secondi");
    delay(100);
  
     puls=digitalRead(2);
   
  if ((puls==HIGH) and (Apuls==0)) {
     Apuls=1;
     delay(100);
  }
  
   else if ((puls==HIGH) and (Apuls==1)) {
     Apuls=0;
     delay(100);
   }
   else if (Apuls==1) { 
     digitalWrite(8,HIGH);
     digitalWrite(9,HIGH);
    delay(1000);
    digitalWrite(7,HIGH);
    delay(1000);
    digitalWrite(8,LOW);
    digitalWrite(7,LOW);
    digitalWrite(9,LOW);
    delay(potValue3);
   }
   
   else if (Apuls==0) { 
    digitalWrite(8,LOW);
    digitalWrite(7,LOW); 
    digitalWrite(9,LOW);

   }
   
}

se volte vedere il circuito lo trovate qua

http://lazzarottofabio.jimdo.com/arduino/

Prima di buttarmi su un programma complesso io avrei provato prima ad agire con una serie di tempi fissi.
Inoltre userei dei relais invece che i fotoaccoppiatori.
Poi controlla cosa accade usando dei serial.println stampando il valore delle variabili su PC per capire cosa succede.

Se la reflex supporta il telecomando a infrarossi utilizzerei quello, io l'ho fatto con un banale LED infrarosso pilotato usando questa libreria
http://sebastian.setz.name/arduino/my-libraries/multi-camera-ir-control/
dove c'è il supporto per parecchie marche di reflex.

Tieni conto che le reflex attuali, a seconda della configurazione, non scattano se non riescono prima a mettere a fuoco.

Ho usato i fotoaccoppiatori al posto dei relé per la portabilità. Ho già comprato il telecomando quindi é inutile spendere ancora

Proverò a modificare lo sketch come mi hai detto e ti saprò dire grazie.

Ciao

ciao ho modificato lo sketch e dopo 34-33 mi da un valore altissimo ( 4294934760 )

ma non riesco a capire perché solo con numeri sopra il 33-34 ho provato anche a cambiare divisore per il valore del potenziometro (potValue1 / ...) ma mi da sempre lo stesso problema :frowning:
grazie in aniticipo :grin:
...

FabioLazzarotto:
ciao ho modificato lo sketch e dopo 34-33 mi da un valore altissimo ( 4294934760 )

E un overflow. Metti un numero troppo grande per il tipo della variabile.
Quale variabile da questo valore e come é lo sketch adesso?
Ciao Uwe

lo sketch è sempre lo stesso

ho usato il potenziometro del kit che normalmente da un valore 0-1023, ho diviso per 17,05 (per avere un valore 0-60) ho moltiplicato per 1000 in modo che arduino leggesse il valore in millisecondi

Da quando i numeri decimali si rappresentano con la VIRGOLA ? ? ? :o :o :o

potValue1 = analogRead(0) / 17,05;

Devi usare il PUNTO DECIMALE !!! :smiling_imp: :smiling_imp: :smiling_imp:

Guglielmo

non cambia niente lo stesso

Infilaci delle Serial.print() e fai debug finché non trovi dove leggi o calcoli i valori errati.

Guglielmo

può essere il potenziometro che causa problemi?

Fabio,
purtroppo non abbiamo la ....

Prova a mettere lo schema di ciò che hai realizzato e magari si nota qualche cosa ...

Hai messo le Serial.print() per fare debug e visualizzare sia valori che leggi che quelli che calcoli tu ?

Guglielmo

Dopo questa istruzione:

delay(potValue3);

Dovresti mettere l'azzeramento della variabile Apuls che mi pare di capire sia quella che fa entrare nell'if che gestisce l'intervallo lungo dello scatto:

delay(potValue3);
Apuls = 0;

. Altrimenti non ci rientri più in quell'if perché la condizione iniziale è

if ((puls==HIGH) and (Apuls==0)) {

Siccome Apuls dopo la prima attivazione vale ancora 1, l'if è falso.

Mi pare.... sono a lavoro e non ho provato il codice con un circuito di test

ciao ho risolto tutto. alla fine dovevo mettere la variabile unsigned long anche su potValue2 perchè il 3 dipende dal 2 ma ho ancora il problema del pulsante che non ferma subito il ciclo delle volte non lo fa proprio per adesso lo sketch è questo

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 6, 5, 4, 3);


int potValue1=0;
unsigned long potValue2=0;
unsigned long potValue3=0;
int puls;
int Apuls=0;


void setup() {
  Serial.begin(9600);
    lcd.begin(16, 2); 
    lcd.print("Interv. Scatto"); 
    pinMode(7,OUTPUT); // fotoaccoppiatore 2
    pinMode(2,OUTPUT);  // pulsante
    pinMode(8,OUTPUT); // fotoaccoppiatore 1
    pinMode(9,OUTPUT); // led 
}

void loop() {
  
      potValue1 = analogRead(0); 
    potValue2 = potValue1 / 17,05;  
    potValue3 = potValue2 * 1000; 
         
    lcd.setCursor(0, 1);
    lcd.print(potValue2);
    Serial.println(potValue3);
    lcd.print(" secondi");
    delay(100);
  
     puls=digitalRead(2);
   
  if ((puls==HIGH) and (Apuls==0)) {
     Apuls=1;
     delay(100);
  }
  
   else if ((puls==HIGH) and (Apuls==1)) {
     Apuls=0;
     delay(100);
   }
   else if (Apuls==1) { 
     digitalWrite(8,HIGH);
     digitalWrite(9,HIGH);
    delay(1000);
    digitalWrite(7,HIGH);
    delay(1000);
    digitalWrite(8,LOW);
    digitalWrite(7,LOW);
    digitalWrite(9,LOW);
    delay(potValue3);
   }
   
   else if (Apuls==0) { 
    digitalWrite(8,LOW);
    digitalWrite(7,LOW); 
    digitalWrite(9,LOW);
   }
   
}