Go Down

Topic: Led autonomo (Read 644 times) previous topic - next topic

SimoneBez

May 04, 2019, 11:39 am Last Edit: May 04, 2019, 02:05 pm by SimoneBez Reason: Errore mio...
Salve a tutti,
non riesco a fare una cosa, probabilmente sbaglio tutto:
vorrei rendere autonomo un led, mi spiego,
la prima volta che viene premuto un pulsante il led si accende e si conta quanto il pulsante rimane premuto,
dalla seconda volta in poi il pulsante viene premuto e rilasciato subito ed il led deve rimanere acceso per il tempo contato in precedenza, ho usato Bool ma probabilmente non ci capisco una mazza,
in breve:

Code: [Select]


int button = 2;
int led = 4;
int buttonstate = 0;
unsigned long starttempo;
unsigned long tempocontato;
bool primavolta;

void setup() {

 pinMode (buttonstate, INPUT);
 pinMode (led, OUTPUT);
 primavolta = true;

}

void loop() {

 buttonstate = digitalRead(button);

 if (buttonstate == HIGH) {

   if (primavolta) {

     digitalWrite (led, HIGH);
     starttempo = millis ();
     if (buttonstate == LOW) {

       tempocontato = (millis() - starttempo);
       digitalWrite (led, LOW);
       primavolta = false;

     }

   } else {
     digitalWrite (led, HIGH);
     delay (tempocontato);
     digitalWrite (led, LOW);
   }

 }

}


mi aiutate?
grazie
     

gpb01

#1
May 04, 2019, 11:57 am Last Edit: May 04, 2019, 11:57 am by gpb01
>SimoneBez:   ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post qui sopra (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).

In pratica, tutto il tuo codice dovrà trovarsi racchiuso tra due tag: [code] _il _tuo_ codice_ [/code] così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo. Grazie.

Guglielmo
Search is Your friend ... or I am Your enemy !

SimoneBez

a ok! scusami...
comunque nel mentre l'ho modificato,
ora è già meglio, ma sembra che ogni volta aggiunga il tempo di pressione del pulsante:

Code: [Select]


int button = 2;
int led = 4;
int buttonstate = 0;
unsigned long starttempo;
unsigned long tempocontato;
bool primavolta;

void setup() {
 
  pinMode (buttonstate, INPUT);
  pinMode (led, OUTPUT);
  primavolta = true;
}

void loop() {
  buttonstate = digitalRead(button);

  if (buttonstate == HIGH) {

    if (primavolta) {
      digitalWrite (led, HIGH);
      starttempo = millis ();
      primavolta = false;

    } else {
       digitalWrite (led, HIGH);
       delay (tempocontato);
       digitalWrite (led, LOW);     
    }
 
  } else {
    digitalWrite (led, LOW);
    tempocontato = (millis() - starttempo);   
  }

}

Standardoil

Io vedo, prevedo e stravedo, come un noto frate
Se non metti un buon debounce avrai grosse delusioni
Prima legge di Nelson (che sono io): Se vuoi il mio aiuto dimostrami almeno che hai letto il nostro "aiutateCi ad aiutarVi"

Non bado a studenti, che copino altrove

Tu hai problema-Io ti domando-Tu non mi rispondi: vuol dire che non ti serve più

Patrick_M

#4
May 04, 2019, 12:46 pm Last Edit: May 04, 2019, 12:48 pm by Patrick_M
gia... e poi
nel primo else (quando non sei nel ciclo primavolta ma il pulsante è ancora premuto) usi un delay che non è ancora stato impostato quindi il led si spegne dopo un tempo zero

p.s.
hai riscritto un nuovo post ma devi modificare il tuo primo post e aggiungere i tag code...
per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

gpb01

>SimoneBez: ... sto sempre attendedo che tu sistemi il tuo primo post seguendo quanto ti ho scritto nel mio post#1 (... dove era chiaramente indicato che NON dovevi scrivere un nuovo post, ma editare quello esistente). Grazie.

Guglielmo
Search is Your friend ... or I am Your enemy !

SimoneBez

gia... e poi
nel primo else (quando non sei nel ciclo primavolta ma il pulsante è ancora premuto) usi un delay che non è ancora stato impostato quindi il led si spegne dopo un tempo zero

p.s.
hai riscritto un nuovo post ma devi modificare il tuo primo post e aggiungere i tag code...
In realtà (l'ho provato) rimane acceso, solo che ogni volta dopo la prima, il led rimane acceso incrementando il tempo autonomamente, in apparenza aggiungendo sempre lo stesso tempocontato...

SimoneBez

#7
May 04, 2019, 02:22 pm Last Edit: May 04, 2019, 02:23 pm by SimoneBez


[/quote
Io vedo, prevedo e stravedo, come un noto frate
Se non metti un buon debounce avrai grosse delusioni

Già, infatti è proprio lì che sbaglio... Suggerimenti?

Standardoil

Sì,
per cominciare vedi un de-bouce hardware, cerca se trovi il pdf di "arduino basic connection" oppure in alternativa cerca sul santo
ti consiglio debounce HW per due ragioni
1) è sempre meglio che SW
2) se già ti incastri adesso sul SW non è che dovendoci fare "anche" il de-bounce sia più semplice...
Prima legge di Nelson (che sono io): Se vuoi il mio aiuto dimostrami almeno che hai letto il nostro "aiutateCi ad aiutarVi"

Non bado a studenti, che copino altrove

Tu hai problema-Io ti domando-Tu non mi rispondi: vuol dire che non ti serve più

Datman

#9
May 04, 2019, 06:20 pm Last Edit: May 04, 2019, 06:22 pm by Datman
Ad esempio un condensatore da 1uF con 47 ohm in serie, tra il pin del pulsante e massa.
Se il pulsante non è particolarmente delicato, puoi omettere la resistenza.
Hi,I'm Gianluca from Roma.I play&work with electronics since I was16(1984).
After 25yrs of maintenance on cameras&video mixers,since 2013myJob is HDTVstudios design.
Since Jan2015 IPlayWith Arduino:bit.ly/2F3LPWP
Thanks 4 a Karma if U like my answer

fabpolli

#10
May 06, 2019, 10:06 am Last Edit: May 06, 2019, 10:07 am by fabpolli
Già, infatti è proprio lì che sbaglio... Suggerimenti?
Detto che come già ti è stato segnalato il debounce (molto meglio se hardware in generale ma in questo caso anche per non crearti ancora più problemi lato software) è necessario al corretto funzionamento il tuo errore non è li.
Il suggerimento è questo, per mantenere la struttura del codice che hai fatto, devi usare un altra variabile booleana per sapere se devi memorizzare starttempo oppure no e non devi mettere a false la variabile primavolta in quel punto, il perché lo lascio dedurre a te altrimenti ti aiuto troppo  :)

Datman

È anche necessaria, ancor più dell'anti rimbalzo, una resistenza di pull down o di pull up. Adottando una logica diretta, come viene spontaneo fare, devi mettere una resistenza verso massa; se, invece, adotti la logica negata, puoi usare le resistenze di pull up interne, scrivendo:
pinMode(buttonstate, INPUT_PULLUP);
Hi,I'm Gianluca from Roma.I play&work with electronics since I was16(1984).
After 25yrs of maintenance on cameras&video mixers,since 2013myJob is HDTVstudios design.
Since Jan2015 IPlayWith Arduino:bit.ly/2F3LPWP
Thanks 4 a Karma if U like my answer

Standardoil

#12
May 06, 2019, 11:14 am Last Edit: May 06, 2019, 12:22 pm by Standardoil
Versione bloccante, non completa, solo come ispirazione
Code: [Select]


if (digitalRead(button)){
   If (tempocontato){
      DigitalWrite(led,1);
      Delay (tempocontato);
      DigitalWrite(led,0);
   }
   else{
      Unsigned long int localtime=Millis();
      DigitalWrite(led,1);
      While (digitalRead(button));
      Tempocontato = Millis()-localtime;
      DigitalWrite (led,0)
   }
}


metti a posto minuscole e cose del genere che è scritto da furbofono

EDIT
questo post è (anche) una parziale risposta a fabpolli, che proponeva di mantenere la struttura precedente
Secondo me è un errore, cavalli così malati vanno abbattuti. E si riparte da capo evitando gli errori passati
Anche questa gigantesca rottura di gabbasisi di leggere un pulsante in una variabile usata una sola volta per un test...
Ma (come direbbe il mio amico Salvo) dadovemmincchiavvviene ?
chi glielo ha insegnato? I sette nani?
Chi è stato il primo che la ha usata? Che merita di mangiare travasandosi la minestra dal piatto al bicchiere e usando la forchetta...
Ebbasta. Che imparino a ragionare "Lean'
Tutti che parlano di ste strxxate. Ma nessuno che lo FA sul serio...
Prima legge di Nelson (che sono io): Se vuoi il mio aiuto dimostrami almeno che hai letto il nostro "aiutateCi ad aiutarVi"

Non bado a studenti, che copino altrove

Tu hai problema-Io ti domando-Tu non mi rispondi: vuol dire che non ti serve più

SimoneBez

Grazie a tutti per i consigli, apprezzo anche il "te lo dico ma non tutto così impari", mi aspettavo proprio questo da questo forum, ci lavoro e poi vi faccio sapere.

maubarzi

#14
May 06, 2019, 08:50 pm Last Edit: May 06, 2019, 08:51 pm by maubarzi
Versione bloccante, non completa, solo come ispirazione...
...scritto da furbofono
della serie digitalRead() istruzione comune, DigitalWrite() istruzione propria ;)
scusa, non ho resistito. :P
Nessuna buona azione resterà impunita!

Preistoria -> medioevo -> rinascimento -> risorgimento -> rincoglionimento!

Go Up