Salve sono alle prime armi con la programmazione.
Ho compilato questo sketch con l’intento di fare qualche prova per poter scattare delle foto ad una goccia d’ acqua .
ho un problema con la funzione millis, non mi funziona correttamente nel punto dove ho segnato come “ errore in questo punto ,mentre la seconda funzione millis mi funziona correttamente.
L’intento è quello di i leggere il passaggio della goccia d’acqua ed impostare un ritardo con il potenziometro per permette di fotografarla al momento desiderato.
il led simula lo scatto, se inserisco dilay funziona correttamente mentre con la funzione millis non funziona.
qualche consiglio in merito!
grazie
Carlo
//Fotografia
//Obiettivo: fotografare una goccia o un fulmine.
const int led = 7;// LED Blu scatto
const int led2 = 8;// LEd Giallo Normalmente Acceso
const int Potenziometro = A1 ;//Potenziometro per ritardo scatto dal passaggio
int Fotoresistenza = A0 ;//Sensore fotoresistenza
int FOTOR = 0 ;// Variabile Fotoresistenza
int Ritardo = 0 ;// Variabile Ritardo con potenziometro
int ValTemp= 0 ;
unsigned long RitardoTemp ;// Associo una varibile temp ad ogni evento ( Ritardo)
unsigned long time ;//Variabile di riferimento per lo scorrere del tempo
unsigned long letturadati;
void setup () {
pinMode (led,OUTPUT);// LED Blu scatto
pinMode (led2,OUTPUT);// LEd Giallo Normalmente Acceso
pinMode (Fotoresistenza, INPUT);//Sensore fotoresistenza
pinMode (Potenziometro,INPUT);// Potenziometro per impostare il ritardo di scatto
time = millis();// Associo alla variabile time il contatore interno
RitardoTemp = millis();
letturadati = millis();
Serial.begin (9600);// Inizializo la seriale
}
void loop () {
time = millis ();
Ritardo = analogRead (Potenziometro);// leggo il valore del potenziometro
Ritardo = map (Ritardo,0,1023,0,500);//converto il valore del potenziometro da 0 a 500 ms
FOTOR = analogRead ( Fotoresistenza );//Leggo il valore della Fotoresistenza e lo assegno alla variabile FOTOR
if ( time > RitardoTemp + Ritardo){// errore in questom punto
RitardoTemp = millis ();
}
if (FOTOR < 920) {// Il led si accende coquando sodisfatta la condizione
digitalWrite (led,HIGH); //LED Blu scatto con il ritado inmpstato dal potenziometro
}
else{
digitalWrite (led , LOW);
}
if (FOTOR < 933){
digitalWrite (led2 ,LOW );
}
else{
digitalWrite (led2 ,HIGH );
}
if (time > letturadati + Ritardo ){
letturadati = millis();
Serial.print ( "Sensore = ");
Serial.println (FOTOR );
Serial.print ( "Ritardo = ");
Serial.println (Ritardo );
}
}
é difficile capirti se non descrivi meglio cosa é il problema.
Ci sono alcuni problemi concettuali.
una fotoresistenza é troppo lenta e troppo poco sensibile per individuare bene la goccia.
Userei un piccolo laser tipo puntatore e un fototransistore.
devi far partire il conto del ritardo dal momento che rilevi la goccia. percui carichi la variabile RitardoTemp solo in quel momento e memorizzi l'azionamento della fotocellula in una variabile di stato.
Ok innanzitutto grazie
per la risposta.
La fotoresistenza è provvisoria poi userò un piccolo puntatore laser con un fototransistore come dici tu.
Ora vedo di fare la modifica suggerita.
grazie
Carlo
OTTIMO il tuo tutorial sull'uso di millis() !! veramente ben spiegato! Mi ha dato spunto per un progetto dove devo fare diverse cose ad intervalli prestabiliti, uno scheduler insomma. Ho visto anche l'ottimo Looper, propio quello che stavo cercando!! credo sia ottimo il poter aggiungere task, stopparle o metterle in pausa ecc... molto utile secondo me.
Ho modificato lo sketch come suggerito da Uwe ma non mi funziona , non ho errori di compilazione.
Mi spiego meglio quando copro la fotoresistenza il led si accende lampeggiando e con il potenziometro vario la velocità di lampeggio.
Se al posto del if al punto 3 Inserisco un delay dopo il punto 4 attengo che il led si accende con il ritardo impostato.
Ed e quello che volevo.
Con il potenziometro voglio poter impostare il ritardo di accensione del led quando copro la fotoresistenza.
La funzione millis credo sia corretta perché sul serial monitor riesco a variare la velocità di lettura dei dati.
//Fotografia
//Obiettivo: fotografare una goccia o un fulmine.
const int led = 7;// LED Blu scatto
const int led2 = 8;// LEd Giallo Normalmente Acceso
const int Potenziometro = A1 ;//Potenziometro per ritardo scatto dal passaggio
int Fotoresistenza = A0 ;//Sensore fotoresistenza
int FOTOR = 0 ;// Variabile Fotoresistenza
int Ritardo = 0 ;// Variabile Ritardo con potenziometro
int Goccia = 0; // Variabile dove rilevo il passaggio della goccia
unsigned long RitardoTemp ;// Associo una varibile temp ad ogni evento ( Ritardo)
unsigned long time ;//Variabile di riferimento per lo scorrere del tempo
unsigned long letturadati;
void setup () {
pinMode (led,OUTPUT);// LED Blu scatto
pinMode (led2,OUTPUT);// LEd Giallo Controllo Normalmente Acceso
pinMode (Fotoresistenza, INPUT);//Sensore fotoresistenza
pinMode (Potenziometro,INPUT);// Potenziometro per impostare il ritardo di scatto
time = millis();// Associo alla variabile time il contatore interno
RitardoTemp = millis();
letturadati = millis();
Serial.begin (9600);// Inizializo la seriale
}
void loop () {
time = millis ();
Ritardo = analogRead (Potenziometro);// leggo il valore del potenziometro
Ritardo = map (Ritardo,0,1023,0,500);//converto il valore del potenziometro da 0 a 500 ms
FOTOR = analogRead ( Fotoresistenza );//Leggo il valore della Fotoresistenza e lo assegno alla variabile FOTOR
if (FOTOR < 920) {// 1- Il led si accende coquando sodisfatta la condizione
Goccia = 1; // 2- quando sodisfatta la condizione assegno alla variabile Goccia il valore 1
}
if (( Goccia == 1) && ( time > RitardoTemp + Ritardo)){// 3 - errore in questom punto
RitardoTemp = millis ();
digitalWrite ( led, HIGH);//4 -Accendo il led che simula lo scatto
Goccia = 0 ; // 5 - Resetto al valore 0
}
else{
digitalWrite (led , LOW);
}
if (Goccia == 1){
digitalWrite (led2 ,LOW );
}
else{
digitalWrite (led2 ,HIGH );
}
if (time > letturadati + Ritardo ){
letturadati = millis();
Serial.print ( "Sensore = ");
Serial.println (FOTOR );
Serial.print ( "Ritardo = ");
Serial.println (Ritardo );
Serial.print ( "Goccia = ");
Serial.println (Goccia );
}
}
Ho modificato ulteriormente sketch ,
Con la funzione delay sul punto 1 funziona correttamente,il led si accende con il ritardo impostato.
Se al punto 1 inserisco la funzione millis lo sketch non mi funziona più e il led comincia a lampeggiare.
qualche consiglio !
//Fotografia
//Obiettivo: fotografare una goccia o un fulmine. V 0,5
const int led = 7;// LED Blu scatto
const int led2 = 8;// LEd Giallo Normalmente Acceso
int Fotoresistenza = A0 ;//Sensore fotoresistenza
int Pulsante = 5 ;// pulsante per incrementare il tempo di ritardo scatto
int Pulsante2 = 4 ;
int Puls = 0;// variabiledel pulsante
int Puls2 = 0;// variabiledel pulsante
int FOTOR = 0 ;// Variabile Fotoresistenza
int Ritardo = 0 ;// Variabile Ritardo con potenziometro
int Goccia = 0; // Variabile dove rilevo il passaggio della goccia
unsigned long RitardoTemp ;// Associo una varibile temp ad ogni evento ( Ritardo)
unsigned long time ;//Variabile di riferimento per lo scorrere del tempo
unsigned long letturadati;
unsigned long startTime = 0;
unsigned long startTime2 = 0;
unsigned long OldTime;
void setup () {
pinMode (led,OUTPUT);// LED Blu scatto
pinMode (led2,OUTPUT);// LEd Giallo Normalmente Acceso
pinMode (Fotoresistenza, INPUT);//Sensore fotoresistenza
pinMode (Pulsante, INPUT); // pulsante per incrementare il tempo di ritardo scatto
pinMode (Pulsante2, INPUT); // pulsante per decremento il tempo di ritardo scatto
time = millis();// Associo alla variabile time il contatore interno
OldTime = millis(); // tempo iniziale memorizzato per confronto con time
letturadati = millis();// tempo iniziale memorizzato per confronto con time
startTime = millis();
startTime2 = millis();
Serial.begin (9600);// Inizializo la seriale
}
void loop () {
time = millis (); // isruzioni oper incrementere il ritardo discatto con un pulsante
Puls = digitalRead (Pulsante);
if(Puls == HIGH && ( millis() - startTime )> 30) {
Ritardo +=5 ; //ad ogni pressione del pulsante incremento di 5 Millisecondi il ritardo di scatto
startTime = millis();
delay (10);
}
time = millis (); // isruzioni oper diminuire il ritardo discatto con un pulsante
Puls2 = digitalRead (Pulsante2);
if(Puls2 == HIGH && ( millis() - startTime2 )> 30) {
Ritardo -=5 ; //ad ogni pressione del pulsante diminuisco di 5 Millisecondi il ritardo di scatto
startTime2 = millis();
delay (10);
}
FOTOR = analogRead ( Fotoresistenza );//Leggo il valore della Fotoresistenza e lo assegno alla variabile FOTOR
if (FOTOR < 920){ // 1- Il led si accende coquando sodisfatta la condizione
Goccia = 1; // 2- quando sodisfatta la condizione assegno alla variabile Goccia il valore 1
}
delay (Ritardo); // 1 Vorrei sostituire la funzione delay con la funzione millis per impostare il ritardo
if ( Goccia == 1){
OldTime = millis ();
digitalWrite ( led, HIGH);//4 -Accendo il led che simula lo scatto
Goccia = 0 ; // 5 - Resetto al valore 0
}
else{
digitalWrite (led , LOW);
}
if (Goccia == 1){
digitalWrite (led2 ,LOW );
}
else {
digitalWrite (led2 ,HIGH );
}
if (time > letturadati + Ritardo ){
letturadati = millis();
Serial.print ( "Sensore = ");
Serial.println (FOTOR );
Serial.print ( "Ritardo = ");
Serial.println (Ritardo );
}
}
Salve
ormai sono giorni che sbatto la testa e non capisco dove sbaglio con la funzione millis.
Ora lo sketch con il delay funziona correttamente.
Nella sezione Ritardo di Scatto vorrei lavorare con i millis ma non mi funziona è come se non ci fosse.
//Fotografia TRIGGER
//Obiettivo: fotografare una goccia o un fulmine.
#include <LiquidCrystal.h> // includere la libreria:
int Laser = 6; // Pin comando Laser
int LedLaser = A1; // Pin comando Laser
int Fotoresistenza = 10 ;//Sensore fotoresistenza
int Scatto = 8 ;// Pin di scatto
int Flash = 13; //Pin per Flash
int LedScatto = A2 ;// Led controllo Scatto
int Pulsante = 7 ;// pulsante per incrementare il tempo di ritardo scatto
int Pulsante2 = 9 ;// pulsante per diminuire il tempo di ritardo scatto
int Puls = 0;// variabi pulsante incremanta
int Puls2 = 0;// variabi pulsante decrementa
int Ritardo = 0 ;// Variabile Ritardo con Pulsanti
int TempPuls =500;// Tempo che rimane premuto il pulsante di scatto
unsigned long time ;//Variabile di riferimento per lo scorrere del tempo
unsigned long OldTime;//Variabile di riferimento per confronto con tempo
unsigned long letturadati;//Variabile di riferimento per lo scorrere del tempo ritardo scrittura dati
unsigned long startTime = 0;//Variabile di riferimento per lo scorrere del tempo Pulsante Incremento
unsigned long startTime2 = 0;//Variabile di riferimento per lo scorrere del tempo Pulsante Decremento
unsigned long Ritardo1;//Variabile di riferimento per lo scorrere del tempo Ritatdo di scatto
unsigned long TempPuls1 ;//Variabile di riferimento per lo scorrere del tempo Durata scatto
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // inizializza la libreria con i Numeri dei pin dell'interfaccia
void setup() {
pinMode (Laser, OUTPUT); //assegno il ledPin in OUTPUT
pinMode (Scatto, OUTPUT); //assegno il ledPin in OUTPUT
pinMode (Fotoresistenza, INPUT);//Sensore fotoresistenza
pinMode (Flash, OUTPUT);//assegno il pin in output per il flash
pinMode (Pulsante, INPUT); // pulsante per incrementare il tempo di ritardo scatto
pinMode (Pulsante2, INPUT); // pulsante per decremento il tempo di ritardo scatto
digitalWrite(Laser,LOW);
lcd.begin (16, 2);//impostiamo il numero di colonne ed il numero di righe di lcd
lcd.setCursor(0,0);
lcd.print ("Foto Trigger");// Visualizzo il messaggio sul display
lcd.setCursor(0,1);
lcd.print ("V. 1,1");
time = millis();// Associo alla variabile time il contatore interno
OldTime = millis(); // tempo iniziale memorizzato per confronto con time
letturadati = millis();// tempo iniziale memorizzato per confronto con time
startTime = millis();
startTime2 = millis();
Ritardo1 = millis();
TempPuls1 = millis();
Serial.begin (9600);// Inizializo la seriale
delay (2000);
}
void loop() {
time = millis ();
//sezione di scatto
digitalWrite ( Laser, HIGH);// Accendo il Laser
analogWrite(LedLaser,254);//Led Controllo Laser
time = millis ();
while (digitalRead(Fotoresistenza)==LOW){
//Pulsanti
Puls = digitalRead (Pulsante);
if(Puls == HIGH && ( millis() - startTime )> 30) {
Ritardo +=5 ; //ad ogni pressione del pulsante incremento di 5 Millisecondi il ritardo di scatto
startTime = millis();
delay (10);
}
Puls2 = digitalRead (Pulsante2);
if(Puls2 == HIGH && ( millis() - startTime2 )> 30) {
Ritardo -=5 ; //ad ogni pressione del pulsante diminuisco di 5 Millisecondi il ritardo di scatto
startTime2 = millis();
delay (10);
}
// LCD
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Ritardo scatto:");
lcd.setCursor(0,1);
lcd.print(Ritardo);
//Serial monitor
Serial.print ( "Ritardo = ");
Serial.println (Ritardo );
Serial.print ( "TempPuls= ");
Serial.println (TempPuls );
}
//sezione di scatto
digitalWrite(Laser,LOW);// Spengo il Laser
analogWrite(LedLaser,0);//Spengo Led Controllo Laser
//Ritatdo di scatto
if ( time > Ritardo1 + Ritardo){
digitalWrite (Scatto,LOW);//Scatto La foto inizio
digitalWrite (Flash ,LOW);// Scatta il flash inizio
digitalWrite(LedScatto,254);//Led Controllo Scatto inizio
Ritardo1 = millis();
}
delay(TempPuls);
//Durata dello scatto
digitalWrite (Flash ,HIGH);// Scatta il flash fine
digitalWrite (Scatto,HIGH);//Scatto La foto fine
analogWrite (LedScatto,0);//Led Controllo Scatto Fine
}
Stai usando analogwrite su un pin non PWM, tra l'altro per usare valori come 0 e 254, tanto vale usare digitalwrite.
Ricorda di inserire anche il pinmode per il LedLaser.