...
Using IF statements: the easiest, most visual way to go for beginners.
Using a Switch-Case statement: a more compact and efficient way to go, to use when once you’re confortable comfortable with the why’s and how’s of the IF statement method.
Tip |
---|
Tutorial 11 gives a walkthrough of a similar program structure. |
Wiring schematics and complete presentation
...
Code Block | ||
---|---|---|
| ||
//*************************************************************************** // CrcDuino Tutorial05.1 - example of a sequential program structure for autonomous robots; using if statements //NOTE: In contrary to the other tutorials, the Normally Closed contact of the buttons and limit switch is used here. // This means that, when the button or switch is not press, "LOW" will be read since an electrical continuity to GND // is established. When they are pressed, the pin will therefore read "HIGH". // Why do we do that here, instead of the method using the NO contact? Just to show you that all paths lead to Rome :) //*************************************************************************** #include <CrcLib.h> //Renaming pins with significant names #define NEXT_STEP_ODD CRC_DIG_1 #define NEXT_STEP_EVEN CRC_DIG_2 using namespace Crc; //Variable declaration //Step management variables bool stepSleep = LOW; bool step1 = LOW; bool step2 = LOW; bool step3 = LOW; //*************************************************************************** void setup() { CrcLib::Initialize(); Serial.begin(2000000); //Start the Serial Monitor communication for on computer screen display, at a high baud rate for faster code execution CrcLib::SetDigitalPinMode(NEXT_STEP_ODD,INPUT); //Digital ports need to be tell wether they are used as inputs or outputs CrcLib::SetDigitalPinMode(NEXT_STEP_EVEN,INPUT); //We want to be in sleep mode upon startup stepSleep = HIGH; step1 = LOW; step2 = LOW; step3 = LOW; } //*************************************************************************** void loop() { CrcLib::Update(); //We continuously want to print on serial monitor the state of our program (what step it's in) //So we will print at every program scan ( a scan being an exectuion of "loop()" //Remember: LOW means "0", and HIGH means "anything but "0" Serial.print("stepSleep: "); Serial.print(stepSleep); Serial.print(" step1: "); Serial.print(step1); Serial.print(" step2: "); Serial.print(step2); Serial.print(" step3: "); Serial.print(step3); Serial.print(" scan time: "); Serial.println( CrcLib::GetDeltaTimeMicros() ); //Print the value returned by GetDeltaTime, which is the scan time //------------------ if(stepSleep) { //The code you'd want to execute during stepSleep would go here //When the step exiting condition is met (we press the button/switch and the other one is not pressed)... if( CrcLib::GetDigitalInput(NEXT_STEP_ODD) == HIGH && CrcLib::GetDigitalInput(NEXT_STEP_EVEN) == LOW) { //...we change the steps configuration to take another branch ( if() statement ) during the next scans stepSleep = LOW; step1 = HIGH; step2 = LOW; step3 = LOW; } } //------------------ if(step1) { //The code you'd want to execute during step1 would go here //When the step exiting condition is met (we press the button/switch and the other one is not pressed)... if( CrcLib::GetDigitalInput(NEXT_STEP_EVEN) == HIGH && CrcLib::GetDigitalInput(NEXT_STEP_ODD) == LOW ) { //...we change the steps configuration to take another branch ( if() statement ) during the next scans stepSleep = LOW; step1 = LOW; step2 = HIGH; step3 = LOW; } } //------------------ if(step2) { //The code you'd want to execute during step2 would go here //When the step exiting condition is met (we press the button/switch and the other one is not pressed)... if( CrcLib::GetDigitalInput(NEXT_STEP_ODD) && CrcLib::GetDigitalInput(NEXT_STEP_EVEN) == LOW ) { stepSleep = LOW; step1 = LOW; step2 = LOW; step3 = HIGH; } } //------------------ if(step3) { //The code you'd want to execute during step3 would go here //When the step exiting condition is met (we press the button/switch and the other one is not pressed)... if( CrcLib::GetDigitalInput(NEXT_STEP_EVEN) == HIGH && CrcLib::GetDigitalInput(NEXT_STEP_ODD) == LOW ) { //...we change the steps configuration to take another branch ( if() statement ) during the next scans stepSleep = HIGH; step1 = LOW; step2 = LOW; step3 = LOW; } } //------------------ } |
Code - Using a Switch-Case statement
Download the Arduino IDE .ino file:
View file | ||
---|---|---|
|
This is a transcript of the code:
Code Block | ||
---|---|---|
| ||
//***************************************************************************
// CrcDuino Tutorial05.2 - example of a sequential program structure for autonomous robots; using a Switch-Case statement
//NOTE: In contrary to the other tutorials, the Normally Closed contact of the buttons and limit switch is used here.
// This means that, when the button or switch is not press, "LOW" will be read since an electrical continuity to GND
// is established. When they are pressed, the pin will therefore read "HIGH".
// Why do we do that here, instead of the method using the NO contact? Just to show you that all paths lead to Rome :)
//***************************************************************************
#include <CrcLib.h>
//Renaming pins with significant names
#define NEXT_STEP_ODD CRC_DIG_1
#define NEXT_STEP_EVEN CRC_DIG_2
using namespace Crc;
int currentStep = 0; //Step management variable
//***************************************************************************
void setup() {
CrcLib::Initialize();
Serial.begin(2000000); //Start the Serial Monitor communication for on computer screen display, at a high baud rate for faster code execution
CrcLib::SetDigitalPinMode(NEXT_STEP_ODD,INPUT); //Digital ports need to be tell wether they are used as inputs or outputs
CrcLib::SetDigitalPinMode(NEXT_STEP_EVEN,INPUT);
currentStep = 0; //We want to be in sleep mode upon startup
}
//***************************************************************************
void loop() {
CrcLib::Update();
//We continuously want to print on serial monitor the state of our program (what step it's in)
//So we will print at every program scan ( a scan being an exectuion of "loop()"
//Remember: LOW means "0", and HIGH means "anything but "0"
Serial.print("Step currently executed "); Serial.print(currentStep);
Serial.print(" scan time: "); Serial.println( CrcLib::GetDeltaTimeMicros() ); //Print the value returned by GetDeltaTime, which is the scan time
switch(currentStep)
{
//------------------
case 0:
//The code you'd want to execute during Step0 would go here
if( CrcLib::GetDigitalInput(NEXT_STEP_ODD) == HIGH && CrcLib::GetDigitalInput(NEXT_STEP_EVEN) == LOW)
{
currentStep = 1;
}
break;
//------------------
case 1:
//The code you'd want to execute during Step1 would go here
if( CrcLib::GetDigitalInput(NEXT_STEP_EVEN) == HIGH && CrcLib::GetDigitalInput(NEXT_STEP_ODD) == LOW )
{
currentStep = 2;
}
break;
//------------------
case 2:
//The code you'd want to execute during Step2 would go here
if( CrcLib::GetDigitalInput(NEXT_STEP_ODD) == HIGH && CrcLib::GetDigitalInput(NEXT_STEP_EVEN) == LOW )
{
currentStep = 3;
}
break;
//------------------
case 3:
//The code you'd want to execute during Step3 would go here
if( CrcLib::GetDigitalInput(NEXT_STEP_EVEN) == HIGH && CrcLib::GetDigitalInput(NEXT_STEP_ODD) == LOW )
{
currentStep = 0;
}
break;
//------------------
}
} |