Buongiorno,
sono un neofita sia dell'elettronica che della programmazione. Ho costruito un dispositivo per la fotografia "water drop". Si tratta di fotografare lo scontro di gocce d'acqua. Il circuito controlla un'elettrovalvola, che rilascia le gocce (dimensione in millisecondi definita dal codice), controlla l'intervallo fra le gocce (sempre in millisecondi), e il ritardo dello scatto della macchina fotografica. Al momento il codice permette, molto semplicemente di cambiare con 2 tasti del "LCD Shield" il delay fra le due gocce (un tasto aumenta e uno diminuisce), e con altri due il delay dello scatto. Vorrei capire come creare un menù per poter cambiare anche gli intervalli di apertura dell'elettrovalvola e poter cambiare così anche le dimensioni delle due gocce.
Pensavo a una cosa tipo: spostare un cursore con i tasti destro e sinistro, e variare il valore in corrispondenza del cursore con i tasti su e giù.
La parte hardware non da problemi, funziona perfettamente ed ho già ottenuto delle belle foto. Il circuito è alimentato da 19,5V, un regolatore di tensione porta il voltaggio a 12V, e questo alimenta sia la scheda Arduino, che l'elettrovalvola. Un pulsante di scatto fa partire la sequenza. e gli impulsi per lo scatto e l'apertura valvola partono dalla scheda regolarmente con i tempi programmati. Per isolare la scheda dalla macchina e dalla valvola ho utilizzato due optoisolatori 4n25, e per l'apertura valvola ho aggiunto un transistor controllato dall'optoisolatore.
Allego una foto scattata con il sincronizzatore e il codice
Ringrazio chiunque mi possa aiutare
Lorenzo
// caratteri SPECIALI
byte heart[8] = {
B00000,
B01010,
B11111,
B11111,
B11111,
B01110,
B00100,
B00000
};
byte drop[8] = {
B00100,
B00100,
B01110,
B01110,
B11111,
B11111,
B11111,
B01110
};
byte frecciagiu[8] = {
B00100,
B00100,
B00100,
B10101,
B11111,
B01110,
B01110,
B00100
};
byte verticale[8] = {
B01110,
B01110,
B01110,
B01110,
B01110,
B01110,
B01110,
B01110
};
// definizione PIN arduino
const int Start = 12;
const int Flash = 11;
const int Goccia = 2;
// pulsante di scatto
int saltamacacoState = HIGH;
// ritardi (regolabili da display solamente "intervalloGocce" e "ritardoFlash"
int goccia1 = 50;
int goccia2 = 50;
int intervalloGocce = 80;
int ritardoFlash = 136;
// gestione del display con tastiera
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
#define BUTTON A0
// valori delle resistenze tasti del display
int SELECT[] = {720, 800};
int LEFT[] = {480, 520};
int RIGHT[] = {0, 100};
int UP[] = {120, 280};
int DOWN[] = {300, 350};
void setup() {
// creazione dei caratteri SPECIALI
lcd.createChar(0, heart);
lcd.createChar(1, drop);
lcd.createChar(2, frecciagiu);
lcd.createChar(3, verticale);
// inizializzazione display
lcd.begin(16, 2);
// inizializzazione dei PIN arduino
pinMode(Flash, OUTPUT);
pinMode(Goccia, OUTPUT);
pinMode(Start, INPUT_PULLUP);
}
void loop() {
int button (analogRead(BUTTON)); // interroga la tastiera e varia i parametri a seconda del tasto premuto
analogRead(BUTTON); {
if ( LEFT[0] <= button && button <= LEFT[1] ) {
intervalloGocce = intervalloGocce - 1;
}
if ( RIGHT[0] <= button && button <= RIGHT[1] ) {
intervalloGocce = intervalloGocce + 1;
}
if ( UP[0] <= button && button <= UP[1] ) {
ritardoFlash = ritardoFlash + 1;
}
if ( DOWN[0] <= button && button <= DOWN[1] ) {
ritardoFlash = ritardoFlash - 1;
}
// quando si preme il pulsante "SALTAMACACO" che è il controllo di inizio della sequenza
saltamacacoState = digitalRead(Start);
if (saltamacacoState == LOW) {
delay(1000); // aspetta 1 secondo
digitalWrite(Goccia, HIGH); // apre il solenoide 1
delay(goccia1); //tiene aperto per tempo "goccia1" per la prima goccia
digitalWrite(Goccia, LOW); //chiude il solenoide 1
delay(intervalloGocce); //aspetta il tempo "intervalloGocce" prima di rilasciare la seconda goccia
digitalWrite(Goccia, HIGH); // apre il solenoide 1
delay(goccia2); //tiene aperto per tempo "goccia2" per la seconda goccia
digitalWrite(Goccia, LOW); //chiude il solenoide 1
delay(ritardoFlash); //aspetta il tempo "ritardoFlash" prima di scattare la foto
digitalWrite(Flash, HIGH); //fa scattare la macchina
delay(500); //tempo necessario perchè la macchina scatti
digitalWrite(Flash, LOW); // interrompe il cortocircuito sullo scatto
delay(3000);
} //pausa per evitare falsi contatti e triggers
else {
digitalWrite(Flash, LOW);
digitalWrite(Goccia, LOW);
// scrive a monitor alternativamente: l'introduzione e i valori dei parametri impostati
// ogni refresh di un secondo aggiorna i valori se vengono modificati dal VOID precedente
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("PECOS Dripper");
lcd.setCursor(14, 0);
lcd.write(byte(1));
lcd.setCursor(15, 0);
lcd.write(byte(1));
lcd.setCursor(0, 1);
lcd.print("Valori impostati");
delay(1000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("G1");
lcd.setCursor(3, 0);
lcd.print("G1-G2");
lcd.setCursor(9, 0);
lcd.print("G2");
lcd.setCursor(12, 0);
lcd.print("Foto");
lcd.setCursor(2, 0);
lcd.write(byte(3));
lcd.setCursor(8, 0);
lcd.write(byte(3));
lcd.setCursor(11, 0);
lcd.write(byte(3));
lcd.setCursor(2, 1);
lcd.write(byte(3));
lcd.setCursor(8, 1);
lcd.write(byte(3));
lcd.setCursor(11, 1);
lcd.write(byte(3));
lcd.setCursor(0, 1);
lcd.print(goccia1);
lcd.setCursor(3, 1);
lcd.print(intervalloGocce);
lcd.setCursor(9, 1);
lcd.print(goccia2);
lcd.setCursor(12, 1);
lcd.print(ritardoFlash);
delay(1000);
}
}
}
Macchina_SCATTA_parametri_CAMBIANO_prova_GOCCIA.ino (4.44 KB)