// У нас на плате pro mini ATmega 168 (5v, 16MHz), хотя это и неважно
#include <SoftwareSerial.h> // Подключаем библиотеку
SoftwareSerial mySerial(10, 11); // RX, TX Назначаем пины на прием и передачу
byte pers; // Переменная для получения данных порта
int x; // Переменная координат алгоритма Брезенхема
int y; // Переменная координат алгоритма Брезенхема
int onoff = 0; // Переменная сигнала на плату симистора
unsigned int n; // Счетчик непришедших пакетов
unsigned long halfWave; // Для отсчета длины полуволны
unsigned long periodSec; // Для отсчета периода в 1 сек
int i = 1;
void setup() {
pinMode(12, OUTPUT); // Назначаем пин на выход (плата симистора)
pinMode(13, OUTPUT); // Назначаем пин на выход (светодиод-контролька)
digitalWrite(12, 0); // выход на плату симистора (отключено)
digitalWrite(13, 0); // Светодиод потушен
// Serial.begin(9600);
mySerial.begin(4800); // Запускаем работу порта
}
void loop()
{
if (periodSec == 0 || (millis() - periodSec) >= 1000) // Один раз в секунду принимаем данные
{
periodSec = millis();
receiveData();
}
if (halfWave == 0 || (millis() - halfWave) >= 10) // Один раз в 10мс включаем или выключаем импульс
{
halfWave = millis();
x = i * pers / 100 ;
if (x == y) // Если целая часть после деления осталась неизменной - импульса нет
{
onoff = 0;
}
else // Если целая часть увеличилась - импульс есть.
{
onoff = 1;
}
digitalWrite(12, onoff); // Включаем или выключаем плату симистора и светодиод.
digitalWrite(13, onoff);
y=x;
if (i >= 100) // После 100 раз, начинаем сначала
{
i = 0;
y = 0;
}
++i;
}
}
void receiveData()
{
if (mySerial.available())
{
pers = mySerial.read(); // Считываем данные с порта, если там что-то есть
n = 0; // Раз данные пришли, обнулим счетчик
}
else
{
++n; // Считаем, сколько раз не пришли данные
}
if (pers > 100)
{
pers = 0; // на всякий случай, если значение нереальное
}
if (n > 10) // Если 10 секунд данные не приходят, прекратим подачу импульсов.
{
pers = 0;
}
}
Ly8g0KMg0L3QsNGBINC90LAg0L/Qu9Cw0YLQtSBwcm8gbWluaSBBVG1lZ2EgMTY4ICg1diwgMTZNSHopLCDRhdC+0YLRjyDRjdGC0L4g0Lgg0L3QtdCy0LDQttC90L4KI2luY2x1ZGUgPFNvZnR3YXJlU2VyaWFsLmg+ICAgICAgICAgICAvLyDQn9C+0LTQutC70Y7Rh9Cw0LXQvCDQsdC40LHQu9C40L7RgtC10LrRgwoKU29mdHdhcmVTZXJpYWwgbXlTZXJpYWwoMTAsIDExKTsgLy8gUlgsIFRYINCd0LDQt9C90LDRh9Cw0LXQvCDQv9C40L3RiyDQvdCwINC/0YDQuNC10Lwg0Lgg0L/QtdGA0LXQtNCw0YfRgwoKYnl0ZSBwZXJzOyAgICAgICAgICAgICAgICAgIC8vINCf0LXRgNC10LzQtdC90L3QsNGPINC00LvRjyDQv9C+0LvRg9GH0LXQvdC40Y8g0LTQsNC90L3Ri9GFINC/0L7RgNGC0LAKaW50IHg7ICAgICAgICAgICAgICAgICAgICAgIC8vINCf0LXRgNC10LzQtdC90L3QsNGPINC60L7QvtGA0LTQuNC90LDRgiDQsNC70LPQvtGA0LjRgtC80LAg0JHRgNC10LfQtdC90YXQtdC80LAKaW50IHk7ICAgICAgICAgICAgICAgICAgICAgIC8vINCf0LXRgNC10LzQtdC90L3QsNGPINC60L7QvtGA0LTQuNC90LDRgiDQsNC70LPQvtGA0LjRgtC80LAg0JHRgNC10LfQtdC90YXQtdC80LAKaW50IG9ub2ZmID0gMDsgICAgICAgICAgICAgIC8vINCf0LXRgNC10LzQtdC90L3QsNGPINGB0LjQs9C90LDQu9CwINC90LAg0L/Qu9Cw0YLRgyDRgdC40LzQuNGB0YLQvtGA0LAKdW5zaWduZWQgaW50IG47ICAgICAgICAgICAgIC8vINCh0YfQtdGC0YfQuNC6INC90LXQv9GA0LjRiNC10LTRiNC40YUg0L/QsNC60LXRgtC+0LIKdW5zaWduZWQgbG9uZyBoYWxmV2F2ZTsgICAgIC8vINCU0LvRjyDQvtGC0YHRh9C10YLQsCDQtNC70LjQvdGLINC/0L7Qu9GD0LLQvtC70L3Riwp1bnNpZ25lZCBsb25nIHBlcmlvZFNlYzsgICAgLy8g0JTQu9GPINC+0YLRgdGH0LXRgtCwINC/0LXRgNC40L7QtNCwINCyIDEg0YHQtdC6CmludCBpID0gMTsKCnZvaWQgc2V0dXAoKSB7CiAgcGluTW9kZSgxMiwgT1VUUFVUKTsgICAgICAgICAvLyDQndCw0LfQvdCw0YfQsNC10Lwg0L/QuNC9INC90LAg0LLRi9GF0L7QtCAo0L/Qu9Cw0YLQsCDRgdC40LzQuNGB0YLQvtGA0LApCiAgcGluTW9kZSgxMywgT1VUUFVUKTsgICAgICAgICAvLyDQndCw0LfQvdCw0YfQsNC10Lwg0L/QuNC9INC90LAg0LLRi9GF0L7QtCAo0YHQstC10YLQvtC00LjQvtC0LdC60L7QvdGC0YDQvtC70YzQutCwKQogIGRpZ2l0YWxXcml0ZSgxMiwgMCk7ICAgICAgICAgLy8g0LLRi9GF0L7QtCDQvdCwINC/0LvQsNGC0YMg0YHQuNC80LjRgdGC0L7RgNCwICjQvtGC0LrQu9GO0YfQtdC90L4pCiAgZGlnaXRhbFdyaXRlKDEzLCAwKTsgICAgICAgICAvLyDQodCy0LXRgtC+0LTQuNC+0LQg0L/QvtGC0YPRiNC10L0KIC8vIFNlcmlhbC5iZWdpbig5NjAwKTsKICBteVNlcmlhbC5iZWdpbig0ODAwKTsgICAgICAgIC8vINCX0LDQv9GD0YHQutCw0LXQvCDRgNCw0LHQvtGC0YMg0L/QvtGA0YLQsAp9Cgp2b2lkIGxvb3AoKQp7CiAgaWYgKHBlcmlvZFNlYyA9PSAwIHx8IChtaWxsaXMoKSAtIHBlcmlvZFNlYykgPj0gMTAwMCkgLy8g0J7QtNC40L0g0YDQsNC3INCyINGB0LXQutGD0L3QtNGDINC/0YDQuNC90LjQvNCw0LXQvCDQtNCw0L3QvdGL0LUKICB7CiAgICBwZXJpb2RTZWMgPSBtaWxsaXMoKTsKICAgIHJlY2VpdmVEYXRhKCk7CiAgfQoKICBpZiAoaGFsZldhdmUgPT0gMCB8fCAobWlsbGlzKCkgLSBoYWxmV2F2ZSkgPj0gMTApICAvLyDQntC00LjQvSDRgNCw0Lcg0LIgMTDQvNGBINCy0LrQu9GO0YfQsNC10Lwg0LjQu9C4INCy0YvQutC70Y7Rh9Cw0LXQvCDQuNC80L/Rg9C70YzRgQogIHsgCiAgICBoYWxmV2F2ZSA9IG1pbGxpcygpOwogICAgeCA9IGkgKiBwZXJzIC8gMTAwIDsKICAgIGlmICh4ID09IHkpICAgICAgICAgICAgICAgICAgICAgLy8g0JXRgdC70Lgg0YbQtdC70LDRjyDRh9Cw0YHRgtGMINC/0L7RgdC70LUg0LTQtdC70LXQvdC40Y8g0L7RgdGC0LDQu9Cw0YHRjCDQvdC10LjQt9C80LXQvdC90L7QuSAtINC40LzQv9GD0LvRjNGB0LAg0L3QtdGCCiAgICB7CiAgICAgIG9ub2ZmID0gMDsKICAgIH0KICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g0JXRgdC70Lgg0YbQtdC70LDRjyDRh9Cw0YHRgtGMINGD0LLQtdC70LjRh9C40LvQsNGB0YwgLSDQuNC80L/Rg9C70YzRgSDQtdGB0YLRjC4KICAgIHsKICAgICAgb25vZmYgPSAxOwogICAgfQogICAgZGlnaXRhbFdyaXRlKDEyLCBvbm9mZik7ICAgICAgICAvLyDQktC60LvRjtGH0LDQtdC8INC40LvQuCDQstGL0LrQu9GO0YfQsNC10Lwg0L/Qu9Cw0YLRgyDRgdC40LzQuNGB0YLQvtGA0LAg0Lgg0YHQstC10YLQvtC00LjQvtC0LgogICAgZGlnaXRhbFdyaXRlKDEzLCBvbm9mZik7CiAgICB5PXg7CiAgICBpZiAoaSA+PSAxMDApICAgICAgICAgICAgICAgICAgIC8vINCf0L7RgdC70LUgMTAwINGA0LDQtywg0L3QsNGH0LjQvdCw0LXQvCDRgdC90LDRh9Cw0LvQsAogICAgewogICAgICBpID0gMDsKICAgICAgeSA9IDA7CiAgICB9CiAgICAgKytpOwogIH0KfQoKdm9pZCByZWNlaXZlRGF0YSgpCnsKICBpZiAobXlTZXJpYWwuYXZhaWxhYmxlKCkpCiAgewogICAgcGVycyA9IG15U2VyaWFsLnJlYWQoKTsgICAgICAgICAgIC8vINCh0YfQuNGC0YvQstCw0LXQvCDQtNCw0L3QvdGL0LUg0YEg0L/QvtGA0YLQsCwg0LXRgdC70Lgg0YLQsNC8INGH0YLQvi3RgtC+INC10YHRgtGMCiAgICBuID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g0KDQsNC3INC00LDQvdC90YvQtSDQv9GA0LjRiNC70LgsINC+0LHQvdGD0LvQuNC8INGB0YfQtdGC0YfQuNC6CiAgfQogIGVsc2UKICB7CiAgICArK247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g0KHRh9C40YLQsNC10LwsINGB0LrQvtC70YzQutC+INGA0LDQtyDQvdC1INC/0YDQuNGI0LvQuCDQtNCw0L3QvdGL0LUKICB9CgogIGlmIChwZXJzID4gMTAwKQogIHsKICAgIHBlcnMgPSAwOyAvLyDQvdCwINCy0YHRj9C60LjQuSDRgdC70YPRh9Cw0LksINC10YHQu9C4INC30L3QsNGH0LXQvdC40LUg0L3QtdGA0LXQsNC70YzQvdC+0LUKICB9CgogIGlmIChuID4gMTApICAgLy8g0JXRgdC70LggMTAg0YHQtdC60YPQvdC0INC00LDQvdC90YvQtSDQvdC1INC/0YDQuNGF0L7QtNGP0YIsINC/0YDQtdC60YDQsNGC0LjQvCDQv9C+0LTQsNGH0YMg0LjQvNC/0YPQu9GM0YHQvtCyLgogIHsKICAgIHBlcnMgPSAwOwogIH0gCn0=