#include <Arduino_FreeRTOS.h>
//#include <timers.h>
void TaskBlink(void *pvParameters);
void TaskTimer(void *pvParameters);
void TaskEnc(void *pvParameters);
long SEC;
enum Timers {start, t1, t2, t3, tA, tR}; int Timers = start;
enum regim {choiceTimers, choiceTime}; int regim = choiceTimers;
struct prTimers {
int number;
String nameTimers;
int time;
};
int dataTimers[9][8] = { // массив кол-во таймеров/кол-во св-в таймеров 0флаг_запуска_таймера,1время,2buz,3dur,4остаток_времени,*,*,*
{0, 5, 1, 1000, 5, 0x0, 0x0, 0xD}, // t1
{0, 10, 2, 1000, 10, 0x0, 0x0, 0x99}, // t2
{0, 20, 3, 1000, 20, 0x0, 0x0, 0x75}, // t3
{0, 30, 5, 500, 30, 0x0, 0x0, 0x83}, // (A)втолиз
{0, 150, 10, 500, 150, 0x0, 0x0, 0x20}, // (Р)асстойка
{0, 180, 10, 500, 180, 0x0, 0x0, 0x9A}, // доп
{0x28, 0xBF, 0xEC, 0xFB, 0x5, 0x0, 0x0, 0x16}, // датчик 0
{0x28, 0xBF, 0xEC, 0xFB, 0x5, 0x0, 0x0, 0x16}, // датчик 1
{0x28, 0xFF, 0xB2, 0x9A, 0x68, 0x18, 0x3, 0x86}, // датчик на макетке.
};
#define pinBuzz 5
#define CLK_tm 6
#define DIO_tm 7
#include "GyverTM1637.h"
GyverTM1637 disp(CLK_tm, DIO_tm);
#include <EncButton.h>
EncButton<EB_TICK, 9, 8, 10> enc; // (DT, CLK, SW) энкодер с кнопкой <A, B, KEY>
TaskHandle_t xHandle;
//TimerHandle_t mTimer;
void setup() {
pinMode(pinBuzz, OUTPUT);
Serial.begin(9600);
disp.clear();
disp.brightness(7); // яркость, 0 - 7 (минимум - максимум)
xTaskCreate(TaskEnc, "TaskEnc", 128, NULL, 1, NULL);
xTaskCreate(TaskBlink, "Blink", 128, NULL, 1, NULL);
xTaskCreate(TaskTimer, "Timer", 128, NULL, 1, &xHandle); // vTaskSuspend(xHandle); vTaskResume(xHandle);
}
void loop() {
// Empty. Things are done in Tasks.
}
void TaskTimer(void *pvParameters) // This is a task.
{
(void) pvParameters;
for (;;)
{
disp.clear(); //disp.displayInt(SEC); disp.displayByte(0, _P);
disp.displayInt(dataTimers[Timers][1]); //disp.displayByte(0, _P);
vTaskDelay(1000 / portTICK_PERIOD_MS); // one tick delay (15ms) in between reads for stability
//SEC--;
//if (SEC == 0) {
// enc.counter = 0; disp.displayInt(SEC); disp.displayByte(0, _P);
// Buzz(4, 300); Serial.println("timer_end");
//vTaskSuspend(xHandle);
//}
}
}
void TaskEnc(void *pvParameters) // This is a task.
{
(void) pvParameters;
for (;;)
{
enc.tick(); // опрос происходит здесь
// =============== ЭНКОДЕР ===============
// обычный поворот
if (enc.turn()) {
//Serial.println("turn");
// можно ещё:
Serial.println(enc.counter); // вывести счётчик
//Serial.println(enc.fast()); // проверить быстрый поворот
//Serial.println(enc.dir()); // вывести направление поворота
}
if (enc.turnH()) Serial.println("hold + turn"); // "нажатый поворот"
if (enc.left()) {
Serial.println("left"); // поворот налево
if (regim == choiceTime) {
dataTimers[Timers][1] = dataTimers[Timers][1] - enc.counter; enc.counter = 0;
if (dataTimers[Timers][1] < 0) dataTimers[Timers][1] = 0;
}
if (regim == choiceTimers) {
Timers--; if (Timers < 0) {
enc.counter = 0;
Timers = 0;
Serial.println(Timers);
}
}
}
if (enc.right()) {
if (regim == choiceTime) {
dataTimers[Timers][1] = dataTimers[Timers][1] + enc.counter; enc.counter = 0; //if (enc.counter < 0) enc.counter = 0;
}
if (regim == choiceTimers) {
Serial.println("right"); // поворот направо
Timers++; if (Timers > 5) {
enc.counter = 5;
Timers = 5;
Serial.println(Timers);
}
}
}
//if (enc.leftH()) Serial.println("leftH"); // нажатый поворот налево
//if (enc.rightH()) Serial.println("rightH"); // нажатый поворот направо
// =============== КНОПКА ===============
//if (enc.press()) Serial.println("press");
if (enc.click()) {
switch (regim) {
case choiceTimers:
break;
case choiceTime:
dataTimers[Timers][4] = dataTimers[Timers][1]; // установим остаток
if (dataTimers[Timers][0] == 0) dataTimers[Timers][0] = 1; //флаг запуска таймера
break;
}
regim = !regim; Serial.println(regim); Serial.println("click");
}
//if (enc.release()) Serial.println("release");
//if (enc.held()) Serial.println("held"); // однократно вернёт true при удержании
//if (enc.hold()) Serial.println("hold"); // будет постоянно возвращать true после удержания
//if (enc.step()) Serial.println("step"); // импульсное удержание
//if (enc.releaseStep()) Serial.println("release step"); // отпущена после импульсного удержания
// проверка на количество кликов
//if (enc.hasClicks(1)) Serial.println("action 1 clicks");
//if (enc.hasClicks(2)) Serial.println("action 2 clicks");
// вывести количество кликов
//if (enc.hasClicks()) {Serial.print("has clicks "); Serial.println(enc.clicks);}
vTaskDelay(5 / portTICK_PERIOD_MS); // one tick delay (5ms) in between reads for stability
}
}
void Buzz(byte n, int dur) {
for (int i = 0; i < n; i++) {
digitalWrite(pinBuzz, HIGH);
vTaskDelay(dur / portTICK_PERIOD_MS);
digitalWrite(pinBuzz, LOW);
vTaskDelay(dur / portTICK_PERIOD_MS);
}
}
void TaskBlink(void *pvParameters) { // This is a task.
(void) pvParameters;
pinMode(LED_BUILTIN, OUTPUT);
for (;;) // A Task shall never return or exit.
{
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
vTaskDelay(1000 / portTICK_PERIOD_MS); // wait for one second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
vTaskDelay(1000 / portTICK_PERIOD_MS); // wait for one second
}
}