Kissa Timer: Ansluta Arduino, Intel perceptuella Computing kameran och en Dränkbar vattenpump (2 / 4 steg)
Steg 2: programmering
I detta steg kommer vi att täcka programmeringsaspekterna krävs för detta projekt. Programmet är uppdelat i två delar:- Bearbetning av
- Den bearbetning sidan av programmet körs i 32-bitars bearbetning miljö för Windows.
- Det ansluter till Intel perceptuella Computing kameran och spårar när användaren sitter framför den bärbara datorn eller när användaren har lämnat genom ansiktsigenkänning inbyggd i kameran.
- Den kommunicerar dessa förändringar till Arduino via en seriell anslutning.
- Vi använde den enkelriktade bearbetningen till Arduino seriell anslutning eftersom vi inte behövde dra någon information bakåt från Arduino. Du kan hitta andra exempel på seriella anslutningar här:
- https://learn.Sparkfun.com/tutorials/Connecting-ar...
- Det också inlägg "randomiserade" meddelanden till Twitter, med hjälp av Twitter API. Dessa randomiserad meddelanden hämtas från samlingar av meddelanden som matchar specifika situationer eller händelser, som utlösts i hela koden. I våra projekt använder vi exemplet med ett program som spårar hur många gånger en användare får upp att använda toaletten och sedan tuktar användaren om de är borta för länge.
- För att arbeta igenom ansluter bearbetning till Twitter, vi använde den här guiden: http://blog.blprnt.com/blog/blprnt/updated-quick-t...
- Sannolikt finns det användbara, eftersom det leder dig genom processen att inrätta programmet på Twitter, generera autentiseringsnycklar, etc.
- Arduino
- Arduino sidan av programmet tar informationen av när användaren lämnar och återvänder till sin laptop, och används för att avgöra när du ska slå på vattenpumpen.
- Hanterar det också vattenpumpen: särskilt pumpen har vi faktiskt pumpar vattnet för snabbt för vad vi vill göra, så programmet Arduino visar strategiskt vattenpumpen och bort så att vi kan mer enkelt styra flödet av vattnet utan att behöva oroa dig om hur du ändrar själva nedsänkbar pumpen.
- Eftersom vi har vattenpumpen inkopplad i PowerSwitch svansen, vända vi vattenpumpen på och av genom att vrida PowerSwitch svansen på och av.
Koden för båda dessa program ges nedan. Jag har tagit kommentarer hela koden för att hjälpa dig att räkna ut vad som händer för varje avsnitt, och där du kommer att behöva göra egna ändringar. Enligt min mening är koden ganska svårt att läsa i formatet Instructables, särskilt eftersom det tycker om att ta bort flikar. Om du kopierar och klistrar in det till bearbetning eller Arduino, kommer det automatiskt färgkoda där så är lämpligt, och göra det lättare att navigera.
Bearbetning
------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------
/**
PeeTracker32
Utvecklad av Austin Toombs (e-post: altoombs indiana edu)
Konceptet av Austin Toombs och Shad Gross
Januari 2014
**/
/ ** importera bibliotek etc ** /
import intel.pcsdk.*;
import processing.serial.*;
/ ** Initiera variabler ** /
/ ** Intel perceptuella Computing variabler ** /
PXCUPipeline session.
PImage rgbTex;
int [] faceLabels = {PXCMFaceAnalysis.Landmark.LABEL_LEFT_EYE_OUTER_CORNER,
PXCMFaceAnalysis.Landmark.LABEL_LEFT_EYE_INNER_CORNER,
PXCMFaceAnalysis.Landmark.LABEL_RIGHT_EYE_OUTER_CORNER,
PXCMFaceAnalysis.Landmark.LABEL_RIGHT_EYE_INNER_CORNER,
PXCMFaceAnalysis.Landmark.LABEL_MOUTH_LEFT_CORNER,
PXCMFaceAnalysis.Landmark.LABEL_MOUTH_RIGHT_CORNER};
ArrayList facePts = ny ArrayList();
ArrayList faceBoxes = ny ArrayList();
/ ** Samlingar av potentiella tweets för verious situationer
Om du skapar egna samlingar av strängar att dra ifrån, är det där du kan initiera dem
**/
ArrayList returnTweets = ny ArrayList();
ArrayList firstThresholdTweets = ny ArrayList();
ArrayList secondThresholdTweets = ny ArrayList();
ArrayList thirdThresholdTweets = ny ArrayList();
/ ** booleska värden för staten logik inom programmet ** /
booleska faceState = false; om ett ansikte ses
booleska prevFaceState = false; om ett ansikte sågs i föregående
/ ** variabler för att integrera med Twitter ** /
Twitter twitter;
/ ** variabler för att övervaka hur länge användaren har varit borta
vi satt upp olika "milstolpar" för medan den användare s gått. Vi har 3 här, men du kan
ändrar detta enkelt genom att lägga till mer här och hela koden var dessa milstolpar
hänvisas till
**/
lång savedTime;
int minimumTime = 6000; minsta tidsfrist innan ett meddelande skickas
int firstMilestone = 30000; första milstolpen för att skicka shameing meddelanden
booleska firstMilestoneMessageSent = false; att hålla reda på om vi skickade det första milstolpe
int secondMilestone = 60000; andra milstolpen för att skicka shameing meddelanden
booleska secondMilestoneMessageSent = false; att hålla reda på om vi skickade det andra milstolpe
int thirdMilestone = 90000; tredje milstolpe för att skicka generande meddelanden
booleska thirdMilestoneMessageSent = false; att hålla reda på om vi skickade det tredje milstolpe
/ ** variabler för seriell anslutning ** /
Seriella myPort; Seriell portobjektet
void setup()
{
Ange storleken på duken
size(640,480);
Skapa bild från kameran information (inte nödvändigt)
rgbTex = createImage(640,480,RGB);
sessionsinformation för Intel perceptuella Computing kameran
session = nya PXCUPipeline(this);
session. Init (PXCUPipeline.COLOR_VGA| PXCUPipeline.FACE_LOCATION| PXCUPipeline.FACE_LANDMARK);
initierar anslutningen till Twitter * komplett med autentisering!
Du kommer att behöva generera din egen Twitter ansökan nycklar och inkludera dem här
ConfigurationBuilder cb = nya ConfigurationBuilder();
cb.setOAuthConsumerKey("XXXXXXXXXXXXXXXXXXXX");
cb.setOAuthConsumerSecret("YYYYYYYYYYYYYYYYYYYYYY");
cb.setOAuthAccessToken("ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ");
cb.setOAuthAccessTokenSecret("XYZYXYZXYZYXYZXZXYZYXYZYXYZYXYZ");
initiera twitter objekt
Twitter = nya TwitterFactory(cb.build()).getInstance();
Detta har inte att kallas alls, men är kul att se
bortkommenterad för nu: getPreviousTweets();
initiera serieporten och inställd 9600 baud-hastighet
myPort = ny följetong (denna, Serial.list() [0], 9600);
initiera samlingarna av tweets
initializeTweets();
}
Rita standardfunktionen i varje behandling program
void draw()
{
Att få data från kameran och ritning till canvas / / /
innan du spelar med perceptuella computing kamera, måste vi se till att
Det kan faktiskt se saker. Allt i detta om uttalande bör
finnas kvar som-är för nu. Vi använda den för att avgöra om ett ansikte är även inom
Visa. Det finns sannolikt ett enklare sätt att göra detta, men vi vilja se ansiktet
rutor så vi kan berätta vad den ser som ett ansikte och vad det inte
IF(session. AcquireFrame(false))
{
session. QueryRGB(rgbTex);
facePts.clear();
faceBoxes.clear();
för (int jag = 0; ++ Jag)
{
långa [] ft = nya lång [2].
IF(!session. QueryFaceID(i,ft))
bryta;
PXCMFaceAnalysis.Detection.Data fdata = ny PXCMFaceAnalysis.Detection.Data();
IF(session. QueryFaceLocationData ((int) ft [0], fdata))
{
faceBoxes.add(fdata.rectangle);
PXCMFaceAnalysis.Landmark.LandmarkData lmark = nya PXCMFaceAnalysis.Landmark.LandmarkData();
för (int f = 0; f {
IF(session. QueryFaceLandmarkData ((int) ft [0], faceLabels [f], 0, lmark))
{
facePts.add(lmark.position);
}
}
}
}
session. ReleaseFrame();
} //end av ansiktsavkänning om uttalande
visar vad kameran ser på duken
Image(rgbTex,0,0);
pushStyle();
stroke(255);
noFill();
drar rutorna ansikte på skärmen
för (int f = 0; f {
PXCMRectU32 faceLoc = (PXCMRectU32)faceBoxes.get(f);
rect(faceLoc.x,faceLoc.y,faceLoc.w,faceLoc.h);
}
Fill(0,255,0);
för (int g = 0; g {
PXCMPoint3DF32 facePt = (PXCMPoint3DF32)facePts.get(g);
Ellipse(facePt.x,facePt.y,5,5);
}
popStyle();
Det är slutet av den ritade saker / / /
spara det tidigare ansikte tillståndet (i spårningssyfte)
prevFaceState = faceState;
om vi inte kan ens se ett ansikte på alla
IF(faceBoxes.Size()==0) {
faceState = false; Vi kan inte se ansiktet, så att användaren inte finns
om de var där en stund sedan, och de nyss lämnade
IF(prevFaceState == true) {
utgång att kameran inte längre ser ett ansikte
System.out.println kan inte ("se ett ansikte, start timer").
börja spåra tid. Millis() mäter tid i millisekunder
sedan starten av programmet
savedTime = millis();
signal till följetong att vi inte kan se ett ansikte
myPort.write('2');
}
användaren har varit borta är den nuvarande tid i millisekunder
sedan starten av programmet minus tiden i millisekunder sedan
början på programmet när användaren kvar.
lång timeAway = millis() - savedTime;
Använd timeAway information för att avgöra när du ska skicka meddelande
processAwayAlerts(timeAway);
}
annat {
om vi ser ansikten, är inte vi timing dem
faceState = sant;
om vi ser ett ansikte där tidigare gjorde vi inte, då vi vet
de kom bara tillbaka
IF(prevFaceState == false) {
beräkna hur länge användaren har varit borta totalt
lång timeAway = millis() - savedTime;
processJustReturnedAlerts(timeAway);
resetMessageBooleans();
}
}
slutet av Rita metod / / /
}
Ställ in var och en av samlingarna av tweets som kan användas för
särskilda situationer
void initializeTweets() {
returnTweets.add var ("från sitt skrivbord för XXX sekunder");
returnTweets.add ("kissade i XXX sekunder");
returnTweets.add var ("improduktiv XXX sekunder");
returnTweets.add ("lyckats förhala XXX sekunder");
returnTweets.add ("slacked av XXX sekunder");
returnTweets.add var ("helt värdelös för XXX sekunder");
firstThresholdTweets.add ("är antagligen kissat just nu, så om du behöver något titta tillbaka snart");
firstThresholdTweets.add ("har varit borta från sitt skrivbord för en tid nu. Inte göra en vana att detta");
firstThresholdTweets.add ("kommer att vara tillbaka snart. Eller han vara bättre.");
firstThresholdTweets.add ("kan inte komma till telefonen just nu. Om han inte har det med honom. I badrummet.");
secondThresholdTweets.add ("... var är du? Varför har du varit borta så länge?");
secondThresholdTweets.add ("vad du gör just nu bättre vara Satans viktigt.");
secondThresholdTweets.add ("om du inte kommer till jobbet idag du kan lika gärna bara gå hem");
secondThresholdTweets.add ("kan ha ett medicinskt problem. Det bör inte ta detta lång kissa.");
thirdThresholdTweets.add ("tar för alltid att kissa. Han bättre Slutför upp snabbt eller riskerar att slösa bort sitt liv").
thirdThresholdTweets.add ("slösar sin tid. Alla bör pressa honom att komma tillbaka till sitt skrivbord");
thirdThresholdTweets.add ("vi skickar ut Sök parti. Du har varit borta för länge.");
thirdThresholdTweets.add är ("inte en modell för hur du ska bete sig i arbetet.");
}
avgöra vilka meddelanden som ska sända och när medan användaren är borta
baserat på den tid de har varit borta
void processAwayAlerts(long timeAway) {
om den tid de har varit borta är längre än lägsta
tiden vi är bekymrade över och slå sedan på LED
IF(timeAway > minimumTime) {
myPort.write('1');
}
om den tid de har varit borta är längre än först
milstolpe tid, då vidta lämpliga åtgärder
om (timeAway > firstMilestone & &! firstMilestoneMessageSent) {
Skicka meddelandet (antingen via twitter eller till konsolen)
sendMessage(randomTweet(firstThresholdTweets));
mark som det första milstolpe meddelandet har skickats
firstMilestoneMessageSent = sant;
}
om den tid de har varit borta är längre än andra
milstolpe tid, då vidta lämpliga åtgärder
om (timeAway > secondMilestone & &! secondMilestoneMessageSent) {
Skicka meddelandet (antingen via twitter eller till konsolen)
sendMessage(randomTweet(secondThresholdTweets));
mark som det andra milstolpen meddelandet har skickats
secondMilestoneMessageSent = sant;
}
om den tid de har varit borta är längre än tredje
milstolpe tid, då vidta lämpliga åtgärder
om (timeAway > thirdMilestone & &! thirdMilestoneMessageSent) {
Skicka meddelandet (antingen via twitter eller till konsolen)
sendMessage(randomTweet(thirdThresholdTweets));
mark som det andra milstolpen meddelandet har skickats
thirdMilestoneMessageSent = sant;
}
}
bestämma vad man ska göra när användaren återvänder
void processJustReturnedAlerts(long timeAway) {
endast Visa meddelande om de var borta den minsta mängden
tid. Annars skulle de nog bara tittar bort eller repor
deras ansikte eller fastställande av håret eller... du få det
IF(timeAway > minimumTime) {
rapport att trösta hur länge användaren var borta
System.out.println ("användaren just återvänt efter:" + timeAway + "millisekunder.");
Skicka meddelande antingen via twitter- eller konsolen
sendMessage (randomTweet (returnTweets) .replace ("XXX", "" + timeAway/1000));
}
en signal över följetong berätta för Arduino som användaren
framför datorn
myPort.write('0');
}
välja en slumpmässigt tweet från given tweet samlingen och
returnera det meddelandet som en sträng
Sträng randomTweet(ArrayList tweetList) {
Välj ett slumptal utifrån längden på samlingen
int tweetIndex = (int) random(tweetList.size());
returnera strängen på den platsen
återvända tweetList.get(tweetIndex);
}
Skicka ett meddelande via twitter eller till konsol
void sendMessage(String message) {
Skicka meddelande via twitter (kommentera bort medan testning)
/ ** prova {
twitter.updateStatus(message);
}
fånga (TwitterException te) {
println ("kunde inte ansluta:" + te);
};**/
Skicka meddelande till konsolen
System.out.println(Message);
}
Återställ meddelande booleska värden. Annars kunde tröskel meddelanden endast
skickas en gång under varje körning av programmet
void resetMessageBooleans() {
firstMilestoneMessageSent = false;
secondMilestoneMessageSent = false;
thirdMilestoneMessageSent = false;
}
/**
* Denna metod bara finner tidigare tweets från enheten och
* skriver dem ut till konsolen. Den kan tas bort och helt enkelt inte
* heter och kommer inte att ändra några andra funktioner i detta program
**/
void getPreviousTweets() {
Fråga fråga = nya Query("#peeTimer");
query.setRpp(100); fungerar inte w/mest senaste Twitter4j
Prova att göra frågebegäran.
försök {
följande rad uppdaterar twitter status
QueryResult resultat = twitter.search(query);
ArrayList tweets = (ArrayList) result.getTweets();
för (int jag = 0; jag < tweets.size(); i ++) {
Status t = (Status) tweets.get(i);
Användaren u = (användare) t.getUser();
Strängen user = u.getName();
Sträng msg = t.getText();
println ("Tweet av" + användare + ":" + msg);
};
}
fånga (TwitterException te) {
println ("kunde inte ansluta:" + te);
};
}
------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------
Arduinoen
------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------
/**
peetimerArduinoSketch
Utvecklad av Austin Toombs (e-post: altoombs indiana edu)
Konceptet av Austin Toombs och Shad Gross
Januari 2014
**/
variabler för att läsa till och från följetong
char val; Uppgifterna från den seriella porten
Stifttilldelningar
int ledPin = 13. Ange PIN-koden till digital i/o-13
int waterPumpPin = 10; Detta stift som egentligen styr PowerSwitch svans, vrida den på och av
tidredovisning för vattenpump
lång previousMillis = 0;
lång offInterval = 4000; Hur länge vi måste det bort per intervall
lång onInterval = 2000. Hur länge vi måste det på per intervall
booleska timeStarted = false;
spåra statligt av vattenpumpen
int waterPumpState = låg;
void setup()
{
pinMode (ledPin, produktionen); Ställ in pinkodsskydd som utgång
pinMode (waterPumpPin, produktionen); Ange PIN-kod
initiera seriell kommunikation på ett 9600 baud
Serial.BEGIN(9600);
}
void loop() {
om (Serial.available())
{/ / Om data är tillgängliga att läsa,
Val = Serial.read(); läsa den och förvara den i val
}
om (val == '1')
{/ / Om 1 mottogs
digitalWrite (ledPin, hög); Aktivera LED
starta om timern inte har börjat än,
IF(!timeStarted) {timeStarted = true;}
bestämma vad man ska göra med vattenpumpen, baserat på tid
manageWaterPump();
} annat {/ / om något annat än en 1 tas emot
digitalWrite (ledPin, låg); stänga av lampan
digitalWrite (waterPumpPin, låg); stänga av vattenpumpen
timeStarted = false; stänga av timern
}
Delay(10); Vänta 10 millisekunder för nästa läsning
}
bestämma hur du ska hantera vattenpumpen
void manageWaterPump() {
den aktuella mängden tid som har gått sedan vi fick 1 i följetong
osignerade långa currentMillis = millis();
om vattenpumpen är redan av
IF(waterPumpState == low) {
och det har varit bort länge nog, då vända den på
om (currentMillis - previousMillis > offInterval) {
spara den senaste gången du blinkade lysdioden
previousMillis = currentMillis;
waterPumpState = hög;
Set LED med ledState av variabeln:
digitalWrite (waterPumpPin, waterPumpState);
}
}
annat {//if vattenpumpen är redan på
och det har varit på länge nog, då vända den bort
om (currentMillis - previousMillis > onInterval) {
spara den senaste gången du blinkade lysdioden
previousMillis = currentMillis;
waterPumpState = låg;
Set LED med ledState av variabeln:
digitalWrite (waterPumpPin, waterPumpState);
}
}
}
------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------