Go Down

Topic: [RISOLTO]Salvare lo stato di un pulsante nel SD. (Read 2844 times) previous topic - next topic

Standardoil

...

Le "stringhe C" non si possono confrontare con "==", devi usare la funzione strcmp() (sempre a patto che abbiano il terminatore di cui sopra) che restituisce zero se le stringhe sono uguali:

quello OP è da maggio , o forse giugno, che ha sempre lo stesso problema (in varie salse), che fa sempre gli stessi errori e ignora sempre gli stessi consigli
forse sarebbe il caso di fare un colpo di mano, uno di noi si offre per dargli la pappa fatta e morta li....


però, attenzione, bisogna mettergliela sotto il naso, che a dirgli che è a due post di distanza non la trova:

beh, è qualche giorno che abbiamo pubblicato, prorpio per questo OP, più versioni di funzioni che leggono da file variabili intere e/o stringhe, un "minimo" di ricerca ed attenzione........
ai tempi non mi aspettavo di venir ringraziato, questo no, ma che almeno lo OP cercasse... questo sì

avrebbe trovato questo:
Che poi la scelta è facile: leggere, leggere sempre, anche di fronte all'evidenza.......

(se mi vedete confuso, avete ragione)

vorrei allacciarmi ad una discussione recente, su leggere un int da file

che sarebbe stato, allora, la soluzione ai problemi che ha ancora
Prima legge di Nelson (che sono io): La risposta giusta si può ottenere solo dalla domanda giusta, domande sbagliate danno risposte inutili

Non bado a studenti, che copino altrove

Hai problema-Ti domando-Non rispondi: Non ti serve più

Salvorhardin

se ti puo' consolare è stato proprio cercando di capire come aiutare lo OP che abbiamo trovato quello


ed è li che abbiamo capito che nonostante i tuoi titoli un po' "fantasiosi" col SW te la cavi bene


quasi meglio di Fabio :)
Sempre una scintilla

Dal Dinamico Duo

WinGamesyun

#17
Dec 05, 2019, 08:50 pm Last Edit: Dec 05, 2019, 09:04 pm by WinGamesyun
Buona sera sto provando il codice postato da >Docdoc< .
Code: [Select]
[code]
#include <SD.h>
#include <Wire.h>
#include <SPI.h>

#define PULSANTE_ON 5
#define PULSANTE_OFF 3
#define LED 6
//int ultimo; //ho provato  cosi.
//char ultimo;
File stato;

void setup() {
   Serial.begin(9600);
  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    while (1);
  }

  pinMode(PULSANTE_ON , INPUT);
  pinMode(PULSANTE_OFF , INPUT);
  pinMode(LED, OUTPUT);

  stato = SD.open("stato.txt");
  if (stato)
  {
    byte ultimo = stato.read();
    stato.close();
    Serial.print("stato.txt: ultimo=");
    Serial.println(ultimo);
    digitalWrite(6, ultimo);
  }
  Serial.println("fine setup ");
  delay(1000);
}

void loop() {
  ultimo = -1;//           mi da errore 'ultimo' su questa riga di codice
  if (digitalRead(PULSANTE_OFF) == HIGH)
    ultimo = 0;
  else if (digitalRead(PULSANTE_ON) == HIGH) {
    ultimo = 1;
    if (ultimo != -1)
    {
      stato = SD.open("stato.txt", FILE_WRITE);
      Serial.print("Scrivo lo stato: ");
      Serial.println(stato);
      stato.write(ultimo);
      delay(50);
      stato.close();
      delay(1000);
    }
  }
}
[/code]
ho commentato la riga che mi da errore ho provato a inizializzare >int ultimo;
funziona ma sulla sd mi stampa dopo la scritta caratteri strani .
Code: [Select]

sulla seriale invece mi stampa solo stato 1, anche se premo l'altro pulsante.

WinGamesyun

#18
Dec 05, 2019, 09:32 pm Last Edit: Dec 05, 2019, 09:50 pm by WinGamesyun
Provando ho risolto la scrittura dei simboli strani nel sd  cambiando Write con print,
ora devo capire perchè funziona solo il pulsante  di ON e non funziona la seriale nel setup.

WinGamesyun

Mi dite sempre che devo leggere bene il codice ma secondo voi questo codice  perché non funziona?

Salvorhardin

ma i pulsanti vanno?

se ci metti un led in parallelo, lo vedi accendersi?
Sempre una scintilla

Dal Dinamico Duo

WinGamesyun

Si vanno perché se inverto i pulsanti nel codice funziona sempre  lo stato 1

Salvorhardin

Sempre una scintilla

Dal Dinamico Duo

docdoc

#23
Dec 08, 2019, 11:38 am Last Edit: Dec 08, 2019, 11:38 am by docdoc
ho commentato la riga che mi da errore ho provato a inizializzare >int ultimo;
Si, manca la definizione di "ultimo" che puoi mettere direttamente nel loop, inoltre c'è una graffa che non deve esserci nella seconda if (dovrebbe averti dato anche un altro errore in compilazione, la mancanza di una graffa), ossia devi avere questo loop:

Code: [Select]
...
void loop() {
  ultimo = -1;
  if (digitalRead(PULSANTE_OFF) == HIGH)
    ultimo = 0;
  else if (digitalRead(PULSANTE_ON) == HIGH)
    ultimo = 1;
  if (ultimo != -1)
  {
    stato = SD.open("stato.txt", FILE_WRITE);
    Serial.print("Scrivo lo stato: ");
    Serial.println(stato);
    stato.write(ultimo);
    delay(50);
    stato.close();
    delay(5000);
  }
}

Comunque lo avevo scritto: ;)
anche se il codice non l'ho provato, mi raccomando, provalo e cerca di capire cosa ho fatto

Quote
sulla seriale invece mi stampa solo stato 1, anche se premo l'altro pulsante.
Questo è un altro discorso, devi dirci allora come hai collegato i due pulsanti perché stando al codice sono attivi in stato HIGH, quindi hai i pulsanti che vanno a +5V e dovresti aver messo anche una resistenza di pull-down verso GND (da 10k Ohm) : è così?
Alex "docdoc"
- "Qualsiasi cosa, prima di rompersi, funzionava"

WinGamesyun

#24
Dec 08, 2019, 09:36 pm Last Edit: Dec 08, 2019, 10:28 pm by WinGamesyun
Buona sera a tutti ci sono riuscito cosi ....
Code: [Select]
[code]

#define PULSANTE_ON 5
#define PULSANTE_OFF 7
#define LED 6
#include <SPI.h>
#include <SD.h>
//char inserito[1];
//char disinserito[1];
char stato [1];
File myFile;
void setup() {
  
  Serial.begin(9600);
  while (!Serial) {
    
  }


  Serial.print("Initializing SD card...");

  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    while (1);
  }
  Serial.println("initialization done.");

  pinMode(PULSANTE_ON , INPUT_PULLUP);
  pinMode(PULSANTE_OFF , INPUT_PULLUP);
  pinMode(LED , OUTPUT);


  myFile = SD.open("stato.txt");

  if (myFile)
  {
    Serial.println("stato,txt:");
    byte i = 0;

    while (myFile.available() && i < 2)
    {
      char letto = (myFile.read());
      Serial.println(letto);
      stato[i++] = letto;


      myFile.close();
    }
    if ( strcmp(stato, "i") == 0)  {
      digitalWrite(6, HIGH);
      Serial.println("stato inserito:");
    } else {
      digitalWrite(6, LOW);
      Serial.println("stato disinserito:");
    }

  }
}
void loop() {

  if (digitalRead(PULSANTE_ON) == LOW) {
    SD.remove("stato.txt");
    myFile = SD.open("stato.txt", FILE_WRITE);


    if (myFile) {
      Serial.println("Writing to test.txt...");

      myFile.print("i");

      Serial.println("stato inserito = ");

      myFile.close();
      Serial.println("i");
      delay(1000);
    } else {
      
      Serial.println("error opening inserito");
    }

  }
  if (digitalRead(PULSANTE_OFF) == LOW)


  {
    SD.remove("stato.txt");
    myFile = SD.open("stato.txt", FILE_WRITE);


    if (myFile) {
      Serial.println("Writing to test.txt...");

      myFile.print("d");

      Serial.println("stato disinserito = ");
      myFile.close();
      Serial.println("d");
    } else {
      // if the file didn't open, print an error:
      Serial.println("error opening d");
    }

    delay(1000);
  }
}
[/code]
A me serviva a ricordare lo stato d 'inserimento di un antifurto in mancanza di corrente e batteria .

PS.  Grazie sempre a tutti per suggerimenti.

docdoc

Bene, se hai risolto ok, vedo che hai usato quindi un solo carattere.

Comunque, per completezza, intanto tu stai sempre mettendo due volte il tag [code] quindi compaiono due volte.

In ogni caso sappi che il tuo programma si può ottimizzare ulteriormente e renderlo più efficiente e compatto. Provo a darti qualche spunto.

Intanto sulla MKR credo che non ti serva il "while (!Serial) { }" che è solo per le Leonardo.

Poi hai anche sbagliato a dimensionare la stringa "stato" perché hai messo 1 carattere, mentre le stringhe C devono sempre comprendere anche il terminatore '\0'. Quindi invece di "char stato[1]" metti "char stato[2]".

Per finire, se hai scelto di usare solo un carattere a quel punto usa un byte che fai prima... ;)


Alex "docdoc"
- "Qualsiasi cosa, prima di rompersi, funzionava"

WinGamesyun

Il codice postato era solo un sketch di prova ,ma funzionante .
Grazie  per l ennesimo consiglio.


Go Up