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
#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);
}
}
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.
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
grazie in aniticipo
...
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
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);
}
}