Go Down

Topic: [RISOLTO]SD >richiamare una variabile int . (Read 1 time) previous topic - next topic

wingamesyun

#15
May 27, 2019, 08:32 pm Last Edit: May 27, 2019, 08:38 pm by WinGamesyun
Buona sera ,
modificato come consigliato purtroppo non va .
 

Code: [Select]
[code]
  myFile = SD.open("totali.txt", FILE_READ);
  if (myFile)
  { // pezzo di lettura file
    char buf[20];
    int i = 0;
    while (myFile.available()) {
      buf[i] = myFile.read();
      i++;
      if (i >= 19) break;
    }
    buf[i] = '\0';
  }
  else {
    sommapar = 0;
  }

[/code]
Ma non devo chiudere il file?
 :smiley-confuse:

wingamesyun

#16
May 27, 2019, 09:48 pm Last Edit: May 27, 2019, 09:50 pm by WinGamesyun
Facendo un pò di prove mi sono accorto che avevamo saltato una riga di codice,
ora funziona ma è comparso un 'altro problema...
la variabile viene richiamata e scritta ma il contatore riparte da zero e come se non riconoscesse il valore reale
della variabile.  
Codice funzionante.
Code: [Select]
myFile = SD.open("totali.txt", FILE_READ);
  if (myFile)
  { // pezzo di lettura file
    char buf[20];
    int i = 0;
    while (myFile.available()) {
      buf[i] = myFile.read();
      i++;
      if (i >= 19) break;
    }
    buf[i] = '\0';
    sommapar = atoi(buf);// il pezzo mancante...
  }

  else {
    sommapar = 0;
  }

Silente

#17
May 28, 2019, 07:56 am Last Edit: May 28, 2019, 06:39 pm by Silente Reason: Correzione dimenticanza
Piccola riscrittura del codice al volo, vedi se cibsi capisce qualcosa di iù sul problema
Code: [Select]

myfile=SD.open ("totali.txt, FILE_READ);
if (myfile)
for (char buffer [7]={0}, byte i=0;myfile.available()&&i<6;i++)
{
char c=myfile.read();
buffer [i]=c;
Serial.print (c);
sommapar=atoi (buffer);
}
else
{
sommapar=0;
Serial.println ("file non aperto ");
}
Serial.println (sommapar);
myfile.close();

Corretta dimenricanza, sei un grande
Dove va un numero va una variabile, una funzione e/o  un test.
Per ottenere devi spiegare

Strumenti/Formattazione automatica fino alla morte!
Cristianesimo:bibbia='C':K&R

nid69ita

Facendo un pò di prove mi sono accorto che avevamo saltato una riga di codice,
ora funziona ma è comparso un 'altro problema...
la variabile viene richiamata e scritta ma il contatore riparte da zero e come se non riconoscesse il valore reale
della variabile.  
Ma questo pezzo è nel setup() ?   (posta sempre tutto)
Si il file devi chiuderlo.
Metti un pò di serial.println   per sapere se ha letto, e se ha letto buf
my name is IGOR, not AIGOR

Standardoil

boh, vi seguo da un po', ma non ho capito una cosa
la veriabile viene salvata una volta sola, ovvero: nel file esiste una sola copia della variabile, oppure il file sarà pieno di righe, dove solo l'ultima è aggiornata?
comunque, senza perdersi tanto in conteggi e righe e fine stringa e atoi e compagnia bella
Code: [Select]

int leggidafile(char * filename)
{
    // così possiamo anche scegliere che file usare
    int locale = 0;
    myFile = SD.open(filename, FILE_READ);

    if (myFile)
    {
        while (myFile.available())
        {
            char cx = myFile.read();

            if ((cx == '\r') || (cx == '\n'))
            {
                // fine riga windows o linux
                if (myFile.available() > 2)
                {
                    // esclude il caso di ultimo ritorno a capo
                    locale = 0;
                    // nuova riga? allora nuovo valore
                    break;
                }

                locale = locale * 10 + cx - '0';
                // ogni nuova cifra sposta a sinistra di un posto e si aggiunge
            }
        }

        myfile.close();
    }
    else
    {
        // Errore di apertura file
    }
    return locale;
}

semplice, rapida, parametrica e funziona anche se per caso ci fossero più righe consecutive e valesse solo l'ultima
Non presurrò più la buona fede di chi:
NON indenta, USA la classe String o NON esegue le ricerche
E di chi non risponde alle domande Tante volte è stato segnalato che è sbagliato, quindi NON sono in buona fede
Non bado a studenti, che copino altrove

Standardoil

volendo cambianto la dichiarazione
Code: [Select]

int leggidafile(char * filename, int * variabile)

e aggiungendo una riga in fondo
Code: [Select]

.
.
.
    *variabile=locale;
    return locale;

posso anche leggere la variabile senza assegnarla esplicitamente
Code: [Select]

leggidafile("nome.txt", &sommamonete);

Non presurrò più la buona fede di chi:
NON indenta, USA la classe String o NON esegue le ricerche
E di chi non risponde alle domande Tante volte è stato segnalato che è sbagliato, quindi NON sono in buona fede
Non bado a studenti, che copino altrove

wingamesyun

#21
May 28, 2019, 09:24 pm Last Edit: May 28, 2019, 09:25 pm by WinGamesyun
Buona sera sono appena ritornato a casa ho caricato il pezzo di codice consigliato da Silente
mi da questo errore.

Code: [Select]
[code]
myFile=SD.open ("totali.txt", FILE_READ);
if (myFile)
for (char buffer [7]={0}, byte i=0;myFile.available()&&i<6;i++)  //su questa riga mi da un errore
{
char c=myFile.read();
buffer [i]=c;
Serial.print (c);
sommapar=atoi (buffer);
}
else
{
sommapar=0;
Serial.println ("file non aperto ");
}
Serial.println (sommapar);
myFile.close();

[/code]
Arduino:1.8.9 (Windows 10), Scheda:"Arduino MKR WiFi 1010"

C:\Users\Utente\Documents\Arduino\apr21a_POSTA_PORTA\apr21a_POSTA_PORTA.ino: In function 'void setup()':

apr21a_POSTA_PORTA:90:32: error: expected initializer before 'i'

 for (char buffer [7]={0}, byte i=0;myFile.available()&&i<6;i++)  //su questa riga mi da un errore

                                ^

apr21a_POSTA_PORTA:90:32: error: expected ';' before 'i'

apr21a_POSTA_PORTA:90:32: error: 'i' was not declared in this scope

apr21a_POSTA_PORTA:90:59: error: expected ')' before ';' token

 for (char buffer [7]={0}, byte i=0;myFile.available()&&i<6;i++)  //su questa riga mi da un errore

                                                           ^

apr21a_POSTA_PORTA:90:60: error: 'i' was not declared in this scope

 for (char buffer [7]={0}, byte i=0;myFile.available()&&i<6;i++)  //su questa riga mi da un errore

                                                            ^

apr21a_POSTA_PORTA:90:63: error: expected ';' before ')' token

 for (char buffer [7]={0}, byte i=0;myFile.available()&&i<6;i++)  //su questa riga mi da un errore

                                                               ^

apr21a_POSTA_PORTA:97:1: error: 'else' without a previous 'if'

 else

 ^

Più di una libreria trovata per "BlynkSimpleWiFiNINA.h"
Usata: C:\Users\Utente\Documents\Arduino\libraries\Blynk
Non usata: C:\Users\Utente\Documents\Arduino\libraries\Blynk_For_Chinese
exit status 1
expected initializer before 'i'

Questo report potrebbe essere più ricco di informazioni abilitando l'opzione
"Mostra un output dettagliato durante la compilazione"
in "File -> Impostazioni"

Standardoil

Buona sera sono appena ritornato a casa ho caricato il pezzo di codice consigliato da Silente
mi da questo errore.
.
.
.
apr21a_POSTA_PORTA:90:32: error: expected initializer before 'i'

 for (char buffer [7]={0}, byte i=0;myFile.available()&&i<6;i++)  //su questa riga mi da un errore

sembrerebbe un tentativo di inizializzare un array assieme all'inizializzazione della variabile di controllo del for
non mi sembra difficile provare a estrarre l'inizializzazione dell'array fuori (prima) del for
e vedere che cosa accade
stando alla presenza dell'operatore virgola dovrebbe andare comunque
ma forse l'operatore virgola non si puo' usare in quel punto di un for, mai provato
Non presurrò più la buona fede di chi:
NON indenta, USA la classe String o NON esegue le ricerche
E di chi non risponde alle domande Tante volte è stato segnalato che è sbagliato, quindi NON sono in buona fede
Non bado a studenti, che copino altrove

wingamesyun

#23
May 28, 2019, 10:10 pm Last Edit: May 28, 2019, 10:33 pm by WinGamesyun
modificato ora funziona ma continuo ad avere sempre lo stesso problema di prima.

Code: [Select]
[code]
#include <SD.h>
#include <RTClib.h>
#include <Wire.h>
RTC_DS1307 rtc;
#include <LiquidCrystal_PCF8574.h>
LiquidCrystal_PCF8574 lcd(0x27);
#define BLYNK_PRINT Serial
#include <SPI.h>
#include <WiFiNINA.h>
#include <BlynkSimpleWiFiNINA.h>
#include <TimeLib.h>
#include <WidgetRTC.h>
WidgetRTC blynk_rtc;
char auth[] = "4";
char ssid[] = "Voda471";
char pass[] = "No5";
char server[] = "blynk-cloud.com";
int port = 8080;
WidgetLCD blynk_lcd(V31);
WidgetLCD blynk1_lcd(V10);

BlynkTimer timer;
#define PORTA         1
#define POSTA         2
#define RESET         3
#define BANCONOTA5    5
#define BANCONOTA10   6
#define BANCONOTA20   7
#define BANCONOTA50   8
#define BANCONOTA100  10


int key[8] = {HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH,};
int pin[8] = {BANCONOTA5, BANCONOTA10, BANCONOTA20, BANCONOTA50, BANCONOTA100, PORTA, POSTA, RESET,};
int  banconota5  = 0;
int  banconota10  = 0;
int  banconota20  = 0;
int  banconota50  = 0;
int  banconota100  = 0;
//int posta = 1;
int porta =  1;
int  sommapar = 0;


String postas = String (postas);
String posta = String ("VUOTO");
String posta1 = String ("PIENO");
File myFile;
File myFile1;
void setup()
{


  WiFi.begin(ssid, pass);
  Blynk.config(auth, server, port);

  Blynk.connect();
  Serial.begin(9600);

  // Blynk.email("dellipaoli.enzo01@gmail.com", "CAMBIA MARIO", "acceso e connesso.");
  timer.setInterval(90000L, leggidati );
  timer.setInterval(300000L, leggidati1 );

  Serial.println("Initializing SD card...");
  if (!SD.begin(4)) {
    Serial.println("SD non presente");
    lcd.begin(16, 2);
    lcd.setBacklight(255);
    lcd.home(); lcd.clear();
    lcd.setCursor(2, 0);
    lcd.print(">V1.0<SD>KO ");
    lcd.setCursor(0, 1);
    lcd.print("SD NON PRESENTE");

    while (1);
  }
  Serial.println("sd presente.");
  lcd.begin(16, 2);
  lcd.setBacklight(255);
  lcd.home(); lcd.clear();
  lcd.setCursor(4, 0);
  lcd.print("SD > OK ");
  lcd.setCursor(2, 1);
  lcd.print("ATTENDERE>V1.0");
  delay(3000);



   byte i=0;
     myFile = SD.open ("totali.txt", FILE_READ);
    if (myFile)
     for (char buffer [7]={0}; myFile.available()&& i<6;i++)
    {
      char c=myFile.read();
     buffer [i]=c;
      Serial.print (c);
     sommapar=atoi (buffer);
     }
     else
   {
     sommapar=0;
    Serial.println ("file non aperto ");
   }
    Serial.println (sommapar);
    myFile.close();


  Wire.begin();
  Wire.beginTransmission(0x27);

  lcd.begin(16, 2);
  lcd.setBacklight(255);
  lcd.home(); lcd.clear();
  lcd.setCursor(1, 0);
  lcd.print("WIN GAMES");
  lcd.setCursor(0, 1);
  lcd.print("TOTALI");
  delay(1000);
  blynk1_lcd.clear();
  blynk1_lcd.print(0, 0, postas );
  blynk1_lcd.print(0, 1, "HOPPER,1" );


  blynk_lcd.clear();
  blynk_lcd.print(4, 0, sommapar );
  blynk_lcd.print(4, 1, " TOTALI ");


  for (int i = 0; i < 8 ; i++)

    pinMode(pin[i], INPUT_PULLUP);


}

void loop()
{

  int k;

  for (int i = 0; i < 8 ; i++)
  {
    k = digitalRead(pin[i]);
    if ( key[i] != k )
    {
      if ( key[i] == HIGH && k == LOW )
      {
        Serial.print("PIN");
        Serial.println(pin[i]);

        switch (pin[i])
        {
          case BANCONOTA5:
            banconota5 = banconota5 + 5;
            sommapar =  banconota5 +  banconota10 + banconota20 + banconota50 + banconota100;

            SD.begin();
            SD.remove("totali.txt");
            myFile = SD.open("totali.txt", FILE_WRITE);


            if (myFile) {

              myFile.print(sommapar);
              myFile.close();


              Serial.println("salvata");

            }

            else {
              Serial.println("error.txt");
            }
            myFile1 = SD.open("totali1.txt", FILE_WRITE);


            if (myFile1) {

              myFile1.print( "INSERITA BANCONOTA DA  5 EURO SOMMA PARZIALE  =  ");
              myFile1.println(sommapar);
              myFile1.close();


              Serial.println("salvata1");

            }

            else {
              Serial.println("error1.txt");
            }
            break;

          case BANCONOTA10:
            banconota10 = banconota10 + 10;
            sommapar = banconota5 +  banconota10 + banconota20 + banconota50 + banconota100;

            Serial.println(" BANCONOTA 10");
            break;
          case BANCONOTA20:
            banconota20 = banconota20 + 20;
            sommapar = banconota5 +  banconota10 + banconota20 + banconota50 + banconota100;
            Serial.println(" BANCONOTA 20");
            break;
          case BANCONOTA50:
            banconota50 = banconota50 + 50;
            sommapar = banconota5 +  banconota10 + banconota20 + banconota50 + banconota100;
            Serial.println(" BANCONOTA 50");
            break;
          case BANCONOTA100:
            banconota100 = banconota100 + 100;

            sommapar = banconota5 +  banconota10 + banconota20 + banconota50 + banconota100;

            Serial.println(" BANCONOTA 100");
            break;
          case POSTA:
            // Blynk.email("dellipaoli.enzo01@gmail.com", "CAMBIO MARIO", "VUOTO");
            postas = posta;
            blynk1_lcd.print(0, 0, postas );
            Serial.println(" POSTA");
            break;
          case PORTA:
            Blynk.notify("ATTENZIONE PORTA APERTA ");
            // Blynk.email("dellipaoli.enzo01@gmail.com", "CAMBIO MARIO", " CAMBIA MONETE \n ATTENZIONE PORTA APERTA ");
            //blynk1_lcd.print(0, 0,stato );
            Serial.println(" PORTA APERTA ");
            break;
          case RESET:
            banconota5   = 0;
            banconota10  = 0;
            banconota20  = 0;
            banconota50  = 0;
            banconota100 = 0;
            sommapar     = 0;
            postas       = posta1 ;
            Serial.println(" AZZERAMENTO TOTALI");

            blynk_lcd.clear();
            blynk1_lcd.clear();
            lcd.home(); lcd.clear();
            lcd.setCursor(0, 1);
            lcd.print("TOTALI");
            lcd.setCursor(1, 0);
            lcd.print("AZZERAMENTO");
            delay(3000);
            lcd.home(); lcd.clear();
            lcd.setCursor(1, 0);
            lcd.print("WIN GAMES");
            lcd.setCursor(0, 1);
            lcd.print("TOTALI");
            break;
        }

        Serial.print("Totale = ");
        Serial.println(sommapar);
        blynk_lcd.print(4, 0, sommapar );
        blynk_lcd.print(4, 1, " TOTALI ");
        blynk1_lcd.print(0, 0, postas );
        blynk1_lcd.print(0, 1, "HOPPER,1" );

      }
      key[i] = k;
    }

    lcd.setCursor(8, 1);
    lcd.print(sommapar);
  }
  if (Blynk.connected()) {
    Blynk.run();
    lcd.setCursor(11, 0);
    lcd.print("CONN");
    lcd.setCursor(11, 0);
  }
  else {
    // Blynk.disconnect();
    lcd.setCursor(11, 0);
    lcd.print("DISC");
  }
  Blynk.run();
  timer.run();
}
void leggidati() {
  if (!Blynk.connected()) {
    WiFi.begin(ssid, pass);
    Blynk.config(auth, server, port);
    Blynk.connect();

  }
  else {

    Serial.println(sommapar);
    blynk_lcd.print(4, 0, sommapar );
  }
}
void leggidati1() {
  if (Blynk.connected()) {
    Serial.println("connesso");
  }
  else {
    Serial.println("no connesso");
  }
}
[/code]
la variabile viene richiamata e scritta ma il contatore riparte da zero e come se non riconoscesse il valore reale
della variabile. 
Ora sto provando anche l'altro codice di <Standardoil  >

wingamesyun

provando con l'altro codice mi da errore alla prima riga.

Code: [Select]
int leggidafile("totali.txt", & sommapar);//su questa riga mi da errore..........
{
    // così possiamo anche scegliere che file usare
    int sommapar = 0;
    myFile = SD.open("totali,txt", FILE_READ);

    if (myFile)
    {
        while (myFile.available())
        {
            char cx = myFile.read();
       
            if ((cx == '\r') || (cx == '\n'))
            {
                // fine riga windows o linux
                if (myFile.available() > 2)
                {
                    // esclude il caso di ultimo ritorno a capo
                   sommapar = 0;
                    // nuova riga? allora nuovo valore
                    break;
                }

                sommapar = sommapar * 10 + cx - '0';
                // ogni nuova cifra sposta a sinistra di un posto e si aggiunge
            }
        }

        myFile.close();
    }
    else
    {
        // Errore di apertura file
    }
    return sommapar;
}

Standardoil

eppurtroppo un minimo di 'C' occorre conoscerlo............
Non presurrò più la buona fede di chi:
NON indenta, USA la classe String o NON esegue le ricerche
E di chi non risponde alle domande Tante volte è stato segnalato che è sbagliato, quindi NON sono in buona fede
Non bado a studenti, che copino altrove

Silente

Con il mio codive (che non sapevo non funzionasse) é ovvio che hai lo syesso problema, in quanto non sappiamo ancora da cosa sia causato. Hai però qualche scrittura su seriale in più, che ci può aiutare a capire appunto questo. Apri il monitor seriale e mostra cosa dice
Dove va un numero va una variabile, una funzione e/o  un test.
Per ottenere devi spiegare

Strumenti/Formattazione automatica fino alla morte!
Cristianesimo:bibbia='C':K&R

wingamesyun

#27
May 29, 2019, 09:05 am Last Edit: May 29, 2019, 09:25 am by WinGamesyun
Buongiorno,allego il risultato della serial.

Credo che il problema stia nel loop a questo punto.

Code: [Select]
09:01:58.132 -> [8971]
09:01:58.132 ->     ___  __          __
09:01:58.132 ->    / _ )/ /_ _____  / /__
09:01:58.132 ->   / _  / / // / _ \/  '_/
09:01:58.132 ->  /____/_/\_, /_//_/_/\_\
09:01:58.132 ->         /___/ v0.6.1 on MKR WiFi 1010
09:01:58.132 ->
09:01:58.132 -> [8972] Connecting to blynk-cloud.com:8080
09:01:58.237 -> [9077] Ready (ping: 34ms).
09:01:58.307 -> Initializing SD card...
09:01:58.447 -> sd presente.
09:02:01.562 -> Totale = 70= valore della  variabile nel setup dopo il riavvio fino a qui tutto ok
09:02:14.767 -> PIN5
09:02:14.837 -> Totale = 5 = valore della variabile nel loop dopo che rileva un impulso nel for mi ricomincia da 0

Silente

Non si vede nulla di quello che scrive la mia parte di codice. Mi interessava sapere se:
1) riusciva ad aprire il file
2) cosa leggeva nel file eventualmente aperto

Quewte informazioni nonnsi leggono, ma compaiono molte informazioni non chiare (cosa sono tutte quelle /?)
Dove va un numero va una variabile, una funzione e/o  un test.
Per ottenere devi spiegare

Strumenti/Formattazione automatica fino alla morte!
Cristianesimo:bibbia='C':K&R

nid69ita

@standardoil,    l'utente ha scritto nel post successivi che il file viene eliminato prima di scriverlo quindi c'e' sempre un solo valore dentro.
L'utente scrive che è un principiante, fare una funzione con puntatori mi pare azzardato per il livello di @WinGamesyun
my name is IGOR, not AIGOR

Go Up