#include "EncButton.h"
uint32_t alarm_t_1 = 5000 ; //реальное максимальное время движения 1 шторы 22 сек.
uint32_t alarm_t_2 = 5000 ; //реальное максимальное время движения 2 шторы 9 сек.
uint32_t alarm_t_i = 0 ; //прошедшее время движения штор
int i = 0;
int N_clicks = 0;
String my_str = "";
bool light_flag = false;
//назначение портов
//1 - большое окно, 2 - маленькое окно
//нагрузка
int BTN = 15; // кнопка управления
int LIGHT = 2; // освещение трюмо
int LIGHT_INFO = 12; // индикация хлопков
int M1_Open = 5; // мотор 1 на открывание
int M1_Close = 18; // мотор 1 на закрывание
int T1_Open = 19; // концевик 1 штора открыта
int T1_Close = 21; // концевик 1 штора закрыта
int M2_Open = 22; // мотор 2 на открывание
int M2_Close = 23; // мотор 2 на закрывание
int T2_Open = 26; // концевик 2 штора открыта
int T2_Close = 27; // концевик 2 штора закрыта
//порты не требуются в реальной конструкции
int W1_Open = 25; // 1 штора открыта
int W2_Open = 14; // 2 штора открыта
//устанавливаем настройки формирования ШИМ
const int freq = 30000;
const int resolution = 8; //интервал ШИМ 0...255
const int Channel_M1_Open = 0; //каналы ШИМ
const int Channel_M1_Close = 1;
const int Channel_M2_Open = 2;
const int Channel_M2_Close = 3;
Button butt1(BTN);
void setup() {
pinMode (M1_Open, OUTPUT);
pinMode (M1_Close, OUTPUT);
pinMode (T1_Open, INPUT_PULLUP);
pinMode (T1_Close, INPUT_PULLUP);
pinMode (W1_Open, OUTPUT);
pinMode (M2_Open, OUTPUT);
pinMode (M2_Close, OUTPUT);
pinMode (T2_Open, INPUT_PULLUP);
pinMode (T2_Close, INPUT_PULLUP);
pinMode (W2_Open, OUTPUT);
pinMode (LIGHT_INFO, OUTPUT);
pinMode (LIGHT, OUTPUT);
digitalWrite (LIGHT_INFO, 0); //выключили лампочку
digitalWrite (LIGHT, 0); //выключили лампочку
//определяем каналы ШИМ в соответствии с настройками
ledcSetup(Channel_M1_Open, freq, resolution);
ledcSetup(Channel_M1_Close, freq, resolution);
ledcSetup(Channel_M2_Open, freq, resolution);
ledcSetup(Channel_M2_Close, freq, resolution);
//назначаем ПИН и канал для формирования ШИМ
ledcAttachPin(M1_Open, Channel_M1_Open);
ledcAttachPin(M1_Close, Channel_M1_Close);
ledcAttachPin(M2_Open, Channel_M2_Open);
ledcAttachPin(M2_Close, Channel_M2_Close);
Serial.begin(115200);
}
void loop() {
//работа по кнопке______________________________________________________
butt1.tick(); // проверяем нажатие кнопки
if (butt1.hasClicks()) {
if (butt1.hasClicks(1)) {
my_blink(1);
motor(1, -1, "Кнопка. "); //сделать наоборот с 1 шторой
}
if (butt1.hasClicks(2)) {
my_blink(2);
motor(2, -1, "Кнопка. "); //сделать наоборот со 2 шторой
}
Serial.print(butt1.getClicks());
Serial.println(" нажатия");
}
//конец работы по кнопке________________________________________________
windows_check(); //показывает положение шторы на окне
} //конец цикла loop
//_______________________________________________________
void light(int on_off, String str) {
if (on_off == 1) digitalWrite(LIGHT, HIGH);
if (on_off == 0) digitalWrite(LIGHT, LOW);
if (on_off == -1) {
light_flag = !light_flag;
Serial.print(str);
Serial.print("Изменить свет на ");
Serial.println(light_flag);
digitalWrite(LIGHT, light_flag);
}
}
//_______________________________________________________
void motor(int N_, int on_off, String str) {
//int8_t M_Open = 0; // любой мотор на открывание
//int8_t M_Close = 0; // любой мотор на закрывание
uint32_t alarm_t = 0; // таймаут для любого мотора
int T_Open, T_Close; // концевики штора открыта/закрыта любого мотора
int t, Channel_forward, Channel_stop, Channel_Open, Channel_Close;
String Direction = "";
if (N_ == 1) { //работаем с 1 мотором
//M_Open = M1_Open;
//M_Close = M1_Close;
Channel_Open = Channel_M1_Open;
Channel_Close = Channel_M1_Close;
T_Open = T1_Open;
T_Close = T1_Close;
alarm_t = alarm_t_1;
}
if (N_ == 2) { //работаем со 2 мотором
//M_Open = M2_Open;
//M_Close = M2_Close;
Channel_Open = Channel_M2_Open;
Channel_Close = Channel_M2_Close;
T_Open = T2_Open;
T_Close = T2_Close;
alarm_t = alarm_t_2;
}
if (on_off == 1) {
t = T_Open;
//f_m = M_Open;
//s_m = M_Close;
Channel_forward = Channel_Open;
Channel_stop = Channel_Close;
Direction = "открывается";
}
if (on_off == 0) {
t = T_Close;
//f_m = M_Close;
//s_m = M_Open;
Channel_forward = Channel_Close;
Channel_stop = Channel_Open;
Direction = "закрывается";
}
if (on_off == -1) {
if (!digitalRead(T_Open)) { //Если концевик штора открыта замкнут, нужно закрывать штору до замыкания концевика штора закрыта
t = T_Close;
//f_m = M_Close;
//s_m = M_Open;
Channel_forward = Channel_Close;
Channel_stop = Channel_Open;
Direction = "закрывается";
}
if (!digitalRead(T_Close)) { //Если концевик штора закрыта замкнут, нужно открывать штору до замыкания концевика штора открыта
t = T_Open;
//f_m = M_Open;
//s_m = M_Close;
Channel_forward = Channel_Open;
Channel_stop = Channel_Close;
Direction = "открывается";
}
//Если оба концевика замкнуты, то штора попытается открыться и моментально остановится. так как некуда
if (digitalRead(T_Open) && digitalRead(T_Close)) { //Если оба концевика свободны, нужно открывать штору до замыкания концевика штора открыта
t = T_Open;
//f_m = M_Open;
//s_m = M_Close;
Channel_forward = Channel_Open;
Channel_stop = Channel_Close;
Direction = "открывается из среднего положения";
}
}
Serial.print(str);
Serial.print(N_);
Serial.println(" окно " + Direction);
//digitalWrite(f_m, HIGH); //включили нужный мотор для движения шторы
//digitalWrite(s_m, LOW);
ledcWrite(Channel_forward, 20); //ШИМ из возможных 256
ledcWrite(Channel_stop, 0);
alarm_t_i = millis();
while (digitalRead(t) && (millis() - alarm_t_i < alarm_t)) delay(20); //ожидание срабатывания концевика или таймаута движения
Serial.println("Стоп-машина!");
//digitalWrite(f_m, LOW); //выключили нужный мотор для движения шторы
ledcWrite(Channel_forward, 0);
ledcWrite(Channel_stop, 0);
}
//_______________________________________________________
void windows_check() { //лампочки для текущего положения штор - горят - открыты
if (digitalRead(T1_Close) && !digitalRead(T1_Open)) digitalWrite(W1_Open, HIGH); //1 окно открыто
if (!digitalRead(T1_Close)) digitalWrite(W1_Open, LOW); //1 окно закрыто
if (digitalRead(T1_Close) && digitalRead(T1_Open)) digitalWrite(W1_Open, LOW); //1 окно в среднем поожении
if (digitalRead(T2_Close) && !digitalRead(T2_Open)) digitalWrite(W2_Open, HIGH); //2 окно открыто
if (!digitalRead(T2_Close)) digitalWrite(W2_Open, LOW); //2 окно закрыто
if (digitalRead(T2_Close) && digitalRead(T2_Open)) digitalWrite(W2_Open, LOW); //2 окно в среднем поожении
}
//_______________________________________________________
void my_blink(int N_) {
digitalWrite(LIGHT_INFO, 0); //выключили лампочку
digitalWrite(LIGHT, 0); //выключили освещение стенки
delay(500);
for (i = 0; i < N_ * 2; i++) { // счётчик от 0 до n_blinks * 2
digitalWrite(LIGHT_INFO, !digitalRead(LIGHT_INFO));
digitalWrite(LIGHT, !digitalRead(LIGHT));
delay(500); // 0,5 сек
}
}
//_______________________________________________________