Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

tempo tra un lampeggio e il successivo

Progetti, interfacciamento, discussioni varie su questa piattaforma.

Moderatori: Foto UtenteWALTERmwp, Foto Utentexyz

0
voti

[11] Re: tempo tra un lampeggio e il successivo

Messaggioda Foto Utentelucaking » 15 feb 2021, 22:05

danielealfa ha scritto:
Codice: Seleziona tutto
if (!primoGiro) conta = (now-tm < 2000) ? conta+1 : 0;

non riesco a capirla, nel uso del ? e del 0 finale.

L' uso dell' operatore ? serve a scrivere in maniera più semplice vari if e else.
Dai un occhiata qui.
Avatar utente
Foto Utentelucaking
1.651 4 5 8
Expert
Expert
 
Messaggi: 1445
Iscritto il: 29 mag 2015, 14:28

1
voti

[12] Re: tempo tra un lampeggio e il successivo

Messaggioda Foto Utentenicsergio » 16 feb 2021, 9:14

djnz ha scritto:Déjà vu... si può usare una logica molto più semplice

Foto Utentedjnz: impeccabile come sempre =D>

danielealfa ha scritto:non riesco a capirla, nel uso del ? e del 0 finale

come ti ha indicato Foto Utentelucaking, ti permettere di scrivere costrutti if/else semplici su una riga, a mio avviso scrivere il codice in meno righe, a meno che queste non diventino criptiche, aumenta la leggibilità.
Andando a step, l'if scritta in maniera estesa sarebbe:

Codice: Seleziona tutto
if (!primoGiro)
{
   if (now - tm < 2000)
   {
      conta = conta + 1;
   }
   else
   {
      conta = 0;
   }
}


se nei blocchi if o else hai una sola istruzione, puoi omettere le parentesi:

Codice: Seleziona tutto
if (!primoGiro)
{
   if (now - tm < 2000)
      conta = conta + 1;
   else
      conta = 0;
}


ed usando l'operatore ternario "?" diventa:

Codice: Seleziona tutto
if (!primoGiro)
   conta = (now - tm < 2000) ? conta + 1 : 0;


Potresti scriverla anche così:

Codice: Seleziona tutto
if (!primoGiro)
   (now-tm < 2000) ? conta++ : conta = 0;


o anche (dove avviene una conversione implicita bool -> int):

Codice: Seleziona tutto
if (!primoGiro)
   conta = (conta + 1) * (now - tm < 2000);

quest'ultima forma in particolare è molto brutta e poco leggibile, io l'ho usata in linguaggi dove l'operatore "?" non è disponibile e in condizioni dove è importante mantenere su una riga valutazione ed azione.


Se posso aggiungere un paio di consigli a quelli degli altri:

ho letto il tuo listato velocemente, non invoglia alla comprensione, ma ho notato che memorizzi degli intervalli di tempo misurati con millis() in tipo di dati long, questo ti espone ai peggiori bug, ovvero quelli che non "trappi" subito:
la funzione millis() ritorna un unsigned long che va da 0 a 4294967295, quindi dopo 49.7 giorni il registro va in overflow e riparte a contare da zero, se usi sempre degli unsigned long anche per gestire le differenze tra i valori misurati, sei immune dal problema dell'overflow ed ottieni sempre risultati coerenti

ti consiglio di usare i tipi bool anziché boolean, il boolean è un alias per il tipo bool, sembra addirittura ci sia una proposta per deprecarlo:
https://arduino.stackexchange.com/questions/43688/using-special-arduino-boolean-data-type-instead-of-standard-bool-data-type
Avatar utente
Foto Utentenicsergio
4.701 3 9 13
Master
Master
 
Messaggi: 938
Iscritto il: 1 gen 2020, 16:42

0
voti

[13] Re: tempo tra un lampeggio e il successivo

Messaggioda Foto Utentedjnz » 16 feb 2021, 19:55

danielealfa ha scritto:cosa cambia se vengono inizializzate prima del setup o nel loop a questo modo?

Le variabili dichiarate prima del setup sono globali (e li ho dichiarato quelle che devono mantenere il valore tra una chiamata e l'altra delle funzioni). Quelle che ho dichiarato dentro il loop sono invece variabili locali che non serve mantengano il valore tra un giro di loop e l'altro. È solo l'abitudine Pythonica di non inquinare lo spazio dei nomi globali se non necessario. In questo caso specifico, visto che anche le altre variabili sono usate solo dentro la funzione loop, si potevano comunque dichiarare al suo interno, ma di tipo static, in modo da non perdere il valore tra un giro a l'altro (l'assegnamento iniziale avviene solo una volta):
Codice: Seleziona tutto
void loop(){
    static byte conta = 0;
    static byte primoGiro = 1;
    static byte premuto = 0;
    static unsigned long tm;  //tempo_memoria
    unsigned long now = millis();
    byte sensorValue = analogRead(A5) > 500;
    byte fronte = sensorValue && !premuto;
    premuto = sensorValue;
Una domanda ben posta è già mezza risposta.
Avatar utente
Foto Utentedjnz
1.590 1 4 7
Master
Master
 
Messaggi: 709
Iscritto il: 26 lug 2020, 14:52

0
voti

[14] Re: tempo tra un lampeggio e il successivo

Messaggioda Foto Utentedanielealfa » 23 feb 2021, 18:57

ok grazie a tutti, delle vostre dritte , buona serata
Avatar utente
Foto Utentedanielealfa
243 2 4 7
Expert
Expert
 
Messaggi: 1313
Iscritto il: 27 mag 2009, 22:51

Precedente

Torna a Arduino

Chi c’è in linea

Visitano il forum: Nessuno e 4 ospiti