Уменьшение размера скетча 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()
{
}
Возможные варианты:
- Выбрать более «жирный» чип.
- Не использовать библиотеки, а реализовать нужную логику самому.