本文介绍了1秒后的Arduino程序停止工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个应该是在4个步骤同时打开4个LED的程序:


  1. 4个LED是否使用了PMW 10mv的值500毫秒开启。

  2. 4个LED是否使用PMW为250mV的值500毫秒开启。

  3. 4个LED是否使用PMW为50mV的一个价值500毫秒开启。

  4. 4个LED是否使用了PMW的为0mV值为500毫秒开启。

该程序使STPE 1和2,然后停止wotking和LED在250mV的继续。

我试图改变持续时间的前两个步骤,但经过前两个步骤完成,并且不要继续3和4,它总是停。

我用面向对象的编程所以请耐心等待与code;其实最重要的类是影响和电机。

Node.cpp:这个类创建它是由一个幅度和所选例如持续时间定义的节点:幅度:10mV的持续时间:500ms的

 的#includeArduino.h
#包括Node.h节点::节点(){}
节点::〜节点(){}INT节点:: getAmplitude()
    {
    返回_amplitude;
    }unsigned long类型节点:: getDuration()
    {
    返回_duration;
    }无效节点:: setPatternNode(INT幅度,符号持续时间长)
    {
    _amplitude =幅度;
    _duration =持续时间;
    }

Pattern.cpp:
这个类创建节点的数组最初创建导致振动例如一个特定的模式:幅度{} 10,250,50,0持续{} 500500500500

 的#includeArduino.h
#包括Pattern.h
#包括Node.h
#包括QueueArray.h
#包括Motor.h模式::模式(){}
模式::〜模式(){}QueueArray<节点>模式:: setPattern(INT振幅[4],无符号​​持续时间长[4]){
    QueueArray<节点>队列;
    无符号长nodeDurationSum = 0;
    对(INT I = 0; I&下; 4;我++){
    节点节点;
    nodeDurationSum = nodeDurationSum +持续时间[I] //持续时间计算的参考是patternStartTime
    node.setPatternNode(振幅[I],nodeDurationSum);
    queue.enqueue(节点);
    }
    返回队列中;
}

Motor.cpp:此类影响由类模式产生的图案(多个)所选择的马达(多个)

 的#includeArduino.h
#包括Motor.h
#包括QueueArray.h
#包括Node.h
#包括Pattern.h
电机马达::()
    {
    }电机马达::(INT引脚)
    {
        pinMode(针,OUTPUT);
        _pin =针;
    }汽车::〜电机()
    {
    }
    无效电机:: runMotor()
    {
        如果(_isMotorActive){
        _currentTime =米利斯(); // _ currentTime的声明为无符号长
        Serial.println(_currentTime);
        如果(_currentTime&下; _currentNode.getDuration())
            {
            analogWrite(_pin,_currentNode.getAmplitude());
            }
        其他
            {
            如果(_currentPattern.isEmpty())
               {
                _isMotorActive = FALSE;
               }
             updateCurrentNode();
            }        }    }
    空隙电机:: motorSetPattern(QueueArray&所述;节点指p)
    {
    _currentPattern = P;
    _isMotorActive = TRUE;
    _patternStartTime =米利斯(); // _ patternStartTime被声明为无符号长
    updateCurrentNode();
    }INT电机:: getCurrentPatternLength()
    {
    返回_currentPattern.count();
    }
无效电机:: updateCurrentNode()
    {
    _currentNode = _currentPattern.dequeue();
    }

Effect.cpp:该类运行超过1个电机,每台电机运行模式向谁受影响以下

 的#includeArduino.h
#包括Effect.h
#包括Motor.h效果::效应(){}效果::效应(电动机M1,马达M2,马达M3,马达M4,QueueArray&所述;节点> P1,QueueArray&所述;节点> P2,QueueArray&所述;节点> P3,QueueArray&所述;节点> P4)
    {
    _vibmotor1 = M1;
    _vibmotor2 = 2;
    _vibmotor3 =立方米;
    _vibmotor4 = M4;    _motorPattern1 = P1;
    _motorPattern2 = P2;
    _motorPattern3 = P3;
    _motorPattern4 = P4;    _vibmotor1.motorSetPattern(_motorPattern1);
    _vibmotor2.motorSetPattern(_motorPattern2);
    _vibmotor3.motorSetPattern(_motorPattern3);
    _vibmotor4.motorSetPattern(_motorPattern4);
    }效果::〜效应()
    {
    }
空效应:: runE​​ffect()
    {
    _vibmotor1.runMotor();
    _vibmotor2.runMotor();
    _vibmotor3.runMotor();
    _vibmotor4.runMotor();
    }

这是Arduino的草图:

 的#include< Effect.h>
#包括LT&;&Motor.h GT;
#包括LT&;&Node.h GT;
#包括LT&;&Pattern.h GT;
#包括LT&;&QueueArray.h GT;马达vibmotor1(3);
马达vibmotor2(5);
马达vibmotor3(6);
马达vibmotor4(9);花纹图案;INT amplitude1 [4] = {10,250,50,0};
无符号长工期[4] = {} 500500500500;
INT amplitude2 [4] = {10,250,50,0};
无符号长DURATION2 [4] = {} 500500500500;
INT amplitude3 [4] = {10,250,50,0};
无符号长duration3 [4] = {} 500500500500;
INT amplitude4 [4] = {10,250,50,0};
无符号长duration4 [4] = {} 500500500500;QueueArray<节点> P1 = pattern.setPattern(amplitude1,工期1);
QueueArray<节点> P2 = pattern.setPattern(amplitude2,DURATION2);
QueueArray<节点> P3 = pattern.setPattern(amplitude3,duration3);
QueueArray<节点> P4 = pattern.setPattern(amplitude4,duration4);效果EFFECT1(vibmotor1,vibmotor2,vibmotor3,vibmotor4,P1,P2,P3,P4);无效设置()
{
 Serial.begin(9600);
}
无效循环()
 {
   effect1.runEffect(); }


解决方案

在你的无效汽车::的run()
你填你 _currentTime 米利斯()
但它给你的时间,因为Arduino的开始,不是因为 ::影响runEffect()启动。所以它可能是已经比你的第一个效果的持续时间高。
尝试存储的实际出发时间,当你第一次调用 runE​​ffect(),并用它作为你的 _currentTime

例如在 runMotor()

 无效汽车:: runMotor()
{
       如果(_firstRun ==真)
       {
           _startTime =米利斯();
           _firstRun = FALSE;
       }       ...您的code ...       _currentTime =米利斯() - _startTime;       ...您的code ...
}

这正是我注意到了。试试吧,第一。如果我不帮助回来这么说。

I have a program that is supposed to turn on 4 LEDs simultaneously in 4 steps:

  1. the 4 LEDs are turned on for 500 ms using PMW for a value of 10mv.
  2. the 4 LEDs are turned on for 500 ms using PMW for a value of 250mv.
  3. the 4 LEDs are turned on for 500 ms using PMW for a value of 50mv.
  4. the 4 LEDs are turned on for 500 ms using PMW for a value of 0mv.

The program makes the stpe 1 and 2 and then it stops wotking and the LEDs keep on at 250mv.

I tried to change the duration for the first two steps but it always stops after these first two steps are done and don't continue the 3 and 4.

I used oriented object programming so please be patient with the code; actually the most important classes are Effect and Motor.

Node.cpp: this class creates a Node which is defined by an amplitude and a duration for the selected for example: amplitude: 10mv duration: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 :this class creates an array of Nodes created initially to result in a particular pattern of vibration for example: amplitude{10,250,50,0} duration{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: this class affects the pattern(s) created by the class Pattern to the selected motor(s).

#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: this class run more than 1 motor, each motor is run following the Pattern to whom it is affected.

#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();
    }

And this is the arduino sketch:

#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();

 }
解决方案

In your void Motor::run()you are filling your _currentTime with millis()But it is giving you the time since the arduino started and NOT since the Effect::runEffect() started. So it could be already higher than the duration of your first effect.Try to store the actual starting time when you first call runEffect() and use it as an offset for your _currentTime

For example in your runMotor()

void Motor::runMotor()
{
       if(_firstRun == true)
       {
           _startTime = millis();
           _firstRun = false;
       }

       ...your code...

       _currentTime = millis() - _startTime;

       ...your code...
}

That is just what i noticed. Try it that first. If i does not help come back and say so.

这篇关于1秒后的Arduino程序停止工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-22 18:55
查看更多