#include <Arduino.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
// Pin Definitions
#define RED_LED 15
#define GREEN_LED 2
#define BUTTON_PIN 12
#define BLUE_LED1 0
#define BLUE_LED2 4
#define BLUE_LED3 16
#define BLUE_PATTERN_BUTTON 14
// Variables
bool is_collecting = false; // Flag to control sensor data collection
bool blue_pattern_on = false; // Flag to control the blue LED pattern
int sensor_value = 0;
// Task for sensor data collection and LED control (Task 1, 2, 3, and 4)
void collectSensorData(void *parameter) {
while (1) {
if (is_collecting) {
// Generate random sensor value between 0 and 100
sensor_value = random(0, 101);
Serial.println("Sensor Value: " + String(sensor_value));
// Blink RED LED if sensor value > 90
if (sensor_value > 90) {
digitalWrite(RED_LED, HIGH);
vTaskDelay(125 / portTICK_PERIOD_MS); // 250 ms period (ON)
digitalWrite(RED_LED, LOW);
vTaskDelay(125 / portTICK_PERIOD_MS); // (OFF)
}
// Blink GREEN LED if sensor value < 90
if (sensor_value < 90) {
digitalWrite(GREEN_LED, HIGH);
vTaskDelay(250 / portTICK_PERIOD_MS); // 500 ms period (ON)
digitalWrite(GREEN_LED, LOW);
vTaskDelay(250 / portTICK_PERIOD_MS); // (OFF)
}
vTaskDelay(1000 / portTICK_PERIOD_MS); // 1 second interval for next reading
} else {
// If data collection is OFF, blink both RED and GREEN LEDs simultaneously every 1000 ms
digitalWrite(RED_LED, HIGH);
digitalWrite(GREEN_LED, HIGH);
vTaskDelay(500 / portTICK_PERIOD_MS); // Both ON for 500 ms
digitalWrite(RED_LED, LOW);
digitalWrite(GREEN_LED, LOW);
vTaskDelay(500 / portTICK_PERIOD_MS); // Both OFF for 500 ms
}
}
}
// Task to monitor button press for toggling sensor data collection (Task 4)
void monitorButton(void *parameter) {
bool buttonState = false;
bool lastButtonState = false;
while (1) {
buttonState = digitalRead(BUTTON_PIN);
// If the button is pressed, toggle the sensor data collection state
if (buttonState == LOW && lastButtonState == HIGH) {
is_collecting = !is_collecting; // Toggle data collection
Serial.println(is_collecting ? "Sensor ON" : "Sensor OFF");
}
lastButtonState = buttonState;
vTaskDelay(50 / portTICK_PERIOD_MS); // Debouncing delay
}
}
// Task for the Blue LED pattern (Task 5)
void blueLedPattern(void *parameter) {
while (1) {
if (blue_pattern_on) {
// LED 1 ON, LED 2 and 3 OFF
digitalWrite(BLUE_LED1, HIGH);
digitalWrite(BLUE_LED2, LOW);
digitalWrite(BLUE_LED3, LOW);
vTaskDelay(500 / portTICK_PERIOD_MS); // 500 ms delay for each step
// LED 2 ON, LED 1 and 3 OFF
digitalWrite(BLUE_LED1, LOW);
digitalWrite(BLUE_LED2, HIGH);
digitalWrite(BLUE_LED3, LOW);
vTaskDelay(500 / portTICK_PERIOD_MS);
// LED 3 ON, LED 1 and 2 OFF
digitalWrite(BLUE_LED1, LOW);
digitalWrite(BLUE_LED2, LOW);
digitalWrite(BLUE_LED3, HIGH);
vTaskDelay(500 / portTICK_PERIOD_MS);
} else {
// Turn off all BLUE LEDs if the pattern is OFF
digitalWrite(BLUE_LED1, LOW);
digitalWrite(BLUE_LED2, LOW);
digitalWrite(BLUE_LED3, LOW);
}
vTaskDelay(50 / portTICK_PERIOD_MS); // Add a small delay to avoid CPU overload
}
}
// Task to monitor button press for toggling Blue LED pattern (Task 6)
void monitorBluePatternButton(void *parameter) {
bool buttonState = false;
bool lastButtonState = false;
while (1) {
buttonState = digitalRead(BLUE_PATTERN_BUTTON);
// If the button is pressed, toggle the blue LED pattern
if (buttonState == LOW && lastButtonState == HIGH) {
blue_pattern_on = !blue_pattern_on; // Toggle blue LED pattern
Serial.println(blue_pattern_on ? "Blue Pattern ON" : "Blue Pattern OFF");
}
lastButtonState = buttonState;
vTaskDelay(100 / portTICK_PERIOD_MS); // Increase debouncing delay
}
}
void setup() {
// Initialize Serial Monitor
Serial.begin(115200);
// Setup LED pins as outputs
pinMode(RED_LED, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
pinMode(BLUE_LED1, OUTPUT);
pinMode(BLUE_LED2, OUTPUT);
pinMode(BLUE_LED3, OUTPUT);
// Setup button pins as inputs (using internal pull-up resistors)
pinMode(BUTTON_PIN, INPUT_PULLUP); // Active LOW button for sensor data
pinMode(BLUE_PATTERN_BUTTON, INPUT_PULLUP); // Active LOW button for blue LED pattern
// Create FreeRTOS tasks
xTaskCreate(collectSensorData, "Collect Sensor Data", 1000, NULL, 1, NULL); // Task for sensor data
xTaskCreate(monitorButton, "Monitor Button", 1000, NULL, 1, NULL); // Task for button press to control sensor data
xTaskCreate(monitorBluePatternButton, "Monitor Blue Pattern Button", 1000, NULL, 1, NULL); // Task for button press to control blue LED pattern
xTaskCreate(blueLedPattern, "Blue LED Pattern", 1000, NULL, 1, NULL); // Task for blue LED pattern
}
void loop() {
// Nothing here, everything is handled by FreeRTOS tasks
}