problemi con array

chiedo aiuto al completamento della compilazione di questo programma, perchè non riesco a capire quale istruzione dare per estrarre da una array, dei dati, in particolare dei tempi in secondi, caricati su array ad ogni passaggio, e visualizzarli su un dispaly LCD.
Il programma di rilevamento funziona benissimo.

copia_rilevamento_tempi_pista_slot.ino (3.27 KB)

ciao,

in primis evita di usare "nomi" per le tue variabili che corrispondono al namespace di arduino...array è uno di questi.
secondo hai dichiarato la tua int array[15]={}; nel setup() e quindi è LOCALE al setup() e non esiste in nessun altro luogo del programma.
devi o dichiararla come "globale" o locale al loop() ma const.

ho provato così ma da errore, sulla stringa lcd.print(const char [3], int&);

int tab[15]= {};
lcd.setCursor(0 ,0);
lcd.print(const char [3], int&);

scusa...cosa vorresto ottenera da:

 lcd.print(const char [3], int&);

???

ORSO2001:
scusa...cosa vorresto ottenera da:

 lcd.print(const char [3], int&);

???

a quanto vedo nessuno a voglia di darmi una mano. grazie lo stesso
P.S. io non sono uno studente ma un pensionato che vuole sono fare un dispositivo per rilevamento
tempi, non posso studiare il linguaggi c, non ho più la possibilità.

chemmy:
P.S. io non sono uno studente ma un pensionato che vuole sono fare un dispositivo per rilevamento
tempi, non posso studiare il linguaggi c, non ho più la possibilità.

... non per farmi i fatti tuoi, ma scusa, per qule motivo? Non dirmi per l'età ... :wink:

Guglielmo

ciao chemmy,

bhe…un paio di cose te le ho dette (primo mio post)…e ti ho chiesto chiarimenti su cosa volevi ottenere dal “comando” lcd.print(const char [3], int&) per, magari, suggerirti la formula giusta.

Se vuoi un aiuto sul comprendere un comando, o su come eseguirlo, su come gestire le variabili…oppure se lo sketch che hai fatto ti da un errore o non funziona come vorresti e non capisci il perchè…qui c’è sempre qualcuno che proverà a darti una mano…se vuoi che qualcuno scriva l’intero codice al posto tuo…non sarà altrettanto facile.

Mah, vediamo se riesco a spiegarmi
Io leggendo i tuoi post precedenti mica ho capito cosa volevi fare.
E quindi non potevo sapere come aiutarti.
Te lo hanno chiesto, cosa volevi fare, ma tu hai evitato di rispondere.
E io come potrei aiutarti?
Per sapere dove bisogna andare bisogna sapere dove si vuole andare, contorto ma vero
Ho letto il tuo ultimo post, e ho pensato:

Dagli una mano, ne ha bisogno, che tutti abbiamo partito da zero, anche me.

E quindi volevo dirti:

Spiega bene il tuo problema, che si comincia

Poi ho letto che pur essendo pensionato, è avendo quindi tempo, anche per i tuoi hobby, non vuoi studiare.
Facciamo così, io ho trovato il tempo di studiare, quindi posso andare a giocare col mio hobby. Tu?
No studio...no hobby

Standardoil:
Mah, vediamo se riesco a spiegarmi
Io leggendo i tuoi post precedenti mica ho capito cosa volevi fare.
E quindi non potevo sapere come aiutarti.
Te lo hanno chiesto, cosa volevi fare, ma tu hai evitato di rispondere.
E io come potrei aiutarti?
Per sapere dove bisogna andare bisogna sapere dove si vuole andare, contorto ma vero
Ho letto il tuo ultimo post, e ho pensato:

Dagli una mano, ne ha bisogno, che tutti abbiamo partito da zero, anche me.

E quindi volevo dirti:

Spiega bene il tuo problema, che si comincia

Poi ho letto che pur essendo pensionato, è avendo quindi tempo, anche per i tuoi hobby, non vuoi studiare.
Facciamo così, io ho trovato il tempo di studiare, quindi posso andare a giocare col mio hobby. Tu?
No studio...no hobby

Ok, scusate lo sfogo, non è che non voglio studiare, mi sto applicando consultando manuali a destro e manca, ma non sono riuscito a trovare una soluzione.

Ho già compilato il programma che mi rileva con un sensore ad infrarossi il passaggio di un modello di auto, a display mi fa vedere il tempo, e mi verifica se questo tempo è il migliore oppure no, e li fa vedere nelle due righe dell' LCD. Adesso io vorrei, dopo avergli dato uno stop al rilevamento, prendere questi tempi e portarli in memoria, in modo che, dopo avere usato un pulsante mi fà vedere questi tempi dal primo all'ultimo, per poterli consultare, dopo di che si ricomincia con il rilevamento dei tempi.
Vi ringrazio per l'interessamento.

ciao,

io suggerisco:
in testa al programma, fuori da loop() e setup() crei queste variabili e la costante:

#define NUM_GIRI 10 // qui decidi quanti giri è una gara
int numGiro=0; //numero del giro eseguito
int posArrayLCD=0; // cosa devo mostrare su LCD
unsigned int tempiPerGiro[NUM_GIRI]; //crei un array che può contenere un tempo per ogni giro; ogni tempo può contenere da 0 a 65535

poi nel tuo loop(), quando verifichi se la macchia è passata per la fotocellula, salvi in :

tempiSuGiro[numGiro]= il tempo rilevato;
numGiro++; // incremento il numero del giro per prossimo rilevamento

il tempo impiegato (tieni presente il formato dell'array) viene salvato nell'array nella sua posizione corrispondente al numero di giri.

alla fine per scorrere i tempi nell'array dovrai crearti una condizione che se pulsante premuto leggo la posizione nell'array...tipo:

lcd.print(tempiSuGiro[posArrayLCD]);
posArrayLCD++;

attento alla gestione del pulsante

ORSO2001:
ciao,

io suggerisco:
in testa al programma, fuori da loop() e setup() crei queste variabili e la costante:

#define NUM_GIRI 10 // qui decidi quanti giri è una gara

int numGiro=0; //numero del giro eseguito
int posArrayLCD=0; // cosa devo mostrare su LCD
unsigned int tempiPerGiro[NUM_GIRI]; //crei un array che può contenere un tempo per ogni giro; ogni tempo può contenere da 0 a 65535




poi nel tuo loop(), quando verifichi se la macchia è passata per la fotocellula, salvi in :


tempiSuGiro[numGiro]= il tempo rilevato;
numGiro++; // incremento il numero del giro per prossimo rilevamento



il tempo impiegato (tieni presente il formato dell'array) viene salvato nell'array nella sua posizione corrispondente al numero di giri.

alla fine per scorrere i tempi nell'array dovrai crearti una condizione che se pulsante premuto leggo la posizione nell'array...tipo:


lcd.print(tempiSuGiro[posArrayLCD]);
posArrayLCD++;




attento alla gestione del pulsante

ok grazie appena torno a casa lo provo tiso dire

ho modificato il programma mi dà un errore sulla riga 45, unsigned float tempiPerGiro[NUM.GIRI];
ho usato “float” perchè ci sono dei decimali.
provo di allegarti il programma

/* Single lane slot car timer
Written by TheInsanityUnleashed @ Youtube
----------------------------------------------------

           PhotoR     10K
 +5    o---/\/\/--.--/\/\/---o GND
                  |
 Pin A0 o----------
 
 
 Pin 8 ------Piezo-----gnd
 
 
 Sensitivity Pot --------- Pin A1
 
----------------------------------------------------
*/
#include <IRremote.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3f, 16, 2);
#define NUM_GIRI 15 //indico il numero di giri max

//variables
const byte lightPin = 0;  
int speakerPin = 8;
int RECV_PIN = 0;
unsigned long lapMillis = 0;
unsigned long startMillis = millis();
unsigned long bestMillis = 9999999;
float lapTime = 0.00;
float bestLap = 0.00;
boolean firstTrigger = true;
boolean newBest = false;
int pulsante = 6;
int giro=0;
IRrecv irrecv(RECV_PIN);
int numGiro = 0;  //numero del giro eseguito
int posArrayLCD = 0; //cosa devo mostrare su LCD
unsigned tempiSuGiro[NUM_GIRI]; //creo un array che può contenere un tempo per ogni giro;ogni tempo può contenere da 0 a 65535
int statop = 0;

void setup()
{
    
    lcd.init ();
    lcd.backlight();
    lcd.setCursor(0, 0);
    lcd.print("Start!           ");
    Serial.begin(9600); 
    pinMode(speakerPin, OUTPUT);
    digitalWrite(speakerPin, LOW);
    irrecv.enableIRIn();
    pinMode (pulsante, INPUT);
    
    
 
}
void loop()
{

//lettura dal sensore di luce
RECV_PIN = analogRead(lightPin);


  //Se la macchina rilevata
  if(RECV_PIN < analogRead(1)){
  
    
    //determinare il tempo sul giro in millisecondi
    lapMillis = millis() - startMillis;
    startMillis = millis();
    
    lapTime = lapMillis / 1000.00;
    
    //se gli abeti innescano la gara di stampa iniziata
    if (firstTrigger == true){
      lcd.setCursor(0, 0);
      lcd.print("Race Started!    ");
      
    }
    
    //stampa se non il primo trigger
    if (firstTrigger != true){
      lapTime=(lapTime+1);
      giro = (giro+1);
      
      Serial.print("lapTime: ");
      Serial.println(lapTime);
      Serial.print("lapMillis: ");
      Serial.println(lapMillis);
      //print lap time
      lcd.setCursor(0, 0);
      lcd.print("Lap:    "); 
      lcd.setCursor(4, 0);
      lcd.print(giro);
      lcd.setCursor(8, 0);
      lcd.print(lapTime);
      lcd.print("       ");
      tempiSuGiro[numGiro]= lapTime;
      numGiro++; //incremento il numero del giro per prossimo passaggio
      statop = digitalRead (pulsante);}
      if(statop == HIGH){
      lcd.setCursor(0 ,0);  
      lcd.print(tempiSuGiro[posArrayLCD]);
      posArrayLCD++;} 
      
   
    
    //se l'ultimo giro è meglio del miglior giro
    if(lapMillis < bestMillis && firstTrigger != true)
    {
      bestMillis = lapMillis;
      bestLap = lapTime;
      Serial.print("bestLap: ");
      Serial.println(bestLap);
      //print best lap time
      lcd.setCursor(0, 1);
      lcd.print("BestLap: ");
      lcd.print(bestLap);
      lcd.print("      ");
      newBest = true;
      
    }
    
    //beep piezo
    if(newBest == true)
    {
      digitalWrite(speakerPin, HIGH);
      delay(1000);
      digitalWrite(speakerPin, LOW);
      delay(25);
      digitalWrite(speakerPin, HIGH);
      delay(50);
      digitalWrite(speakerPin, LOW);
      delay(25);
      digitalWrite(speakerPin, HIGH);
      delay(50);
      digitalWrite(speakerPin, LOW);
      delay(25);
      digitalWrite(speakerPin, HIGH);
      delay(50);
      digitalWrite(speakerPin, LOW);    
      newBest = false;
    } 
    else
    {
      digitalWrite(speakerPin, HIGH);
      delay(150);
      digitalWrite(speakerPin, LOW);
    }
    
    firstTrigger = false;
    Serial.println("----------------"); 
  }
}

Ciao.
Credo che float non possa essere unsigned. Prova a toglierlo.
In ogni caso, secondo me ti conviene gestire numeri unsigned long invece di floar. Tanto in un unsigned long hai tanto "spazio"... Salvi il tempo come intero moltiplicato per 100 o 1000 e poi ti preoccupi di visualizzare i decimali solo su lcd.

Ps correggi il tuo post mettendo il codice nei tag code.

ho tolto il float, ed ho corretto anche, nella stessa riga, tempiPerGiro con tempiSuGiro, non mi da più nessun errore , il programma gira però quando premo il pulsante collegato al pin 7, non da nessun risultato,

l' istruzione del pilsante è forse sbagliata?

>chemmy: in conformità al regolamento, punto 7, devi editare il tuo post #11 (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More…** → Modify che si trova in basso a destra del tuo post) e racchiudere il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra). Ovvero, prima del codice devi mettere [ code ] (senza gli spazi che ho messo io tra le parentesi), dopo il codice devi mettere [ /code ] (sempre senza gli spazi) così da avere il codice racchiuso tra di essi. Grazie.

Guglielmo

Dopo che hai corretto come dice Guglielmo, prova a togliere il ; prima della graffa di apertura dell'if.

ho rimodificato le righe di funzione del pulsante, il programma gira bene, però quando premo il pulsante non fa vedere niente ma continua il suo loop, ti allego il programma

/* Single lane slot car timer
Written by TheInsanityUnleashed @ Youtube
----------------------------------------------------

           PhotoR     10K
 +5    o---/\/\/--.--/\/\/---o GND
                  |
 Pin A0 o----------
 
 
 Pin 8 ------Piezo-----gnd
 
 
 Sensitivity Pot --------- Pin A1
 
----------------------------------------------------
*/
#include <IRremote.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3f, 16, 2);
#define NUM_GIRI 15 //indico il numero di giri max

//variables
const byte lightPin = 0;  
int speakerPin = 8;
int RECV_PIN = 0;
unsigned long lapMillis = 0;
unsigned long startMillis = millis();
unsigned long bestMillis = 9999999;
float lapTime = 0.00;
float bestLap = 0.00;
boolean firstTrigger = true;
boolean newBest = false;
int pulsante = 6;
int giro=0;
IRrecv irrecv(RECV_PIN);
int numGiro = 0;  //numero del giro eseguito
int posArrayLCD = 0; //cosa devo mostrare su LCD
unsigned tempiSuGiro[NUM_GIRI]; //creo un array che può contenere un tempo per ogni giro;ogni tempo può contenere da 0 a 65535
int statop = 0;

void setup()
{
    
    lcd.init ();
    lcd.backlight();
    lcd.setCursor(0, 0);
    lcd.print("Start!           ");
    Serial.begin(9600); 
    pinMode(speakerPin, OUTPUT);
    digitalWrite(speakerPin, LOW);
    irrecv.enableIRIn();
    pinMode (pulsante, INPUT);
    
    
 
}
void loop()
{

//lettura dal sensore di luce
RECV_PIN = analogRead(lightPin);


  //Se la macchina rilevata
  if(RECV_PIN < analogRead(1)){
  
    
    //determinare il tempo sul giro in millisecondi
    lapMillis = millis() - startMillis;
    startMillis = millis();
    
    lapTime = lapMillis / 1000.00;
    
    //se gli abeti innescano la gara di stampa iniziata
    if (firstTrigger == true){
      lcd.setCursor(0, 0);
      lcd.print("Race Started!    ");
      
    }
    
    //stampa se non il primo trigger
    if (firstTrigger != true){
      lapTime=(lapTime+1);
      giro = (giro+1);
      
      Serial.print("lapTime: ");
      Serial.println(lapTime);
      Serial.print("lapMillis: ");
      Serial.println(lapMillis);
      //print lap time
      lcd.setCursor(0, 0);
      lcd.print("Lap:    "); 
      lcd.setCursor(4, 0);
      lcd.print(giro);
      lcd.setCursor(8, 0);
      lcd.print(lapTime);
      lcd.print("       ");
      tempiSuGiro[numGiro]= lapTime;
      numGiro++; //incremento il numero del giro per prossimo passaggio
      statop = digitalRead (pulsante);}
      if(statop == HIGH){
      lcd.setCursor(0 ,0);  
      lcd.print(tempiSuGiro[posArrayLCD]);
      posArrayLCD++;} 
      
   
    
    //se l'ultimo giro è meglio del miglior giro
    if(lapMillis < bestMillis && firstTrigger != true)
    {
      bestMillis = lapMillis;
      bestLap = lapTime;
      Serial.print("bestLap: ");
      Serial.println(bestLap);
      //print best lap time
      lcd.setCursor(0, 1);
      lcd.print("BestLap: ");
      lcd.print(bestLap);
      lcd.print("      ");
      newBest = true;
      
    }
    
    //beep piezo
    if(newBest == true)
    {
      digitalWrite(speakerPin, HIGH);
      delay(1000);
      digitalWrite(speakerPin, LOW);
      delay(25);
      digitalWrite(speakerPin, HIGH);
      delay(50);
      digitalWrite(speakerPin, LOW);
      delay(25);
      digitalWrite(speakerPin, HIGH);
      delay(50);
      digitalWrite(speakerPin, LOW);
      delay(25);
      digitalWrite(speakerPin, HIGH);
      delay(50);
      digitalWrite(speakerPin, LOW);    
      newBest = false;
    } 
    else
    {
      digitalWrite(speakerPin, HIGH);
      delay(150);
      digitalWrite(speakerPin, LOW);
    }
    
    firstTrigger = false;
    Serial.println("----------------"); 
  }
}

sicuro che
statop = digitalRead (pulsante);
vada prima della graffa?

l'ho messa prima come vedi ma non cambia niente

numGiro++;} //incremento il numero del giro per prossimo passaggio
statop = digitalRead (pulsante);

Aspetta, però la parte di lettura pulsante è dentro questo if
if (RECV_PIN < analogRead(1))
E’ corretto che sia così? Se non sei dentro quel if la pressione del pulsante non viene rilevata…