Stap 1: Functionaliteit ontwerp en programmering
Het idee van de functionaliteit van de Arduino Script kan worden gezien in deze grafiek.
- Nadat u bent overgeschakeld op de macht de servomotor wordt verplaatst naar de eerste positie en wacht op een thee
tas moet worden gevoegd. - Dan is de knop ingedrukt herhaaldelijk – één keer voor elke brouwen minuut.
- Wanneer de knop niet langer dan 2 seconden ingedrukt is verplaatst de servomotor naar het brouwen
positie en tellen begint. - Wanneer de brouwen tijd is voorbij de servomotor terugverplaatst naar einde positie (hetzelfde als de beginpositie) en macht kan worden uitgeschakeld.
Ik heb 2 versies van het script verstrekt.
De eerste is geïmplementeerd voor een standaard Arduino board en in gebruik was voor enige tijd en is ideaal voor het maken
wijzigingen in het programma zonder een programmeur. In het tweede voorbeeld wordt geïmplementeerd voor het gebruik van een ATtiny85-processor.
Het begon als een eenvoudige versie zeer vergelijkbaar met de scripts van de software u in de andere gevallen vindt. Maar het bleek dat er worden enkele toevoegingen moest maken het echt handig voor dagelijks gebruik se had ik verschillende meer eisen ten uitvoer moeten worden gelegd. Deze verbeterde versies zijn hier beschikbaar.
Een kleine statusmachine
Het programma dient altijd te weten van de huidige situatie van de tijd wanneer de macht was ingeschakeld totdat de brouwen tijd voorbij is. Daarom is er een globale variabele met de naam staat , die de juiste waarde overeenkomt met de situatie kunnen nemen:
uint8_t staat;
In de bovenstaande afbeelding ziet u hoe de Staten worden gebruikt. Het is een ongecompliceerd implementatie met uitzondering van de herhalende wanneer de knop wordt gedrukt tijdens de programmeringsfase meerdere malen.
Om een goede leesbaarheid de mogelijke worden statuswaarden gedefinieerd in de constante sectie van het script:
#define STATE_INIT 0x00 / / / < wachten op eerste knop ingedrukt
#define STATE_DOWN 0x10 / / / < de knop is ingedrukt
#define STATE_UP 0x11 / / / < de knop wordt vrijgegeven dus de thee-tijd te verhogen met één.
#define STATE_ENTER 0x21 / / / < door aan te tonen van het aantal minuten invoeren van het brouwen fase
#define STATE_BREW 0x22 / / / < Voer het theezakje en wachten tot het einde van het brouwen van tijd
#define STATE_END 0x99 / / / < tijd eindigde brouwen.
Servo / theezakje posities
De standpunten die we nodig voor de servo hebben moeten worden gevonden door trial and error, omdat ze afhangen van de concrete opzet van de thee-timer en de servo. Voor een eenvoudig ontwerp zijn 2 posities genoeg (initiële en ENTER). Ze zijn gedefinieerd in de constante sectie van het script:
#define TEABAG_INITIAL 95
#define TEABAG_ENTER 65
#define TEABAG_DIP 70
#define TEABAG_OUT 83
Dit zijn de posities voor de begintoestand te hechten een theezakje, het brouwen standpunt, een kleine beweging die was aangevraagd door een aantal gebruikers en de uit positie, niet te hoog zodat de laatste druppels in de theepot vallen kunnen. Op het einde wordt de servo verplaatst naar de aanvangspositie loskoppelen van het theezakje.
De servo langzaam
De meeste wenste versterking van de eerste versie moest maken van de servo langzaam in plaats van de eenvoudige "zo snel mogelijk" versie geïmplementeerd in de eerste versie. Dus de tbSetPosition methode niet verplaatst het servo direct maar in plaats daarvan registreert de positie van de bestemming in een globale variabele. Dan is van tijd tot tijd door het aanroepen van de functie tbCheckPosition de huidige positie van de servo gewijzigd door 1 in de gewenste richting. Tot slot, wanneer de servo betreffendedepositie van de bestemming heeft bereikt de servo wordt losgekoppeld om energie te besparen.
De variabelen tbPosition en tbPositionNext opslaan de huidige en de gewenste positie.
Verplaatsen van de servo onder zware belasting
De eerste versie vrijstaande de servo onmiddellijk na het verplaatsen naar de nieuwe positie. Echter niet de servo met zware belasting zijn eindbestemming bereikt op een betrouwbare manier. Dit werd opgelost door gebruik te maken van de specifieke timer variabele tbLastMove die altijd wordt ingesteld op de huidige tijd na het verplaatsen van de servo.
De servo is vrijstaand 400 msec. na de laatste beweging.
Kijken naar de tijd
De gemakkelijkste manier voor het beheersen van de tijd-afhankelijke functies is het gebruik van de millis()-functie die resulteert in het aantal milliseconden die zijn verstreken sinds het opstarten.
Ik gebruik deze functie om de "huidige tijd" en vergelijken met de laatste keer wanneer iets interessants gebeurd.
Elke keer als de loop-functie wordt gestart, de nu-variabele is ingesteld en de duur van de huidige fase wordt berekend met behulp van de variabelen:
niet-ondertekende lang;
niet-ondertekende lang begonnen;
niet-ondertekende lange duur;
Deze aanpak is veruit beter dan het gebruik van de functie delay() voor de uitvoering van de algemene timing mechanisme. Echter, soms is het gewoon makkelijker om te delay() bijvoorbeeld gebruiken voor schakelen de LED in- en uitschakelen of het aantal milliseconden te wachten totdat de servo kreeg verplaatst.
Er zijn sommige timing-constanten zijn gedefinieerd in de koptekst van de schets die u aan uw behoeften aanpassen kunt:
#define MSECS_TO_START 2000 / / / < wanneer knop is niet ingedrukt sinds 2 seconden, de start brouwen.
#define MSECS_FOR_DROPS 10000 / / / < het aantal seconden in de zak over de theepot in de buurt is.
#define MSECS_TO_DETACH 400 / / / < na 400 msec geen beweging heeft plaatsgevonden de servo wordt losgekoppeld om energie te besparen.
De minimale tijd in milliseconden die een druk op de knop moet duren ernstig wordt genomen is geprogrammeerd als 50. Het gebeurt vaak dat een knop het signaal niet op een juiste manier maar stuitert of twee keer overschakelen voordat u volledig sluit. Deze kleine snelle sequenties zijn gewoon genegeerd.
Voordat de LED knippert één keer voor elke minuut tijd brouwen.
Reset en probeer het opnieuw
Soms gebeurt het dat de TTT start niet correct omdat het theezakje springt af of geeft het niet graag gaan duiken het aantal geprogrammeerde minuten was verkeerd. In dit geval moet u uit en weer overschakelen.
Ik omvatte meer reacties in de broncode weergeven. Lezen en wijzigen...