#define FIRMWARE_VERSION 0.11
/////Управление движением/////
// =============================================================================
// НАСТРОЙКИ ПИНОВ МИКРОКОНТРОЛЛЕРА
// =============================================================================
enum Pins {
PIN_UNI1 = PA0, //управляющий пин/ пин светофора R1
PIN_UNI2 = PA1, //управляющий пин/ пин светофора Y1
PIN_UNI3 = PA2, //управляющий пин/ пин светофора G1
PIN_UNI4 = PA3, //управляющий пин/ пин светофора OUT1
PIN_UNI5 = PA4, //управляющий пин/ пин светофора R2
PIN_UNI6 = PA5, //управляющий пин/ пин светофора Y2
PIN_UNI7 = PA6, //управляющий пин/ пин светофора G2
PIN_UNI8 = PA7, //управляющий пин/ пин светофора OUT2
PIN_CP1_IR_IN = PB3, //КТ1 ИК приемник
PIN_CP1_IR_OUT = PB12, //КТ1 ИК передатчик
PIN_CP1_IR_PIT = PA9, //КТ1 ИК разрешение передачи
PIN_CP2_IR_IN = PB4, //КТ2 ИК приемник
PIN_CP2_IR_OUT = PB13, //КТ2 ИК передатчик
PIN_CP2_IR_PIT = PA10, //КТ2 ИК разрешение передачи
PIN_CP3_IR_IN = PB5, //КТ3 ИК приемник
PIN_CP3_IR_OUT = PB14, //КТ3 ИК передатчик
PIN_CP3_IR_PIT = PA11, //КТ3 ИК разрешение передачи
PIN_CP4_IR_IN = PB6, //КТ4 ИК приемник
PIN_CP4_IR_OUT = PB15, //КТ4 ИК передатчик
PIN_CP4_IR_PIT = PA12 //КТ4 ИК разрешение передачи
};
// =============================================================================
// КОМАНДЫ ИК-ПРОТОКОЛА
// =============================================================================
// enum IRCommands {
// CMD_QUERY_ID = 47, //передача ID на УУ
// CMD_CAR_TO_CAR = 33, //между машинками
// CMD_TRAFFIC_LIGHT = 55, //от светофора
// CMD_CALIBRATION = 0, //от прибора калибровки//2-BBK
// CMD_X1 = 12, //переключить стрелку//1
// CMD_X2 = 24, //переключить стрелку//2
// CMD_X3 = 94, //переключить стрелку//3
// CMD_AUTO_ARROW = 28, //автоматически выключает стрелки//5
// CMD_TEMP_STOP = 178, //временный стоп //ок
// CMD_SMOOTH_START = 208, //плавный старт //вверх
// // CMD_SMOOTH_STOP = 50, //плавный стоп //вниз
// // CMD_LOW_SPEED = 170, //низкая скорость //перемотка назад
// // CMD_NORMAL_SPEED = 42, //рабочая скорость //play
// // CMD_MAX_SPEED = 232, //максимальная скорость //перемотка вперед
// // CMD_STOP = 104, //стоп//stop
// // CMD_TURN_LEFT = 242, //левый поворотник//-vol
// // CMD_TURN_RIGHT = 144, //правый поворотник//+vol
// // CMD_POWER_OFF = 80, //выключить машинку//exit
// // CMD_SPEED_UP = 200, //увеличить скорость на 10//CH+
// // CMD_SPEED_DOWN = 72, //уменьшить скорость на 10//CH-
// // CMD_MANUAL_ON = 64, //ручной режим вкл //3
// // CMD_MANUAL_OFF = 96, //ручной режим выкл //6
// // CMD_REVERSE = 129, //задний ход //9
// // CMD_INFO = 136, // отправляет заряд ионистора//info
// // CMD_POWER_ON = 18, //сброс машинки, после выключения//0
// // ///калибровка--в машинке будут перемигиваться фары и поворотники--увеличение значений будет укзано миганиями
// // CMD_CALIB_MODE = 114, //калибровка//menu
// // CMD_CAL_VOLT_UP = 200, //в калибровке/увеличение напряжения для запуска//CH+
// // CMD_CAL_VOLT_DOWN = 72, //в калибровке/уменьшение напряжения для запуска//CH-
// // CMD_CAL_SPEED_UP = 208, //в калибровке//увеличить среднюю скорость машинки//вверх
// // CMD_CAL_SPEED_DOWN= 50, //в калибровке//уменьшить среднюю скорость машинки//вниз
// // CMD_CAL_ID_UP = 232, //в калибровке//увеличить адрес ID//перемотка вперед
// // CMD_CAL_ID_DOWN = 170, //в калибровке//уменьшить адрес ID//перемотка назад
// // CMD_CAL_TEST_LED = 98, //в калибровке//вкл-выкл тест сигнала//1
// // CMD_CAL_OK = 178, //в калибровке//подтвердить изменение//OK
// // CMD_CAL_RESET = 224 //в калибровке//Сброс настроек по умолчанию//5
// };
// =============================================================================
// НАСТРОЙКИ
// =============================================================================
#define DEBUG_ENABLE //Включение дебаг режима, закоментировать, если дебаг не нужен
uint8_t DEVICE_ID = 1; //адрес устройства по дефолту (1-255)
//Рабочие адреса
uint8_t CMD_QUERY_ID = 47; //прием адреса машинки\\47
uint8_t CMD_CAR_TO_CAR = 33; //между машинками
uint8_t CMD_TRAFFIC_LIGHT = 55; //адрес светофора
uint8_t CMD_CALIBRATION = 0; //адрес прибора калибровки//2-BBK
//Настройки светофора
uint8_t TF_ON = 0; //включение светофора 1-включен, 0-выключен
uint8_t SF_ON = 1; //полярность светофора, 0 - с общим GND, 1 - с общим плюсом
uint8_t SVT = 10; //задержка переключения светофора в сек
uint8_t MIG = 40; //скорость мигания светофора в мсек*10
uint8_t freq_sig = 400; //частота отправки сигнала в мсек*10
//Команды для светофора
uint8_t CMD_TEMP_STOP = 178; //временный стоп //ок
uint8_t CMD_SMOOTH_START = 208; //плавный старт //вверх
// =============================================================================
// CAN НАСТРОЙКИ
// =============================================================================
#define CAN_ID_BASE 0x100 // Базовый CAN ID
#define CAN_ID_PC_TO_DEVICE 0x200 // ID для команд от PC к устройству
#define CAN_ID_DEVICE_TO_PC 0x300 // ID для данных от устройства к PC
#define CAN_ID_DISCOVERY 0x100 // ID для обнаружения устройств
// =============================================================================
// БИБЛИОТЕКИ
// =============================================================================
#include "NecDecoder.h"
#include "NecEncoder.h"
#include <EEPROM.h>
NecDecoder CP1_ir_in;
NecDecoder CP2_ir_in;
NecDecoder CP3_ir_in;
NecDecoder CP4_ir_in;
NecEncoder CP1_IR_OUT(PIN_CP1_IR_OUT);
NecEncoder CP2_IR_OUT(PIN_CP2_IR_OUT);
NecEncoder CP3_IR_OUT(PIN_CP3_IR_OUT);
NecEncoder CP4_IR_OUT(PIN_CP4_IR_OUT);
NecEncoder IR1_OUT(PIN_UNI4);
NecEncoder IR2_OUT(PIN_UNI8);
#ifdef DEBUG_ENABLE
#define DEBUG(x) Serial.print(x)
#define DEBUGLN(x) Serial.println(x)
#else
#define DEBUG(x)
#define DEBUGLN(x)
#endif
enum Work_Mode {
MODE_MANUAL,
MODE_AUTOMATIC
};
Work_Mode mode;
// Состояние светофора
enum TrafficLightState {
TL_STATE_RED,
TL_STATE_RED_YELLOW,
TL_STATE_GREEN,
TL_STATE_GREEN_BLINK,
TL_STATE_YELLOW
};
TrafficLightState state;
uint8_t receiving_data[8] = {0}; //массив принимаемых данных
uint8_t temp_data[9] = {0}; //массив принимаемых данных
uint8_t send_data[8] = {0}; //массив отправляемых данных
bool automatic_arrow;
void ir1Isr() {
CP1_ir_in.tick();
}
void ir2Isr() {
CP2_ir_in.tick();
}
void ir3Isr() {
CP3_ir_in.tick();
}
void ir4Isr() {
CP4_ir_in.tick();
}
void initialize(){
DEBUGLN (F("SmartCars - UDM-KU"));
DEBUG (F("Версия ПО: ")); DEBUGLN (FIRMWARE_VERSION);
DEBUG(F("Board: STM32F103C8T6"));
DEBUG(F("F_CPU: ")); DEBUGLN(F_CPU);
if (EEPROM.read(132) == 30){ //проверяем, была ли калибровка
if (EEPROM.read(10) != 255) EEPROM.get(10, DEVICE_ID);
if (EEPROM.read(20) != 255) EEPROM.get(20, TF_ON);
if (TF_ON){
if (EEPROM.read(22) != 255) EEPROM.get(22, SF_ON);
if (EEPROM.read(24) != 255) EEPROM.get(24, SVT);
if (EEPROM.read(26) != 255) EEPROM.get(26, MIG);
if (EEPROM.read(28) != 255) EEPROM.get(28, freq_sig);
}
DEBUGLN (F("Данные считаны из памяти"));
} else DEBUGLN (F("!!!В ДЕМО режиме!!!"));
DEBUG (F("ID устройства: ")); DEBUGLN (DEVICE_ID);
DEBUG (F("Светофор: "));if (TF_ON){
DEBUGLN (F("включен"));
DEBUG (F("Полярность светофора: "));
if (SF_ON) DEBUGLN (F("плюс")); else DEBUGLN (F("GND"));
DEBUG (F("Задержка переключениия: ")); DEBUG (SVT); DEBUGLN (F(" сек."));
DEBUG (F("скорость мигания: ")); DEBUG (MIG*10); DEBUGLN (F(" милисек."));
DEBUG (F("скорость ИК сигнала: ")); DEBUG (freq_sig*10); DEBUGLN (F(" милисек."));
} else DEBUGLN (F("выключен"));
}
void setup() {
// // Отключаем JTAG для использования PB3, PB4, PB5
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
// GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); // Отключаем JTAG, оставляем SWD
// attachInterrupt(digitalPinToInterrupt(PIN_CP1_IR_IN), ir1Isr, FALLING); //автоопределение прерывания приемника
// attachInterrupt(digitalPinToInterrupt(PIN_CP2_IR_IN), ir2Isr, FALLING); //автоопределение прерывания приемника
// attachInterrupt(digitalPinToInterrupt(PIN_CP3_IR_IN), ir3Isr, FALLING); //автоопределение прерывания приемника
// attachInterrupt(digitalPinToInterrupt(PIN_CP4_IR_IN), ir4Isr, FALLING); //автоопределение прерывания приемника
attachInterrupt(PIN_CP1_IR_IN, ir1Isr, FALLING); //автоопределение прерывания приемника
attachInterrupt(PIN_CP2_IR_IN, ir2Isr, FALLING); //автоопределение прерывания приемника
attachInterrupt(PIN_CP3_IR_IN, ir3Isr, FALLING); //автоопределение прерывания приемника
attachInterrupt(PIN_CP4_IR_IN, ir4Isr, FALLING); //автоопределение прерывания приемника
pinMode(PIN_UNI1, OUTPUT);
pinMode(PIN_UNI2, OUTPUT);
pinMode(PIN_UNI3, OUTPUT);
pinMode(PIN_UNI4, OUTPUT);
pinMode(PIN_UNI5, OUTPUT);
pinMode(PIN_UNI6, OUTPUT);
pinMode(PIN_UNI7, OUTPUT);
pinMode(PIN_UNI8, OUTPUT);
pinMode(PIN_CP1_IR_OUT, OUTPUT);
pinMode(PIN_CP2_IR_OUT, OUTPUT);
pinMode(PIN_CP3_IR_OUT, OUTPUT);
pinMode(PIN_CP4_IR_OUT, OUTPUT);
pinMode(PIN_CP1_IR_PIT, OUTPUT);
pinMode(PIN_CP2_IR_PIT, OUTPUT);
pinMode(PIN_CP3_IR_PIT, OUTPUT);
pinMode(PIN_CP4_IR_PIT, OUTPUT);
digitalWrite(PIN_UNI1, LOW);
digitalWrite(PIN_CP1_IR_PIT, LOW); //разрешение ИК отправки
digitalWrite(PIN_CP2_IR_PIT, LOW);
digitalWrite(PIN_CP3_IR_PIT, LOW);
digitalWrite(PIN_CP4_IR_PIT, LOW);
#ifdef DEBUG_ENABLE
Serial.begin(9600); //115200 - 9600
#endif
initialize();
}
// void sendDeviceStatus() {
// uint8_t data[8] = {0};
// data[0] = DEVICE_ID; // ID устройства
// data[1] = x1 ? 1 : 0; // Состояние X1
// data[2] = x2 ? 1 : 0; // Состояние X2
// data[3] = x3 ? 1 : 0; // Состояние X3
// data[4] = automatic_arrow ? 1 : 0; // Автострелки
// data[5] = 0; // Резерв
// data[6] = 0; // Резерв
// data[7] = 0; // Резерв
// sendCAN_Message(CAN_ID_DEVICE_TO_PC + DEVICE_ID + 0x80, data, 8);
// }
// void sendDiscoveryResponse() {
// uint8_t data[8] = {0};
// data[0] = DEVICE_ID; // ID устройства
// data[1] = FIRMWARE_VERSION * 100; // Версия прошивки
// data[2] = 1; // Тип устройства (1=Управляющее)
// data[3] = 2; // Количество ИК приемников
// data[4] = 3; // Количество управляемых блоков
// data[5] = 0; // Резерв
// data[6] = 0; // Резерв
// data[7] = 0; // Резерв
// sendCAN_Message(CAN_ID_DISCOVERY + DEVICE_ID, data, 8);
// }
// void IR_send_id(){ // отправка ID при срабатывании Холла
// static unsigned long send_tmr2;
// digitalWrite(PIN_IR_ENABLE, HIGH); //отключение ИК приемника на время передачи
// if (millis() - send_tmr2 > 500) {
// irFront.send(CMD_QUERY_ID, carID);
// send_tmr2 = millis();
// digitalWrite(PIN_IR_ENABLE, LOW);
// }
// }
//мы принимаем пакет 1.1.101.69.10.0.5.1.56 - наш адрес, ИК передатчик, ИК адрес, ИК команда, стрелка Х1, Х2, Х3, служебный - 1 обычный прием, CRC
//data 15.1.103.69.1.0.0.1.56- номер принятого пакета, ИК передатчик 0-нет, ИК адрес, ИК команда, стрелка Х1, Х2, Х3, служебный, CRC
/*
1-15 - адрес устройства
2-1 - № передатчика
3-101 - адрес машинки
4-68 - команда для машинки
5-50 - стрелка Х1 в мс*100
6-0 - стрелка Х2 в мс*100
7-10 - стрелка Х3 в мс*100
8-1 - служебный, 1-выполнение, 5- узнать состояние, 99 - изменение настроек
9-111 - CRC вычисляется
*/
void Receive_data() {
if (Serial.available()) {
char buffer[32];
int len = Serial.readBytesUntil('\n', buffer, sizeof(buffer)-1);
buffer[len] = '\0';
int received_id, ir_num, ir_adr, ir_data, st_x1, st_x2, st_x3, service, rec_CRC;
unsigned int rec_num;
// Парсим 8 чисел
if (sscanf(buffer, "%d.%d.%d.%d.%d.%d.%d.%d.%d", &received_id, &ir_num, &ir_adr, &ir_data, &st_x1, &st_x2, &st_x3, &service, &rec_CRC) == 9) {
temp_data[0] = (uint8_t)received_id;//кому адресован пакет
temp_data[1] = (uint8_t)ir_num; //номер ИК передатчика
temp_data[2] = (uint8_t)ir_adr; //ИК адрес
temp_data[3] = (uint8_t)ir_data; //ИК команда
temp_data[4] = (uint8_t)st_x1; //Стрелка 1
temp_data[5] = (uint8_t)st_x2; //Стрелка 1
temp_data[6] = (uint8_t)st_x3; //Стрелка 1
temp_data[7] = (uint8_t)service; //Сервисный
temp_data[8] = (uint8_t)rec_CRC; //CRC
// При проверке пакета:
uint8_t check_crc = 0;
for (int i = 0; i < 7; i++) {
check_crc ^= temp_data[i];
}
if (check_crc == temp_data[8]) DEBUG (F("Принят пакет - "));
else DEBUG (F("CRC не совпадает - "));
DEBUGLN (buffer);
// Проверяем ID устройства
if (temp_data[0] == DEVICE_ID) {
if (service == 1){
rec_num++;
// Пакет для нас - обрабатываем
receiving_data[0] = (uint8_t)rec_num; //номер принятого пакета
receiving_data[1] = temp_data[1]; //номер ИК передатчика
receiving_data[2] = temp_data[2]; //ИК адрес
receiving_data[3] = temp_data[3]; //ИК команда
receiving_data[4] = temp_data[4]; //Стрелка 1
receiving_data[5] = temp_data[5]; //Стрелка 1
receiving_data[6] = temp_data[6]; //Стрелка 1
receiving_data[7] = temp_data[7]; //Сервисный
DEBUGLN (F("Выплонение команд"));
}else DEBUGLN (F("Не прошел сервисный байт"));
} else {
// Пакет не для нас - отправляем обратно
DEBUGLN (DEVICE_ID); DEBUG (F("Не наш пакет - ")); DEBUGLN (buffer);
}
} else {
DEBUGLN (F("ERROR: Неверный формат пакета"));
}
}
}
void Input_Command(){
if (CP1_ir_in.available()) { //проверяем пришла ли команда
uint8_t address = CP1_ir_in.readAddress(); // Чтение адреса
uint8_t command = CP1_ir_in.readCommand(); // Чтение команды
DEBUGLN ("Принят пакет, приемник 1:");
DEBUG (address); DEBUG(F(" -адрес - команда - ")); DEBUGLN (command); //отладка ИК
if (address == CMD_QUERY_ID) {
send_data[1] = command;
send_data[6] = 1;
}else if (address == CMD_CALIBRATION){
send_data[1] = command;
send_data[6] = 2;
}
}
if (CP2_ir_in.available()) { //проверяем пришла ли команда
uint8_t address = CP2_ir_in.readAddress(); // Чтение адреса
uint8_t command = CP2_ir_in.readCommand(); // Чтение команды
DEBUGLN ("Принят пакет, приемник 2:");
DEBUG (address); DEBUG(F(" -адрес - команда - ")); DEBUGLN (command); //отладка ИК
if (address == CMD_QUERY_ID) {
send_data[2] = command;
send_data[6] = 1;
}else if (address == CMD_CALIBRATION){
send_data[2] = command;
send_data[6] = 2;
}
}
if (CP3_ir_in.available()) { //проверяем пришла ли команда
uint8_t address = CP3_ir_in.readAddress(); // Чтение адреса
uint8_t command = CP3_ir_in.readCommand(); // Чтение команды
DEBUGLN ("Принят пакет, приемник 3:");
DEBUG (address); DEBUG(F(" -адрес - команда - ")); DEBUGLN (command); //отладка ИК
if (address == CMD_QUERY_ID) {
send_data[2] = command;
send_data[6] = 1;
}else if (address == CMD_CALIBRATION){
send_data[2] = command;
send_data[6] = 2;
}
}
if (CP4_ir_in.available()) { //проверяем пришла ли команда
uint8_t address = CP4_ir_in.readAddress(); // Чтение адреса
uint8_t command = CP4_ir_in.readCommand(); // Чтение команды
DEBUGLN ("Принят пакет, приемник 4:");
DEBUG (address); DEBUG(F(" -адрес - команда - ")); DEBUGLN (command); //отладка ИК
if (address == CMD_QUERY_ID) {
send_data[2] = command;
send_data[6] = 1;
}else if (address == CMD_CALIBRATION){
send_data[2] = command;
send_data[6] = 2;
receiving_data[4] = 10;
}
}
}
// // При формировании пакета:
// data[7] = 0; // Обнуляем байт CRC
// for (int i = 0; i < 7; i++) {
// data[7] ^= data[i]; // XOR всех байтов
// }
// // При проверке пакета:
// uint8_t check_crc = 0;
// for (int i = 0; i < 7; i++) {
// check_crc ^= data[i];
// }
// if (check_crc == data[7]) {
// // CRC верна
// }
void Sending_data(){
if (send_data[6]){
send_data[7] = 0; // Обнуляем байт CRC
for (int i = 0; i < 7; i++) {
send_data[7] ^= send_data[i]; // XOR всех байтов
}
char response[32]; //отправка пакета
snprintf(response, sizeof(response), "%d.%d.%d.%d.%d.%d.%d.%d",
send_data[0] = DEVICE_ID, // адрес устройства
send_data[1], // CP1 принятый адрес машинки
send_data[2], // CP2 принятый адрес машинки
send_data[3], // ir_adr
send_data[4], // ir_data
send_data[5], // st_x1
send_data[6], // сервисный
send_data[7]); // CRC
DEBUGLN(F("Отправляем пакет - ")); Serial.println(response); // Отправляем ответ
//send_data[6]=0;
for (int i = 0; i < 7; i++) {
send_data[i] = 0; // обнуляем пакет
}
}
}
void Work(){
unsigned int current_date;
Receive_data();
Arrow();
Sending_data();
if (receiving_data[0] > current_date){
current_date = receiving_data[0];
if (receiving_data[1]) IR_send(receiving_data[1], receiving_data[2], receiving_data[3]);
}
}
void Arrow(){//управление стрелками
static unsigned long arrow1, arrow2, arrow3;
static unsigned long arrow_tmr1, arrow_tmr2, arrow_tmr3;
static bool x1, x2, x3, x1D, x2D, x3D;
if (receiving_data[4]){arrow_tmr1 = receiving_data[4] * 100; arrow1 = millis(); receiving_data[4] = 0;}
if (receiving_data[5]){arrow_tmr2 = receiving_data[5] * 100; arrow2 = millis(); receiving_data[5] = 0;}
if (receiving_data[6]){arrow_tmr3 = receiving_data[6] * 100; arrow3 = millis(); receiving_data[6] = 0;}
if (millis() - arrow1 > arrow_tmr1) x1 = true; else x1 = false;
if (millis() - arrow2 > arrow_tmr2) x2 = true; else x2 = false;
if (millis() - arrow3 > arrow_tmr3) x3 = true; else x3 = false;
digitalWrite(PIN_UNI1, x1);
digitalWrite(PIN_UNI2, x2);
digitalWrite(PIN_UNI3, x3);
if (x1 != x1D){
x1D = x1; DEBUG (F("Стрелка 1 - ")); if(!x1) DEBUGLN (F("ON")); else DEBUGLN (F("OFF"));
// Отладка таймеров
DEBUG(F("arrow_tmr1=")); DEBUG(arrow_tmr1);
DEBUG(F(" arrow1=")); DEBUG(arrow1);
DEBUG(F(" millis()=")); DEBUG(millis());
DEBUG(F(" x1=")); DEBUGLN(x1);
}
if (x2 != x2D){x2D = x2; DEBUG (F("Стрелка 2 - ")); if(!x2) DEBUGLN (F("ON")); else DEBUGLN (F("OFF"));}
if (x3 != x3D){x3D = x3; DEBUG (F("Стрелка 3 - ")); if(!x3) DEBUGLN (F("ON")); else DEBUGLN (F("OFF"));}
}
// void Arrow() {
// static unsigned long arrow_end1 = 0, arrow_end2 = 0, arrow_end3 = 0;
// static bool x1 = false, x2 = false, x3 = false, x1D, x2D, x3D;
// // Получаем новое время работы стрелки
// if (receiving_data[4] > 0) {
// arrow_end1 = millis() + (unsigned long)receiving_data[4] * 100;
// receiving_data[4] = 0;
// x1 = true; // Включаем стрелку
// }
// if (receiving_data[5] > 0) {
// arrow_end2 = millis() + (unsigned long)receiving_data[5] * 100;
// receiving_data[5] = 0;
// x2 = true;
// }
// if (receiving_data[6] > 0) {
// arrow_end3 = millis() + (unsigned long)receiving_data[6] * 100;
// receiving_data[6] = 0;
// x3 = true;
// }
// // Проверяем таймеры
// if (arrow_end1 > 0 && millis() >= arrow_end1) {
// x1 = false; // Выключаем стрелку
// arrow_end1 = 0;
// }
// if (arrow_end2 > 0 && millis() >= arrow_end2) {
// x2 = false;
// arrow_end2 = 0;
// }
// if (arrow_end3 > 0 && millis() >= arrow_end3) {
// x3 = false;
// arrow_end3 = 0;
// }
// // Для TBD62083AFWG (активный LOW)
// digitalWrite(PIN_UNI1, x1 ? LOW : HIGH);
// digitalWrite(PIN_UNI2, x2 ? LOW : HIGH);
// digitalWrite(PIN_UNI3, x3 ? LOW : HIGH);
// // Отладка
// if (x1 != x1D) {
// x1D = x1;
// DEBUG(F("Стрелка 1 - ")); DEBUGLN(x1 ? "ON" : "OFF");
// DEBUG(F("arrow_end1=")); DEBUG(arrow_end1);
// DEBUG(F(" millis=")); DEBUGLN(millis());
// }
// // ... аналогично для x2, x3
// }
void IR_send (uint8_t device, uint8_t Address, uint8_t Data){
DEBUG (F("Передача ИК пакета- ")); DEBUG (device); DEBUG (F(" ADR- ")); DEBUG (Address); DEBUG (F(" DATA- ")); DEBUGLN (Data);
switch (device) {
case 1:
digitalWrite(PIN_CP1_IR_PIT, HIGH); //отключение ИК приемника на время передачи
CP1_IR_OUT.send(Address, Data);
digitalWrite(PIN_CP1_IR_PIT, LOW);
break;
case 2:
digitalWrite(PIN_CP2_IR_PIT, HIGH); //отключение ИК приемника на время передачи
CP2_IR_OUT.send(Address, Data);
digitalWrite(PIN_CP2_IR_PIT, LOW);
break;
case 3:
if (!TF_ON) IR1_OUT.send(Address, Data); else DEBUG (F("! Ошибка передатчик занят светофором"));
break;
case 4:
if (!TF_ON) IR1_OUT.send(Address, Data); else DEBUG (F("! Ошибка передатчик занят светофором"));
break;
default:
break;
}
receiving_data[1] = 0; receiving_data[2] = 0; receiving_data[3] = 0;
}
// void Input_Command_CP1 (){
// if (CP1_ir_in.available()) { //проверяем пришла ли команда
// uint8_t address1 = CP1_ir_in.readAddress(); // Чтение адреса
// uint8_t command1 = CP1_ir_in.readCommand(); // Чтение команды
// DEBUGLN ("Принят пакет, приемник 1:");
// DEBUG (address1); DEBUG(F(" -адрес - команда - ")); DEBUGLN (command1); //отладка ИК
// if (address1 == CMD_QUERY_ID || address1 == CMD_CALIBRATION) { //проверка, пришел ли с нужного адреса
// switch (command1) {
// case CMD_X1: //плавный старт
// arrow1 = millis();
// x1 = !x1;
// break;
// case CMD_X2: //плавный старт
// arrow2 = millis();
// x2 = !x2;
// break;
// case CMD_X3: //плавный старт
// arrow3 = millis();
// x3 = !x3;
// break;
// case CMD_AUTO_ARROW: //плавный старт
// automatic_arrow = !automatic_arrow;
// DEBUG (F("Авто выключение стрелок - ")); if(automatic_arrow) DEBUGLN (F("ON")); else DEBUGLN (F("OFF"));
// break;
// default:
// break;
// }
// }
// }
// Arrow();
// }
// void Arrow(){
// static bool x1D, x2D, x3D;
// if (automatic_arrow){
// if (millis() - arrow1 > ARR_TM) x1 = false; else x1 = true;
// if (millis() - arrow2 > ARR_TM) x2 = false; else x2 = true;
// if (millis() - arrow3 > ARR_TM) x3 = false; else x3 = true;
// }
// digitalWrite(PIN_ST_X1, x1);
// digitalWrite(PIN_ST_X2, x2);
// digitalWrite(PIN_ST_X3, x3);
// if (x1 != x1D){
// x1D = x1;
// DEBUG (F("Стрелка 1 - ")); if(x1) DEBUGLN (F("ON")); else DEBUGLN (F("OFF"));
// }
// if (x2 != x2D){
// x2D = x2;
// DEBUG (F("Стрелка 2 - ")); if(x2) DEBUGLN (F("ON")); else DEBUGLN (F("OFF"));
// }
// if (x3 != x3D){
// x3D = x3;
// DEBUG (F("Стрелка 3 - ")); if(x3) DEBUGLN (F("ON")); else DEBUGLN (F("OFF"));
// }
// }
void loop() {
if(TF_ON) Traffic_Lights();
Input_Command();
if(!TF_ON) Work();
}