Stránka 1 z 2

ARDUINO - funkce pro zapis na SD kartu - VYŘEŠENO

Napsal: 23 srp 2015, 18:51
od jiri255
Zdravím,
nějak jsem se zasekl s funkcí pro zápis na SD, tak bych tu chtěl někoho
z Vás požádat o radu.
Program viz níže zapisuje na SD kartu dobu běhu přístroje podle delay,
tedy každých 10s a já bych potřeboval, aby ten program fungoval trochu
jinak.
Přesněji, že pokud bude "Dobabehu" = např: 2 minuty, tak to spustí funkci pro zápis na SD a zapíše ji to tam.
Nějak přesně nevím, jak to správně zapsat, aby mi to takhle fungovalo?

Předem děkuji za pomoc

Kód: Vybrat vše

#include <SD.h>

File myFile;
char Dobabehu[19];

  int vterin = 0;      //pro cas doby behu pristroje
  int minut = 0;       //pro cas doby behu pristroje
  int hodin = 0;       //pro cas doby behu pristroje
  int dny = 0;         //pro cas doby behu pristroje
 
  void setup() {
  Serial.begin(9600);
 
//------------------------------------nacteni SD karty
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
    Serial.print("Hledam SD kartu...");

  pinMode(10, OUTPUT);
 
  if (!SD.begin(4)) {
    Serial.println("Karta nenalezena");
    return;
  }
  Serial.println("Karta nalezena.");
//------------------------------------konec nacitani SD karty

}

void loop() {
 
  Serial.print("Doba behu - ");
  Serial.println(Dobabehu);

//----------------------------------------zacatek zapisu na SD   
     // nothing happens after setup
      myFile = SD.open("test.txt", FILE_WRITE);
   
   // if the file opened okay, write to it:
   if (myFile) {
     Serial.print("Writing to test.txt...");
     myFile.print(Dobabehu);
     myFile.print(" ; ");
   } else {
     // if the file didn't open, print an error:
     Serial.println("error opening test.txt");
   }
//-------------------------------------------konec zapisu na SD

 //-----------------------------------------doba behu pristroje 
  vterin = vterin + 10;  // přičtem další vteřinu

  if (vterin == 60){  // pokud je vteřin 60
  vterin = 0;   // vynulujem vteřiny
  minut ++;     // přičtem minutu
  }

  if (minut == 60){ // pokud je minut 60
  minut = 0;  // vynulujem minuty
  hodin ++;   // přičtem hodinu
  }

  if (hodin == 24){ // pokud je hodin 24
  hodin = 0; // vynulujem hodiny
  dny ++;    // prictem den
  }
 
  //char Dobabehu[19];
  sprintf(Dobabehu, "Dny: %d - %02d:%02d:%02d", (dny),(hodin),(minut),(vterin));
//------------------------------------konec doby behu pristroje
 
  delay(10000); //opakovani
 
}

Napsal: 23 srp 2015, 19:09
od Cowley
Delay nepouzivej.
Pouzij funkci millis.

Napsal: 23 srp 2015, 19:17
od jiri255
pomocí millis to právě řešit nechci, a delay je tam taky jen, aby ten program běžel může být nastaveno na 10000,30000 nebo 50000 na tom nezáleží jde o to, aby pokud je "dobabehu" = 2minuty, tak to provede zápis na kartu....

Napsal: 23 srp 2015, 19:20
od Cowley
Tak nuluj az kdyz mas napocitano 120 vterin a proved zapis. Do hodiny budes mit 30 zapisu a vse pojede dal jak ma.

Napsal: 23 srp 2015, 19:26
od Cowley
Mas jeden loop, kterej by rad rotoval a delal co ma, jen na konci ho bloknes na 10sekund.

Pokud bys vyjmul to zapisovani a dal si ho napriklad do podprogramu, kterej si zavolas podle nejaky svy podminky, bude ti zapisovat prave tehdy, co ho zavolas.

Podminka kazde 2 minuty je napriklad modulo minuty, tzn. %minuty.

Navic nikde v programu nevidim Dobubehu zavislou na vypoctu z vterin,minut,hodin a dnu.

Napsal: 23 srp 2015, 19:41
od jiri255
jj přesně tak, napadá mě udělat s toho zápisu na SD něco jako níže a odsunout to na konec programu za loop.
Jen nevím, jak zapsat tu podmínku...

Kód: Vybrat vše

int getSDzapis() {
//----------------------------------------zacatek zapisu na SD   
     // nothing happens after setup
      myFile = SD.open("test.txt", FILE_WRITE);
   
   // if the file opened okay, write to it:
   if (myFile) {
     Serial.print("Writing to test.txt...");
     myFile.print(Dobabehu);
     myFile.print(" ; ");   
     myFile.close();
     Serial.println("done.");
   } else {
     // if the file didn't open, print an error:
     Serial.println("error opening test.txt");
   }
//-------------------------------------------konec zapisu na SD
 }

Napsal: 23 srp 2015, 19:44
od Cowley
Prvni pocitani vterin vyhod a nech tam jen

If ( vterin==120)
{getSD();
minut=minut+2}

A podprogram musi zacinat void getSDzapis()
A cely podprogram ve vlastnich slozenych zavorkach.

Napsal: 23 srp 2015, 20:06
od jiri255
tak jsem to upravil snad správně, ale na kartu to nezapisuje,
tak nevím v čem by mohl být problém...

Kód: Vybrat vše

#include <SD.h>

File myFile;
char Dobabehu[19];

  int vterin = 0;      //pro cas doby behu pristroje
  int minut = 0;       //pro cas doby behu pristroje
  int hodin = 0;       //pro cas doby behu pristroje
  int dny = 0;         //pro cas doby behu pristroje
 
  void setup() {
  Serial.begin(9600);
 
//------------------------------------nacteni SD karty
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
    Serial.print("Hledam SD kartu...");

  pinMode(10, OUTPUT);
 
  if (!SD.begin(4)) {
    Serial.println("Karta nenalezena");
    return;
  }
  Serial.println("Karta nalezena.");
//------------------------------------konec nacitani SD karty

}

void loop() {
 
  Serial.print("Doba behu - ");
  Serial.println(Dobabehu);

 //-----------------------------------------doba behu pristroje 
  vterin = vterin + 10;  // přičtem další vteřinu

  if (vterin == 60){  // pokud je vteřin 60
  vterin = 0;   // vynulujem vteřiny
  minut ++;     // přičtem minutu
  }

  if (minut == 60){ // pokud je minut 60
  minut = 0;  // vynulujem minuty
  hodin ++;   // přičtem hodinu
  }

  if (hodin == 24){ // pokud je hodin 24
  hodin = 0; // vynulujem hodiny
  dny ++;    // prictem den
  }
 
  //char Dobabehu[19];
  sprintf(Dobabehu, "Dny: %d - %02d:%02d:%02d", (dny),(hodin),(minut),(vterin));
//------------------------------------konec doby behu pristroje

  if (vterin==120)
 {getSD();}
 
  delay(10000); //opakovani
 
}

void getSD() {
 //----------------------------------------zacatek zapisu na SD   
      // nothing happens after setup
       myFile = SD.open("test.txt", FILE_WRITE);
     
    // if the file opened okay, write to it:
    if (myFile) {
      Serial.print("Writing to test.txt...");
      myFile.print(Dobabehu);
      myFile.print(" ; ");   
      myFile.close();
      Serial.println("done.");
    } else {
      // if the file didn't open, print an error:
      Serial.println("error opening test.txt");
    }
 //-------------------------------------------konec zapisu na SD
  }

Napsal: 23 srp 2015, 20:09
od Cowley
Vzdyt si takhle sekundy vynulujes driv nez staci napocitat 120. Koukni nahoru do diskuse...

Napsal: 23 srp 2015, 20:13
od Cowley
 if (vterin == 60){  // pokud je vteřin 60   vterin = 0;   // vynulujem vteřiny   minut ++;     // přičtem minutu   } 

Tohle vymaz a nahrad to tou dvouminutovou podminkou se skokem.

Napsal: 23 srp 2015, 20:25
od jiri255
no změnil jsem tu podmínku pro zápis na SD
if (vterin==120)
{getSD();}

za

if (minut==2)
{getSD();}

což začalo zapisovat na SD kartu, ale teď to zapisuje nějak divně...
pokud jsou 2 minuty zapisuje to pořád dokud tam neskočí 2:50 a pak
už to nefunguje, mělo by to při 4 minutách zapsat, ale to nic už neudělá
zde je výpis:

Kód: Vybrat vše

Hledam SD kartu...Karta nalezena.
Doba behu - Dny: 0 - 00:00:10
Doba behu - Dny: 0 - 00:00:20
Doba behu - Dny: 0 - 00:00:30
Doba behu - Dny: 0 - 00:00:40
Doba behu - Dny: 0 - 00:00:50
Doba behu - Dny: 0 - 00:01:00
Doba behu - Dny: 0 - 00:01:10
Doba behu - Dny: 0 - 00:01:20
Doba behu - Dny: 0 - 00:01:30
Doba behu - Dny: 0 - 00:01:40
Doba behu - Dny: 0 - 00:01:50
Writing to test.txt...done.
Doba behu - Dny: 0 - 00:02:00
Writing to test.txt...done.
Doba behu - Dny: 0 - 00:02:10
Writing to test.txt...done.
Doba behu - Dny: 0 - 00:02:20
Writing to test.txt...done.
Doba behu - Dny: 0 - 00:02:30
Writing to test.txt...done.
Doba behu - Dny: 0 - 00:02:40
Writing to test.txt...done.
Doba behu - Dny: 0 - 00:02:50
Doba behu - Dny: 0 - 00:03:00
Doba behu - Dny: 0 - 00:03:10
Doba behu - Dny: 0 - 00:03:20
Doba behu - Dny: 0 - 00:03:30
Doba behu - Dny: 0 - 00:03:40
Doba behu - Dny: 0 - 00:03:50
Doba behu - Dny: 0 - 00:04:00
Doba behu - Dny: 0 - 00:04:10
Doba behu - Dny: 0 - 00:04:20


Napsal: 23 srp 2015, 20:30
od Cowley
Podminka minuty==2 je prece splnena jen ve 2.00 pak 2.10 pak 2.20 atd do 2.50 pak uz ne. To uz jsou minuty==3 atd, predtim byly minuty==1. Takhle to nejde. Zkus to s tim ode me.

A cti ty prispevky cele...

Napsal: 23 srp 2015, 20:38
od jiri255
no a nešlo by to upravit do té podmínky, že by to zapsalo jen jednou při těch 2 minutách a přičítalo by to minuty.

if (minut==2)
{getSD();}

Napsal: 23 srp 2015, 20:49
od jiri255
upravil jsem to takhle

if (minut == 2){
getSD();
minut ++;
}

tak teď to zapíše jednou při dvou minutách, ale nepřičítá
to dál a dál nezapisuje

Napsal: 23 srp 2015, 20:52
od Cowley
If(((minut%2)==0)&&(vterin==0))
{GetSD();}


Pokud jsou minuty sude 2,4,6.... a zaroven jsou vteriny rovne 0 tzn. Zacala suda minuta, skoc do podprogramu.