Skocz do zawartości

Problem z programem - menu na LCD


Pomocna odpowiedź

Dziękuję, już rozumiem mój błąd, bardzo mi pomogłeś, można powiedzieć, że problem ze zmianą kart rozwiązany. Niestety napotkałem już ostatni problem w moim projekcie, mianowicie podczas zapisu danych z czujnika na kartę SD zmienna i nie zwiększa się. Wiem że to jest podstawa ale biję się w głowę o co może chodzić. 

void karta()
{
plik = SD.open("temp.txt", FILE_WRITE);
 for (int i=0; i<10; i++){
  plik.println("Odczyt temperatury nr: ");
  plik.println(i);
  plik.println("Temperatura w pokoju");
plik.println(sensor1.getTempCByIndex(0));
plik.println("Temperatura na zewnątrz");
plik.println(sensor2.getTempCByIndex(0));
plik.println("Temperatura na grzejniku");
plik.println(sensor3.getTempCByIndex(0));
plik.close();
  }
}

 

Chcę uzyskać 10 numerowanych kolejno wyników, niestety za każdym razem dostaję i=0.

Coś mi tu nie pasuje:

1. Otwierasz plik do zapisu
2. i=0
3. Zapisujesz odczyt nr 0
4. Zamykasz plik
i... próbujesz zapisać kolejne odczyty do zamkniętego pliku. Nie wiem, ale czy plik.close() nie powinien być poza pętlą for?

 

Mój błąd, nie zauważyłem tego. Chyba już jestem zmęczony tym projektem. Myślałem, że będzie już fajnie ale prędkość zapisu jest zbyt duża 😕 delay nie mogę tutaj dać bo się zatrzyma cały program a wrzucając millis() nie widzi for'a

 

void karta()
{
plik = SD.open("temp.txt", FILE_WRITE);


aktualnyCzas1 = millis();
  if (aktualnyCzas1 - zapamietanyCzas1 >= 8000)
  {
    zapamietanyCzas1 = aktualnyCzas1;    

   for (int i=0; i<100; i++){
  plik.println("Odczyt temperatury nr: ");
  plik.println(i);
  plik.println("Temperatura w pokoju");
plik.println(sensor1.getTempCByIndex(0));
plik.println("Temperatura na zewnątrz");
plik.println(sensor2.getTempCByIndex(0));
plik.println("Temperatura na grzejniku");
plik.println(sensor3.getTempCByIndex(0));
  }
 }
  plik.close();
}

 

(edytowany)
6 minut temu, zirael3 napisał:

wrzucając millis() nie widzi for'a

No nie wytrzymałem...

Widzi, widzi, tylko do zamkniętego pliku fatalnie się pisze... a otwieranie otwartego pliku też nie zawsze wychodzi.

Dobra, już się nie odzywam.

Edytowano przez ethanak

Nie, trzeba otworzyć plik jeśli będziemy w nim zapisywać. Kaki sens  ma otwieranie pliku, jeśli zaraz masz ifa który nie pozwala na zapis i zamknięcie?

(edytowany)
9 minut temu, ethanak napisał:

Nie, trzeba otworzyć plik jeśli będziemy w nim zapisywać. Kaki sens  ma otwieranie pliku, jeśli zaraz masz ifa który nie pozwala na zapis i zamknięcie?

Taki ma sens, że ma plik otwarty na początku funkcji, a na końcu plik zamyka - z czasem pewnie by sobie zoptymalizował kolega ten fragment. Pytanie klucz dlaczego millis() koledze nie działa tak jak tego oczekuje?
Może warto byłoby sprawdzić jaka jest wartość aktualnyCzas1 i zapamietanyCzas1 na wejściu funkcji?

Edytowano przez Belferek
Przed chwilą, Belferek napisał:

Taki ma sens, że ma plik otwarty

To ja mam pytanie (bo nie mam jak sprawdzić): co zwraca SD.open(cośtam, FILE_WRITE) jeśli plik jest już otwarty?

Czyli otwierasz plik, nie zapisujesz, nie zamykasz, znowu otwierasz, nie sprawdzasz czy się otworzył, znowu nie zapisujesz i nie zamykasz, tak w kółko przez 8 sekund, a potem otwierasz plik który już z tysiąc razy otworzyłeś, nie sprawdzasz czy się otworzył bo sprawdzanie to dla cieniasów jest, Chuck Norris potrafi do zamkniętego pliku pisać to i wszyscy mogą?

A... przepraszam, ale tak to jest jak się widzi kod bez wcięć i trzeba nawiasy liczyć. Dobrze że Arduino się w Lispie nie programuje bo jak widać przy trzech już się można machnąć, a co dopiero przy dwusetnym 😉

Co nie zmienia faktu, że open/close są w tym przypadku całkowicie zbędne, a są to dość kosztowne funkcje.

 

(edytowany)

No tak ... już koledze zwracałem uwagę na formatowanie kodu i pewnie wkrótce się poprawi :-).
Autorowi sugeruję taką funkcję i obserwację wyników w monitorze portu szeregowego:
 

void karta()
{
    aktualnyCzas1 = millis();
    Serial.print("Aktualny:");    Serial.println(aktualnyCzas1);
    Serial.print("Zapamietany:"); Serial.println(zapamietanyCzas1);
    Serial.print("Roznica:");     Serial.println(aktualnyCzas1-zapamietanyCzas1);
    if (aktualnyCzas1 - zapamietanyCzas1 >= 8000)
      {
        plik = SD.open("temp.txt", FILE_WRITE);
        zapamietanyCzas1 = aktualnyCzas1;    
        for (int i=0; i<100; i++)
         {
           plik.println("Odczyt temperatury nr: ");
           plik.println(i);
           plik.println("Temperatura w pokoju");
           plik.println(sensor1.getTempCByIndex(0));
           plik.println("Temperatura na zewnątrz");
           plik.println(sensor2.getTempCByIndex(0));
           plik.println("Temperatura na grzejniku");
           plik.println(sensor3.getTempCByIndex(0));
           }
          plik.close();
         }
}

  

 

Edytowano przez Belferek

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...