va bene ci provo, imparo sempre qualcosa ibn fin dei conti ...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
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.
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 !
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?
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
...
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.
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?
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 ... :
Purtroppo mi freghi sempre...te l'ho detto un giorno ti sfido sul mio campo
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
Il punto esclamativo che inverte l'avevo eliminato e solo ora ho capito il suo funzionamento.
Sono un pò demoralizzato
PS: il #define timeout 5000UL NON lo prende quindi ho utilizzato unsigned long timeout 5000
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.
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
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 !