#include <LiquidCrystal_I2C.h>
#include <Arduino_FreeRTOS.h>
#include <Adafruit_NeoPixel.h>
#define RED_LED 13
#define GREEN_LED 12
#define TOGLE_BUTTON 11
#define INCREASE_BUTTON 10
#define DECREASE_BUTTON 9
#define I2C_ADDR 0x27
#define LCD_COLUMNS 16
#define LCD_LINES 2
#define NEO_PIN 8
#define NEO_SIZE 16
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NEO_SIZE, NEO_PIN, NEO_GRB + NEO_KHZ800);
void Task1( void *pvParameters );
void Task2( void *pvParameters );
void Task3( void *pvParameters );
void Task4( void *pvParameters );
void setup()
{
pinMode(RED_LED, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
pinMode(TOGLE_BUTTON, INPUT_PULLUP);
pinMode(INCREASE_BUTTON, INPUT_PULLUP);
pinMode(DECREASE_BUTTON, INPUT_PULLUP);
lcd.init();
lcd.backlight();
strip.begin();
strip.show();
xTaskCreate(Task1,"Task1",128,NULL,1,NULL);
xTaskCreate(Task2,"Task2",128,NULL,1,NULL);
xTaskCreate(Task3,"Task3",128,NULL,1,NULL);
xTaskCreate(Task4,"Task4",128,NULL,1,NULL);
vTaskStartScheduler();
}
void loop()
{
}
bool greenLedOn = false;
bool redLedOn = false;
int redLedTime = 1000;
int redLedRecurrence = 0;
unsigned long redLedStartTime = 0;
void Task1(void *pvParameters) {
while(1) {
if (digitalRead(TOGLE_BUTTON) == LOW) {
while (digitalRead(TOGLE_BUTTON) == LOW){}
if (greenLedOn) {
redLedStartTime = millis();
redLedOn = true;
digitalWrite(RED_LED, HIGH);
redLedRecurrence = 1;
} else {
redLedOn = false;
digitalWrite(RED_LED, LOW);
}
greenLedOn = !greenLedOn;
}
if (greenLedOn) {
digitalWrite(GREEN_LED, HIGH);
}
if (!greenLedOn) {
digitalWrite(GREEN_LED, LOW);
}
}
}
void Task2(void *pvParameters) {
while(1) {
if (digitalRead(DECREASE_BUTTON) == LOW) {
while (digitalRead(DECREASE_BUTTON) == LOW){}
if (redLedTime > 100) {
redLedTime -= 100;
lcd.clear();
}
}
if (digitalRead(INCREASE_BUTTON) == LOW) {
while (digitalRead(INCREASE_BUTTON) == LOW){}
if (redLedTime < 100000) {
redLedTime += 100;
lcd.clear();
}
}
if (!greenLedOn) {
if (millis() - redLedStartTime > redLedTime) {
if (redLedOn) {
digitalWrite(RED_LED, LOW);
redLedOn = false;
} else {
digitalWrite(RED_LED, HIGH);
redLedOn = true;
redLedRecurrence++;
}
redLedStartTime = millis();
}
}
}
}
void Task3(void *pvParameters) {
while(1) {
lcd.setCursor(0,0);
lcd.print("Green ");
lcd.print(greenLedOn ? "ON " : "OFF");
lcd.setCursor(0,1);
lcd.print("Red ");
lcd.print(redLedOn ? "ON " : "OFF");
lcd.print(" ");
lcd.print(redLedRecurrence);
lcd.print(" ");
lcd.print(redLedTime);
}
}
int neoStartTime = 0;
int neoTime = 100;
int neoR = 255;
int neoG = 0;
int neoB = 255;
int neoPixel = 0;
void Task4(void *pvParameters) {
while(1) {
if (millis() - neoStartTime > neoTime) {
if (neoPixel >= NEO_SIZE) {
neoPixel = 0;
if (neoG == 0) {
neoG = 255;
} else {
neoG = 0;
}
}
strip.setPixelColor(neoPixel, strip.Color(neoR, neoG, neoB));
strip.show();
neoPixel++;
neoStartTime = millis();
}
}
}