#include "AccelStepper.h"
AccelStepper stepper1(1,4,2);
const byte LED = 13; //定义LED引脚为数字引脚13
const byte BUTTON5 = 5; //定义按钮引脚为数字引脚5
const byte BUTTON12  = 12;

int stopstale =0;
bool runstale = false;
int old_val = 0; //定义一个变量来存储按钮的上一次状态
int steps =30000;
int runon=0;
int runondate=0;

// 任务的句柄
TaskHandle_t motorTaskHandle;
TaskHandle_t commandTaskHandle;
// 任务一:控制电机
void motorTask(void *parameter)
{
  // 设置电机的最大速度和加速度
  stepper1.setMaxSpeed(2000);
  stepper1.setAcceleration(2000);

  while (true)
  {
    // 让电机运行到目标位置
    stepper1.run();
    // 延时一毫秒
    vTaskDelay(1);
  }
  Serial2.println("Ending task 1");
  //vTaskDelete(NULL);
}

// 任务二:接收指令
void commandTask(void *parameter)
{
  // 用来存储指令的变量
  int command = 0;

  while (true)
  {
    // 从串口读取指令
    if (Serial1.available() > 0)
    {
      command = Serial1.parseInt();
      // 根据指令设置电机的目标位置
      stepper1.moveTo(command);
    }
    if(digitalRead(BUTTON5)==1){
      stepper1.move(steps);
    }
    if(digitalRead(BUTTON12)==1){
      stepper1.stop();
    // 延时一毫秒
    vTaskDelay(1);
  }
  Serial2.println("Ending task 2");
  //vTaskDelete(NULL);
  }
}

//初始化设置
void setup() {
  pinMode(LED, OUTPUT); //设置该引脚为输出模式
  pinMode(BUTTON5, INPUT); //设置该引脚为输入模式
  pinMode(BUTTON12, INPUT);
  stepper1.setMaxSpeed(1000.0);    // 1号电机最大速度500 
  stepper1.setAcceleration(2000.0);  // 1号电机加速度50.0
  //attachInterrupt(digitalPinToInterrupt(runstale), speedz, CHANGE);
  //attachInterrupt(digitalPinToInterrupt(BUTTON12), speedr, CHANGE);
  //xTaskCreate(task1,"task1",10000,NULL,1,NULL);
  //任务函数*带有任务名称字符串* *堆栈大小,单位为字节* *作为任务输入参数传递*  * * *任务优先级任务处理* 
  //xTaskCreate(task2,"task2",10000,NULL,2,NULL);
  Serial.begin(9600); 

    // 创建任务一,分配给核心0
  xTaskCreatePinnedToCore(
      motorTask,   // 任务函数
      "Motor",     // 任务名称
      10000,       // 堆栈大小
      NULL,        // 参数
      6,           // 优先级
      &motorTaskHandle, // 任务句柄
      0);          // 核心编号

  // 创建任务二,分配给核心1
  xTaskCreatePinnedToCore(
      commandTask, // 任务函数
      "Command",   // 任务名称
      10000,       // 堆栈大小
      NULL,        // 参数
      5,           // 优先级
      &commandTaskHandle, // 任务句柄
      1);          // 核心编号
 }


 //循环
void loop() {
 }



void speedr(){
  if(runon!=0&&stopstale==true){
    runon=runon-1;
  }else{
    runon=runondate;
  }
  
  stopstale=false;

 }
/*
void task1(void*parameter)
{
  while(1){
    if(digitalRead(BUTTON5)==1){
      stepper1.move(steps);
      while(stepper1.distanceToGo() != 0){
        stepper1.run(); 
        }     
      }
  }
}
  //vTaskDelete(NULL);

void task2(void*parameter)
{
  while(1)
  {
    if (digitalRead(BUTTON12)==1) {  
      stepper1.stop();
      digitalWrite(LED, HIGH); 
    }else{
      digitalWrite(LED, LOW); 
    }
    
  }
  //vTaskDelete(NULL);
}
*/

/*
#include <AccelStepper.h>

// 定义电机的步进数和引脚
#define MOTOR_STEPS 200
#define MOTOR_PIN1 2
#define MOTOR_PIN2 3
#define MOTOR_PIN3 4
#define MOTOR_PIN4 5

// 创建一个AccelStepper对象,使用FULL4WIRE模式
AccelStepper stepper = AccelStepper(FULL4WIRE, MOTOR_PIN1, MOTOR_PIN3, MOTOR_PIN2, MOTOR_PIN4);

// 定义一些常量和变量
const int BAUD_RATE = 9600; // 串口波特率
const int MAX_SPEED = 1000; // 电机的最大速度,单位为步/秒
const int ACCELERATION = 100; // 电机的加速度,单位为步/秒^2
String input = ""; // 用于存储串口接收到的字符串

void setup() {
  // 初始化串口和电机
  Serial.begin(BAUD_RATE);
  stepper.setMaxSpeed(MAX_SPEED);
  stepper.setAcceleration(ACCELERATION);
}

void loop() {
  // 如果串口有可用数据,读取并存储到input变量中
  if (Serial.available() > 0) {
    input = Serial.readString();
    input.trim(); // 去除字符串两端的空白字符
    Serial.println("收到指令: " + input); // 打印收到的指令
  }

  // 如果input不为空,根据指令控制电机
  if (input != "") {
    if (input == "F") { // 如果指令为F,表示向前转动
      stepper.setSpeed(MAX_SPEED); // 设置电机速度为最大速度
      stepper.runSpeed(); // 运行电机
    }
    else if (input == "B") { // 如果指令为B,表示向后转动
      stepper.setSpeed(-MAX_SPEED); // 设置电机速度为负的最大速度
      stepper.runSpeed(); // 运行电机
    }
    else if (input == "S") { // 如果指令为S,表示停止转动
      stepper.stop(); // 停止电机
      stepper.runToPosition(); // 运行到停止位置
    }
    else { // 如果指令不是F、B或S,表示无效指令
      Serial.println("无效指令,请输入F、B或S"); // 打印错误信息
    }
    input = ""; // 清空input变量,等待下一次接收指令
  }
}



#include <Arduino.h>
#include <AccelStepper.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>

// 电机的引脚
#define STEP_PIN 13
#define DIR_PIN 14

// 电机的对象
AccelStepper stepper(AccelStepper::DRIVER, STEP_PIN, DIR_PIN);

// 任务的句柄
TaskHandle_t motorTaskHandle;
TaskHandle_t commandTaskHandle;

// 串口的对象
HardwareSerial Serial1(1);
HardwareSerial Serial2(2);

// 任务一:控制电机
void motorTask(void *parameter)
{
  // 设置电机的最大速度和加速度
  stepper.setMaxSpeed(1000);
  stepper.setAcceleration(500);

  while (true)
  {
    // 让电机运行到目标位置
    stepper.run();
    // 延时一毫秒
    vTaskDelay(1);
  }
  Serial2.println("Ending task 1");
  vTaskDelete(NULL);
}

// 任务二:接收指令
void commandTask(void *parameter)
{
  // 用来存储指令的变量
  int command = 0;

  while (true)
  {
    // 从串口读取指令
    if (Serial1.available() > 0)
    {
      command = Serial1.parseInt();
      // 根据指令设置电机的目标位置
      stepper.moveTo(command);
    }
    // 延时一毫秒
    vTaskDelay(1);
  }
  Serial2.println("Ending task 2");
  vTaskDelete(NULL);
}

void setup()
{
  // 初始化串口
  Serial1.begin(9600, SERIAL_8N1, 16, 17); // 串口1,用于接收指令
  Serial2.begin(115200, SERIAL_8N1, 4, 5); // 串口2,用于打印信息

  // 创建任务一,分配给核心0
  xTaskCreatePinnedToCore(
      motorTask,   // 任务函数
      "Motor",     // 任务名称
      10000,       // 堆栈大小
      NULL,        // 参数
      6,           // 优先级
      &motorTaskHandle, // 任务句柄
      0);          // 核心编号

  // 创建任务二,分配给核心1
  xTaskCreatePinnedToCore(
      commandTask, // 任务函数
      "Command",   // 任务名称
      10000,       // 堆栈大小
      NULL,        // 参数
      5,           // 优先级
      &commandTaskHandle, // 任务句柄
      1);          // 核心编号
}

void loop()
{
  // 不需要在这里写任何代码
}
*/
A4988