1秒后的Arduino程序停止工作 [英] Arduino Program Stop Working after 1 sec

查看:553
本文介绍了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 <偏移/ p>

例如在 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程序停止工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆