ciao a tutti, scrivo qui per alcuni aiuti riguardanti lo sketch che ho fatto.
devo comandare lo scatto di una reflex tramite fotocellula, all'interruzione della "barriera" diciamo, parte lo scatto che puo essere ritardato da 0ms a qualche secondo
questo a grandi linee è il codice iniziale , semplice ma credo che funzioni.
#define FOTOCELLULA_PIN 10 //pin a cui è collegata la fotocellula
#define FOTOCAMERA_PIN 12 //pin a cui è collegato l'opto 4N25
#define STANDBY 0
#define ACTIVE 1
int mode = STANDBY;
void setup() {
pinMode(FOTOCELLULA_PIN, INPUT); //imput digitale fotocellula
pinMode(FOTOCAMERA_PIN, OUTPUT); //output digitale scatto foto
}
void loop() {
if (digitalRead(FOTOCELLULA_PIN) == HIGH) //riceve il segnale della fotocellula
{
mode = ACTIVE;
delay(50); //tempo di attesa tra fotocellula e scatto 50 millisecondi
digitalWrite(FOTOCAMERA_PIN, HIGH); // da il contatto del 4N25 e scatta le foto
}
if((mode == ACTIVE) && (digitalRead(FOTOCELLULA_PIN) == LOW))
{
digitalWrite(FOTOCAMERA_PIN, LOW); // toglie il contatto del 4N25 e blocca lo scatto delle foto
mode = STANDBY;
}
}
è corretto? +
Direi di si, ma non puoi provarlo?
Questo ammesso che tu voglia che la fotocamera faccia più scatti..
ciao sciorty, sto aspettando che mi arrivi l'opto e la breadbord
potrei collegarlo anche cosi "volante" ma preferisco aspettare e far le cose fatte bene.
nel frattempo leggo e imparlo a programmare con arduino
sciorty:
Questo ammesso che tu voglia che la fotocamera faccia più scatti..
esatto, con questo codice in pratica finche la barriera viene interrotta la macchina scatta.
vorrei poter impostare anche un tempo di ritardo tra uno scatto e l'altro...
ma devo ragionarci su xke non avendo mai programmato devo un attimo capire
lucavigna:
vorrei poter impostare anche un tempo di ritardo tra uno scatto e l'altro...
ma devo ragionarci su xke non avendo mai programmato devo un attimo capire
Basta aggiungere un LOW pochi msec dopo l'HIGH al pin di scatto.
Comunque per com'è ora il codice va bene, ma se in futuro metterai altre righe sotto sostituirei quell' IF con un WHILE
P.s: l'obbiettivo della fotocamera va messo in manuale, altrimenti devi comandare anche la messa a fuoco e questo ti sballa i tempi
EDIT
modificato la baggianata e risposto sotto 
sciorty:
Basta aggiungere un LOW pochi msec dopo l'HIGH al pin di scatto.
Comunque per com'è ora il codice va bene, ma se in futuro metterai altre righe sotto sostituirei quell' IF con un WHILE
P.s: l'obbiettivo della fotocamera va messo in manuale, altrimenti devi comandare anche la messa a fuoco e questo ti sballa i tempi
allora devo studiare un po di piu 
no no l'obiettivo è in manuale e la messaa fuoco gia preimpostata. l'opto comanda solo eslucivamente i collegamenti dello scatto
ora controllo xke sopra ho scritto una baggianata
in pratica devo modificarlo cosi:
#define FOTOCELLULA_PIN 10 //pin a cui è collegata la fotocellula
#define FOTOCAMERA_PIN 12 //pin a cui è collegato l'opto 4N25
#define STANDBY 0
#define ACTIVE 1
int mode = STANDBY;
void setup() {
pinMode(FOTOCELLULA_PIN, INPUT); //imput digitale fotocellula
pinMode(FOTOCAMERA_PIN, OUTPUT); //output digitale scatto foto
}
void loop() {
while(digitalRead(FOTOCELLULA_PIN) == HIGH) //riceve il segnale della fotocellula
{
mode = ACTIVE;
delay(50); //tempo di attesa tra fotocellula e scatto
digitalWrite(FOTOCAMERA_PIN, HIGH); // da il contatto del 4N25 e scatta le foto
delay(1000); //mantiene lo scatto per 1 secondo
digitalWrite(FOTOCAMERA_PIN, LOW); // toglie contatto del 4N25 e scatta le foto
delay(5000); //rimane inattivo lo scatto per 5 secondi
}
if((mode == ACTIVE) && (digitalRead(FOTOCELLULA_PIN) == LOW))
{
digitalWrite(FOTOCAMERA_PIN, LOW); // toglie il contatto del 4N25 e blocca lo scatto delle foto
mode = STANDBY;
}
}
in pratica cosi facendo , finche il pin della fotocellula rimane su HIGH , il pin della fotocamera continua a fare un LOW / HIGH in base ai tempi impostati in delay()
giusto?
Esatto, a questo punto puoi fare direttamente così (almeno, io farei così):
#define FOTOCELLULA_PIN 10 //pin a cui è collegata la fotocellula
#define FOTOCAMERA_PIN 12 //pin a cui è collegato l'opto 4N25
void setup() {
pinMode(FOTOCELLULA_PIN, INPUT); //imput digitale fotocellula
pinMode(FOTOCAMERA_PIN, OUTPUT); //output digitale scatto foto
}
void loop() {
while(digitalRead(FOTOCELLULA_PIN) == HIGH) //riceve il segnale della fotocellula
{
delay(50); //tempo di attesa tra fotocellula e scatto
digitalWrite(FOTOCAMERA_PIN, HIGH); // da il contatto del 4N25 e scatta le foto
delay(10); //mantiene lo scatto per 1 secondo
digitalWrite(FOTOCAMERA_PIN, LOW); // toglie contatto del 4N25
delay(5000); //aspetto 5 secondi per l'eventuale prossimo scatto
}
}
Un secondo per il mantenimento dello scatto è po' tantino, basterebbero pochi ms. Anche perché se la tua fotocamera è veloce in un secondo potrebbe anche fare più di uno scatto visto che lo mantieni HIGH
sciorty:
Esatto, a questo punto puoi fare direttamente così (almeno, io farei così):
Un secondo per il mantenimento dello scatto è po' tantino, basterebbero pochi ms. Anche perché se la tua fotocamera è veloce in un secondo potrebbe anche fare più di uno scatto visto che lo mantieni HIGH
perfetto! allora le mie letture non sono state vane!
ho impostato il tempo di un secondo ma effettivamente è un po troppo. impostando lo scatto singolo potrebbe anche non crearmi problemi ma farmi piu di uno scatto, con lo scatto a raffica credo che in un secondo riesco a fare circa 12 scatti ma i flash non mi stanno dietro e non è quel che mi serve 
faro' delle prove e vediamo un po come gestire il ritardo 
grazie!
poi piu avanti inseriro' altre funzioni. e qui la cosa si complica eheh
o almeno x me che sono un novizio!
PS: ho visto che hai tolgo alcune righe di comando? posso chiederti come mai?
#define STANDBY 0
#define ACTIVE 1
int mode = STANDBY;
if((mode == ACTIVE) && (digitalRead(FOTOCELLULA_PIN) == LOW))
{
digitalWrite(FOTOCAMERA_PIN, LOW); // toglie il contatto del 4N25 e blocca lo scatto delle foto
mode = STANDBY;
}
Perché con il while non hai bisogno di assegnare lo stato a delle variabili! se sei fuori dal ciclo, la fotocellula non è interrotta 
poi ovviamente dipende, in questo caso secondo me va meglio così, ma in futuro magari potrebbero essere meglio gli if!
ok grazie della spiegazione 
valutero le soluzioni, xke quasi quasi aggiungo lo scatto ad alta velocita con sensore audio (high speed photography)
c'è gia un progetto in rete, inserico dei connettori e con un display e dei tasti seleziono cosa voler fare se uno o l'altro 
Si, è una cosa che appassiona pure me nonostante non sia fotografo.
Per gli scatti ad alta velocità(le più comuni nell'acqua) io usai un piezo elettrico dei buzzer, per percepire le vibrazioni. Qui trovi un semplice tutorial 
grazie del link ora me lo guardo per bene!
io ho ordinato una shield gia assemblata per arduino, un sensore suono con livello di soglia impostabile, per 4 euro avro' da divertirmi eheh!
sciorty, ho deciso di aggiungere ulteriori cose al codice
devo collegare un display (HD44780 16x2) con una scheda I2C (1602 I2C interface) ed il sensore DHT11
in modo da vedere temperatura e umidita sul display
poi voglio aggiungere anche un RTC I2C per poter visualizzare anche la data e l'ora in questo modo:
T: 25° U: 18%
05/01/14 18:30
per ora ho creato un codice a parte che poi aggiungero al resto, mi trovo meglio ad elaborare i codici cosi
ho importato le librerie e ho fatto compilare, non mi da errori.
// carico le librerie
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
// definisco il pin del sensore
#define DHTPIN 8
// definisco il tipo di sensore
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
// definisco il collegamento del seriale e il display
LiquidCrystal_I2C lcd(0x25, 16, 2);
void setup() {
// setto il tipo di display (colonne, righe)
lcd.begin(16, 2);
// Pulisce l'LCD e pone il cursore all'inizio
lcd.clear();
// scrivo sul display le parole fisse
lcd.print("T:");
lcd.setCursor(0,1);
lcd.print("U:");
lcd.setCursor(5,1);
}
void loop() {
int t = dht.readTemperature();
int h = dht.readHumidity();
// posiziono il cursore per la prima riga della data e ora
lcd.setCursor(3, 0);
lcd.print(t);
lcd.setCursor(7, 0);
lcd.print(h);
}
poi nella seconda riga del display voglio far scrivere la data e l'ora
al momento mi manca il modulo i2c del display, il sensore dht11 e il display ce li ho gia.
devo aspettare che mi arrivi il modulo e poi provarlo
come ti sembra il codice?
in questo sketch invece ho collegato sia il display che il modulo rtc via I2C, collegandoli in cascata
sono codici presi da sketch gia utilizzati, li ho riadattati
c'è una cosa che non capisco:
per il display nel codice viene specificato lo Slave address :0x27, mentre per il modulo rtc non viene menzionato nei codici gia compilati che ho trovato
xke?
allego tutto il codice xke mi sa che ho combinato qualche casino
:
// carico le librerie
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#include <RTClib.h>
// definisco il pin del sensore
#define DHTPIN 8
// definisco il tipo di sensore
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
// definisco a quali pin è connesso il display
LiquidCrystal_I2C lcd(0x25, 16, 2);
char buffer1[20];
char buffer2[20];
RTC_DS1307 RTC;
const int setpin = 6;
boolean statepin = 0;
void setup () {
// scrivo sul display le parole fisse
lcd.print("T:");
lcd.setCursor(0,1);
lcd.print("U:");
lcd.setCursor(5,1);
pinMode (6, INPUT);
digitalWrite (6, HIGH);
Wire.begin();
RTC.begin();
lcd.begin(16, 2);
if (! RTC.isrunning()) {
RTC.adjust(DateTime(__DATE__, __TIME__));
}
}
void loop () {
statepin = digitalRead (setpin);
if (statepin == LOW)
{
RTC.adjust(DateTime(__DATE__, __TIME__));
}
DateTime now = RTC.now();
sprintf(buffer1, "%02d:%02d", now.hour(), now.minute());
lcd.setCursor(0,0);
lcd.print( buffer1 );
sprintf(buffer2, "%02d/%02d/%d", now.day(), now.month(), now.year());
lcd.setCursor(6,0);
lcd.print( buffer2 );
delay(1000);
int t = dht.readTemperature();
int h = dht.readHumidity();
// posiziono il cursore per la seconda riga della data e ora
lcd.setCursor(3, 1);
lcd.print(t);
lcd.setCursor(7, 1);
lcd.print(h);
}