#include <Arduino_FreeRTOS.h>
#include <MsTimer2.h>
#define CLOCK_PIN 5
#define LATCH_PIN 6
#define DATA_PIN 7
#define BUTTON_PIN 2
#define ANALOG_LIGHT_INPUT_PIN 5
#define DECITION_TIME 30000
#define WAIT_TIME 10000
#define CHANGE_TIME 2000
#define BLINKING_TIME 250
#define BLINKING_PATTERN 3
#define NIGHT_PATTERN 6
void trafic_task(void *p);
void serial_task(void *p);
void night_task(void *p);
void update_shift_register();
void blink();
TaskHandle_t trafic_task_Handler;
TaskHandle_t serial_task_Handler;
TaskHandle_t night_task_Handler;
bool state = false;
int led_pattern = 0;
byte leds[] = {
0b10001000,
0b01001000,
0b00101000,
0b00110000,
0b00100000,
0b00101000,
0b00100000,
0b00000000
};
void setup() {
Serial.begin(115200);
Serial.println("start");
pinMode(CLOCK_PIN, OUTPUT);
pinMode(LATCH_PIN, OUTPUT);
pinMode(DATA_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), blink, FALLING);
MsTimer2::set(DECITION_TIME, blink);
MsTimer2::start();
xTaskCreate(trafic_task, "trafic_task", 128, NULL, 1, &trafic_task_Handler);
xTaskCreate(serial_task, "serial_task", 128, NULL, 1, &serial_task_Handler);
xTaskCreate(night_task, "night_task", 128, NULL, 2, &night_task_Handler);
vTaskStartScheduler();
}
void loop() {
}
void trafic_task(void *p) {
int i;
update_shift_register();
while (1) {
if (state == true) {
MsTimer2::stop();
//delay(WAIT_TIME);
update_shift_register();
delay(CHANGE_TIME);
update_shift_register();
delay(CHANGE_TIME);
update_shift_register();
//delay(WAIT_TIME);
for (i = 0; i < 10; i++) {
led_pattern = BLINKING_PATTERN;
update_shift_register();
delay(BLINKING_TIME);
update_shift_register();
delay(BLINKING_TIME);
}
update_shift_register();
delay(CHANGE_TIME);
led_pattern = 0;
update_shift_register();
state = false;
MsTimer2::start();
}
delay(1);
}
}
void serial_task(void *p) {
char input;
while (1) {
if (state == false && Serial.available()) {
input = Serial.read();
if (input == 'B' || input == 'b' ) {
state = true;
}
Serial.flush();
}
delay(1);
}
}
void night_task(void *p) {
while(1) {
delay(DECITION_TIME);
if (state == false) {
while (analogRead(ANALOG_LIGHT_INPUT_PIN) < 30) {
led_pattern = NIGHT_PATTERN;
update_shift_register();
delay(CHANGE_TIME);
update_shift_register();
delay(CHANGE_TIME);
}
led_pattern = 0;
update_shift_register();
}
}
}
void update_shift_register() {
digitalWrite(LATCH_PIN, LOW);
shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, leds[led_pattern]);
digitalWrite(LATCH_PIN, HIGH);
led_pattern++;
}
void blink() {
if (state == false) {
state = true;
}
}