Hugo, eller "U go! för LinkIt en (3 / 4 steg)
Steg 3: Programvaru- och kontroll
Som tidigare nämnts, är programvaran tillgänglig under licensen Apache 2.0 på GitHub.
Utvecklingen av ett effektivt övervakningssystem, med hänsyn till behovet av att spara så mycket batteri som möjligt inblandade vissa svårigheter samtidigt ge tillförlitlig information med en relativt enkel sensorer arkitektur krävs för att utveckla några effektiva strategier som kommer att diskuteras nedan. För full källa (dokumenterade), se offentliga databasen ovan.
Visuella meddelanden
På grund av dess användning är det nästan självklart att denna enhet inte kräver ett komplett användargränssnitt att arbeta. Men genom den andra sidan är det mycket användbart förmågan att veta status för Hugo med bara en titt. Valet var att anta en enda RGB ledde till hantera alla viktiga signaler som har känsla för att visuellt meddelas. I tabell förklara antagna färgkodning och ljus varaktighet för varje övervägd tillstånd.
För en effektiv färg förvaltning som har skapats en tvådimensionella matris med färginställningar RGB RGB LED stift och de olika villkor har varit knuten till en specifik färg.
Färgkodningen struct < br > int rgb [8] [3] = {
{HÖG, LÅG, LÅG}, / / RÖD
{LÅG, HÖGT, LÅGT}, / / GRÖN
{LÅG, LÅG, HÖG}, / / BLÅ
{HÖG, HÖG, LÅG}, / / GUL
{HIGH, LOW, HIGH}, / / MAGENTA
{LÅG, HÖG, HÖG}, / / CYAN
{HÖG, HÖG, HÖG}, / / VIT
{LÅG, LÅG, LÅGT} / / SVART
};
#define SMS_COLOR C_YELLOW
#define WEB_COLOR C_WHITE
#define TEMPERATURE_ALERT_COLOR C_MAGENTA
#define BATTERY_ALERT_COLOR C_RED
#define MOTION_ALERT_COLOR C_BLUE
#define MOTION_WARNING_COLOR C_YELLOW
#define MOVING_COLOR C_GREEN
En enkel setColor() funktion kan sedan skapa LED av önskad färg.
Annullera setColor (int colorID) {
digitalWrite (RED_PIN, rgb[colorID][L_RED]); < br > digitalWrite (GREEN_PIN, rgb[colorID][L_GREEN]); < br > digitalWrite (BLUE_PIN, rgb[colorID][L_BLUE]); < br >}
Hur huvudloop fungerar
Funktionen loop() definierar hela logiken i programmet, som är uppdelad i tre huvuddelar:
- SMS-processor, alltid köra emot kommandon från användaren
- Webben uppdatera förlopp (om användaren har uppdaterat cloud webbfunktioner)
- Alert och visuella signaler kontrollerna
Den enda verksamhet som alltid kör är SMS aktivitet som regelbundet kontrollera förekomsten av meddelanden i kö
Som linkIt en under körningen av delay() går kommando i energisparläge är det viktigt strategin denna uppmaning används längs programmet; med en bra optimering är det möjligt att dramatiskt öka enhetens batteri tiden istället för att ha det fungerar bara några timmar. Den aktuella versionen av programvaran kan förbli för ca 24 timmar i standby-läge utan att behöva ladda batteriet. Detta menar, i en verklig situation, om hunden är i bakgården hund hus och under en natt jag ser är försvann jag kan aktivera enheten och börja spåra honom som ser miljön temperatur och sin aktivitetsnivå.
Bästa kalibreringen hittills är baserad på de olika inställningarna av försening till grand ett bra timing svar Hugo enheten i alla tillstånd med e mindre möjliga strömförbrukning.
Datauppdatering frekvenser i ms < br > #define FREQ_REMOTE 10000 / / (10 SEK.)
#define CYCLES_BATTERY_LEVEL 90 / / antalet ms är CYCLES_BATTERY_LEVEL * FREQ_REMOTE (15 min)
#define CYCLES_TEMPERATURE 15 / / antalet ms är CYCLES_TEMPERATURE * FREQ_REMOTE (2,5 min)
#define CYCLES_MOTION 30 / / antalet ms är CYCLES_MOTION * FREQ_REMOTE (5 min)
#define MAX_INACTIVITY_WARNING 30 / / nr-motion period innan du börjar Visuell varning (5 min)
SMS-processor
SMS processorn kontrollera varje slinga cykel förekomsten av meddelanden i kö och hämta dem skicka dem till tolken (se koden nedan).
Observera att efter det första (äldre) meddelandet i kö SMS bufferten rengörs automatiskt så om användaren skicka flera meddelanden utan att vänta på svar några av dem kan vara förlorad.
void sendSMSAnswer (String smsMsg) {< br > sträng svar = ""; Svarssträng att kommandot
booleska sendResponse;
msgQueue = false; Inaktivera kön. Kommer att vara skapar om omöjligt att skicka meddelande
sendResponse = false; Ställ in till true om endast ett giltigt kommando tas emot
Kontrollera innehållet i meddelandet för kommandot
och förbereda svarsmeddelandet
// ................................................... Heta
(detta är ett själv skicka meddelande)
IF(smsMsg.equals(CMD_OVERHEATING)) {
svar = getTemperatureAlert();
sendResponse = sant;
// ................................................... Start
} annat if(smsMsg.equals(CMD_START)) {
IF(!Armed) {
powerGPS(true);
svar = CMD_BOARDARMED;
beväpnade = sant;
sendResponse = sant;
}
annat {
svar = CMD_ALREADYRUNNING;
sendResponse = sant;
}
// ................................................... Stanna
} annat if(smsMsg.equals(CMD_STOP)) {
IF(Armed) {
powerGPS(true);
svar = CMD_BOARDSTOPPED;
beväpnade = false;
sendResponse = sant;
}
annat {
svar = CMD_NOTRUNNING;
sendResponse = sant;
}
// ................................................... Information
} annat if(smsMsg.equals(CMD_INFO)) {
IF(Armed) {
svar = getBatteryLevel();
svar += getTemperature();
svar += getMotion();
svar += getGPSPosition();
sendResponse = sant;
}
annat {
svar = CMD_NOINFO;
sendResponse = sant;
}
// ................................................... Firmware
(papperslösa)
} annat if(smsMsg.equals(CMD_FIRMWARE)) {
char bl [MSG_BUFFER];
sprintf (bl, CMD_FIRMWAREINFO, checkBatteryLevel());
svar = bl;
sendResponse = sant;
// ................................................... Hjälp
} annat if(smsMsg.equals(CMD_HELP)) {
svar = CMD_HELPMSG;
sendResponse = sant;
}
// ................................................... Okänd
annat {
svar = CMD_UNKNOWN;
sendResponse = sant;
}
Skicka svaret SMS
IF(sendResponse) {
Ställa in målnumret börjar SMS skickas process
LSMS.beginSMS(REMOTE_NUMBER);
Skicka meddelande (svar)
LSMS.print(response);
Prova att skicka meddelande eller aktivera kön
IF (!. LSMS.endSMS()) {
msgQueue = sant; Aktivera en kö för skicka igen
msgQueueMessage = smsMsg; Sparar köade meddelandet
}
} / / Skicka svar stämmer
}
Observera att kommandot odokumenterade Firmware utförs oberoende av enheten, återvänder den firmware version, version och build-nummer batterinivån och datum för den senaste uppdateringen.
Styra Hugo
Kanske låter konstigt implementera en metod för att styra enheten via SMS, men det finns många skäl att försöksvis bekräftade att hans är förmodligen den mest tillförlitliga metoden.
- Det är nästan säkert att endast godkända telefonnummer kan skicka kommandon.
- Det är tillförlitliga, eftersom SMS (eller text meddelande) inte är förlorat om mottagaren har ingen täckning när det skickas. Eftersom det inte finns täckning igen meddelandet omedelbart emot och bearbetas.
- Det är en billig lösning. Det finns många aktörer som ger hundratals dagliga eller månatliga gratis SMS
- Det behöver inte speciella tjänster eller dedikerade applikationer att köras
- Gör det fjärranslutna systemet kan nås i många förhållanden när mer sofistikerade metoder misslyckas.
- Om till att föredra andra trådlösa metoder som WiFi, Bluetooth eller BLE eftersom det är tänkt att i de flesta fall den enheten bör vara gör att det är långt bort från användaren.
Styrprotokollet för SMS är mycket enkel och bygger på en uppsättning kommandon som ska skickas till mobilnumret på enheten. Väsentliga genomförs och fungerar bra, flera andra är under test.
Start
Detta kommando aktiverar enheten som börja spåra positionen var 10 sekunder och kolla hunden aktivitetens status och miljön temperatur.
Information
En komplett returstatus sensorerna och den faktiska ställning. Position visas som en Google Maps-länk som öppnas i webbläsaren på mobil smartphone visar läget.
Stanna
Kommandot inaktivera systemet som returnerar i standby-läge.
FRAMTIDA IMPLEMENTERINGAR:
Tyst
Att spara energi, visuell anmälan RGB LED ignoreras och hålls
Samla in
Aktivera/inaktivera datainsamling under aktiviteten på en fil som sparas på microSD-kortet.
Web
Aktivera/inaktivera spårningsdata skickas till webbservern. När aktiverad, användaren kan spåra vägen för hunden realtid på webben men förbrukar mer ström.