logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Arduino R4 WiFi i Data Logger Shield - zapis danych na kartę SD - rejestrator temperatury tutorial

p.kaczmarek2 15 Paź 2023 09:32 963 7
  • Arduino R4 WiFi i Data Logger Shield - zapis danych na kartę SD - rejestrator temperatury tutorial
    Dzisiaj uruchamiamy najnowsze Arduino R4 WiFi wraz z nakładką Data Logger Shield, która pozwala wygodnie zapisywać dane na kartę SD. Najpierw uruchomimy najprostszys zapis do pliku na karcie, a potem spróbujemy go rozbudować i wykonamy prosty termometr na bazie DHT11 wraz z historią pomiarów w pliku.

    Adafruit Data Logger Shield
    Do tematu użyłem nakładki DataLogger produkcji Adafruit. Kupiłem ją w Chinach za około 10 zł, ale w naszym kraju też ją można dostać za odpowiednio większą cenę:
    Arduino R4 WiFi i Data Logger Shield - zapis danych na kartę SD - rejestrator temperatury tutorial
    Karta SD nie jest dostępna w zestawie!
    Sam shield oferuje nieco więcej niż slot na kartę SD. Mamy tutaj:
    - DS1307 wraz z osprzętem i slotem na bateryjkę CR1220 (ale R4 ma już RTC na pokładzie, więc nie wiem, czy nam się to w dużym stopniu przyda)
    - przestrzeń prototypową do wykorzystania wedle uznania
    - wyprowadzony przycisk RESET
    - stabilizator napięcia 3.3V wraz z buforem dla karty SD
    - diody LED L1 i L2 które możemy podpiąć do wybranego GPIO
    Szczegółową dokumentację płytki, wersja C, udostępnia Adafruit:
    Arduino R4 WiFi i Data Logger Shield - zapis danych na kartę SD - rejestrator temperatury tutorial
    Arduino R4 WiFi i Data Logger Shield - zapis danych na kartę SD - rejestrator temperatury tutorial
    Dostępna jest też starsza wersja, wersja B:
    Arduino R4 WiFi i Data Logger Shield - zapis danych na kartę SD - rejestrator temperatury tutorial
    Arduino R4 WiFi i Data Logger Shield - zapis danych na kartę SD - rejestrator temperatury tutorial
    W praktyce shield prezentuje się tak:
    Arduino R4 WiFi i Data Logger Shield - zapis danych na kartę SD - rejestrator temperatury tutorial Arduino R4 WiFi i Data Logger Shield - zapis danych na kartę SD - rejestrator temperatury tutorial Arduino R4 WiFi i Data Logger Shield - zapis danych na kartę SD - rejestrator temperatury tutorial Arduino R4 WiFi i Data Logger Shield - zapis danych na kartę SD - rejestrator temperatury tutorial
    Oczywiście pasuje na R4:
    Arduino R4 WiFi i Data Logger Shield - zapis danych na kartę SD - rejestrator temperatury tutorial Arduino R4 WiFi i Data Logger Shield - zapis danych na kartę SD - rejestrator temperatury tutorial

    Prosty przykład zapisu na kartę SD
    Przykładowy kod od Adafruit wymaga uruchomienia też RTC, z tego też powodu postanowiłem go dla Was uprościć. Poniżej umieszczam moją wersję sketchu:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Do zapisu na kartę SD potrzeba załączyć nagłówek SD.h. Następnie tworzymy obiekt klasy File. W setup uruchamiamy kartę SD poprzez:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    a następniemy dobieramy nazwę naszego pliku z logiem, gdyż nie chcemy nadpisywać poprzednich logów:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    W pętli kolejno badamy kolejne nazwy plików, LOGGER00.CSV, LOGGER01.CSV i tak dalej. Dopóki dana nazwa istnieje, to ją pomijamy. W przeciwnym razie tworzymy plik o takiej nazwie i przerywamy pętlę.
    Potem wystarczy tylko wykonywać do niego zapis w głównej pętli:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Tu, dla przykładu, zapisuję licznik pętli (moja zmienna g_loops) oraz wartość bieżącego czasu z funkcji milis().
    Wsad bez problemu się kompiluje na R4, wgrywamy:
    Arduino R4 WiFi i Data Logger Shield - zapis danych na kartę SD - rejestrator temperatury tutorial
    Sprawdziłem działanie sketchu. Po chwili wyjąłem kartę SD, by się przekonać, czy coś się zapisało:
    Arduino R4 WiFi i Data Logger Shield - zapis danych na kartę SD - rejestrator temperatury tutorial
    Sukces - dane są poprawnie zapisywane na kartę:
    Arduino R4 WiFi i Data Logger Shield - zapis danych na kartę SD - rejestrator temperatury tutorial
    Czyli podstawa działa, ale pora uruchomić zegar.

    RTC z Arduino R4
    Arduino R4 posiada wbudowany zegar RTC, który możemy łatwo uruchomić kilkoma linijkami kodu:
    https://docs.arduino.cc/tutorials/uno-r4-minima/rtc
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Odpalmy na próbę powyższy kod:
    Arduino R4 WiFi i Data Logger Shield - zapis danych na kartę SD - rejestrator temperatury tutorial
    Wszystko działa, bez zarzutów.

    Konfiguracja czasu RTC z poziomu UART
    Poprzedni przykład ma startową datę wpisaną na sztywno. Trzeba go zmodyfikować tak, aby można ją było wysłać przez UART. Tym razem zrobimy prostą wersję, bez sumy kontrolnej, bez weryfikacji przesyłanych danych.
    Załóżmy, że wysyłamy datę w formacie:
    
    2023-08-14-15:37
    

    Po niej następnuje znak następnej linii. Najpierw wczytajmy całość do obiektu klasy string:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    A potem wczytamy z niej dane:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Odpuściłem sobie poprawne ustawienie dnia tygodnia oraz konfiguracji SaveLight. Mimo to, powyższa metoda powinna zapewnić nam możliwość ustawienia bieżącego czasu i daty przez terminal. Sprawdźmy:
    Arduino R4 WiFi i Data Logger Shield - zapis danych na kartę SD - rejestrator temperatury tutorial
    Działa! Zatem konfigurację czasu już mamy, teraz pora znaleźć jakiś czujnik...

    Uruchamiamy DHT11
    Teraz uruchomimy popularny czujnik temperatury i wilgotności DHT11.
    DHT11 można kupić już za jedyne 2 zł:
    Arduino R4 WiFi i Data Logger Shield - zapis danych na kartę SD - rejestrator temperatury tutorial
    DHT11 wystarczy podłączyć do Arduino. Mamy trzy piny - zasilanie, masa i sygnał:
    Arduino R4 WiFi i Data Logger Shield - zapis danych na kartę SD - rejestrator temperatury tutorial
    Podłączony do czwartego pinu:
    Arduino R4 WiFi i Data Logger Shield - zapis danych na kartę SD - rejestrator temperatury tutorial
    Teraz potrzebna będzie biblioteka. Nie ma jej wbudowanej. Trzeba coś pobrać z Githuba. Wybrałem:
    https://github.com/adidax/dht11
    Pobrałem zipa, a potem dodałemgo przez Sketch->Include Library->Add .zip library
    Oto przykładowy sketch z dokumentacji tej biblioteki:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Odpalamy i... działa! Działa też na R4, super:
    Arduino R4 WiFi i Data Logger Shield - zapis danych na kartę SD - rejestrator temperatury tutorial
    Z ciekawości rzuciłem okiem do źródeł tej biblioteki:
    https://github.com/adidax/dht11/blob/master/dht11.cpp
    Kod był pisany bardzo dawno temu, ale korzysta tylko z Arduino API, więc i tak działa na nowej platformie. Nikt nic nie musiał portować.

    Łączymy wszystko w całość...
    Teraz możemy połączyć nasze trzy omawiane przykłady w jeden, funkcjonalny logger:
    - do demka karty SD podpinamy zegar RTC wraz z możliwością ustawienia czasu
    - do demka karty SD podpinamy kod obsługi DHT11
    - dopisujemy samodzielnie wydruk zmiennych do UART oraz do pliku CSV:
    Arduino R4 WiFi i Data Logger Shield - zapis danych na kartę SD - rejestrator temperatury tutorial
    Pełny kod:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Odpalamy. Tak wygląda bez skonfigurowanego czasu:
    Arduino R4 WiFi i Data Logger Shield - zapis danych na kartę SD - rejestrator temperatury tutorial
    Teraz wysyłamy:
    
    2023-08-14-15:37
    

    by ustawić datę i czas.
    Działa, chociaż jeszcze przydałoby się poprawić zamianę miesiąca (liczenie od 0 vs od 1):
    Arduino R4 WiFi i Data Logger Shield - zapis danych na kartę SD - rejestrator temperatury tutorial
    Jeszcze sprawdźmy zawartość karty SD:
    Arduino R4 WiFi i Data Logger Shield - zapis danych na kartę SD - rejestrator temperatury tutorial

    Końcowe uwagi i poprawki
    Kod korzysta z RTC od Arduino R4, więc musimy podłączyć bateryjkę do podtrzymania go w razie zaniku normalnego zasilania:
    Arduino R4 WiFi i Data Logger Shield - zapis danych na kartę SD - rejestrator temperatury tutorial
    Kod wysyłania danych na UART/kartę SD nie zawiera poprawki dopisującej zero przed pojedynczą liczbą minut i godzin, można to łatwo dopisać.
    Można by też to ładniej zorganizować, formatować tekst raz do bufora a potem go drukować i na UART, i do pliku.

    Podsumowanie
    Adafruit Data Logger shield przetrwało próbę czasu i okazało się być bezproblemowe do użycia z Arduino R4 WiFi. Dodatkowo też pozytywnie zaskoczyła mnie biblioteka od sensora DHT11, która mimo iż nie była aktualizowana od lat, to jest napisana tak, że i tak z R4 (jak i z innymi platformami) działa. Prosty logger temperatury do karty SD udało się w pełni bezproblematycznie uruchomić.
    Jedyne co mogę jeszcze dodać, że projekt wymaga podpięcia bateryjki do zasilania RTC od R4 a shield niestety zasłania te piny, ale na szczęście można dolutować się do nich od spodu PCB, więc zasadniczo nie ma problemu.

    Fajne? Ranking DIY
    Pomogłem? Kup mi kawę.
    O autorze
    p.kaczmarek2
    Moderator Smart Home
    Offline 
  • #2 20770976
    Nargo
    Poziom 22  
    Swego czasu chciałem porównać czujniki z Chin DHT22(AM2301) 5szt. oraz DS18B20 10szt.
    Złożone na stykówce i logowanie do karty SD
    
    #include <SPI.h>
    #include <SD.h>
    #include "DHT.h"
    #include <OneWire.h>
    #include <DallasTemperature.h>
    
    const int DS18B20Pin = 4;
    OneWire oneWire(DS18B20Pin);
    DallasTemperature ds18b20(&oneWire);
    float DS18B20temp[10];
    
    #define CS_SD 16
    
    #define NUM_DHT 5
    #define DHTPIN1 18
    #define DHTPIN2 17
    #define DHTPIN3 21
    #define DHTPIN4 22
    #define DHTPIN5 12
    #define DHTTYPE DHT22
    DHT dht[NUM_DHT] = { //definiujemy tablicę obiektów klasy DHT
      DHT(DHTPIN1, DHTTYPE),
      DHT(DHTPIN2, DHTTYPE),
      DHT(DHTPIN3, DHTTYPE),
      DHT(DHTPIN4, DHTTYPE),
      DHT(DHTPIN5, DHTTYPE)
    };
    
    float temp_DHT[NUM_DHT];
    float hum_DHT[NUM_DHT];
    
    
    File myFile;
    
    void setup() 
    {
      pinMode(LED_BUILTIN, OUTPUT);
      Serial.begin(9600);
      while (!Serial) 
      {
      
      }
    
    
      Serial.print("Inicjalizacja SD");
    
      if (!SD.begin(CS_SD)) 
      {
        Serial.println("SD błąd");
        while (1);
      }
      Serial.println("SD OK");
    
      if (SD.exists("Temp.txt")) 
      {
        Serial.println("Temp.txt jest");
      } 
      else 
      {
        Serial.println("Temp.txt NIE MA");
      }
    
      
      Serial.println("Temp.txt otwieranie");
      myFile = SD.open("Temp.txt", FILE_WRITE);
      myFile.println("DHT22t-1, DHT22h-1,DHT22t-2, DHT22h-2,DHT22t-3, DHT22h-3,DHT22t-4, DHT22h-4,DHT22t-5, DHT22h-5, DS18B20-1, DS18B20-2, DS18B20-3, DS18B20-4, DS18B20-5, DS18B20-6, DS18B20-7, DS18B20-8, DS18B20-9, DS18B20-10, ");
      myFile.close();
      digitalWrite(LED_BUILTIN, HIGH); 
      delay(100);                      
      digitalWrite(LED_BUILTIN, LOW);  
      delay(100);      
      digitalWrite(LED_BUILTIN, HIGH); 
      delay(100);                      
      digitalWrite(LED_BUILTIN, LOW);  
      Serial.println("ok");
      for (int i=0; i<NUM_DHT; ++i)
      {
        dht[i].begin();
      }
    
    }
    
    void loop() 
    {
      myFile = SD.open("Temp.txt", FILE_WRITE);
      if (myFile) 
      {
        for (int i=0; i<NUM_DHT; ++i)
        {
          temp_DHT[i] = dht[i].readTemperature();
          hum_DHT[i] = dht[i].readHumidity();
          myFile.print(temp_DHT[i]);
          myFile.print(", ");
          Serial.print(temp_DHT[i]);
          Serial.print(", ");
          myFile.print(hum_DHT[i]);
          myFile.print(", ");
          Serial.print(hum_DHT[i]);
          Serial.print(", ");
        }
        ds18b20.requestTemperatures();  
        for (int i=0; i<10; ++i)
        {
          DS18B20temp[i] = ds18b20.getTempCByIndex(i);
          myFile.print(DS18B20temp[i]);
          myFile.print(", ");
          Serial.print(DS18B20temp[i]);
          Serial.print(", ");
        }
        
        myFile.println(" ");
        Serial.println(" ");
      }
        
      digitalWrite(LED_BUILTIN, HIGH);  
      delay(100);                      
      digitalWrite(LED_BUILTIN, LOW);  
      delay(100);      
      digitalWrite(LED_BUILTIN, HIGH); 
      delay(100);                      
      digitalWrite(LED_BUILTIN, LOW);  
      myFile.close();
      delay(300000);
      
    }
    
    
    
    


    Efekty pracy programu w załączniku po leżakowaniu w samochodzie w kwietniu :D
  • #3 20771010
    p.kaczmarek2
    Moderator Smart Home
    Bardzo fajny i przyjemny projekt dla początkującego, warto to zrobić, chociaż u Ciebie brakuje timestampu pomiaru. Bez tego ciężko cokolwiek potem z tymi danymi zrobić.

    Ja w kolejnej części o Arduino R4 zamierzam zaprezentować generowanie strony HTML z właśnie tymi wykresami, powiedzmy, taki przykład zastosowania WiFi do stacji pogodowej DIY bądź jakiejś bazy pomiarów.
    Pomogłem? Kup mi kawę.
  • #4 20771034
    Nargo
    Poziom 22  
    W jednej wersji miałem z zegarem, ale po dołożeniu DHT program nie działał prawidłowo na moim urządzeniu :D

    W załączeniu plik z wynikami.

    Ogólnie to zależało mi tylko na porównaniu dokładności poszczególnych czujników.
  • #5 20771394
    TechEkspert
    Redaktor
    Dobry materiał, ciekawa sprawa z RTC w Arduino R4, natomiast w Data Logger Shield też masz RTC podtrzymane bateryjnie, powstaje pytanie z którego skorzystać...
REKLAMA