/*
* Практическая работа №2
* Модифицируйте проект из видео 2 так, чтобы в памяти микроконтроллера
* сохранялись четыре последние полученные через серийный порт команды.
* Организуйте вывод полученных команд в серийный порт через каждые 20 секунд
* автор: Михаил Балуев
*/
#include <Arduino.h>
#include <string>
#include <vector>
//номер пина кнопки
#define BUT_PIN 18
//номер пина светодиода
#define LED_PIN 39
//период чтения пина кнопки, мс
#define BUTTON_READ_DELAY 20
//время горения, мс
#define LED_ON_DURATION 1000
//максимальное значение "мощности" свечения
#define POWER_MAX 255
//константа периода вывода полученных команд, мс
constexpr uint16_t commands_print_perioid = 20000;
//константа размера контейнера для полученных команд
constexpr uint16_t v_array_max_size = 4;
//константа кол-ва нажатий на кнопку для включения светодиода
constexpr uint16_t button_push_number = 1;
//текущий уровень пина кнопки
bool s_button_pin_state;
//счетчик нажатий кнопки
uint16_t s_button_push_counter;
//буффер для приема сообщений
std::string message;
//контейнер для хранения полученных команд
std::vector<int> v;
void setup() {
pinMode(LED_PIN, OUTPUT);
s_button_pin_state = LOW;
s_button_push_counter = 0;
Serial.begin(115200);
}
void loop()
{
//метка для времени вывода полученных команд
static unsigned long time_stamp = commands_print_perioid;
/*
* читаем текущее время, сравниваем с меткой времени;
* если время достигло метки - метку обновляем, выводим команды
*/
unsigned long now = millis();
if(now >= time_stamp)
{
time_stamp += commands_print_perioid;
//Serial.println(now);
//выводим элементы контейнера
Serial.print("Last commands: ");
for(auto i : v)
{
Serial.print(i);
Serial.print("\t");
}
Serial.println("");
}
/*
* читаем данные из серийного порта
*/
if(Serial.available() > 0)
{
message = "";
while(Serial.available() > 0) //
{
message += std::string(1, char(Serial.read()));
}
//мощность свечения
uint16_t power = std::stoi(message);
//проверка на диапазон
if(power > POWER_MAX) power = POWER_MAX;
Serial.print("Recieved: power = ");
Serial.println(power);
//если размер вектора меньше максимального, вставляем полученное значение в конец;
//иначе - сдвигаем значения и заменяем последнее
if(v.size() < v_array_max_size)
{
v.push_back(power);
}
else
{
for(uint8_t i = 0; i < v_array_max_size - 1; i++)
{
v[i] = v[i + 1];
}
v[v_array_max_size - 1] = power;
}
}
/*
* Читаем уровень на пине кнопки с заданным периодом (20 мс).
* Если уровень изменился - сохраняем его, и если стал HIGH:
* инкремент счетчика нажатий и если счетчик достиг заданного значения -
* сброс счетчика нажатий, светим установленное время с мощностью последней команды
*/
bool button_pin_level = digitalRead(BUT_PIN);
if(s_button_pin_state != button_pin_level)
{
s_button_pin_state = button_pin_level;
if(button_pin_level == HIGH)
{
if(++s_button_push_counter == button_push_number)
{
s_button_push_counter = 0;
analogWrite(LED_PIN, v.back());
delay(LED_ON_DURATION);
analogWrite(LED_PIN, 0);
}
}
}
//задержка
delay(BUTTON_READ_DELAY);
}
Loading
esp32-s3-devkitc-1
esp32-s3-devkitc-1