Go Down

Topic: [RISOLTO] Gestione scrittura su SD senza odiosi scroll (Read 1 time) previous topic - next topic

matrix77

#5
Jan 26, 2013, 04:56 pm Last Edit: Jan 26, 2013, 05:03 pm by matrix77 Reason: 1

memorizza lo stato precedente ed a ogni ciclo lo compari con quello attuale, se è differente lo scrivi altrimenti no.
pseudodomanda-->pseudorisposta  :smiley-mr-green:

Ciao, si hai ragione, te lo farei con un plc, ma con Arduino non riesco

Senza vedere lo sketch non so cosa fai. Mi viene da pensare che non resetti la condizione per cui scrivi sulla SD, quindi ad ogni loop il codice scrive (giustamente) sulla schedina.

Se potessi pubblicare il programma forse si capirebbe meglio l'errore.

Ecco le due righe stupide di codice:
Code: [Select]
//Premo il pulsante e scrivo su SD
if (!digitalRead(buttonPins[2])){
Prova = SD.open("Prova.txt", FILE_WRITE);
Prova.println("Test scrittura");
Prova.close();


Mi viene da pensare che dovrei comparare lo stato precedente con l'attuale, dovrebbe suonare un po' come: "adesso il pulsante è premuto e scrivi, ma se è ancora premuto al ciclo successivo, non scrivi", ma non so come dirglielo.



matrix77

#6
Jan 26, 2013, 05:13 pm Last Edit: Jan 26, 2013, 05:34 pm by matrix77 Reason: 1
Forse ci sono quasi: imposto una variabile a zero, ma con la pressione del pulsante, la porto a "1", al ciclo successivo, la scrittura avverrà, se lo stato della variabile è a zero, ma con il pulsante premuto, di conseguenza non verrà scritto nulla sulla scheda, dovrei essere sulla strada buona?

Esempio:

Questo funziona:
Code: [Select]
{
  //Premo il pulsante e scrivo su SD
if (!digitalRead (buttonPins[2])&& (m == 0)){
Prova = SD.open("Prova.txt", FILE_WRITE);
Prova.println("Test scrittura");
Prova.close();
m = 1;

Ciao

alessanddrob

prendi una variabile
la imposti col valore del pin
e la printi su sd
poi ciclicamente la compari con lo stato del pin
se ce variazione la riprinti

oppure usare l'interrupt delle porte per avviare la comparazione, l'interruput avviene solo se ce una variazione in generale su ttutti gli 8 bit non è specifico per un pin (almeno mi pare )

scritto in linguaggio scimmiesco :D
ciao

leo72

Vuoi scrivere qualcosa sulla SD nel momento in cui viene premuto un pulsante e vuoi farlo solo per 1 volta, giusto?

Code: [Select]
  //Premo il pulsante e scrivo su SD
if (!digitalRead (buttonPins[2])&& (m == 0)){
Prova = SD.open("Prova.txt", FILE_WRITE);
Prova.println("Test scrittura");
Prova.close();
m = 1;

Questo codice funziona però poi devi rimettere "m" a 0 per poter riscrivere sulla scheda.
Oppure puoi fare un ciclo che, finché c'è la pressione del pulsante, non esce dal blocco che hai usato per scrivere:

Code: [Select]
if (!digitalRead (buttonPins[2])){
  Prova = SD.open("Prova.txt", FILE_WRITE);
  Prova.println("Test scrittura");
  Prova.close();
  while (!digitalRead(buttonPins[2]));
}

In questo modo dopo la scrittura ti metti in attesa del rilascio del pulsante.
Questo ovviamente va bene se poi non devi fare altro.

Ovviamente senza sketch completo non so se la soluzione può fare al caso tuo oppure no.
Comunque si tratta sempre di usare una delle molteplici soluzioni visto che in programmazione non c'è un unico modo per fare 1 cosa.

matrix77


Vuoi scrivere qualcosa sulla SD nel momento in cui viene premuto un pulsante e vuoi farlo solo per 1 volta, giusto?

Code: [Select]
  //Premo il pulsante e scrivo su SD
if (!digitalRead (buttonPins[2])&& (m == 0)){
Prova = SD.open("Prova.txt", FILE_WRITE);
Prova.println("Test scrittura");
Prova.close();
m = 1;

Questo codice funziona però poi devi rimettere "m" a 0 per poter riscrivere sulla scheda.
Oppure puoi fare un ciclo che, finché c'è la pressione del pulsante, non esce dal blocco che hai usato per scrivere:

Code: [Select]
if (!digitalRead (buttonPins[2])){
  Prova = SD.open("Prova.txt", FILE_WRITE);
  Prova.println("Test scrittura");
  Prova.close();
  while (!digitalRead(buttonPins[2]));
}

In questo modo dopo la scrittura ti metti in attesa del rilascio del pulsante.
Questo ovviamente va bene se poi non devi fare altro.

Ovviamente senza sketch completo non so se la soluzione può fare al caso tuo oppure no.
Comunque si tratta sempre di usare una delle molteplici soluzioni visto che in programmazione non c'è un unico modo per fare 1 cosa.



Ciao Leo e grazie per il tuo gentile intervento, quello che vorrei fare è questo, ma ci sono degli errori:

Code: [Select]
{
  //Premo il pulsante e scrivo su SD
if (!digitalRead (buttonPins[2]) && (m == 0)){
Prova = SD.open("Prova.txt", FILE_WRITE);
Prova.println("Test scrittura");
Prova.close();
m = 1;
    }
    if (!digitalRead(buttonPins[2], LOW) && (m == 1)){ //E' una riga errata, ma vorrei controllare la mancata pressione inserendo un secondo testo
Prova = SD.open("Prova.txt", FILE_WRITE);
Prova.println("Test scrittura2");
Prova.close();
m = 0;
    }
}

Go Up