Arduino程序停止工作后1秒
Arduino Program Stop Working after 1 sec
我有一个程序,应该在4个步骤中同时打开4个led:
- 4个led在10mv的PMW下开启500 ms。
- 4个led在250mv的PMW下开启500 ms。
- 4个led在50mv的PMW下开启500 ms。
- 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...
}
这正是我注意到的。先试试这个。
相关文章:
- Visual Studio 2017 停止工作,并在打开后显示许多控制台窗口
- 自 Windows 10 20H1 以来,具有单独线程的多个窗口停止工作
- C++代码停止工作错误使用cout内部函数
- LoadImage 在 Windows 更新后停止工作
- C++程序工作,但 Windows 显示"程序.exe已停止工作"
- VS 代码 C/C++ 智能感知在更新后停止工作
- 不使用与左右停止工作命名空间 std 的简单比较
- 为什么通过定义另一个指针单元格,整个代码停止工作?
- 德拉吉诺 LG01-S 收到异常数据包并停止工作
- G++ 在生成文件中使用时停止工作
- 当循环在条件C++之前停止工作时
- GCC:--静态链接到pthread的整个存档配方在最近的GCC版本中停止工作
- 正则表达式代码无缘无故停止工作
- 我的代码在第 4 个选择后停止工作
- 读取二进制文件大小的短自上周以来停止工作
- C++ 已停止工作静态映射函数
- Vscode 自动格式化代码在运行几次后停止工作
- 无限循环在5到10秒后停止工作
- 程序给出程序.exe启动后约4秒停止工作
- Arduino程序停止工作后1秒