Bird cage LED daylight simulation system (6 / 10 steg)
Steg 6: Strukturera koden: Ange maskin & uppgifter
Jag brukade programmering på högre nivå språk, med stor stödjande ramverk... på grund av detta kände jag ett behov av några extra struktur i min kod.
Mjuk Timer
För att programmera som det finns flera uppgifter körs samtidigt, använde jag mjuka Timer bibliotek. Med detta bibliotek förhindrar att ha en "Gud" loop metod som kontrollerar allt, och som kontrollerar flödet blir oläslig. Eller som skapare förklarar det:
SoftTimer aktiverar en högre nivå Arduino programmering, jet lätt att använda och lätta. Du ställs ofta inför problemet att du behöver att föröka aktiviteter på samma gång. I SoftTimer skapar sätt programmerare aktiviteter som körs med jämna mellanrum.
När du använder SoftTimer genomför du inte "loop" funktionen av Arduino. All kod körs event driven, alla processer som körs asynkront, ingen mer blockerande koden (som behövs för delay()).
Observera att du offra förutsägbarhet i din timing, i mitt projekt detta ingen spelar roll... men om hårt realtid behövs, Använd bibliotek gillar inte detta!
Statliga maskin:
En annan sak jag la för struktur är en tillståndsdator.
Eftersom enheten kan endast vara i en stat på en enda gång, och koden för att komma in och ut ur staterna är i samma funktion, bidrar detta verkligen till att förbättra förutsägbarheten i enheten!
/ *---(Förklara staten enum)---* /
#define STARTUP_STATE 1
#define CONFIGURATION_STATE 2
#define DAY_STATE 3
#define NIGHT_STATE 4
#define DAY_NIGHT_TRANSITION 5
#define NIGHT_DAY_TRANSITION 6
void ChangeState(int newState)
{
SoftTimer.add(&backlightTask);
Lämna aktuella tillstånd
Switch (currentState)
{
fall STARTUP_STATE:
SoftTimer.remove(&startupTask);
bryta;
fall CONFIGURATION_STATE:
bryta;
fall DAY_STATE:
SoftTimer.remove(&timerTask);
SoftTimer.remove(&defaultDisplayTask);
bryta;
fall NIGHT_STATE:
SoftTimer.remove(&timerTask);
SoftTimer.remove(&defaultDisplayTask);
bryta;
fall DAY_NIGHT_TRANSITION:
SoftTimer.remove(&dayToNightTask);
bryta;
fall NIGHT_DAY_TRANSITION:
SoftTimer.remove(&nightToDayTask);
bryta;
}
Ange ny stat
växel (newState)
{
fall STARTUP_STATE:
SoftTimer.add(&startupTask);
bryta;
fall CONFIGURATION_STATE:
DrawSettingsUI();
bryta;
fall DAY_STATE:
SoftTimer.add(&timerTask);
SoftTimer.add(&defaultDisplayTask);
DrawSettingsUI();
bryta;
fall NIGHT_STATE:
SoftTimer.add(&timerTask);
SoftTimer.add(&defaultDisplayTask);
bryta;
fall DAY_NIGHT_TRANSITION:
ledBrightnessLevel = dayLevel;
SoftTimer.add(&dayToNightTask);
bryta;
fall NIGHT_DAY_TRANSITION:
ledBrightnessLevel = nightLevel;
SoftTimer.add(&nightToDayTask);
bryta;
}
Spara aktuella tillstånd
currentState = newState;
}