leggere tempo pulsante premuto...

tutto il tempo che aspetta che venga premuto il pulsante poi se non

questo if non funziona:

pulschiusura = digitalRead(pulschiusura);

if (pulschiusura == HIGH) { duratapulschiusura = pulseIn (pulschiusura, HIGH); }

Praticamente, che abbia o no il pulsante premuto, pulseIn funziona sempre e tiene impegnato il micro per il secondo di default.

inutilmente e usando millis() non riesco a trovare una soluzione a leggere quanto tempo viene tenuto premuto un pulsante, che poi mi basta misurare un secondo.

io non riesco a vederla.

uffa!!

Reply to
Drizzt do'Urden
Loading thread data ...

Il 09/09/2019 18:20, Drizzt do'Urden ha scritto:

Ho capito, qui pulschiusura = digitalRead(pulschiusura); invece di usare il nome della variabile dell'ingresso devo usare il numero del pin, ora funziona ma non legge il tempo.. boh.

Reply to
Drizzt do'Urden

conseguenze dai mattoni base, in questo caso del linguaggio.

millemila correzioni e prove B) E' ovvio che ci siano

dell'UCAS) spero che questa sia almeno "didattica" o comunque metta in evidenza una metodologia. E' la codifica

int keypressed () { // ritorna 1 se chiuso 0 se aperto }

void loop () { static char is_pressed = 0 ; static unsigned long tyme_pressd ; char just_released = 0 ;

if( keypressed () ) { if( is_pressed == 0 ) { tyme_pressd = millis () ; is_pressed = 1 ; } else { if( ( millis() - tyme_pressd ) > 1000 ) { is_pressed = 0 ; just_released = 1 ; } } }

if( just_released ) { // vedi tu... } }

--
- Thanks for introducing me to minimalims. 
- It's the least I could do.
Reply to
Archaeopteryx

Il 09/09/2019 18:45, Archaeopteryx ha scritto:

uhmm, potrebbe essere che millis() aumenta costantemente mentre

errore di fondo :-(

Oppure non ho capito una mazza :-)

Reply to
Drizzt do'Urden

Il 09/09/2019 18:45, Archaeopteryx ha scritto:

Si potrebbe usare la funzione do/while ?

Reply to
Drizzt do'Urden

flowchart di sezioni anche piccole. Potremmo star dicendo

vedo che come l'ho scritta, una volta entrati nella

*avvicina* a una soluzione funzionante riscrivendo come sotto. E' il livello in cui mi pare inizi a funzionare e potrei pensare di mettere alla prova il frammento di codice, ma aspetterei uno o entrambi dei seguenti eventi:

didattica e lo corregge (sicuramente ancora non va);

int keypressed () { // ritorna 1 se chiuso 0 se aperto }

void loop () { static char is_pressed = 0 ; static unsigned long tyme_pressd ; char just_released = 0 ;

if( keypressed () ) { if( is_pressed == 0 ) { tyme_pressd = millis () ; is_pressed = 1 ; } } else { if( ( millis() - tyme_pressd ) > 1000 ) { is_pressed = 0 ; just_released = 1 ; } }

if( just_released ) { // vedi tu... } }

--
- Thanks for introducing me to minimalims. 
- It's the least I could do.
Reply to
Archaeopteryx

giri a vuoto nei loop, quindi personalmente cerco di mettere dei flag e organizzare le cose in modo che un confronto o la valutazione di un'espressione venga fatto

perfettibile da questo punto di vista.

--
- Thanks for introducing me to minimalims. 
- It's the least I could do.
Reply to
Archaeopteryx

Il 09/09/19 18:20, Drizzt do'Urden ha scritto:

In alcuni casi ragionare a contatti e temporizzatori semplifica. Nel seguente schema il contatto 'in' comanda un temporizzatore Ton (ritardato all'attacco) che comanda un'uscita 'q'. L'uscita ritorna a zero quando il contatto si riapre:

.-------. in | Ton | q

-----] [----------| |---------( )------ | 1s | '-------'

Traduciamolo in Ardu-C:

byte in = (digitalRead(...) == PRESSLEVEL); if (!in) { q=0; t=millis(); } else if (millis()-t > 1000) { q=1; }

Reply to
Claudio_F

effetti tendo sempre a scrivere cercando di evitare questo

un'ottima soluzione.

Anche se ammetto, non ce la farei mai a usarla; io sono nato con l'8088 e per dirne una anche se so che il compilatore riesce a usare il minimo numero di variabili (nel senso che puoi dichiararne due ma se vede che ne usi una sola per volta genera il codice di conseguenza) il C della MS non aveva questa ottimizzazione. Quindi tuttora non resisto e devo cercare di prendere il controllo io.

Esempio: invece di "int passo_1" e "int passo_2" che il compilatore potrebbe tradurre in una sola variabile scrivo per esempio "int dummy" e la uso in entrambe le zone del

casini ma le brutte abitudini sono dure a morire e l'imprinting pure, quindi cerco di non contare sul compilatore.

--
- Thanks for introducing me to minimalims. 
- It's the least I could do.
Reply to
Archaeopteryx

Il 09/09/19 20:28, Archaeopteryx ha scritto:

In genere a inizio loop effettuo una

uint32_t now = millis();

e poi uso now in tutti i punti dove serve.

Comunque vedo che anche chiamare varie volte millis non rallenta piu` di tanto, il loop gira a qualche dieci kHz (credo che l'ATMEGA328 rulli a quasi 10 MIPS medi).

Reply to
Claudio_F

"Claudio_F" ha scritto nel messaggio news:ql64pn$1bv4$ snipped-for-privacy@gioia.aioe.org...

}

mi piace il tuo modo di fare parallelismi con i PLC, ma chissa' se Drizzt sa cos'e' e come funziona un PLC ?

intanto per complicare la vita a Drizzt, :-)) mettiamo il tuo esempio tutto su una riga:

pressed = !digitalRead( pin ) ? millis()-t > 1000 : ( t=millis(),false );

dove:

bool pressed; // stato del pulsante da usare poi nel programma unsigned long t; // memoria millis alla pressione da non toccare mai serve solo per quella riga di programma

sketch di test completo:

unsigned long t=0;

void setup() { // put your setup code here, to run once: pinMode( 13,OUTPUT ); pinMode( 3,INPUT_PULLUP ); }

void loop() { // put your main code here, to run repeatedly:

bool pressed = !digitalRead( 3 ) ? millis()-t > 1000 : ( t=millis(),false );

digitalWrite( 13,pressed ); }

Reply to
alfio

lse );

guru ^_^

compatti mi vengono sul serio le vertigini.

--
- Thanks for introducing me to minimalims. 
- It's the least I could do.
Reply to
Archaeopteryx

Il 09/09/19 21:07, alfio ha scritto:

Non serve, basta saper disegnare uno schema a rele' ;)

Mi associo alla malvagita` :D

Pero` non e` totalmente equivalente, perche' se il contatto rimane chiuso indefinitamente, ogni 51 giorni per l'uscita si riapre per un secondo.

Reply to
Claudio_F

Il 09/09/2019 20:14, Claudio_F ha scritto:

nel riportarlo in codice mi sembra che il risultato di tempo sia sempre

Forse non riesco a leggere bene il codice?

Reply to
Drizzt do'Urden

Il 09/09/2019 21:07, alfio ha scritto:

Grazie -_- :-P

a parte che non ho trovato da nessuna parte il simbolo "?", cosa significa? Anche qui, se non ho letto male il codice, possibilissimo :-)

valore esagerato.

Reply to
Drizzt do'Urden

In data settembre 2019 alle ore 13:39:45, Drizzt do'Urden ha scritto:

}
a

non conosco assolutamente Arduino,ma forse mi sugge il problema. Con un microcontrollore generico userei l'input capture,per tempi brevi(ms = o meno),mi pare che diversi micro abbiano gi=E0 un filtro digitale interno = per ignorare commutazioni troppo brevi. Metterei il timer del capture in DMA verso una variabile destinazione e abiliterei il timer su interrupt del GPIO del pin.Potrei quindi leggermi con calma il risultato,senza polling continuo. Arduino non permette di fare questo?

--
Questa email =E8 stata esaminata alla ricerca di virus da AVG. 
http://www.avg.com
Reply to
blisca

Vuol dire "voglio farmi del male", ma un'altra spiegazione

formatting link

--
- Thanks for introducing me to minimalims. 
- It's the least I could do.
Reply to
Archaeopteryx

Il 10/09/2019 14:08, Archaeopteryx ha scritto:

non funziona:

if (pulschiusura == HIGH, pulsapertura==LOW, finecorsa==HIGH) { digitalWrite (relechiusura, HIGH); }

Reply to
Drizzt do'Urden

Il 10/09/2019 13:58, blisca ha scritto:

io non ti so rispondere, so solo che arduino uno ha solo due pin con

di fare qualcosa che funzioni ma arrivo poco in la :-) Per ora ho messo condensatore e resistenze per creare un filtro che assorba gli eventuali cambi di stato spuri.

Reply to
Drizzt do'Urden

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.