Go Down

Topic: watchdog per GPS locator TK102 v3 (Read 1 time) previous topic - next topic

vince59

Si Gug,

infatti, nel primo codice, ero anche riuscito a far si che fosse verificata una pausa di x secondi dopodichè passavo ad una altra istruzione.
Però, come ripeto, ora la situazione è più semplice avendo "abbandonato" il led a favore di un punto dove devo verificare SOLO la presenza/assenza di VCC e NON più lampeggio.
Il mio problema ora è che non riesco a definire il codice per rilasciare il pulsante (pin su HIGH) QUANDO la tensione torna sulla piazzola (pin di rilevamento).
Ho provato con il while ma forse l'ho costruito male...hai qualche indicazione?

gpb01

#16
Feb 27, 2019, 09:51 am Last Edit: Feb 27, 2019, 09:54 am by gpb01
Beh, in tal caso è ancora più banale ...
... partendo da quanto avevi scritto, si può pensare un semplice while() che ...

Code: [Select]
#define pinInVCC 2
#define pinOutBottone 13

void setup()
{
  pinMode(pinInVCC, INPUT);
  pinMode(pinOutBottone, OUTPUT);
  digitalWrite(pinOutBottone, HIGH);
}

void loop()
{
   while(!digitalread(pinInVCC)) {        // se il pinInVCC è LOW rimane nel while, altrimenti esce
      digitalWrite (pinOutBottone, LOW);  // chiude su GND il pulsante
   }
   digitalWrite (pinOutBottone, HIGH);    // Rilascia il pulsante
}

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

vince59

#17
Feb 27, 2019, 09:56 am Last Edit: Feb 27, 2019, 10:12 am by vince59
...non ci crederai ma ho appena buttato giù su carta proprio quel while leggendo la dispensa di Marsella e Lombardi...forse ieri lo avevo costruito male.
Si funziona, il codice gira in simulazione...ed ho trovato anche le due trappole da te messe  :smiley-cool: ...PRIMA di caricare il codice!!!

Ora lo testo sul device programmando l'ATtiny

PS: faccio anche qualche prova leggendo il led.

Thanks

vince59

Gug, forum bsera,

sembrava fatta invece no.
La piazzola non mi fornisce un segnale adeguato e sembra si innneschi una sorta di rimbalzo per cui l'output non è stabile.
Devo tornare sul led...devo, quindi:
- rilevare il segnale sul led (pinInVCC HIGH ..e ci siamo)
- misurare il tempo di SPEGNIMENTO.
  Ora considerando che il dispositivo quando si accende illumina (una volta sola) il led per 6 sec, poi fa una                                                                   pausa di 4 sec, blink, pausa di 4 sec, blink e cosi via.
Ho pensato quindi di basare il ciclo sul rilevamento di una pausa maggiore di 6 secondi  (misura lo startTime ed il finishTime e li sottrae) al verificarsi della quale devo...
- pigiare il tasto (pinOutBottone LOW...e ci siamo)
- tornare a rilevare il segnale sul led (pinInVCC HIGH)
- rilasciare il tasto (pinOutBottone HIGH..).
Da qui sorgono le domande:
1. Secondo te si riesce a fare?...
2. hai qualche percorso logico più semplice?
3. Il dispositivo rimarrà acceso almeno 5 giorni si va in overflow?
4. come è opportuno organizzare i "blocchi" di codice?

gpb01

#19
Feb 27, 2019, 07:53 pm Last Edit: Feb 27, 2019, 07:56 pm by gpb01
Io veramente lo avevo già abbozzato in tempi NON sospetti ...  :smiley-twist:

Code: [Select]
#define pinInLED 2
#define pinOutBottone 13
#define timeout 5000

uint32_t ultimaAccensione;

void setup()
{
  pinMode(pinInLED, INPUT);
  pinMode(pinOutBottone, OUTPUT);
  digitalWrite(pinOutBottone, HIGH);
}

void loop()
{
   if ( digitalRead(pinInLED) ) ultimaAccensione = millis();
   
   if (mills() - ultimaAccensione > timout) {
      while( !digitalread(pinInLED) ) {        // se il pinInLED è LOW rimane nel while, altrimenti esce
         digitalWrite(pinOutBottone, LOW);     // chiude su GND il pulsante
      }
      digitalWrite(pinOutBottone, HIGH);       // Rilascia il pulsante
      ultimaAccensione = millis();
   }
}

... a te ora verificarlo, correggerlo, sistemarlo ;)

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

vince59

#20
Feb 27, 2019, 10:13 pm Last Edit: Feb 27, 2019, 10:57 pm by vince59
ti odio Gug  :smiley-evil:  :smiley-evil:  :smiley-evil:  :smiley-evil:  :smiley-evil:


va bene ci provo, imparo sempre qualcosa  ibn fin dei conti :smiley-grin: ...però sai una cosa...potrebbe essere un problema "elettrico" nel senso che la batteria da sui 4v mentre i segnali che girano nel circuito sono circa 3v che vengono rilevati e l'attiny fa il suo dovere però il segnale in uscita sul pin che chiude a massa non è continuo (rilevato con multimetro) ma "blinka" velocemente ma blinka. Ci sto ragionando su  :smiley-roll-blue:  

vince59

Gug,

al banco sembra girare (ho invertito gli stati nel ciclo WHILE); la pausa viene rilevata PERO' fatta l'accensione, il pin NON rilascia (...ovvero rimane puntato su LOW) mentre dovrebbe cambiare stato quando legge nuovamente il led ON.

Ora devo smettere che domani mi devo alzare presto...verifico domani per bene.

gpb01

A quanto è alimentato l'ATtiny? Perché potrebbe essere un problema di riconoscimento dei "livelli" ... ::)

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

vince59

#23
Feb 28, 2019, 09:10 am Last Edit: Feb 28, 2019, 09:58 am by vince59
Bgiorno Gug & forum,

l'attiny è alimentato direttamente dalla stessa batteria del dispositivo (3,7v) all'interno del quale girano invece 2,9v. Io ritengo che il chip funzioni in quanto con il multimetro rilevo lo switch e la chiusura verso GND. Tuttavia è come se si innescasse un rimbalzo o un attacca/stacca.
L'impressione è che appena sente il LOW cambia stato ma immediatamente dopo risente l'HIGH - ovviamente - cambia di nuovo stato ed il dispositivo non ce la fa ad accendersi...per un parallelo con le auto...e come se appena sentisse girare il motorino di avviamento laasciasse tornare la chiave SENZA attendere la reale messa in moto...quindi accenna a girare ma NONva in moto.
Vediamo se prendo il segnale dal led.
Il codice come dicevo ieri - pulito degli errori  8) - riesco a farlo girare. Ora lo provo sul dispositivo...ieri sera però, in simulazione, rimaneva nell'ultimo stato ...ovvero andava su LOW (chiudendo a GND) ma NON tornava su HIGH quando gli davo di nuovo il positivo sul sensorPin.
il codice è questo:

Code: [Select]

#define pinInLED 2
#define pinOutBottone 13
//#define timeout 5000
int timeout = 5000;

uint32_t ultimaAccensione;

void setup()
{
  pinMode(pinInLED, INPUT); // pin 2
  pinMode(pinOutBottone, OUTPUT); // pin 13
  digitalWrite(pinOutBottone, HIGH);
}

void loop()
{
  if (digitalRead(pinInLED) ) ultimaAccensione = millis();  // se pin 2 = HIGH ultimaAcc = tempo

  if (millis() - ultimaAccensione > timeout)  // se il tempo - ultimaAcc è maggiore di 5 secondi
  {
    while (digitalRead(pinInLED) ) {       // se il pinInLED è LOW rimane nel while, altrimenti esce
      digitalWrite(pinOutBottone, HIGH);     // chiude su GND il pulsante
    }
    digitalWrite(pinOutBottone, LOW);       // Rilascia il pulsante
    ultimaAccensione = millis();
  }

gpb01

Intanto rimetti il #define per il timeout ... ma mettilo corretto che io mi ero perso un pezzo :D:

Code: [Select]
#define timeout  5000UL
... dopo di che metti una rete R/C sul pin di ingresso in modo che, anche se c'è una breve variazione, non venga rilevata, altrimenti tocca fare una specie di "debouncing" da software, ma come sai, quando posso lo evito !

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

vince59

Gug...prelevando il segnale dal led, il chip lavora e chiude su GND in maniera stabile. Tuttavia, rimane chiuso su GND e non da problemi.
In pratica sta cortocircuitando il puilsante di accensione su GND!!

Risultato: un filo saldato direttamente tra pin uscita del bottone e GND ha risolto.

Tuttavia mi piacerebbe vedere il codice girare come "vorremmo". Manca lo sgancio una volta rilevata l'accensione led dopo il riavvio.
Come ne usciamo?

gpb01

#26
Feb 28, 2019, 01:02 pm Last Edit: Feb 28, 2019, 01:04 pm by gpb01
Veramente già c'è se leggi bene il codice ...

Code: [Select]
while ( !digitalRead(pinInLED) ) {      // se il pinInLED è LOW rimane nel while, altrimenti esce
   digitalWrite(pinOutBottone, LOW);    // chiude su GND il pulsante
}
digitalWrite(pinOutBottone, HIGH);      // Rilascia il pulsante
...

... sei tu che hai sbagliato a modificarlo !

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

vince59

#27
Feb 28, 2019, 02:10 pm Last Edit: Feb 28, 2019, 02:12 pm by vince59
Ho smanettato più volte per avere il funzionamento appropriato sulla base dei risultati pratici e potrei aver postato uno di quelli "test". Ricontrollo ma credo non lo facesse per questo avevo modificato. Provo di nuovo il codice...almeno per imparare.

gpb01

#28
Feb 28, 2019, 03:13 pm Last Edit: Feb 28, 2019, 03:13 pm by gpb01
Ho smanettato più volte per avere il funzionamento appropriato sulla base dei risultati pratici ...
... ovvero alla "pene di segugio" invece che seguire la logica di funzionamento del circuito ... ::)

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

vince59

no no Gug, non credo. Provando il tuo codice e mirando ad avere uno stato LOW sul piedino output (sia 13 o 12 o quello che si vuole) ho dovuto invertire gli stati interni del while.
O non ho capito il while o....ù
Ovviamente anche secondo me l'ultimo comando deve essere un output cambio di stato da low ad high quando arriva un input high sul pin che rileva il segnale.
Dove sbaglio?

Go Up