#include <WiFi.h>
#include <WiFiClient.h>
#include <WebServer.h>
#include <uri/UriBraces.h>
#include "ArduinoJson.h"
#include "EspMQTTClient.h"
#include "FS.h"
#include "SD.h"
#include <SPI.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;
// MQTT Configuracoes
EspMQTTClient client{
"Wokwi-GUEST", //SSID do WiFi
"", // Senha do wifi
"mqtt.tago.io", // Endereço do servidor
"", // Usuario
"34e42be8-83e3-496f-a2a8-eb7a0f21fb93", // Token do device
"Receptor sd-card", // Nome do device
1883 // Porta de comunicação
};
WebServer server(80);
#define SD_CS 5
File root;
// Save reading number on RTC memory
RTC_DATA_ATTR int readingID = 0;
// Define NTP Client to get time
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP);
// Declare variables with global scope
String formattedDate;
String dayStamp;
String timeStamp;
String dataMessage;
void setup() {
pinMode(SD_CS, OUTPUT);
Serial.begin(9600);
Serial.println("Conectando WiFi");
while (!client.isWifiConnected()) {
Serial.print('.'); client.loop(); delay(1000);
}
Serial.println("WiFi Conectado");
Serial.println("Conectando com Servidor MQTT");
while (!client.isMqttConnected()) {
Serial.print('.'); client.loop(); delay(1000);
}
Serial.println("MQTT Conectado");
Serial.print("Initializing SD card... ");
// Initialize a NTPClient to get time
timeClient.begin();
timeClient.setTimeOffset(-10800);
// 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
}
}
void onConnectionEstablished() {
server.handleClient();
client.loop();
}
void loop() {
char bufferJson[100];
// 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");
writeFile(SD, "/data.txt", "Reading ID, Date, Hour, Temperature \r\n");
}
// Increment readingID on every new reading
readingID++;
getTimeStamp();
StaticJsonDocument<300> documentoJson;
documentoJson["variable"] = "hora";
documentoJson["value"] = timeStamp;
documentoJson["unit"] = "HHMMSS";
serializeJson(documentoJson, bufferJson);
Serial.println(bufferJson);
client.publish("ImagemTumor", bufferJson);
file.close();
delay(1000);
}
void printDirectory(File dir, int numTabs) {
while (true) {
File entry = dir.openNextFile();
if (! entry) {
// no more files
break;
}
for (uint8_t i = 0; i < numTabs; i++) {
Serial.print('\t');
}
Serial.print(entry.name());
if (entry.isDirectory()) {
Serial.println("/");
printDirectory(entry, numTabs + 1);
} else {
// files have sizes, directories do not
Serial.print("\t\t");
Serial.println(entry.size(), DEC);
}
entry.close();
}
}
void getTimeStamp() {
while(!timeClient.update()) {
timeClient.forceUpdate();
break;
}
// The formattedDate comes with the following format:
// 2018-05-28T16:00:13Z
// We need to extract date and time
formattedDate = timeClient.getFormattedTime(); // Corrigido para getFormattedTime()
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);
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();
}