///////////////////////////////////////////////////////////////////// // mavjuz WinLpt 0.2.9 // Скетч для Arduino UNO // Устройство принимает команды (байты) от компьютера и управляет // дискретными выходами (например, светодиодами) // // Протокол управления: // 0 - выключить выходной сигнал // 255 - включить выходной сигнал // 1 - сброс номера текущего канала на 0 // любые другие команды - игнор // // Настройки WinLpt, для плагина вывода Generic Serial output: // Скорость передачи: 9600, 19200, 38400, 57600, 115200 // Заголовок: 1 // Окончание: оставить поле пустым // Отправить при остановке: 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 // Количество байт данных: любое от 1 до 32 // ///////////////////////////////////////////////////////////////////// // Код программы ///////////////////////////////////////////////////////////////////// // * Номера выходов для управления (для MEGA от 1 до 12 штук) const int channels[] = {22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53}; // * Скорость обмена данными с компьютером const int baudrate = 9600; // 9600, 19200, 38400, 57600, 115200 // Количество каналов управления const int numChannels = sizeof(channels); // Номер канала, для которого будет применена команда int curChannel = 0; // Функция setup() выполняется 1 раз при запуске контроллера void setup() { // Запуск и настройка скорости для приёма данных через USB-COM Serial.begin(baudrate); // Настройка выходных сигналов контроллера for(int i = 0; i < numChannels; i++) { // Режим вывода pinMode(channels[i], OUTPUT); // Выключение выходного сигнала digitalWrite(channels[i], LOW); } } // Функция loop() выполняется циклически void loop() { // y будет равен количеству поступивших от компьютера команд (байт) int y = Serial.available(); for (int i = 0; i < y; i++) // Цикл обработки приходящих команд { int inc = Serial.read(); // Чтение данных if (inc == 1) // Если получена команда для сброса { curChannel = 0; // Сброс номера текущего канала на 0 continue; // Продолжить цикл обработки } if (curChannel < numChannels) // Если номер канала меньше количества каналов { digitalWrite(channels[curChannel], !!inc); // Вывод сигнала curChannel++; // Переход к следующему каналу } } }