Вы не должны блокировать функцию loop
в Arduino. Если вы посмотрите, как определяется main
(<arduino_install_dir>\hardware\arduino\avr\cores\arduino\main.cpp
), вы увидите:
int main(void)
{
init();
initVariant();
#if defined(USBCON)
USBDevice.attach();
#endif
setup();
for (;;) {
loop();
if (serialEventRun) serialEventRun();
}
return 0;
}
Если вы заблокируете первый вызов l oop с помощью while (true)
, вы не получите serialEventRun
шанс быть названным. Насколько я могу судить, он используется для обработки последовательных событий.
Так что да, глобальных переменных, как правило, следует избегать. Однако из-за того, что скетч Arduino разработан для небольших программ, я могу сказать, что вам следует придерживаться рекомендуемого стиля глобальных переменных Arduino + setup
+ loop
.
Что вы можете сделать, чтобы облегчить это, - это организовать свои код в классы, которые абстрагируют вашу модель. Например, если вы управляете двигателем вместо:
#define DRIVER_EN 5
#define DRIVER_DIR 6
#define DRIVER_PUL 7
int motor_microstepping;
int motor_gear_ratio;
void setup()
{
motor_microstepping = 8;
motor_gear_ratio = 2;
pinMode(DRIVER_EN, OUTPUT);
pinMode(DRIVER_DIR, OUTPUT);
pinMode(DRIVER_PUL, OUTPUT);
digitalWrite(DRIVER_EN, LOW);
}
, я создал класс для своего контроллера двигателя. Вот как это используется:
using namespace em::physics::literals;
em::motor::TB6600 slider_motor{
5, // EN
6, // DIR
7, // PUL
1.8_deg, // pulse_angle
8, // microstepping
1, // gear ratio
};
void setup()
{
slider_motor.setup();
}
void loop()
{
// ...
slider_motor.enable();
slider_motor.set_direction_low();
//...
}