#include <AccelStepper.h>

// Configurações do motor de passo
const int stepPin = 6; // Pino de passo => (PB3)
const int dirPin = 5;  // Pino de direção => (PB4)

const float motorResolution = 1.8;  // Resolução do motor em graus
const float gearRatio = 2.0;        // Relação de redução do motor
const float screwPitch = 2.0;       // Passo da rosca em mm

// Velocidade da plantadeira
const float planterSpeedKmH = 10.0; // Velocidade da plantadeira em km/h

AccelStepper stepper(AccelStepper::DRIVER, stepPin, dirPin);

void setup() {
  Serial.begin(9600);

  stepper.setMaxSpeed(1000);
  stepper.setAcceleration(500);
}

void loop() {
  float fertilizerRateKgHa, fertilizerRateKgAlq;
  float fertilizerFlowRateKgS;

  if (Serial.available() > 0) {
    fertilizerRateKgHa = Serial.parseFloat(); // Recebe dosagem em kg/ha do usuário

    // Converte dosagem de kg/ha para kg/alq
    fertilizerRateKgAlq = fertilizerRateKgHa * 0.0247105; // 1 hectare = 0.0247105 alqueires

    // Converte velocidade de km/h para m/s
    float planterSpeedMs = (planterSpeedKmH * 1000) / 3600;

    // Calcula a vazão do adubo em kg/s
    fertilizerFlowRateKgS = (fertilizerRateKgHa * planterSpeedMs) / 10000;

    // Calcula a velocidade do motor de passo em passos por segundo
    float stepsPerRevolution = (360 / motorResolution) * gearRatio;
    float stepSpeed = (fertilizerFlowRateKgS * stepsPerRevolution) / (screwPitch * 1000);

    // Define a velocidade do motor de passo
    stepper.setSpeed(stepSpeed);
  }

  // Atualiza a posição do motor
  stepper.runSpeed();
}
A4988