问题描述
我有一个应该是在4个步骤同时打开4个LED的程序:
- 4个LED是否使用了PMW 10mv的值500毫秒开启。
- 4个LED是否使用PMW为250mV的值500毫秒开启。
- 4个LED是否使用PMW为50mV的一个价值500毫秒开启。
- 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);
}效果::〜效应()
{
}
空效应:: runEffect()
{
_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()
启动。所以它可能是已经比你的第一个效果的持续时间高。
尝试存储的实际出发时间,当你第一次调用 runEffect()
,并用它作为你的 _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:
- the 4 LEDs are turned on for 500 ms using PMW for a value of 10mv.
- the 4 LEDs are turned on for 500 ms using PMW for a value of 250mv.
- the 4 LEDs are turned on for 500 ms using PMW for a value of 50mv.
- 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程序停止工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!