[RISOLTO] Segnapunti elettronico: testo lampeggiante e sensori ad ultrasuoni

Puoi fare una cosa simile:

if(distanza<3)
  {
  if(conta_fasi_goal==0) conta_fasi_goal=1;
  //...
  //...
  }
seGoal();

-------------------
uint32_t t_attesa;

void seGoal()
{
switch(conta_fasi_goal)
  {
  case 1:
  bipOn();
  scrivi("GOAL");
  conta_fasi_goal=2;
  t_attesa=millis();
  break;

  case 2:
  if(millis()-t_attesa>999)
    {
    bipOff();
    lcd.clear();
    t_attesa=millis();
    conta_fasi_goal=3;
    }
  break;
    
  case 3:
  if(millis()-t_attesa>499)
    {
    scrivi("GOAL");
    t_attesa=millis();
    conta_fasi_goal=4;
    }
  break;

  case 4:
  if(millis()-t_attesa>499)
    {
    lcd.clear();
    conta_fasi_goal=5;
    }
  break;
  //...

  //... ... ...

  case 21: // No... Sono di meno!
  //...
  conta_fasi_goal=0;
  }
}

Ok questo devo studiarmelo un po'... La funzione millis non mi è proprio chiara

Lascia stare

Sei troppo fuori strada

Devi studiarti come si usa la funzione millis(), prima QUI, poi QUI e QUI e QUI e tutti gli articoli che sono in QUESTA pagina ... vedrai che poi ti sarà tutto più chiaro :slightly_smiling_face:

Apportare spunti interessanti al topic... si può essere d'accordo o meno che il programma sia ampiamente migliorabile ma se non si ha voglia di aiutare non è obbligatorio intervenire

2 Likes

@Ducembarr: ... REGOLAMENTO, punto 16.4, ... evita.

Guglielmo

A proposito di millis():

... e bene specificare che, comunque, se la funzione viene correttamente richiamata, questo "ricominciare da zero" è ininfluente e il tutto funziona correttamente, quindi è cosa di cui NON ci si deve preoccupare. :wink:

Guglielmo

Sì. È scritto alla fine dei quella mia risposta.

Grazie a tutti per il supporto... Diciamo che per questo semplice progetto, mi basta ridurre un po' il tempo dei delay (senza andarmi a complicare ulteriormente le cose) e riesco comunque ad usarlo per quello che mi serve...
Capisco che per chi è esperto, a volte può essere "frustrante" vedere errori banali o dover rispondere a domande elementari. Non dovendolo fare per lavoro ma solo a scopo hobbistico con il poco tempo che ho, spero comunque di imparare sempre meglio almeno le possibilità basi che Arduino offre e dedicarmi a piccoli progetti casalinghi...
Per la variabile booleana che dicevo per i 3 suoni ripetuti del cicalino nel void Progetto, mi riferivo a qualcosa di simile a quella usata per il testo GOAL, ma trattandosi di un componente che si attiva anche in altre circostanze non so se possa essere scritta allo stesso modo, e quindi l'ho scritta in modo molto molto elementare...
Per il discorso di millis ho capito il funzionamento (soprattutto dopo il buon esempio di @Datman) ma ho ancora delle difficoltà nella sintassi, quindi studierò i link riportati da @fabpolli nel post 46 per riuscire a padroneggiarlo meglio e sostituirlo al delay che ho capito che è comunque una funzione bloccante e quindi in molti casi è sconsigliata.
Ancora grazie a tutti

1 Like

Però è l'occasione buona per imparare a farlo non bloccante con lo switch/case! Devi solo continuare quello che ho iniziato io.

Si l'ho fatto anche con il precedente progetto.
Per il momento lo uso così, poi appena riesco a padroneggiarlo meglio, riscrivo il codice in modo più ottimizzato.

Ho visto la libreria e ho cercato di capirne il funzionamento. Dovendo però usare i sensori HR04 la parte che dovrei inserire io (oltre a richiamare la libreria stessa) è solo "Sensor.Unlock = true;" all'interno del setup, giusto? Perché a quanto ho capito il resto riguarda i sensori SRF05... Oppure ho saltato qualche passaggio?

Ok, però considera che imparare ad evitare codice che si blocca (ossia le delay ma non solo...) è essenziale per poter programmare questi device che devono poter fare a volte anche più cose (quasi) contemporaneamente. Quindi ti consiglio caldamente di iniziare a studiare millis() e come si usa, cosa che poi ti porta inevitabilmente anche a studiare cosa sono e come si impostano le cosiddette "Macchine a Stati Finiti" (o in inglese FInite State machines, FSM).

A parte questo, mi chiedo: ma se hai un display LCD con I2C, che diamine di libreria stai usando che richiede tutti quegli inutili parametri?

Intendo questo:

#include <LiquidCrystal_I2C.h>
//configurazione LCD cinese
#define I2C_ADDR 0x27
#define BACKLIGHT_PIN 3
#define En_pin 2
#define Rw_pin 1
#define Rs_pin 0
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7

LiquidCrystal_I2C lcd(I2C_ADDR, En_pin, Rw_pin, Rs_pin, D4_pin, D5_pin, D6_pin, D7_pin);

L'I2C non richiede tutti quei pin, ne bastano 2 e sono sempre gli stessi (SDA e SCL ossia A4 e A5) quindi non vanno neanche specificati!

Ovviamente cambiando libreria devi anche cambiare l'inizializzazione, da:

  lcd.begin(16, 2);
  lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
  lcd.setBacklight(HIGH);

a questo (anche in questo caso, più semplice):

  lcd.init();
  lcd.backlight();

Purtroppo ci sono svariate librerie con lo stesso identico nome "LiquidCrystal_I2C" ma comportamento e caratteristiche diverse (lo so, avrebbero potuto almeno cambiare un poco il nome, ma tant'è...) che ci si confonde. Per dire, con una libreria di quelle "migliori" (io uso o quella di Frank de Brabander, o la PCF8574 di Matthias Hertel, entrambe le trovi nelle librerie dall'IDE), la definizione diventa molto semplice:

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);

Tutto qui.

Si esatto.

No, il codice è perfettamente compatibile sia con SRF05 sia con SR04, fatta eccezione per l'"Unlock" che va impostato solo per gli SR04 ossia in caso di "impallamento" dell'SR04, tenta di recuperarlo con quel metodo che ti ho descritto.

Sto usando un LCD cinese preso su AliExpress, che funziona perfettamente ma che richiede l'uso di questa libreria con questa configurazione pur usando i PIN SDA e SCL (almeno stando al video di Paolo Aliverti su YouTube che ho seguito alla lettera).

Si mi riferivo al fatto che gli SRF05 hanno una configurazione diversa (oltre al PIN triggher e PIN echo richiedono "maxdistanze" e "readinterval").

Si questo sarà il prossimo argomento che approfondirò, in quanto i piccoli progetti che voglio provare a fare richiedono automazioni temporali.

Ti confermo che per me non ha alcun senso dover definire e passare tutti quei parametri di pin che non servono: o la libreria è diciamo "strana" (e quindi poco "standard"...), oppure se hai un normale backpack I2C puoi provare ad usare la libreria che ti ho indicato e secondo me deve funzionare.

Altrimenti puoi dire esattamente quale libreria stai usando ed un link al video di Aliberti dove ne parla?

Il link è questo https://youtu.be/WZFwBiydYhg?si=D9RmD5Sxsy0VjfZm
Girando online ho trovato questo e l'ho seguito senza provare a cambiare. Può darsi che come dici tu possa funzionare anche con una libreria standard. Appena riesco ci provo

Bah anche io ho comprato vari LCD "cinesi" (di fatto i display sono tutti cinesi o quasi, e tutti basati sullo stesso chipset...) ma quello che occorre capire è l'interfaccia I2C ossia quel piccolo backpack con i 4 pin. Tra l'altro non so quale sia esattamente il display che hai acquistato visto che non hai messo il link (io personalmente ho ribrezzo per AliExpress, ma è una mia fissazione...), né hai specificato se l'adattatore I2C era già installato o se lo hai acquistato ed installato tu...

Certo, se invece lo hai preso da AZDelivery, quello che si vede nel video di Aliberti, da quel rivenditore tedesco ho comprato parecchia roba, e non ho mai avuto problemi con nulla.
Per finire, diciamo che il video di Aliberti ormai ormai ha 5 anni, non è detto che sia come ha detto lui.

Comunque sia ho scaricato quella libreria, e tra i possibili costruttori c'è anche questo:

LiquidCrystal_I2C::LiquidCrystal_I2C( uint8_t lcd_Addr )
{
   config(lcd_Addr, EN, RW, RS, D4, D5, D6, D7);
}

la funzione "config()" viene chiamata con quella (inutile) sfilza di pin e non mi pare che in realtà li utilizzi. Inoltre tra gli esempi di quella libreria in "HelloWorld_i2c.pde" (notare l'estensione, usata con gli IDE vecchissimi, precedenti persino all'1.0!!) l'inizializzazione la fa così:

LiquidCrystal_I2C lcd(0x38);
...
  lcd.begin(16,2);               // initialize the lcd 
...

E quindi, sempre secondo la mia modesta opinione, tutta quella sfilza di pin nel costruttore è INUTILE (e quella libreria è VECCHIA!).
Se il circuitino di interfaccia I2C non è "strano" ed è al contrario recente, io credo che tu possa usare la libreria standard e gettare alle ortiche quella (ed i consigli di Aliberti....).

Ho comprato qualcosa da AZDelivery, ma no LCD in questione. L'adattatore I2C era già montato sul display... Comunque proverò i tuoi consigli e se funziona con le librerie standard di sicuro la cambio, anche perché a quanto sembra quella che uso io va in conflitto con le altre, quindi se dovessi prendere un altro tipo di LCD dovrei cancellare questa per installarne un altra e così via... Ti farò sapere, grazie

Dovresti vedere il chip di quell'adattatore, questo è il mio di uno dei tanti che ho:
image

Come si può (più o meno) vedere, è basato sul chip PCF8574. Se anche il tuo ha lo stesso chip, sicuramente ti funziona anche con la libreria di Frank de Brabander, o come dicevo, meglio direttamente quella PCF8574 di Matthias Hertel.

A0, A1 e A2 impostano l'indirizzo fra 0x20 e 0x27: