#include "Parser.h" // библиотека парсера
#include "AsyncStream.h" // асинхронное чтение сериал
AsyncStream<50> serial(&Serial, ';'); // указываем обработчик и стоп символ
#include <Wire.h>
#include "PCF8575.h"
PCF8575 expander20;
PCF8575 expander21;
boolean f0 = 1;
boolean f1 = 1;
boolean f2 = 1;
boolean f3 = 1;
boolean f4 = 1;
boolean f5 = 1;
boolean f6 = 1;
boolean f7 = 1;
boolean f8 = 1;
boolean f9 = 1;
boolean f10 = 1;
boolean f11 = 1;
boolean f12 = 1; //флаги еспандеров
boolean f13 = 1;
boolean f14 = 1;
boolean f15 = 1;
boolean f16 = 1;
boolean f17 = 1;
boolean f18 = 1;
boolean f19 = 1;
boolean f20 = 1;
boolean f_vk1 = false;
boolean f_vk2 = false;
boolean f_vk3 = false;
boolean f_vk4 = false;
boolean f_vk5 = false;
boolean f_vk6 = false;
boolean f_vk7 = false;
boolean f_vk8 = false;
boolean f_vk9 = false;
boolean f_vk10 = false;
boolean f_vk11 = false;
boolean f_vk12 = false; //флаги ВКЛючения функций (FNK)
boolean f_vk13 = false;
boolean f_vk14 = false;
boolean f_vk15 = false;
boolean f_vk16 = false;
boolean f_otk1 = false;
boolean f_otk2 = false;
boolean f_otk3 = false;
boolean f_otk4 = false;
boolean f_otk5 = false;
boolean f_otk6 = false;
boolean f_otk7 = false;
boolean f_otk8 = false;
boolean f_otk9 = false;
boolean f_otk10 = false;
boolean f_otk11 = false;
boolean f_otk12 = false; //флаги ВЫКЛлючения функций (FNK)
boolean f_otk13 = false;
boolean f_otk14 = false;
boolean f_otk15 = false;
boolean f_otk16 = false;
unsigned long t2 ; //переменная таймера
unsigned long t1 ; //переменная таймера
int St_Kin1 = 0;
int St_Kin2 = 0;
int St_Kin3 = 0;
int St_Kin4 = 0;
int St_Kin5 = 0;
int St_Kin6 = 0; //состояние концевиков
int St_Kin7 = 0;
int St_Kin8 = 0;
int St_Kin9 = 0;
int St_Kin10 = 0;
int St_Kin11 = 0;
int St_Kin12 = 0;
int St_Kin13 = 0;
int St_Kin14 = 0;
int St_Kin15 = 0;
int St_Kin16 = 0;
int FUNK1 = 0;
int FUNK2 = 0;
int FUNK3 = 0;
int FUNK4 = 0;
int FUNK5 = 0;
int FUNK6 = 0;
int FUNK7 = 0;
int FUNK8 = 0;
int FUNK9 = 0;
int FUNK10 = 0;
int FUNK11 = 0;
int FUNK12 = 0;
int FUNK13 = 0;
int FUNK14 = 0;
int FUNK15 = 0;
int FUNK16 = 0;
void setup() {
Serial.begin(9600);
expander20.begin(0x20);
expander21.begin(0x21);
expander20.pinMode(0, OUTPUT);
expander20.pinMode(1, OUTPUT);
expander20.pinMode(2, OUTPUT);
expander20.pinMode(3, OUTPUT);
expander20.pinMode(4, OUTPUT);
expander20.pinMode(5, OUTPUT);
expander20.pinMode(6, OUTPUT);
expander20.pinMode(7, OUTPUT);
expander20.pinMode(8, OUTPUT);
expander20.pinMode(9, OUTPUT);
expander20.pinMode(10, OUTPUT);
expander20.pinMode(11, OUTPUT);
expander20.pinMode(12, OUTPUT);
expander20.pinMode(13, OUTPUT);
expander20.pinMode(14, OUTPUT);
expander20.pinMode(15, OUTPUT);
expander21.pinMode(0, INPUT_PULLUP);
expander21.pinMode(1, INPUT_PULLUP);
expander21.pinMode(2, INPUT_PULLUP);
expander21.pinMode(3, INPUT_PULLUP);
expander21.pinMode(4, INPUT_PULLUP);
expander21.pinMode(5, INPUT_PULLUP);
expander21.pinMode(6, INPUT_PULLUP);
expander21.pinMode(7, INPUT_PULLUP);
expander21.pinMode(8, INPUT_PULLUP);
expander21.pinMode(9, INPUT_PULLUP);
expander21.pinMode(10, INPUT_PULLUP);
expander21.pinMode(11, INPUT_PULLUP);
expander21.pinMode(12, INPUT_PULLUP);
expander21.pinMode(13, INPUT_PULLUP);
expander21.pinMode(14, INPUT_PULLUP);
expander21.pinMode(15, INPUT_PULLUP);
}
void loop() {
parsing();
St_Kin1 = expander21.digitalRead(0);
St_Kin2 = expander21.digitalRead(1);
St_Kin3 = expander21.digitalRead(2);
St_Kin4 = expander21.digitalRead(3);
St_Kin5 = expander21.digitalRead(4);
St_Kin6 = expander21.digitalRead(5);
St_Kin7 = expander21.digitalRead(6);
St_Kin8 = expander21.digitalRead(7);
St_Kin9 = expander21.digitalRead(8);
St_Kin10 = expander21.digitalRead(9);
St_Kin11 = expander21.digitalRead(10);
St_Kin12 = expander21.digitalRead(11);
St_Kin13 = expander21.digitalRead(12);
St_Kin14 = expander21.digitalRead(13);
St_Kin15 = expander21.digitalRead(14);
St_Kin16 = expander21.digitalRead(15);
expander20.digitalWrite(0, f0);
expander20.digitalWrite(1, f1);
expander20.digitalWrite(2, f2);
expander20.digitalWrite(3, f3);
expander20.digitalWrite(4, f4);
expander20.digitalWrite(5, f5);
expander20.digitalWrite(6, f6);
expander20.digitalWrite(7, f7);
expander20.digitalWrite(8, f8);
expander20.digitalWrite(9, f9);
expander20.digitalWrite(10, f10);
expander20.digitalWrite(11, f11);
expander20.digitalWrite(12, f12);
expander20.digitalWrite(13, f13);
expander20.digitalWrite(14, f14);
expander20.digitalWrite(15, f15);
//========================================================================== відправка стану кінцевиків
static uint32_t tmr = 0;
if (millis() - tmr > 500) { //отправка по таймеру
tmr = millis(); //отправка данных концевиков
int packet[12]; //количество в пакете !!!
packet[0] = !St_Kin1;
packet[1] = !St_Kin2;
packet[2] = !St_Kin3;
packet[3] = !St_Kin4;
packet[4] = !St_Kin5;
packet[5] = !St_Kin6;
packet[6] = !St_Kin7;
packet[7] = !St_Kin8;
packet[8] = !St_Kin9;
packet[9] = !St_Kin10;
packet[10] = !St_Kin11;
packet[11] = !St_Kin12;
sendPacket(0, packet, 12);
}
//=============================РАБОТА C ФУНКЦИЯМИ FUNK==================================================
if ( FUNK1 == 1 && f_vk1 == false) {
t1 = millis(); // Запишем время срабатывания в t1
f_vk1 = true; //устанавливаем флаг flag включения в true
}
if ( f_vk1 == true) //если флаг установлен то выполняем действия в скобках
{
FUNK1 = 2; // сброс FUNK1
if (millis() - t1 > 1000) { //если текущее время (-) время которое
f0 = 0; //запомнили с момента услов FUNK1 больше 1с
} // включаем реле1 (f0 = 0)
if (millis() - t1 > 2000) {
f9 = 0;
}
if (millis() - t1 > 6000) {
f10 = 0;
f_vk1 = false; //после запуска 3 реле сбрасываем флаг
}
}
if ( FUNK1 == 0 && f_otk1 == false ) {
t2 = millis(); // Запишем время срабатывания (FUNK1) в t1
f_otk1 = true; //устанавливаем флаг отключения f_otk1 в true
}
if ( f_otk1 == true) //если флаг установлен то выполняем действия в скобках
{
FUNK1 = 2; // сброс FUNK1
if (millis() - t2 > 1000) { //если текущее время (-) время которое
f0 = 1; //запомнили с момента услов FUNK1 больше 1с
} // отключаем реле1 (f0 = 1)
if (millis() - t2 > 2000) {
f9 = 1;
}
if (millis() - t2 > 6000) {
f10 = 1;
f_otk1 = false; //после отключения 3 реле сбрасываем флаг
}
}
// if (FUNK2 == 1 && St_Kin3 == 0 && St_Kin5 == 0 && St_Kin7 == 0 ){
// digitalWrite(8, 0);
// }
// if ( FUNK2 == 1) {
// f1 = 0;
// if (FUNK3 == 1 && St_Kin3 == 0 && St_Kin5 == 0 && St_Kin8 == 0 ){
// digitalWrite(8, 0);
// }
// }
// if ( FUNK2 == 0) {
// f1 = 1;
// }
// if ( FUNK3 == 1) {
// f2 = 0;
// // if (FUNK4 == 1 && St_Kin6 == 0 && St_Kin3 == 0 ){
// // digitalWrite(8, 0);
// // }
// }
// if ( FUNK3 == 0) {
// f2 = 1;
// }
// if ( FUNK4 == 1) {
// expander20.digitalWrite(3, LOW);
// // if (FUNK4 == 1 && St_Kin6 == 0 && St_Kin3 == 0 ){
// // digitalWrite(8, 0);
// // }
// }
// if ( FUNK5 == 1) {
// expander20.digitalWrite(4, LOW);
// // if (FUNK4 == 1 && St_Kin6 == 0 && St_Kin3 == 0 ){
// // digitalWrite(8, 0);
// // }
// }
// if ( FUNK6 == 1) {
// expander20.digitalWrite(5, LOW);
// // if (FUNK4 == 1 && St_Kin6 == 0 && St_Kin3 == 0 ){
// // digitalWrite(8, 0);
// // }
}
//===============================================================================
// функция для отправки пакета на ПК
void sendPacket(int key, int* data, int amount) {
Serial.print(key);
Serial.print(',');
for (int i = 0; i < amount; i++) {
Serial.print(data[i]);
if (i != amount - 1) Serial.print(',');
}
Serial.print('\n');
}
// функция парсинга, опрашивать в лупе
void parsing() {
if (serial.available()) {
Parser data(serial.buf, ','); // отдаём парсеру
int ints[30]; // массив для численных данных
data.parseInts(ints); // парсим в него
switch (ints[0]) { // свитч по ключу
case 0:
break;
case 1: FUNK1 = ints[1];
break;
case 2: FUNK2 = ints[1];
break;
case 3: FUNK3 = ints[1];
break;
case 4: FUNK4 = ints[1];
break;
case 5: FUNK5 = ints[1];
break;
case 6: FUNK6 = ints[1];
break;
}
}
}