mirror of
https://github.com/RobTillaart/Arduino.git
synced 2024-10-03 18:09:02 -04:00
0.2.0 HeartBeat
This commit is contained in:
parent
0832418993
commit
258ef3276d
@ -2,6 +2,10 @@ compile:
|
||||
# Choosing to run compilation tests on 2 different Arduino platforms
|
||||
platforms:
|
||||
- uno
|
||||
- leonardo
|
||||
- due
|
||||
- zero
|
||||
# - due
|
||||
# - zero
|
||||
# - leonardo
|
||||
- m4
|
||||
- esp32
|
||||
# - esp8266
|
||||
# - mega2560
|
||||
|
@ -4,10 +4,14 @@ name: Arduino CI
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
arduino_ci:
|
||||
runTest:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: Arduino-CI/action@master
|
||||
# Arduino-CI/action@v0.1.1
|
||||
- uses: ruby/setup-ruby@v1
|
||||
with:
|
||||
ruby-version: 2.6
|
||||
- run: |
|
||||
gem install arduino_ci
|
||||
arduino_ci.rb
|
||||
|
@ -1,7 +1,7 @@
|
||||
//
|
||||
// FILE: HeartBeat.cpp
|
||||
// AUTHOR: Rob Tillaart
|
||||
// VERSION: 0.1.3
|
||||
// VERSION: 0.2.0
|
||||
// PURPOSE: Arduino library for HeartBeat with frequency and dutyCycle
|
||||
// DATE: 2019-06-12
|
||||
// URL: https://github.com/RobTillaart/HeartBeat
|
||||
@ -12,6 +12,10 @@
|
||||
// 0.1.2 2021-01-15 renamed all to HeartBeat
|
||||
// added dutyCycle
|
||||
// 0.1.3 2021-05-27 fix arduino-lint
|
||||
// 0.2.0 2021-11-02 update Build-CI, add badges
|
||||
// add getFrequency(), getDutyCycle();
|
||||
// add getState().
|
||||
// removed set()
|
||||
|
||||
|
||||
#include "HeartBeat.h"
|
||||
@ -19,7 +23,6 @@
|
||||
|
||||
HeartBeat::HeartBeat()
|
||||
{
|
||||
_dutyCycle = 50;
|
||||
}
|
||||
|
||||
|
||||
@ -35,14 +38,15 @@ void HeartBeat::begin(const uint8_t pin, float frequency)
|
||||
|
||||
void HeartBeat::setFrequency(float frequency)
|
||||
{
|
||||
_frequency = abs(frequency);
|
||||
_frequency = frequency;
|
||||
if (_frequency < 0) _frequency = -frequency;
|
||||
if (_frequency < 0.001) _frequency = 0.001;
|
||||
_setFreqDuty();
|
||||
}
|
||||
|
||||
|
||||
void HeartBeat::setDutyCycle(float dutyCycle)
|
||||
{
|
||||
|
||||
_dutyCycle = constrain(dutyCycle, 0, 100); // percentage
|
||||
_setFreqDuty();
|
||||
}
|
||||
@ -50,29 +54,28 @@ void HeartBeat::setDutyCycle(float dutyCycle)
|
||||
|
||||
void HeartBeat::beat()
|
||||
{
|
||||
static uint8_t state = LOW;
|
||||
if (_running == false)
|
||||
{
|
||||
state = LOW;
|
||||
_state = LOW;
|
||||
}
|
||||
else
|
||||
{
|
||||
uint32_t now = micros();
|
||||
if ((state == LOW) && (now - _lastHeartBeat) < _dutyCycleLow) return;
|
||||
if ((state == HIGH) && (now - _lastHeartBeat) < _dutyCycleHigh) return;
|
||||
if ((_state == LOW) && (now - _lastHeartBeat) < _dutyCycleLow) return;
|
||||
if ((_state == HIGH) && (now - _lastHeartBeat) < _dutyCycleHigh) return;
|
||||
_lastHeartBeat = now;
|
||||
state = !state;
|
||||
_state = !_state;
|
||||
}
|
||||
digitalWrite(_pin, state);
|
||||
digitalWrite(_pin, _state);
|
||||
}
|
||||
|
||||
|
||||
/////////////////////////////////
|
||||
|
||||
|
||||
//
|
||||
// PRIVATE
|
||||
//
|
||||
void HeartBeat::_setFreqDuty()
|
||||
{
|
||||
_lastHeartBeat = 0;
|
||||
float time = 10000.0/_frequency;
|
||||
_dutyCycleHigh = round(_dutyCycle * time);
|
||||
_dutyCycleLow = round((100 - _dutyCycle) * time);
|
||||
@ -80,3 +83,4 @@ void HeartBeat::_setFreqDuty()
|
||||
|
||||
|
||||
// -- END OF FILE --
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
//
|
||||
// FILE: HeartBeat.h
|
||||
// AUTHOR: Rob Tillaart
|
||||
// VERSION: 0.1.3
|
||||
// VERSION: 0.2.0
|
||||
// PURPOSE: Arduino library for HeartBeat with frequency and dutyCycle
|
||||
// DATE: 2019-06-12
|
||||
// URL: https://github.com/RobTillaart/HeartBeat
|
||||
@ -10,34 +10,40 @@
|
||||
|
||||
#include "Arduino.h"
|
||||
|
||||
#define HEARTBEAT_LIB_VERSION (F("0.1.3"))
|
||||
#define HEARTBEAT_LIB_VERSION (F("0.2.0"))
|
||||
|
||||
|
||||
class HeartBeat
|
||||
{
|
||||
public:
|
||||
HeartBeat();
|
||||
|
||||
void begin(const uint8_t pin, float frequency = 1.0);
|
||||
void setFrequency(float frequency = 1.0);
|
||||
void setDutyCycle(float dutyCycle = 50);
|
||||
void begin(const uint8_t pin, float frequency = 1.0);
|
||||
|
||||
void setFrequency(float frequency = 1.0);
|
||||
void setDutyCycle(float dutyCycle = 50);
|
||||
float getFrequency() { return _frequency; };
|
||||
float getDutyCycle() { return _dutyCycle; };
|
||||
|
||||
inline void enable() { _running = true; };
|
||||
inline void disable() { _running = false; };
|
||||
|
||||
void beat();
|
||||
|
||||
// OBSOLETE in next release
|
||||
void set(float frequency = 1.0) { setFrequency(frequency); };
|
||||
void beat();
|
||||
uint8_t getState() { return _state; };
|
||||
|
||||
protected:
|
||||
void _setFreqDuty();
|
||||
float _frequency;
|
||||
float _dutyCycle;
|
||||
uint32_t _lastHeartBeat;
|
||||
uint32_t _dutyCycleHigh;
|
||||
uint32_t _dutyCycleLow;
|
||||
bool _running;
|
||||
uint8_t _pin;
|
||||
|
||||
float _frequency = 1.0;
|
||||
float _dutyCycle = 50;
|
||||
|
||||
uint32_t _lastHeartBeat = 0;
|
||||
uint32_t _dutyCycleHigh = 500;
|
||||
uint32_t _dutyCycleLow = 500;
|
||||
|
||||
bool _running = false;
|
||||
uint8_t _pin = 255;
|
||||
uint8_t _state = LOW;
|
||||
};
|
||||
|
||||
|
||||
|
@ -1,18 +1,20 @@
|
||||
|
||||
[![Arduino CI](https://github.com/RobTillaart/HeartBeat/workflows/Arduino%20CI/badge.svg)](https://github.com/marketplace/actions/arduino_ci)
|
||||
[![Arduino-lint](https://github.com/RobTillaart/HeartBeat/actions/workflows/arduino-lint.yml/badge.svg)](https://github.com/RobTillaart/HeartBeat/actions/workflows/arduino-lint.yml)
|
||||
[![JSON check](https://github.com/RobTillaart/HeartBeat/actions/workflows/jsoncheck.yml/badge.svg)](https://github.com/RobTillaart/HeartBeat/actions/workflows/jsoncheck.yml)
|
||||
[![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](https://github.com/RobTillaart/HeartBeat/blob/master/LICENSE)
|
||||
[![GitHub release](https://img.shields.io/github/release/RobTillaart/HeartBeat.svg?maxAge=3600)](https://github.com/RobTillaart/HeartBeat/releases)
|
||||
|
||||
|
||||
# HeartBeat
|
||||
|
||||
Arduino library for a HeartBeat with frequency and dutycycle
|
||||
Arduino library for a HeartBeat with frequency and duty cycle.
|
||||
|
||||
|
||||
## Description
|
||||
|
||||
The hearbeat library offers a simple HeartBeat by sending pulses to
|
||||
a digital pin. Typical usage is to blink a (built in) LED as indicater
|
||||
The heartbeat library offers a simple HeartBeat by sending pulses to
|
||||
a digital pin. Typical usage is to blink a (built in) LED as indicator
|
||||
a program is still alive.
|
||||
|
||||
The library uses no hardware timer and is based upon micros() so the user
|
||||
@ -24,35 +26,39 @@ can be used as a first level debugging tool. Different frequencies can indicate
|
||||
a different state of the program or a different level of some sensor.
|
||||
No heart beat indicates the program is stuck or blocked.
|
||||
|
||||
The current version does not allow to differ the ON and OFF time,
|
||||
this might be an option in a future version.
|
||||
|
||||
For more complex patterns, please check my pulsePattern library.
|
||||
|
||||
|
||||
## Interface
|
||||
|
||||
The interface consists of a small set of
|
||||
The interface consists of the following functions:
|
||||
|
||||
- **HeartBeat()** constructor
|
||||
- **begin(uint8_t pin, float freq)** to configure the HeartBeat.
|
||||
- **void begin(uint8_t pin, float frequency)** to configure the HeartBeat.
|
||||
The default frequency is 1.0
|
||||
- **setFrequency(float freq)** change the frequency of the pulsing.
|
||||
Will not enable or disable the HeartBeat. Must be > 0.0
|
||||
- **setDutyCycle(float dutyCycle = 50)** duty cycle in percentage time HIGH.
|
||||
Must be between 0.00 and 100.0.
|
||||
- **enable()** enable the pulsing
|
||||
- **disable()** disable the pulsing; will switch of the LED.
|
||||
- **beat()** the worker; this function checks if the HeartBeat is enabled
|
||||
- **void setFrequency(float frequency)** change the frequency of the pulsing.
|
||||
Will not enable or disable the HeartBeat.
|
||||
Must be > 0.001 otherwise it will be constrained to 0.001.
|
||||
On the upper side values beyond 10 Hz are hard for humans but are allowed.
|
||||
- **void setDutyCycle(float dutyCycle = 50)** duty cycle in percentage time HIGH.
|
||||
Must be between 0.00 and 100.0. A value of 0 will put the heartbeat effectively off.
|
||||
- **float getFrequency()** returns set frequency (or constrained value).
|
||||
- **float getDutyCycle()** returns set duty cycle (or constrained value).
|
||||
- **void enable()** enable the pulsing.
|
||||
- **void disable()** disable the pulsing; will switch of the LED.
|
||||
- **void beat()** the worker; this function checks if the HeartBeat is enabled
|
||||
and the LED must be toggled.
|
||||
It must be called as often as possible to keep a steady pace,
|
||||
at least 4 times the given frequency.
|
||||
Not calling **beat()** effectively stops the hearbeat.
|
||||
Not calling **beat()** effectively stops the heartbeat.
|
||||
- **uint8_t getState()** returns the state of the heartbeat.
|
||||
Useful for debugging.
|
||||
|
||||
|
||||
#### Obsolete
|
||||
|
||||
- **set(float freq)** Will become obsolete, use **setFrequency()** instead.
|
||||
- **set(float freq)** is replaced by **setFrequency()**.
|
||||
|
||||
|
||||
## Applications
|
||||
|
||||
@ -62,13 +68,22 @@ Applications include but are not limited to
|
||||
- 1 Hz = OK
|
||||
- 2 Hz = Warning
|
||||
- 5 Hz = Error
|
||||
- indicate power usage by increasing HeartBeat e.g. round(amps)
|
||||
- indicate sound volume by increasing HeartBeat
|
||||
- indicate changing distant by hearbeat
|
||||
- geiger counter style.
|
||||
- no signal would indicate also an error.
|
||||
- indicate power e.g. round(amps) - you might need to map the range!
|
||||
- indicate the volume by increasing heartBeat
|
||||
- indicate a changing distant - increasing or decreasing.
|
||||
- Geiger counter style.
|
||||
|
||||
|
||||
## Operation
|
||||
|
||||
See examples
|
||||
|
||||
|
||||
## Future
|
||||
|
||||
- differentiate between ON / OFF time
|
||||
- improve documentation
|
||||
- add examples
|
||||
-
|
||||
|
||||
|
@ -16,8 +16,13 @@ void setup()
|
||||
Serial.println(__FILE__);
|
||||
Serial.println(HEARTBEAT_LIB_VERSION);
|
||||
|
||||
HB.begin(13, 3); // PIN 13 with frequency 3
|
||||
HB.setDutyCycle(10.0); // 10% time high
|
||||
HB.begin(13, 3); // PIN 13 with frequency 3
|
||||
HB.setDutyCycle(17.53);
|
||||
|
||||
Serial.print("FR: ");
|
||||
Serial.println(HB.getFrequency());
|
||||
Serial.print("DC: ");
|
||||
Serial.println(HB.getDutyCycle());
|
||||
}
|
||||
|
||||
|
||||
|
@ -19,6 +19,9 @@ void setup()
|
||||
HB[0].begin(11, 1);
|
||||
HB[1].begin(12, 3);
|
||||
HB[2].begin(13, 5);
|
||||
HB[0].setDutyCycle(20);
|
||||
HB[1].setDutyCycle(30);
|
||||
HB[2].setDutyCycle(40);
|
||||
}
|
||||
|
||||
|
||||
|
@ -31,7 +31,7 @@ void loop()
|
||||
{
|
||||
lastUpdate = millis();
|
||||
float f = 1.0 + 0.1 * random(50);
|
||||
HB.set(f);
|
||||
HB.setFrequency(f);
|
||||
}
|
||||
|
||||
// do other stuff here
|
||||
|
@ -9,8 +9,6 @@
|
||||
|
||||
HeartBeat HB;
|
||||
|
||||
int frequency = 1;
|
||||
|
||||
|
||||
void setup()
|
||||
{
|
||||
@ -18,7 +16,7 @@ void setup()
|
||||
Serial.println(__FILE__);
|
||||
Serial.println(HEARTBEAT_LIB_VERSION);
|
||||
|
||||
HB.begin(13, frequency);
|
||||
HB.begin(13, 1.0);
|
||||
}
|
||||
|
||||
|
||||
@ -26,9 +24,9 @@ void loop()
|
||||
{
|
||||
HB.beat();
|
||||
|
||||
float f = 5 * (1 + sin(millis()/10000));
|
||||
HB.set(f);
|
||||
|
||||
float frequency = 5 * (1 + sin(millis()/1000.0));
|
||||
HB.setFrequency(frequency);
|
||||
// Serial.println(frequency, 6);
|
||||
// do other stuff here
|
||||
}
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
# Syntax Coloring Map For HeartBeat
|
||||
# Syntax Colouring Map For HeartBeat
|
||||
|
||||
# Datatypes (KEYWORD1)
|
||||
# Data types (KEYWORD1)
|
||||
HeartBeat KEYWORD1
|
||||
|
||||
|
||||
@ -8,6 +8,8 @@ HeartBeat KEYWORD1
|
||||
begin KEYWORD2
|
||||
setFrequency KEYWORD2
|
||||
setDutyCycle KEYWORD2
|
||||
getFrequency KEYWORD2
|
||||
getDutyCycle KEYWORD2
|
||||
enable KEYWORD2
|
||||
disable KEYWORD2
|
||||
beat KEYWORD2
|
||||
|
@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "HeartBeat",
|
||||
"keywords": "HeartBeat, blinking led, polling",
|
||||
"description": "Arduino library for HeartBeat with frequency and dutyCycle.",
|
||||
"description": "Arduino library for HeartBeat with frequency and duty cycle.",
|
||||
"authors":
|
||||
[
|
||||
{
|
||||
@ -15,7 +15,7 @@
|
||||
"type": "git",
|
||||
"url": "https://github.com/RobTillaart/HeartBeat.git"
|
||||
},
|
||||
"version": "0.1.3",
|
||||
"version": "0.2.0",
|
||||
"license": "MIT",
|
||||
"frameworks": "arduino",
|
||||
"platforms": "*"
|
||||
|
@ -1,8 +1,8 @@
|
||||
name=HeartBeat
|
||||
version=0.1.3
|
||||
version=0.2.0
|
||||
author=Rob Tillaart <rob.tillaart@gmail.com>
|
||||
maintainer=Rob Tillaart <rob.tillaart@gmail.com>
|
||||
sentence=Arduino library for HeartBeat with frequency and dutyCycle.
|
||||
sentence=Arduino library for HeartBeat with frequency and duty cycle.
|
||||
paragraph=blinking led by frequent polling.
|
||||
category=Other
|
||||
url=https://github.com/RobTillaart/HeartBeat
|
||||
|
@ -49,7 +49,7 @@ unittest_teardown()
|
||||
|
||||
unittest(test_constructor)
|
||||
{
|
||||
fprintf(stderr, "VERSION: %s\n", HEARTBEAT_LIB_VERSION );
|
||||
fprintf(stderr, "VERSION: %s\n", (char *) HEARTBEAT_LIB_VERSION );
|
||||
|
||||
GodmodeState* state = GODMODE();
|
||||
state->reset();
|
||||
@ -79,6 +79,32 @@ unittest(test_constructor)
|
||||
}
|
||||
|
||||
|
||||
unittest(test_frequency)
|
||||
{
|
||||
HeartBeat HB;
|
||||
HB.begin(13, 4);
|
||||
|
||||
assertEqualFloat(4, HB.getFrequency(), 0.001);
|
||||
for (int fr = 1; fr < 10; fr++)
|
||||
{
|
||||
HB.setFrequency(fr);
|
||||
assertEqualFloat(fr, HB.getFrequency(), 0.001);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
unittest(test_dutycycle)
|
||||
{
|
||||
HeartBeat HB;
|
||||
HB.begin(13, 1);
|
||||
|
||||
for (int dc = 10; dc < 101; dc += 10)
|
||||
{
|
||||
HB.setDutyCycle(dc);
|
||||
assertEqualFloat(dc, HB.getDutyCycle(), 0.001);
|
||||
}
|
||||
}
|
||||
|
||||
unittest_main()
|
||||
|
||||
// --------
|
||||
|
Loading…
x
Reference in New Issue
Block a user