#include <Wire.h> // Inclui a biblioteca Wire usada para I2C
#include <Adafruit_BMP280.h> // Inclui a biblioteca do BMP280
#include <SPI.h> // Inclui a biblioteca SPI
#include <SD.h> // Inclui a biblioteca SD
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <freertos/semphr.h>
SemaphoreHandle_t serialMutex;
const int sdCS = 27;
Adafruit_BMP280 bmp; //mutex acesso a serial
void task1 (void *Altitude){
while(true){
if(xSemaphoreTake(serialMutex, portMAX_DELAY)){
Serial.print("Tarefa 1 usando a serial");
float altitude = bmp.readAltitude(1013.25); // Lê a altitude do sensor
return altitude; // Chamada da função que vai armazenar os dados de altitude no cartão MicroSD
Serial.print("Altitude (m): "); //exibe os dados no monitor serial
Serial.println(altitude);
Serial.print("\n");
xSemaphoreGive(serialMutex); // Libera o mutex
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
}
void task2 (void *Pressure){
while(true){
if(xSemaphoreTake(serialMutex, portMAX_DELAY)){
Serial.print("Tarefa 2 usando a serial");
float pressure = bmp.readPressure(); // Lê a altitude do sensor
return pressure; // Chamada da função que vai armazenar os dados de pressão no cartão MicroSD
Serial.print("Pressure (hPa): ");
Serial.println(pressure);
Serial.print("\n");
xSemaphoreGive(serialMutex); // Libera o mutex
vTaskDelay(500 / portTICK_PERIOD_MS);
}
}
}
void task3 (void *Temperature){
while(true){
if(xSemaphoreTake(serialMutex, portMAX_DELAY)){
Serial.print("Tarefa 3 usando a serial");
float temperature = bmp.readTemperature(); // Lê a altitude do sensor
return temperature; // Chamada da função que vai armazenar os dados de temperatura no cartão MicroSD
Serial.print("Temperature (C): ");
Serial.println(temperature);
Serial.print("\n");
xSemaphoreGive(serialMutex); // Libera o mutex
vTaskDelay(500 / portTICK_PERIOD_MS);
}
}
}
// Define o pino do Chip Select para o Cartão SD
// Cria o objeto BMP
void setup() {
Serial.begin(9600);
// Inicializa o sensor BMP
if (!bmp.begin(0x76)) {//0x76 é o endereço 'genérico' para usarmos num BMP
Serial.println("Não foi possível encontrar um sensor BMP280 válido, cheque conexão");
while (1);
// Esse bloco significa: caso o BMP não inicialize ele vai travar o programa
}
// Inicializa o cartão SD
if (!SD.begin(sdCS)) {
Serial.println("Cartão falho ou não presente");
while (1);
// Esse bloco significa: caso o SD não inicialize ele vai travar o programa
}
serialMutex = xSemaphoreCreateMutex(); //cria o mutex
xTaskCreate(task1, "Task1", 1000, NULL, 1, NULL);
delay(500);
xTaskCreate(task2, "Task2", 1000, NULL, 1, NULL);
delay(500);
xTaskCreate(task3, "Task3", 1000, NULL, 1, NULL);
delay(500);
Serial.println("Inicializada o Armazenamento de dados de Altitude");
logTodos();
}
void loop() {
//nada aqui ;-;
}
void logTodos(float altitude, float temperature, float pressure) {
// Cria o arquivo no cartão SD
File dataFile = SD.open("dados_log.txt", FILE_WRITE);
// Checa se o arquivo foi aberto com sucesso
if (dataFile) {
// Chamada das funções que armazenam os dados
dataFile.print(altitude);
dataFile.print("\n");
dataFile.print(temperature);
dataFile.print("\n");
dataFile.print(pressure);
dataFile.print("\n");
dataFile.close();
} else {
// Caso o arquivo não abra, essa será a mensagem:
Serial.println("Erro ao abrir o arquivo para armazenar os dados");
}
}