// У нас на плате pro mini ATmega 168 (5v, 16MHz), хотя это и неважно
#include <SoftwareSerial.h> // Подключаем библиотеку
SoftwareSerial mySerial(10, 11); // RX, TX Назначаем пины на прием и передачу
byte pers = 0; // Переменная для получения данных порта (мощность в процентах)
int pers1;
int pers2;
unsigned int n; // Счетчик непришедших пакетов
unsigned long timer1;
void setup() {
pinMode(12, OUTPUT); // Назначаем пин на выход (плата симистора)
pinMode(13, OUTPUT); // Назначаем пин на выход (светодиод-контролька)
digitalWrite(12, 0); // выход на плату симистора (отключено)
digitalWrite(13, 0); // Светодиод потушен
Serial.begin(9600);
mySerial.begin(4800); // Запускаем работу порта
}
void loop()
{
timer1 = millis(); // Начинаем отсчет времени
Serial.println(millis());
if (pers2 <= 500) // Если мощность менее 50%
{
if (pers2 == 0) // Если мощность равна 0
{
digitalWrite(12, 0); // Выключаем все
digitalWrite(13, 0);
receiveData (); // Получаем данные с основного контроллера
while ((millis() - timer1) <= 999) {
; // Просто ждем, когда секунда пройдет
}
}
else
{
digitalWrite(12, HIGH); // Если мощность менее 50%, но не 0
digitalWrite(13, HIGH); // Включаем все
delay (pers2); // ждем (мощность х 10)мсек
digitalWrite(12, LOW); // Выключаем все
digitalWrite(13, LOW);
}
receiveData (); // получаем данные
while ((millis() - timer1) <= 999) {
; // ждем, когда закончится секунда
}
}
else
{
digitalWrite(12, HIGH); // Если мощность более 50%
digitalWrite(13, HIGH); // Включаем все
pers1 = pers2; // Запоминаем переменную
receiveData (); // получаем данные
while ((millis() - timer1) <= (pers1)) {
; // Ждем пока закончится импульс, пропорциональный мощности
}
digitalWrite(12, LOW); // Выключаем все
digitalWrite(13, LOW);
while ((millis() - timer1) <= 999) {
; // Ждем пока закончится секунда
}
}
}
void receiveData () // Функция получения данных с основной платы.
{
if (mySerial.available())
{
pers = mySerial.read(); // Считываем данные с порта, если там что-то есть
n = 0; // Раз данные пришли, обнулим счетчик
}
else
{
n++; // Считаем, сколько раз не пришли данные
}
if (pers > 100)
{
pers = 0; // Отсечем нереальные значения на всякий случай значение
}
if (n > 10) // Если 10 секунд данные не приходят, прекраим подачу импульсов.
{
pers = 0;
}
pers2 = (pers * 10); // Получим длину импульса в милисекундах.
}