watchdog per GPS locator TK102 v3

ti odio Gug :smiling_imp: :smiling_imp: :smiling_imp: :smiling_imp: :smiling_imp:

va bene ci provo, imparo sempre qualcosa ibn fin dei conti :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 :roll_eyes:

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.

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

Guglielmo

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:

#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();
  }

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

#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

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?

Veramente già c'è se leggi bene il codice ...

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

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.

vince59:
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 ... ::slight_smile:

Guglielmo

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?

Provalo NON con al tua schedina, ma con Arduino UNO e un filo (sul 13 hai già il LED che ti fa vedere il segnale).

Dato che usi un filo volante metti:

pinMode(pinInLED, INPUT_PULLUP); // pin 2

e verifica il funzionameto :wink:

Guglielmo

Ecco .. ho appena provato sulla UNO e funziona come si deve (ho anche corretto gli errori di battitura) ...

#define pinInLED 2
#define pinOutBottone 13
#define timeout 5000UL

uint32_t ultimaAccensione;

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

void loop()
{
   if ( digitalRead(pinInLED) ) ultimaAccensione = millis();
   
   if (millis() - ultimaAccensione > timeout) {
      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();
   }
}

... provalo anche tu prima sulla UNO con un filo e poi sul tuo circuito ... se NON va sul tuo circuito è o un problema di rimbalzi o un problemi di livelli ... ::slight_smile:

Guglielmo

...e c'hai sempre ragione caz... :sob: :sob: :sob: :sob:

Purtroppo mi freghi sempre...te l'ho detto un giorno ti sfido sul mio campo :smiling_imp:

Allora, il primo semplice codice cui avevi aggiunto il while (giuro ci ero arrivato) conteneva degli errori che non so se fossero di battitura o per farmi studiare. Ho dato per scontato che fossero per il secondo nobile fine. Quindi ho letto e li ho corretti subito, MA uno l'ho cannato alla grande :sob: :sob: :sob: :sob:
Il punto esclamativo che inverte :sob: :sob: :sob: l'avevo eliminato :sob: :sob: e solo ora ho capito il suo funzionamento.

Sono un pò demoralizzato :confused: :confused:

PS: il #define timeout 5000UL NON lo prende quindi ho utilizzato unsigned long timeout 5000

vince59:
Purtroppo mi freghi sempre...te l'ho detto un giorno ti sfido sul mio campo :smiling_imp:

... c'è il rischio che te frego pure li :smiley: :smiley: :smiley: (ho preso il porto d'armi al compimento del 18esimo anno :smiling_imp:)

vince59:
Il punto esclamativo che inverte :sob: :sob: :sob: l'avevo eliminato :sob: :sob: e solo ora ho capito il suo funzionamento.

Sono un pò demoralizzato :confused: :confused:

Avevo messo apposta il commento ... per far capire che veniva verificata la condizione opposta :slight_smile:

Nun te demoralizza' ... ce vo' tempo e attenzione :wink:

Guglielmo

:smiley: ok.

Perchè l'IDE non prende il #define 5000UL...so che il define NON è una variabile ma una sorta di sostituzione testo ed invece io ho messo una variabile unsigned long.

Come NO ? ? ? :o #define timeout 5000UL lo compila tranquillamente, non serve che definisci una variabile e sprechi memoria.

Guglielmo

Gug,

se uso la variabile lo compila. Se uso il #define timeout 5000UL mi da questo messaggio:

unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout = 1000000L);
^
TK102_LED:16: error: expected unqualified-id before numeric constant
TK102_LED.ino:17:15: note: in expansion of macro 'timeout'
expected ',' or '...' before numeric constant

Scusa ma che c'entra la pulseIn() ? ? ? ? ? :o :o :o Chi t'ha detto di usarla ? ? ? ? ?

Guglielmo

No Gug quello è il messaggio dell'IDE che viene fuori se uso il define!!! Esce tutto questo se metto il define:


TK102_LED:16: error: expected ',' or '...' before numeric constant
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:136:65: note: in expansion of macro 'timeout'
unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout);
^
TK102_LED:16: error: expected ',' or '...' before numeric constant
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Stream.h:57:33: note: in expansion of macro 'timeout'
void setTimeout(unsigned long timeout); // sets maximum milliseconds to wait for stream data, default is 1 second
^
TK102_LED:16: error: expected ',' or '...' before numeric constant
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:234:65: note: in expansion of macro 'timeout'
unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout = 1000000L);
^
expected ',' or '...' before numeric constant

Scusa, board Arduino UNO, copi/incolli il mio programma, lo compili e da errore? :o Hai un problema sulla tua installazione, NON deve dare neanche un warning !

Guglielmo