تسجيل بيانات درجة الحرارة إلى بطاقة MicroSD بـاستـخدام ESP32 اكتب تعليقُا

ESP32

يوضح هذا المشروع كيفية تسجيل البيانات مع الطوابع الزمنية على بطاقة microSD باستخدام ESP32 . على سبيل المثال ، سنقوم بتسجيل قراءات درجة الحرارة من جهاز استشعار DS18B20 كل 10 دقائق . سيكون ESP32 في وضع السكون العميق بين كل قراءة ، وسيطلب التاريخ والوقت باستخدام بروتوكول وقت الشبكة (NTP) .

ملخص مشروع تخزين دراجات الحرارة مع ESP32

قبل البدء ، دعنا نبرز الميزات الرئيسية للمشروع :

ESP-32-data-logging-overview
  • يقرأ ESP32 درجة الحرارة باستخدام جهاز استشعار درجة الحرارة DS18B20 .
  • بعد الحصول على درجة الحرارة ، تقدم طلبًا إلى خادم NTP (بروتوكول وقت الشبكة) للحصول على التاريخ والوقت . لذلك ، يحتاج ESP32 إلى اتصال Wi-Fi .
  • يتم تسجيل البيانات (درجة الحرارة والطابع الزمني) على بطاقة microSD . لتسجيل البيانات على بطاقة microSD ، نستخدم وحدة بطاقة microSD .
  • بعد الانتهاء من هذه المهام السابقة ، ينام ESP32 لمدة 10 دقائق .
  • يستيقظ ESP32 ويكرر هذه العملية .

الأجزاء المطلوبة لمشروع تخزين دراجات الحرارة مع ESP32

فيما يلي قائمة بالأجزاء اللازمة لإنشاء هذا المشروع (انقر فوق الروابط أدناه للعثور على أفضل الاسعار في في موقع أنا ألكتروني ) .

esp32-datalogging-parts-required

إعداد وحدة بطاقة microSD مع ESP32

لحفظ البيانات على بطاقة microSD مع ESP32 ، نستخدم وحدة بطاقة microSD التالية التي تتصل بـ ESP32 باستخدام بروتوكول اتصالات SPI .

microsd-card-module

تنسيق بطاقة microSD مع ESP32

عند استخدام بطاقة microSD مع ESP32 ، يجب عليك تنسيقها أولاً . اتبع الإرشادات التالية لتهيئة بطاقة microSD الخاصة بك .

1. أدخل بطاقة microSD في جهاز الكمبيوتر الخاص بك . انتقل إلى جهاز الكمبيوتر وانقر بزر الماوس الأيمن على بطاقة SD . حدد تنسيق كما هو موضح في الشكل أدناه .

format-SD-card-1

2. سوف تفتح معك نافذة جديدة . حدد FAT32 ، اضغط على ابدأ لتهيئة عملية التنسيق واتبع الإرشادات التي تظهر على الشاشة .

format-SD-card-2

الاسلاك - ربط مكونات المشروع مع ESP32

اتبع المخطط التخطيطي التالي لتجميع الدائرة لهذا المشروع .

esp32-data-logging_bb

يمكنك أيضًا استخدام الجدول التالي كمرجع لتوصيل وحدة بطاقة microSD :

1

تحميل الكود البرمجي مع ESP32

إليك الكود الذي تحتاج إلى تحميله على ESP32 . قبل التحميل ، تحتاج إلى تعديل الكود لتضمين بيانات اعتماد الشبكة (SSID وكلمة المرور) .

لتحميل الكود البرمجي اضغط هنا
// Libraries for SD card
#include "FS.h"
#include "SD.h"
#include <SPI.h>

//DS18B20 libraries
#include <OneWire.h>
#include <DallasTemperature.h>

// Libraries to get time from NTP Server
#include <WiFi.h>
#include <NTPClient.h>
#include <WiFiUdp.h>

// Define deep sleep options
uint64_t uS_TO_S_FACTOR = 1000000;  // Conversion factor for micro seconds to seconds
// Sleep for 10 minutes = 600 seconds
uint64_t TIME_TO_SLEEP = 600;

// Replace with your network credentials
const char* ssid     = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

// Define CS pin for the SD card module
#define SD_CS 5

// Save reading number on RTC memory
RTC_DATA_ATTR int readingID = 0;

String dataMessage;

// Data wire is connected to ESP32 GPIO 21
#define ONE_WIRE_BUS 21
// Setup a oneWire instance to communicate with a OneWire device
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature sensor 
DallasTemperature sensors(&oneWire);

// Temperature Sensor variables
float temperature;

// Define NTP Client to get time
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP);

// Variables to save date and time
String formattedDate;
String dayStamp;
String timeStamp;

void setup() {
  // Start serial communication for debugging purposes
  Serial.begin(115200);

  // Connect to Wi-Fi network with SSID and password
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected.");

  // Initialize a NTPClient to get time
  timeClient.begin();
  // Set offset time in seconds to adjust for your timezone, for example:
  // GMT +1 = 3600
  // GMT +8 = 28800
  // GMT -1 = -3600
  // GMT 0 = 0
  timeClient.setTimeOffset(3600);

  // Initialize SD card
  SD.begin(SD_CS);  
  if(!SD.begin(SD_CS)) {
    Serial.println("Card Mount Failed");
    return;
  }
  uint8_t cardType = SD.cardType();
  if(cardType == CARD_NONE) {
    Serial.println("No SD card attached");
    return;
  }
  Serial.println("Initializing SD card...");
  if (!SD.begin(SD_CS)) {
    Serial.println("ERROR - SD card initialization failed!");
    return;    // init failed
  }

  // If the data.txt file doesn't exist
  // Create a file on the SD card and write the data labels
  File file = SD.open("/data.txt");
  if(!file) {
    Serial.println("File doens't exist");
    Serial.println("Creating file...");
    writeFile(SD, "/data.txt", "Reading ID, Date, Hour, Temperature \r\n");
  }
  else {
    Serial.println("File already exists");  
  }
  file.close();

  // Enable Timer wake_up
  esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);

  // Start the DallasTemperature library
  sensors.begin(); 

  getReadings();
  getTimeStamp();
  logSDCard();
  
  // Increment readingID on every new reading
  readingID++;
  
  // Start deep sleep
  Serial.println("DONE! Going to sleep now.");
  esp_deep_sleep_start(); 
}

void loop() {
  // The ESP32 will be in deep sleep
  // it never reaches the loop()
}

// Function to get temperature
void getReadings(){
  sensors.requestTemperatures(); 
  temperature = sensors.getTempCByIndex(0); // Temperature in Celsius
  //temperature = sensors.getTempFByIndex(0); // Temperature in Fahrenheit
  Serial.print("Temperature: ");
  Serial.println(temperature);
}

// Function to get date and time from NTPClient
void getTimeStamp() {
  while(!timeClient.update()) {
    timeClient.forceUpdate();
  }
  // The formattedDate comes with the following format:
  // 2018-05-28T16:00:13Z
  // We need to extract date and time
  formattedDate = timeClient.getFormattedDate();
  Serial.println(formattedDate);

  // Extract date
  int splitT = formattedDate.indexOf("T");
  dayStamp = formattedDate.substring(0, splitT);
  Serial.println(dayStamp);
  // Extract time
  timeStamp = formattedDate.substring(splitT+1, formattedDate.length()-1);
  Serial.println(timeStamp);
}

// Write the sensor readings on the SD card
void logSDCard() {
  dataMessage = String(readingID) + "," + String(dayStamp) + "," + String(timeStamp) + "," + 
                String(temperature) + "\r\n";
  Serial.print("Save data: ");
  Serial.println(dataMessage);
  appendFile(SD, "/data.txt", dataMessage.c_str());
}

// Write to the SD card (DON'T MODIFY THIS FUNCTION)
void writeFile(fs::FS &fs, const char * path, const char * message) {
  Serial.printf("Writing file: %s\n", path);

  File file = fs.open(path, FILE_WRITE);
  if(!file) {
    Serial.println("Failed to open file for writing");
    return;
  }
  if(file.print(message)) {
    Serial.println("File written");
  } else {
    Serial.println("Write failed");
  }
  file.close();
}

// Append data to the SD card (DON'T MODIFY THIS FUNCTION)
void appendFile(fs::FS &fs, const char * path, const char * message) {
  Serial.printf("Appending to file: %s\n", path);

  File file = fs.open(path, FILE_APPEND);
  if(!file) {
    Serial.println("Failed to open file for appending");
    return;
  }
  if(file.print(message)) {
    Serial.println("Message appended");
  } else {
    Serial.println("Append failed");
  }
  file.close();
}

أنتهت !!!

اترك تعليقاً



لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *