#define BTN_PIN 3 // кнопка подключена сюда (BTN_PIN --- КНОПКА --- GND)
#define BTN_PIN1 2 // кнопка подключена сюда (BTN_PIN --- КНОПКА --- GND)
#include "GyverButton.h"
GButton butt1(BTN_PIN);
GButton butt2(BTN_PIN1);
const float BETA = 3950; // should match the Beta Coefficient of the thermistor
#include "GyverStepper2.h"
GStepper2< STEPPER4WIRE> stepper(2048, 8, 6, 9, 5);
#include <Beeper.h>
Beeper buz(A5);
bool dir = 1;
bool fan = false;
bool flag = false;
bool rel1 = false;
bool rel2 = false;
bool temp = false;
bool rezhim = false;
int dec_digits [10] {1,79,18,6,76,36,32,15,0,4};
unsigned char binary_pattern[] = {
0b11110000, //0 "t."
0b00111000, //1 - F.
01101110, //2 "H"
0b01111111 //3 .
};
uint32_t tmr, tmr2, timer;
int period;
//Pin connected to ST_CP of 74HC595
int STCP_pin = 4;
//Pin connected to SH_CP of 74HC595
int SHCP_pin = 12;
//Pin connected to DS of 74HC595
int DS_pin = 11;
//------------------------------------
void digit_dot(){
digitalWrite(7, HIGH);
digitalWrite(STCP_pin,LOW);
shiftOut(DS_pin, SHCP_pin, LSBFIRST,binary_pattern[3]);
digitalWrite(STCP_pin, HIGH);
}
void digit_t(){
digitalWrite(7, HIGH);
digitalWrite(STCP_pin,LOW);
shiftOut(DS_pin, SHCP_pin, LSBFIRST,binary_pattern[0]);
digitalWrite(STCP_pin, HIGH);
}
void digit_F(){
digitalWrite(7, HIGH);
digitalWrite(STCP_pin,LOW);
shiftOut(DS_pin, SHCP_pin, LSBFIRST,binary_pattern[1]);
digitalWrite(STCP_pin, HIGH);
}
void digitoff(){
digitalWrite(7, LOW);
}
void digit0(){
digitalWrite(7, HIGH);
digitalWrite(STCP_pin,LOW);
shiftOut(DS_pin, SHCP_pin, LSBFIRST,dec_digits[0]);
digitalWrite(STCP_pin, HIGH);
}
void digit1(){
digitalWrite(7, HIGH);
digitalWrite(STCP_pin,LOW);
shiftOut(DS_pin, SHCP_pin, LSBFIRST,dec_digits[1]);
digitalWrite(STCP_pin, HIGH);
}
void digit2(){
digitalWrite(7, HIGH);
digitalWrite(STCP_pin,LOW);
shiftOut(DS_pin, SHCP_pin, LSBFIRST,dec_digits[2]);
digitalWrite(STCP_pin, HIGH);
}
void digit3(){
digitalWrite(7, HIGH);
digitalWrite(STCP_pin,LOW);
shiftOut(DS_pin, SHCP_pin, LSBFIRST,dec_digits[3]);
digitalWrite(STCP_pin, HIGH);
}
void digit4(){
digitalWrite(7, HIGH);
digitalWrite(STCP_pin,LOW);
shiftOut(DS_pin, SHCP_pin, LSBFIRST,dec_digits[4]);
digitalWrite(STCP_pin, HIGH);
}
void OFF(){
timer = millis();
period = 15000; //15000
}
//------------------------------------
void setup() {
Serial.begin(9600);
Serial.setTimeout(50);
stepper.setMaxSpeed(50); // скорость движения к цели
stepper.setAcceleration(50); // ускорение
//stepper.setTarget(50); // цель
attachInterrupt(1, isr, CHANGE);
attachInterrupt(0, isr, CHANGE);
butt1.setDebounce(40); // настройка антидребезга (по умолчанию 80 мс)
butt1.setTimeout(1500); // настройка таймаута на удержание (по умолчанию 500 мс)
butt2.setDebounce(40); // настройка антидребезга (по умолчанию 80 мс)
butt2.setTimeout(1500); // настройка таймаута на удержание (по умолчанию 500 мс)
// buz.beepNote(NOTE_GB, 3, 100, 100);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT); // D6 как выход
pinMode(7,OUTPUT); // D7 как выход MR shift register
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(A1, OUTPUT); // A1 как выход (Nano/UNO)
pinMode(A2, OUTPUT); // A2 как выход
pinMode(A3, OUTPUT); // A3 как выход
pinMode(A4, OUTPUT); // A4 как выход
pinMode(A5, OUTPUT); // A5 как выход
// set the 74HC595 Control pin as output
pinMode(DS_pin, OUTPUT);
pinMode(STCP_pin, OUTPUT);
pinMode(SHCP_pin, OUTPUT);
digitalWrite(A1, LOW); // nizkiy сигнал на Fan
digitalWrite(A2, LOW); // nizkiy сигнал на rele1
digitalWrite(A3, LOW); // nizkiy сигнал на rele2
digitalWrite(A5, LOW); // nizkiy сигнал на buzzer
digitalWrite(7, LOW); //выход MR shift register
//------------------------------------Vyvod v port Opciy upravlenija
Serial.println(F("Option Knob's:"));
Serial.println(F("1Click -FAN"));
Serial.println(F("2Click's-Fan 1Heat"));
Serial.println(F("3Click's-Fan 2Heat"));
Serial.println(F("4Click's-Fan 2Heat & Swing"));
Serial.println(F("Hold-All is Off"));
Serial.println(F("Option Serial:"));
Serial.println(F("1-Fan Only"));
Serial.println(F("2-Fan 1Heat"));
Serial.println(F("3-Fan 2Heat"));
Serial.println(F("4-Fan 2Heat & Swing"));
Serial.println(F("6-All is Off"));
Serial.println(F("5-Temp once in minute On"));
Serial.println(F("50-Temp once in minute Off"));
Serial.println(F("8-Temp once in 30 minute On"));
Serial.println(F("80-Temp once in 30 minute Off"));
}
void isr() { // опрашиваем в прерывании, чтобы поймать нажатие в любом случае
butt1.tick();
butt2.tick();
}
void loop() {
stepper.tick(); // мотор асинхронно крутится тут
butt1.tick(); // опрашиваем в скетче, иначе не будут работать проверки по времени!
butt2.tick();
buz.tick();
//----------------------------------
if (Serial.available()) {
int val = Serial.parseInt();
switch (val){
case 1: //Ventilator
digit_F();
buz.beep(US_B3, 1, 100);
fan = true;
rel1 = false;
rel2 = false;
flag = false;
stepper.setTarget(50);
Serial.println(F("FAN"));
break;
case 2: //Ventilator i 1ten
digit1();
buz.beep(US_B3, 1, 150);
fan = true;
rel1 = true;
rel2 = false;
flag = false;
stepper.setTarget(50);
Serial.println(F("FAN 1Heat"));
break;
case 3: //Ventilator i 2tena
digit2();
buz.beep(US_B3, 2, 100, 200);
fan = true;
rel1 = true;
rel2 = true;
flag = false;
stepper.setTarget(50);
Serial.println(F("FAN 2Heat"));
break;
case 4: //Ventilator oba tena i swing
digit3();
buz.beep(US_B3, 03, 100, 200);
fan = true;
rel1 = true;
rel2 = true;
flag = true;
stepper.setTarget(50);
Serial.println(F("FAN 2Heat Swing"));
break;
case 5: // Temp is ON
digit_dot();
temp=true;
Serial.println(F("Temp is ON"));
break;
case 50: // Temp is off
digitoff();
temp=false;
Serial.println(F("Temp is OFF"));
break;
case 6: // Otkluchenie vsego
digitoff();
buz.beep(US_B4, 1, 300);
OFF();
rel1 = false;
rel2 = false;
flag = false;
break;
case 7: // задача 7
digit4();
buz.beep(US_B3, 4, 60, 200);
Serial.println(val);
break;
case 8: // Rezhim is ON
rezhim=true;
Serial.println(F("Rezhim30 is ON"));
break;
case 80: // Rezhim is off
rezhim=false;
Serial.println(F("Rezhim30 is OFF"));
break;
}
}
//--------------------------------------
if (butt1.hasClicks()) {
switch (butt1.getClicks()) {
case 0: // задача 0
break;
case 1: //Ventilator
digit_F();
buz.beep(US_B4, 1, 50);
fan = true;
rel1 = false;
rel2 = false;
flag = false;
stepper.setTarget(50);
Serial.println(F("FAN"));
break;
case 2: //Ventilator i 1ten
digit1();
buz.beep(US_B4, 1, 100);
fan = true;
rel1 = true;
rel2 = false;
flag = false;
stepper.setTarget(50);
Serial.println(F("FAN 1 Heat"));
break;
case 3: //Ventilator i 2tena
digit2();
buz.beep(US_B3, 2, 100, 200);
fan = true;
rel1 = true;
rel2 = true;
flag = false;
stepper.setTarget(50);
Serial.println(F("FAN 2 Heat"));
break;
case 4: //Ventilator oba tena i swing
digit3();
buz.beep(US_B3, 03, 100, 200);
fan = true;
rel1 = true;
rel2 = true;
flag = true;
stepper.setTarget(50);
Serial.println(F("FAN 2 Heat Swing"));
//Serial.println(butt1.getClicks()); // и вывести число нажатий
break;
case 5: // задача 4
digit4();
//Serial.println(butt1.getClicks()); // вывести число нажатий
break;
}
}
//---------------------------------------
if (butt2.hasClicks()) {
switch (butt2.getClicks()) {
case 0: // задача 0
break;
case 1: //
period = 610000; // 600000 10 minut
timer = millis();
Serial.println(butt2.getClicks()); // вывести число нажатий
break;
case 2: //
period = 900000; //900000 15 minut
timer = millis();
Serial.println(butt2.getClicks()); // вывести число нажатий
break;
case 3: //
period = 1200000; // 1200000 20 minut
timer = millis();
Serial.println(butt2.getClicks()); // вывести число нажатий
break;
case 4: //
period = 1800000; //1800000 30 minut
timer = millis();
Serial.println(butt2.getClicks()); // и вывести число нажатий
break;
}
}
//----------------------------------
if (butt1.isHolded()) { // проверка на удержание
digitoff();
buz.beep(US_B3, 1, 300);
OFF();
rel1 = false;
rel2 = false;
flag = false;
}
if (butt2.isHolded()) {
period = 0;
Serial.println(F("Timer is OFF"));
}
if(fan){
digitalWrite(A1, HIGH); // высокий сигнал на FAN
} else digitalWrite(A1, LOW); // LOW сигнал на FAN
if (rel1){
digitalWrite(A2, HIGH); // высокий сигнал на TEN_1
} else digitalWrite(A2, LOW); // LOW сигнал на TEN_1
if (rel2){
digitalWrite(A3, HIGH); // высокий сигнал на TEN_2
} else digitalWrite(A3, LOW); // LOW сигнал на TEN_2
if (flag){ //zapusk kachanija zaslonki
if (stepper.ready()) { // если приехали
dir = !dir; // разворачиваем
stepper.setTarget(dir * 40); // едем в другую сторону
}
}
if (temp && (millis() - tmr >= 60000)){ // kazhduyu minutu
int Value = analogRead(A0);
float celsius = 1 / (log(1 / (1023. / Value - 1)) / BETA + 1.0 / 298.15) - 273.15;
Serial.print(F("Temp: "));
Serial.println(celsius,1);
digit_t();
tmr = millis();
digitoff();
digit_dot();
}
if (rezhim && (millis() - tmr2 >= 1800000)){ // kazhdye 30 minut
int Value = analogRead(A0);
float celsius = 1 / (log(1 / (1023. / Value - 1)) / BETA + 1.0 / 298.15) - 273.15;
Serial.print(F("Temp: "));
Serial.println(celsius,1);
tmr2 = millis();
}
if (period && millis() - timer >= period) { //Для перезапуска такого таймера нужно задать период period ненулевым числом и сбросить таймер timer = millis().
period = 0; // остановить
digitoff();
buz.beep(US_B2, 1, 300);
fan = false;
rel1 = false;
rel2 = false;
flag = false;
stepper.setTarget(0);
Serial.println(F("OFF"));
}
/*
//-----------------------асинхронный вывод в порт
static uint32_t tmr;
if (millis() - tmr >= 30) {
tmr = millis();
Serial.println(stepper.pos);
}
*/
//--------------------------------------------
//if (butt1.isHold()) Serial.println("Hold"); // возвращает состояние кнопки
//if (butt1.isClick()) //Serial.println("Click"); // проверка на один клик
//if (butt1.isSingle()) Serial.println("Single"); // проверка на один клик
//if (butt1.isDouble()) Serial.println("Double"); // проверка на двойной клик
//if (butt1.isTriple()) Serial.println("Triple"); // проверка на тройной клик
//if (butt1.isPress()) Serial.println("Press"); // нажатие на кнопку (+ дебаунс)
//if (butt1.isRelease()) Serial.println("Release"); // отпускание кнопки (+ дебаунс)
//--------------------------------
}