En liten te Timer (TTT) maskin för Arduino och ATtiny (1 / 3 steg)
Steg 1: Funktionalitet design och programmering
Idén om funktionaliteten för Arduino skriptet kan ses i denna graf.
- När du slår på strömmen servomotor flyttas till den ursprungliga placeringen och väntar på en te
påsen skall bifogas. - Sedan trycker på knappen flera gånger – en gång för varje brygga minut.
- När knappen inte trycks mer än 2 sekunder flyttas servomotor till bryggning
position och börjar att räkna. - När brygga tiden är över servomotor flyttar tillbaka till slutpositionen (samma som startposition) och makt kan stängas av.
Jag har lämnat 2 versionen av skriptet.
Den första genomförs för en standard Arduino ombord och var i bruk under en tid och är bra för att göra
ändringar i programmet utan programmerare. Den andra en implementeras för att använda en ATtiny85 processor.
Det började som en enkel version liknar programvara skript kan du hitta i de andra exemplen. Men det visade sig att det måste finnas några tillägg till gör det verkligen användbart för daglig användning se jag hade flera ytterligare krav som skall genomföras. Dessa förbättrade versioner finns här.
En liten stat maskin
Programmet måste alltid veta den aktuella situationen från den tid när kraften var påslagen tills brygga tiden är över. Därför finns det en global variabel med namnet staten som kan ta lämpligt värde motsvarar situationen:
uint8_t staten.
På bilden ovan kan du se hur de används. Det är en rättfram implementation utom på den upprepande när knappen trycks in flera gånger under programplaneringsfasen.
För att ha en god läsbarhet i möjliga definieras lägesvärdena i avsnittet konstant i skriptet:
#define STATE_INIT 0x00 / / / < väntar på första knappen ner
#define STATE_DOWN 0x10 / / / < knappen trycks
#define STATE_UP 0x11 / / / < knappen släpps så ökas den te-tid med ett.
#define STATE_ENTER 0x21 / / / < in i brygga fas av visar hur många minuter
#define STATE_BREW 0x22 / / / < ange tepåse och vänta till slutet av brygga tid
#define STATE_END 0x99 / / / < bryggning tid avslutades.
Servo / tepåse positioner
De ståndpunkter som vi behöver för servo måste hittas genom försök och misstag eftersom de beror på den konkreta utformningen av te timern och servo. För en enkel design är 2 positioner tillräckligt (INITIAL och retur). De definieras i den konstanta delen av skriptet:
#define TEABAG_INITIAL 95
#define TEABAG_ENTER 65
#define TEABAG_DIP 70
#define TEABAG_OUT 83
Dessa är positionerna för den första staten att bifoga en tepåse, brygga position, en liten rörelse som begärdes av vissa användare och den ur positionen, inte för högt så att de sista dropparna kan falla i en tekanna. I slutändan flyttas servo till den första ståndpunkten att lossa tepåse.
Rör servo långsamt
Mest önskade förbättring från den första versionen var att göra servo rör långsamt i stället för enkelt "så snabbt som möjligt" version i första version. Därför den tbSetPosition metoden flyttas inte servo direkt men istället registrerar destination position i en global variabel. Sedan ändras från tid till annan genom att funktionen tbCheckPosition servo aktuella position av 1 i önskad riktning. Slutligen, när servo uppnådde destination servo är fristående för att spara energi.
Variablerna tbPosition och tbPositionNext lagrar aktuellt och önskat läge.
Flytta servo under tung belastning
Den första versionen fristående servo omedelbart efter flyttas till den nya positionen. Emellertid med tung belastning servo inte når sin slutdestination på ett tillförlitligt sätt. Detta löstes med hjälp av särskilda timer variabel tbLastMove som alltid som den aktuella tiden efter flyttanden servo.
Servo är fristående 400 msec. efter den sista satsen.
Titta på tiden
Det enklaste sättet för att kontrollera tid beroende av funktionerna är att använda funktionen millis() som returnerar antalet millisekunder som passerat sedan startades.
Jag använder denna funktion att få "aktuell tid" och jämför med förra gången när något intressant har hänt.
Varje gång funktionen loop() startas, nu variabeln är satt och varaktigheten av den nuvarande fasen beräknas med hjälp av variabler:
osignerade långa nu;
osignerade långa började;
osignerade långa varaktighet;
Detta tillvägagångssätt är överlägset bättre än att använda funktionen delay() för att genomföra övergripande timing mekanism. Men är ibland det bara enklare att använda delay() till exempel för koppla LED on and off eller väntar på några millisekunder tills servo fick flyttas.
Det finns vissa timing konstanter som definieras i huvudet på den skiss som du kan justera dina behov:
#define MSECS_TO_START 2000 / / / < när knappen är inte intryckt efter 2 sekunder, början bryggning.
#define MSECS_FOR_DROPS 10000 / / / < antal sekunder påsen är närliggande över te potten.
#define MSECS_TO_DETACH 400 / / / < efter 400 uppdateringsförsök ingen rörlighet servo är fristående för att spara energi.
Den minsta tid i millisekunder som en knapptryckning har till sist för att tas seriöst är programmerat som 50. Det händer ofta att en knapp inte växla signalen på ett korrekt sätt men studsar en eller två gånger innan du stänger helt. Dessa små snabba sekvenser är bara ignoreras.
Innan du börjar lysdioden blinkar en gång för varje brygga tid minut.
Reset och försök igen
Ibland händer det att TTT inte startar korrekt eftersom tepåse hoppar av eller inte gillar att gå dykning i programmerad minuter var fel. I detta fall måste du slå av och på igen.
Jag med fler kommentarer i källkoden. Läsa och ändra...