#include "EncButton.h"
#include <WiFi.h> // esp32
#include <GyverNTP.h>
//назначение портов: 1 - большое окно, 2 - маленькое окно
//нагрузка
const int M1_Open = 5; // мотор 1 на открывание
const int M1_Close = 18; // мотор 1 на закрывание
const int M2_Open = 22; // мотор 2 на открывание
const int M2_Close = 23; // мотор 2 на закрывание
const int LIGHT = 2; // освещение трюмо
const int LIGHT_INFO = 12; // индикация хлопков
const int LED_BuiltIn = 2; // D2 встроенный светодиод
const int LED_OnBoard = 13; // D13 светодиод на плате
//датчики
//const int PIR = 4; // D4 датчик движения
//концевики и кнопка
const int T1_Open = 19; // концевик 1 штора открыта
const int T1_Close = 21; // концевик 1 штора закрыта
const int T2_Open = 26; // концевик 2 штора открыта
const int T2_Close = 27; // концевик 2 штора закрыта
const int BTN = 15; // кнопка управления
//порты не требуются в реальной конструкции
const int W1_Open = 25; // 1 штора открыта
const int W2_Open = 14; // 2 штора открыта
int morning_h = 9; //09:01:00 - открытие штор по расписанию
int evening_h = 21; //21:01:00 - закрытие штор по расписанию
int morning_m = 1; //минута чтобы не мешать курантам
int evening_m = 1; //минута чтобы не мешать курантам
int my_sec = 0;
int my_ms = 10;
bool sec_ms = false;
uint32_t alarm_t_1 = 1000000 ; //начальное максимальное время движения 1 шторы
uint32_t alarm_t_2 = 1000000 ; //начальное максимальное время движения 2 шторы
uint32_t t_vent = 0; //начальное время движения 1 шторы для проветривания
int i = 0;
int N_clicks = 0;
String my_str = "";
uint32_t global_tmr, tmr_, tmr_blink;
Button butt1(BTN);
//********************************************************************
void setup() {
Serial.begin(115200);
pinMode (M1_Open, OUTPUT);
pinMode (M1_Close, OUTPUT);
pinMode (M2_Open, OUTPUT);
pinMode (M2_Close, OUTPUT);
pinMode (LIGHT, OUTPUT);
pinMode (LIGHT_INFO, OUTPUT);
pinMode (LED_BuiltIn, OUTPUT);
pinMode (LED_OnBoard, OUTPUT);
pinMode (W1_Open, OUTPUT);
pinMode (W2_Open, OUTPUT);
pinMode (T1_Open, INPUT_PULLUP);
pinMode (T1_Close, INPUT_PULLUP);
pinMode (T2_Open, INPUT_PULLUP);
pinMode (T2_Close, INPUT_PULLUP);
alarm_t_1 = calibr(1); //таймаут для 1 шторы
alarm_t_2 = calibr(2); //таймаут для 2 шторы
t_vent = (alarm_t_1 - 3000) / 3; //время на проветривание для 1 шторы
Serial.println(F("Начинаем... "));
}
//********************************************************************
void loop() {
if (millis() - global_tmr >= 10) { //главный такт цикла = 10 мс
global_tmr = millis();
work_button();
}
} //конец цикла loop
//********************************************************************
uint32_t calibr(int N_) { //возвращает таймаут для шторы
uint32_t alarm_t_i = motor(N_, 1, "В 0-ю позицию. "); //открываем, т.е. выводим окно в 0-ю позицию
alarm_t_i = motor(N_, 0, "Калибровка. "); //закрываем
uint32_t alarm_t_i_i = motor(N_, 1, "Калибровка. "); //открываем
uint32_t alarm_t_ = max(alarm_t_i, alarm_t_i_i) + 3000; //большее + 3 сек.
//Serial.print(alarm_t_i);
//Serial.print(",");
//Serial.print(alarm_t_i_i);
//Serial.print(",");
//Serial.println(alarm_t_);
return (alarm_t_);
}
//********************************************************************
void work_button() { //работа по кнопке
butt1.tick();// проверяем нажатие кнопки
if (butt1.hasClicks()) {
N_clicks = butt1.getClicks();
Serial.print(N_clicks);
Serial.println(" нажатия кнопки");
switch (N_clicks) {
case 1:
case 2: {
motor(N_clicks, -1, "Кнопка. "); //сделать наоборот с 1 или 2 шторой
}
break;
case 3: light(-1, "Кнопка. "); //сделать наоборот с подсветкой
break;
}
}
windows_check(); //показывает положение шторы на окне
} //конец работы по кнопке
//********************************************************************
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) {
Serial.print(str);
Serial.print("Изменить свет на ");
Serial.println(!digitalRead(LIGHT));
digitalWrite(LIGHT, !digitalRead(LIGHT));
}
}
//********************************************************************
uint32_t motor(int N_, int on_off, String str) { //возвращает время движения шторы t_
int8_t M_Open = 0; //любой мотор на открывание
int8_t M_Close = 0; //любой мотор на закрывание
int8_t T_Open = 0; //концевик штора открыта любого мотора
int8_t T_Close = 0; //концевик штора закрыта любого мотора
uint32_t alarm_t = 0; //таймаут для любого мотора
uint32_t alarm_t_i = 0; //таймаут для любого мотора
uint32_t t_ = 0; //время движения шторы
int8_t T_= 0; //рабочий концевик для текущего движения шторы
int8_t f_m = 0; //рабочий полюс мотора для текущего движения шторы
int8_t s_m = 0; //нерабочий полюс мотора для текущего движения шторы
String Direction = "";
if (N_ == 1) { //работаем с 1 мотором
M_Open = M1_Open;
M_Close = 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;
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;
Direction = "открывается";
}
if (on_off == 0) {
T_= T_Close;
f_m = M_Close;
s_m = M_Open;
Direction = "закрывается";
}
if (on_off == -1) {
if (!digitalRead(T_Open)) { //Если концевик штора открыта замкнут, нужно закрывать штору до замыкания концевика штора закрыта
T_= T_Close;
f_m = M_Close;
s_m = M_Open;
Direction = "закрывается";
}
if (!digitalRead(T_Close)) { //Если концевик штора закрыта замкнут, нужно открывать штору до замыкания концевика штора открыта
T_= T_Open;
f_m = M_Open;
s_m = M_Close;
Direction = "открывается";
}
//Если оба концевика замкнуты, то штора попытается открыться и моментально остановится. так как некуда
if (digitalRead(T_Open) && digitalRead(T_Close)) { //Если оба концевика свободны, нужно открывать штору до замыкания концевика штора открыта
T_= T_Open;
f_m = M_Open;
s_m = M_Close;
Direction = "открывается из среднего положения";
}
}
Serial.print(str);
Serial.print(N_);
Serial.println(" окно " + Direction);
digitalWrite(f_m, HIGH); //включили нужный полюс мотора для движения шторы
digitalWrite(s_m, LOW);
alarm_t_i = millis();
while (digitalRead(T_) && (millis() - alarm_t_i < alarm_t)) delay(20); //ожидание срабатывания концевика или таймаута движения
Serial.println("Стоп-машина!");
digitalWrite(f_m, LOW); //выключили нужный полюс мотора для движения шторы
t_ = millis() - alarm_t_i; //время движения шторы
//теперь откроем 1 штору на проветривание
if (N_ == 1 && !digitalRead(T1_Close) && str != "Калибровка. ") { //если 1 штора закрыта и не по причине калибровки, то открываем 1 окно для проветривания
delay(3000);
digitalWrite(M1_Open, HIGH);//включили 1 мотор для открытия шторы
digitalWrite(M1_Close, LOW);
alarm_t_i = millis();
while (digitalRead(T1_Open) && (millis() - alarm_t_i < t_vent)) delay(20); //ожидание времени движения или срабатывания концевика
Serial.println("Стоп на проветривание!");
digitalWrite(M1_Open, LOW); //выключили полюс на открытие мотора для движения шторы
}
return (t_); //открытие 1 окна на проветривание не учитывается
}
//_______________________________________________________
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 сек
}
}
//_______________________________________________________