//подключение заголовочных файлов Ardoino.h, string, iostream
#include <Arduino.h>
#include <string>
#include <iostream>
//подключаем заголовочный файл array для использования массивов
#include <array>
/*Определяем глобальную переменную button_push_number
для подсчета числа нажатий кнопки*/
int button_push_number;
/*Определяем константу led_pin указывающую номер пина,
которому подключается светодиод и присваиваем ей значение 39
по номеру пина */
const int led_pin = 39;
/*Определяем константу buitton_pin указывающую номер пина,
которому подключается светодиод и присваиваем ей значение 18
по номеру пина */
const int button_pin = 18;
// мощность свечения
int power = 4096;
// буффер для приема сообщений
std::string message = "";
/*Определяем константу buffer_size указывающую число последних значений,
передаваемых в порт и сохраняемых в буфере. По заданию buffer_size = 4*/
const int buffer_size = 4;
/*Определим переменную time_count,в которую будем записывать интервалы врвемени
для отсчета 20 секунд с момента предыдущего вывода*/
float time_count;
//Инициализируем массив, в который будем записывать содержимое порта
std::array <int, buffer_size> mylist;
//инициализация переменной, указывающей состояние светодиода
//false - погашен; true - горит
bool light_on = false;
//определяем переменную - счетчик ячеек для задания кольцевого буфера
int num_curr = 0;
//определяем переменную - номер ячейки для записи принимаемого значения
int num_cell = 0;
//определяем локальную переменную ms, в которой записано время, прошедшее с момента запуска программы
float ms;
//определяем переменную, которую будем использовать в виде буфера для записи элементов
//int var_buffer;
/*Функция setup, устанавливающая пин 39 в состояние вывода,
пин 18 в состояние ввода,
начальное значение переменной light_on false (кнопка не нажата),
начальное значение переменной ms_button зададим равное 0,
начальное значение time_count зададим равное 0
а также выполняющая инициализацию порта*/
void setup() {
//установка вывода контроллера с номером led_pin в состояние вывода OUTPUT
pinMode(led_pin, OUTPUT);
//установка вывода контроллера с номером button_pin в состояние вывода INPUT
pinMode(button_pin, INPUT);
//установка начального значения переменной time_count в 0
time_count = 0;
/*установка начального значения переменной light_on в состояние False
cветодиод не горит*/
light_on = false;
//инициализация порта
Serial.begin(115200);
}
/*Процедура выполняет управление светодиодом, подключенным к пину 39.
выполняется считывание информации из последовательного порта, 4 значения вводятся с клавиатуры и
записываются в ячейки памяти массива mylist с номером num_curr. счетчик num_curr увеличивается на 1
После достижения значения buffer_size обеспечивается запись в данных последнюю ячейку.
Перед этим происходит циклическая перезапись элементов ячейки с номером i+1 в ячейку сномером i
и цикл повторяется
Выполняется проверка состояния пина 19 после нажатия кнопки (подключенной к пину 18)
загорается светодиод с интенсивностью, вводимой с клавиатуры и хранящейся в переменной power
После этого светодиод горит в течение 1с с заданной интенсивностью и происходит изменение
переменной состояния light_on в значение false . при этом на пин 39 выдается команда на подачу
низкого уровня напряжения интенсивность 0*/
void loop() {
//проверка достижения значения переменной num_cur значения buffer_size
if (num_curr >= buffer_size)
{
//записываем данные в ячейку массива с номером 3
num_cell = buffer_size - 1;
}
else
{
//в противном случае записываем данные в текущую ячейку
num_cell = num_curr;
}
// читаем данные из серийного порта
if (Serial.available() > 0)
{
//очистка строки
message = "";
/*выполнение процедуры чтения из порта с задержкой 500 мс*/
while(Serial.available() > 0)
{
message += std::string(1, char(Serial.read()));
delay(500);
}
// конвертация значения из string в тип int
power = std::stoi(message);
//вывод переменной power в терминал
Serial.print("Recieved: power = ");
Serial.println(power);
//подготовим массив для записи
if (num_curr >= buffer_size)
{
for (int i = 0; i < buffer_size - 1; ++i)
{
/*Serial.println(i);
Serial.println("до перезаписи");
Serial.println(mylist[i]);
Serial.println(mylist[i+1]);*/
mylist.at(i) = mylist.at(i + 1);
/*Serial.println("после перезаписи");
Serial.println(mylist[i]);
Serial.println(mylist[i+1]);*/
}
}
//запись переменной power в массив в ячейку с номером num_curr*/
mylist[num_cell] = power;
/*вывод сообщения о записи
Serial.print("записано в ячейку ");
Serial.print(num_cell);
Serial.print(" значение ");
Serial.println(mylist[num_cell]);*/
//увеличение счетчика num_curr на 1
++num_curr;
}
/*записываем в переменную ms время, прошедшее с момента запуска программы, полученное
с помощью функции milis*/
ms = millis();
/*проверка состояния переменной button pin и
присвоение переменной ight_on значения True
если значение button_pin равно True (нажата кнопка)*/
if(digitalRead(button_pin) == HIGH)
{
light_on = true;
}
/*проверка состояния переменной light_on
в значении true зажигается светодиод и задается интенсивность свечения
с помощью параметра power. устанавливается значение времени горения
с помощью функции delay в 1000 мс (1с)
при значении light on равном False передается 0 и светодиод не горит*/
if(light_on == true)
{
light_on = false;
analogWrite(led_pin, power);
delay(1000);
}
else{
analogWrite(led_pin, 0);
}
/*процедура вывода содержимого буфера по прошествии 20 с
выполняется проверка разности значений переменной ms и time_count
в случае выполнения условия выполняется вывод сообщения,
а переменной time_count присваивается текущее значение переменной ms
далее с помощью цикла for выводится содержимое массива mylist*/
if ((ms - time_count) >= 20000)
{
Serial.println("Прошло 20 c.");
time_count = ms;
for (int i = 0; i < buffer_size; ++i)
{
Serial.print( mylist[i] );
Serial.println();
}
}
}