This sketch is used by Exercise: Event-Loop Programming and Exercise: Resolution and Mapping.
The full code is all in one file EventLoopDemo.ino.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | // EventLoopDemo.ino : demonstrate generation of two simultaneous square waves at different rates
// The example program generates audio-frequency square waves at different
// pitches on pins 4 and 5 to demonstrate a simple event-loop control structure
// allowing parallel execution of two timed tasks. The exercise asks the
// student to add an analog potentiometer input and use the input value to
// modulate the pitch by varying the waveform timing.
// Define the pin numbers on which the outputs are generated.
const int outputPin1 = 4;
const int outputPin2 = 5;
/****************************************************************/
// This function is called once after reset to initialize the program.
void setup()
{
// Initialize the digital output pins to output drive mode.
pinMode( outputPin1, OUTPUT );
pinMode( outputPin2, OUTPUT );
}
/****************************************************************/
// Global variables.
long next_output_time_1 = 0; // timestamp in microseconds for when next to update output 1
long next_output_time_2 = 0; // timestamp in microseconds for when next to update output 2
long output_interval_1 = 500; // interval in microseconds between output 1 updates
long output_interval_2 = 700; // interval in microseconds between output 2 updates
int output_state_1 = LOW; // current state of output 1
int output_state_2 = LOW; // current state of output 2
/****************************************************************/
// This function is called repeatedly as fast as possible from within the
// built-in library to poll program events.
void loop()
{
// read the current time in microseconds
long now = micros();
// Polled task 1 for output 1. Check if the next_output_time_1 timestamp has
// been reached; if so then update the output 1 state.
if (now > next_output_time_1) {
// reset the timer for the next polling point
next_output_time_1 = now + output_interval_1;
// toggle the output_state_1 variable
output_state_1 = !output_state_1;
// update output pin 1 with the new value
digitalWrite( outputPin1, output_state_1 );
}
// Polled task 2 for output 2. Check if the next_output_time_2 timestamp has
// been reached; if so then update the output 2 state.
if (now > next_output_time_2) {
// reset the timer for the next polling point
next_output_time_2 = now + output_interval_2;
// toggle the output_state_2 variable
output_state_2 = !output_state_2;
// update output pin 2 with the new value
digitalWrite( outputPin2, output_state_2 );
}
}
/****************************************************************/
|