#include <Arduino.h>
#include <string>
#include <vector>
#define led_pin 38 // 38pin вывод на светодиод
int power = 255;
std::string buffer = "";
std::vector <int> vec_cmd(4) ; //вектор ждя хранения 4 команд
bool light_on = false; // признак включения светодиода
int index_vec = 0 ; // индекс
unsigned long time_begin; //начальное время для отсчета 20 сек
unsigned long time_end; //
bool em_vec = false; //признак, что массив заполнен
const short max_number = 3; // количество ячеек
// заполняет массив принимает значение мощности
// возвращает количество заполненных ячеек вектора
int put_power (int &pwr);//заполняет массив
// расчет средней сколоьзящей мощности
// принимает указатель на вектор и количество заполненных ячеек
// возвращает среднюю скользящую
int mean(std::vector <int> &vtr, int &ind); //
void setup() {
// определяем 38 пин как выход
pinMode(led_pin, OUTPUT);
Serial.begin(115200);
time_begin = millis();
}
void loop() {
if (Serial.available() >0) {
buffer = "";
int n; // число заполненных элементов массива
while(Serial.available()>0)
{
buffer +=std::string(1, char(Serial.read()));
delay(500);
}
power = std::stoi(buffer);
Serial.print( "Recived power =");
Serial.println(power);
n = put_power (power); //заполнeние массива
int map_sum = mean( vec_cmd , n); // скользящее среднее
Serial.print( "Moving average power=");
Serial.println(map_sum); // вывод скоьльзящего среднего
}
if (digitalRead(17) == HIGH)
{
light_on = true; //признак, что нужно включать
}
else
{
}
// если признак включения светодиода установлен
if (light_on)
{
light_on = false; // сброс признака
analogWrite(led_pin, power); // зажигаем светодиод
delay(1000);
}
else
{
analogWrite(led_pin, 0); //светодиод не светится
}
time_end = millis(); //получаем текущее время
if((time_end - time_begin) >= 20000) //если прошло 20 сек
{
//выводим все значения вектора
for (int i = 0; i < vec_cmd.size(); i++)
{
Serial.println(vec_cmd[i]) ;
}
time_begin = millis(); //пкрезапускаем таймер
}
}
//заполняет массив
int put_power (int & pwr)
{
if(!em_vec) //вектор еще пуст
{
vec_cmd.at(index_vec)= pwr; //заполняем
index_vec++;
if(index_vec > max_number) // весь запполнен
{
em_vec = true;
// index_vec--; // индекс на последний элемент
}
}
else //вектор один раз полностью заполнен
{
// сдвигаем в массиве 3 ячейки
for (int i = 0; i<3; i++)
{
vec_cmd.at(i) = vec_cmd.at(i+1);
}
vec_cmd.at(3) = pwr ;
// записываем в конец новое значение
//
}
return index_vec;
}
// считает скользящее среднее
int mean(std::vector <int> &vtr, int &ind)
{
int sum = 0; // начальное значение
for (size_t i = 0; i < vtr.size() ; ++i)
sum = (sum + vtr.at(i)) ;
return sum/ind; //результат
}