#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
File dataFile;
void task1 (void *pvParameters){
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
Serial.print("Altitude (m): "); //exibe os dados no monitor serial
Serial.println(altitude);
Serial.print("\n");
if(SD.exists("dados_log.txt")){
dataFile.print(altitude);
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 a altitude");
}
xSemaphoreGive(serialMutex); // Libera o mutex
vTaskDelay(200 / portTICK_PERIOD_MS);
}
}
}
void task2 (void *pvParameters){
while(true){
if(xSemaphoreTake(serialMutex, portMAX_DELAY)){
Serial.print("Tarefa 2 usando a serial");
float pressure = bmp.readPressure(); // Lê a altitude do sensor
Serial.print("Pressure (hPa): ");
Serial.println(pressure);
Serial.print("\n");
if(SD.exists("dados_log.txt")){
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 a pressão");
}
xSemaphoreGive(serialMutex); // Libera o mutex
vTaskDelay(150 / portTICK_PERIOD_MS);
}
}
}
void task3 (void *pvParameters){
while(true){
if(xSemaphoreTake(serialMutex, portMAX_DELAY)){
Serial.print("Tarefa 3 usando a serial");
float temperature = bmp.readTemperature(); // Lê a altitude do sensor
Serial.print("Temperature (C): ");
Serial.println(temperature);
Serial.print("\n");
if(SD.exists("dados_log.txt")){
dataFile.print(temperature);
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 a temperatura");
}
xSemaphoreGive(serialMutex); // Libera o mutex
vTaskDelay(150 / 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
}
// Cria o arquivo no cartão SD
dataFile = SD.open("dados_log.txt", FILE_WRITE);
//Mensagem de inicialização do armazenamento de dados no cartão SD
Serial.println("Inicializada o Armazenamento de dados de Altitude");
serialMutex = xSemaphoreCreateMutex(); //cria o mutex
xTaskCreate(task1, "Task1", 1000, NULL, 1, NULL);
delay(200);
xTaskCreate(task2, "Task2", 1000, NULL, 1, NULL);
delay(150);
xTaskCreate(task3, "Task3", 1000, NULL, 1, NULL);
delay(150);
}
void loop() {
//nada aqui ;-;
}