Arduino程序停止工作后1秒

Arduino Program Stop Working after 1 sec

本文关键字:1秒 停止工作 程序 Arduino      更新时间:2023-10-16

我有一个程序,应该在4个步骤中同时打开4个led:

  1. 4个led在10mv的PMW下开启500 ms。
  2. 4个led在250mv的PMW下开启500 ms。
  3. 4个led在50mv的PMW下开启500 ms。
  4. 4个led使用PMW为0mv值开启500 ms。

程序使1型和2型,然后停止工作,led保持在250mv。

我试图改变前两步的持续时间,但它总是在前两步完成后停止,而不继续第三步和第四步。

我使用面向对象编程,所以请耐心的代码;实际上最重要的类是Effect和Motor。

Node.cpp:这个类创建一个由振幅和持续时间定义的节点,例如:振幅:10mv持续时间:500ms

#include "Arduino.h"
#include "Node.h"
Node::Node(){}
Node::~Node(){}
int Node::getAmplitude()
    {
    return  _amplitude;
    }
unsigned long Node::getDuration()
    {
    return  _duration;
    }
void Node::setPatternNode(int amplitude,unsigned long duration)
    {
    _amplitude=amplitude;
    _duration=duration;
    }

Pattern.cpp:这个类创建一个节点数组,最初创建的结果是一个特定的振动模式,例如:振幅{10,250,50,0}持续时间{500,500,500,500}

#include "Arduino.h"
#include "Pattern.h"
#include "Node.h"
#include "QueueArray.h"
#include "Motor.h"
Pattern::Pattern(){}
Pattern::~Pattern(){}
QueueArray <Node> Pattern::setPattern(int amplitude[4],unsigned long duration[4]){
    QueueArray <Node> queue;
    unsigned long nodeDurationSum = 0;
    for (int i=0;i<4;i++){
    Node node;
    nodeDurationSum = nodeDurationSum + duration[i]; //the reference for duration calculation is patternStartTime 
    node.setPatternNode(amplitude[i],nodeDurationSum);
    queue.enqueue(node);
    }
    return queue;
}

motor .cpp:该类将pattern类创建的模式影响到所选的电机。

#include "Arduino.h"
#include "Motor.h"
#include "QueueArray.h"
#include "Node.h"
#include "Pattern.h"

Motor::Motor()
    {
    }
Motor::Motor(int pin)
    {
        pinMode(pin, OUTPUT);
        _pin = pin;
    }
Motor::~Motor()
    {
    }

    void Motor::runMotor()
    {
        if(_isMotorActive){
        _currentTime=millis();//_currentTime is declared as "unsigned long"
        Serial.println(_currentTime);       
        if(_currentTime < _currentNode.getDuration())
            {
            analogWrite(_pin,_currentNode.getAmplitude());
            } 
        else 
            {
            if(_currentPattern.isEmpty())
               {
                _isMotorActive = false;
               }
             updateCurrentNode();
            }
        }
    }

    void Motor::motorSetPattern(QueueArray <Node> p)
    {
    _currentPattern = p;
    _isMotorActive = true;
    _patternStartTime = millis();//_patternStartTime is declared as "unsigned long"
    updateCurrentNode();
    }
int Motor::getCurrentPatternLength()
    {
    return _currentPattern.count();
    }

void Motor::updateCurrentNode()
    {
    _currentNode = _currentPattern.dequeue();
    }

Effect.cpp:该类运行1个以上电机,每个电机按照受影响的模式运行。

#include "Arduino.h"
#include "Effect.h"
#include "Motor.h"
Effect::Effect(){}
Effect::Effect(Motor m1,Motor m2,Motor m3,Motor m4,QueueArray <Node> p1,QueueArray <Node> p2,QueueArray <Node> p3,QueueArray <Node> p4)
    {
    _vibmotor1=m1;
    _vibmotor2=m2;
    _vibmotor3=m3;
    _vibmotor4=m4;
    _motorPattern1 = p1;
    _motorPattern2 = p2;
    _motorPattern3 = p3;
    _motorPattern4 = p4;
    _vibmotor1.motorSetPattern(_motorPattern1);
    _vibmotor2.motorSetPattern(_motorPattern2);
    _vibmotor3.motorSetPattern(_motorPattern3);
    _vibmotor4.motorSetPattern(_motorPattern4);
    }
Effect::~Effect()
    {
    }

void Effect::runEffect()
    {
    _vibmotor1.runMotor();
    _vibmotor2.runMotor();      
    _vibmotor3.runMotor();      
    _vibmotor4.runMotor();      
    }

这是arduino草图:

#include <Effect.h>
#include <Motor.h>
#include <Node.h>
#include <Pattern.h>
#include <QueueArray.h>
Motor vibmotor1(3);
Motor vibmotor2(5);
Motor vibmotor3(6);
Motor vibmotor4(9);
Pattern pattern;
int amplitude1[4] = {10,250,50,0};
unsigned long duration1[4] = {500,500,500,500};
int amplitude2[4] = {10,250,50,0};
unsigned long duration2[4] = {500,500,500,500};
int amplitude3[4] = {10,250,50,0};
unsigned long duration3[4] = {500,500,500,500};
int amplitude4[4] = {10,250,50,0};
unsigned long duration4[4] = {500,500,500,500};
QueueArray <Node> p1 = pattern.setPattern(amplitude1,duration1);
QueueArray <Node> p2 = pattern.setPattern(amplitude2,duration2);
QueueArray <Node> p3 = pattern.setPattern(amplitude3,duration3);
QueueArray <Node> p4 = pattern.setPattern(amplitude4,duration4);
Effect effect1(vibmotor1,vibmotor2,vibmotor3,vibmotor4,p1,p2,p3,p4);
void setup()
{
 Serial.begin(9600);
}  

void loop()
 {
   effect1.runEffect(); 
 }

在您的void Motor::run()millis()填充_currentTime但它给你的时间,因为arduino开始,而不是因为Effect::runEffect()开始。所以它可能已经比你第一次效应的持续时间要长了。尝试存储第一次调用runEffect()时的实际开始时间,并将其用作_currentTime

的偏移量。

例如在你的runMotor()

void Motor::runMotor()
{
       if(_firstRun == true)
       {
           _startTime = millis();
           _firstRun = false;
       }
       ...your code...
       _currentTime = millis() - _startTime;
       ...your code...
}

这正是我注意到的。先试试这个。