I am starting creating building blocks which I will use to create future projects based on the Trinket.
Let's say I have an application running on my micro controller which have 5 states.
I need to be able to see in which state the app is and switch to the next state
I will use the on board led to represent the 5 states as
- No light
- Dim light
- Bright light
- Led flashing quickly
- Led flashing slowly
See Video
Source Code (The source code has been greatly improved in Part II)
/*
Implement a 5 state button. By clicking on the button the button activate one
of the 5 state. A led display the 5 states.
States
0 - No ligth
1 - Dim light
2 - Bright ligt
3 - Led flashing quickly
4 - Led flashing slowly
based on video Tutorial 02 for Arduino: Buttons, PWM, and Functions
https://www.youtube.com/watch?v=_LCCGFSMOr4
http://arduino.cc/en/Reference/HomePage
Torres Frederic 2014.12.12
*/
#include "fArduino.h"
const int SWITCH_PIN = 0;
const int LED_PIN = 1; // Red LED on the Trinket
const int LED_LIGTH_STEP_VALUES[] = { 0, 20, 200, 255, 255 }; // Define the led intensity, 255 we will blink
const int LED_BLINKING_RATES[] = { 100, 300 };
int _ledLevelIndex = 0;
const int _blinking1LevelIndex = 3;
const int _blinking2LevelIndex = 4;
boolean _blinkingOn = false;
boolean _buttonLastStateInLoop = false;
BoardClass Board;
void setup() {
Board.SetPinMode(SWITCH_PIN, INPUT);
Board.SetPinMode(LED_PIN, OUTPUT);
}
void loop() {
boolean buttonPressed = Board.GetButtonStateDebounced(SWITCH_PIN, _buttonLastStateInLoop);
int ledLevel = LED_LIGTH_STEP_VALUES[_ledLevelIndex];
if (buttonPressed == true && _buttonLastStateInLoop == false) {
_ledLevelIndex += 1;
ledLevel = LED_LIGTH_STEP_VALUES[_ledLevelIndex];
if (_ledLevelIndex >= ArraySize(LED_LIGTH_STEP_VALUES))
_ledLevelIndex = 0;
}
_buttonLastStateInLoop = buttonPressed;
if ((_ledLevelIndex == _blinking1LevelIndex) || (_ledLevelIndex == _blinking2LevelIndex)) {
_blinkingOn = !_blinkingOn;
Board.LedOn(LED_PIN, _blinkingOn, LED_BLINKING_RATES[_ledLevelIndex-3]);
}
else {
Board.LedSet(LED_PIN, ledLevel);
}
}
Next step, I will create a dedicated class name MultiStateButton, which can
- Manage the state
- Handle the user input
- Handle the user interface AKA the LED
- Support Next and Previous state button
- To implement the flashing light I use for now a delay(), which block the loop and is not good. I need to use a time counter to flash the light.
I am also using a C++ class named Board containing re-usable code, mostly to be able to write clean and maintainable code.
See my next blog post

No comments:
Post a Comment