Уменьшение размера скетча arduino

Пытаюсь запихнуть этот скетч в Atmega8.

Нужно уменьшить размер скетча на 1022 байта (минимум), но не знаю, как

#include <Arduino.h>
#include "ServoSmooth.h" // https://github.com/AlexGyver/GyverLibs/tree/master/ServoSmooth

#define ENGINE_PIN 11
#define SERVO_PIN 9
#define REVERSE_PIN 5

long last_m_time = 0;

int engine_pwm = 0;
int is_reverse_engine = 0;
int servo_angle = 90;

ServoSmooth steering;

void setup()
{
  Serial.begin(9600);
  Serial.setTimeout(20);
  
  pinMode(ENGINE_PIN, OUTPUT);
  pinMode(SERVO_PIN, OUTPUT);
  pinMode(REVERSE_PIN, OUTPUT);

  steering.attach(SERVO_PIN);
  steering.setSpeed(130);    
  steering.setAccel(0.1);       
}

String getValue(String data, char separator, int index)
{
  int found = 0;
  int strIndex[] = {0, -1};
  int maxIndex = data.length() - 1;

  for (int i = 0; i <= maxIndex && found <= index; i++)
  {
    if (data.charAt(i) == separator || i == maxIndex)
    {
      found++;
      strIndex[0] = strIndex[1] + 1;
      strIndex[1] = (i == maxIndex) ? i + 1 : i;
    }
  }
  return found > index ? data.substring(strIndex[0], strIndex[1]) : "";
}

void decode_message(String data)
{
  // приходит строка в виде 90:120:0
  servo_angle = getValue(data, ':', 0).toInt();

  engine_pwm = getValue(data, ':', 1).toInt();

  is_reverse_engine = getValue(data, ':', 2).toInt();
}

void reset_vehicle()
{
  engine_pwm = 0;
  is_reverse_engine = 0;
  servo_angle = 90;
}

void check_connection()
{
  if ((millis() - last_m_time) > 700)
  {
    reset_vehicle();
  }
}

void loop()
{
  String data = Serial.readStringUntil('\n');

  if (data.length() > 0)
  {
    last_m_time = millis();
    decode_message(data);
  }

  steering.setTargetDeg(servo_angle);
  analogWrite(ENGINE_PIN, engine_pwm);
  digitalWrite(REVERSE_PIN, is_reverse_engine);

  check_connection();

  steering.tick();
}

upd:

Что я смог сделать (теперь нужно уменьшить еще на 824 байта):

#include <Arduino.h>
#include "ServoSmooth.h" // https://github.com/AlexGyver/GyverLibs/tree/master/ServoSmooth

#define ENGINE_PIN 11
#define SERVO_PIN 9
#define REVERSE_PIN 5

uint32_t last_m_time = 0;

byte engine_pwm = 0;
byte is_reverse_engine = 0;
byte servo_angle = 90;

ServoSmooth steering;

void setup()
{
  Serial.begin(9600);
  Serial.setTimeout(20);
  
  pinMode(ENGINE_PIN, OUTPUT);
  pinMode(SERVO_PIN, OUTPUT);
  pinMode(REVERSE_PIN, OUTPUT);

  steering.attach(SERVO_PIN);
  steering.setSpeed(130);    
  steering.setAccel(0.1);       
}

String getValue(String& data, char separator, uint8_t index)
{
  int found = 0;
  int strIndex[] = {0, -1};
  uint8_t maxIndex = data.length() - 1;

  for (uint8_t i = 0; i <= maxIndex && found <= index; i++)
  {
    if (data.charAt(i) == separator || i == maxIndex)
    {
      found++;
      strIndex[0] = strIndex[1] + 1;
      strIndex[1] = (i == maxIndex) ? i + 1 : i;
    }
  }
  return found > index ? data.substring(strIndex[0], strIndex[1]) : "";
}

void decode_message(String& data)
{
  servo_angle = getValue(data, ':', 0).toInt();
  engine_pwm = getValue(data, ':', 1).toInt();
  is_reverse_engine = getValue(data, ':', 2).toInt();
}

void reset_vehicle()
{
  engine_pwm = 0;
  is_reverse_engine = 0;
  servo_angle = 90;
}

void check_connection()
{
  if ((millis() - last_m_time) > 700)
  {
    reset_vehicle();
  }
}

void loop()
{
  String data = Serial.readStringUntil('\n');
  if (data.length() > 0)
  {
    last_m_time = millis();
    decode_message(data);
  }
  steering.setTargetDeg(servo_angle);
  analogWrite(ENGINE_PIN, engine_pwm);
  digitalWrite(REVERSE_PIN, is_reverse_engine);
  check_connection();
  steering.tick();
} 

Ответы (1 шт):

Автор решения: Герман Борисов

Библиотека Гайвера в принципе не влезет а Atmega8.

Чтоб в этом убедиться попробуйте скомпилировать скетч, который не делает ничего, просто подключает библиотеки:

#include <Arduino.h>
#include "ServoSmooth.h" // https://github.com/AlexGyver/GyverLibs/tree/master/ServoSmooth

#define ENGINE_PIN 11
#define SERVO_PIN 9
#define REVERSE_PIN 5

ServoSmooth steering;

void setup()
{
  Serial.begin(9600);
  Serial.setTimeout(20);
  
  pinMode(ENGINE_PIN, OUTPUT);
  pinMode(SERVO_PIN, OUTPUT);
  pinMode(REVERSE_PIN, OUTPUT);

  steering.attach(SERVO_PIN);
  steering.setSpeed(130);    
  steering.setAccel(0.1);       
}

void loop()
{

}

Возможные варианты:

  1. Выбрать более «жирный» чип.
  2. Не использовать библиотеки, а реализовать нужную логику самому.
→ Ссылка