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.
    • 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);
}
}
}
------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------

Se Steg
Relaterade Ämnen

Arduino Intel Edison - nybörjare vattning Guide - Uncomplete

Hej alla,Här är min lilla guide för mitt projekt Intel IOT "Växt Rehab Installation".Min huvudsakliga koncept är att föra växter de bästa förutsättningarna att växa tack vare en Automatisk installation, drivs av Arduino - Intel Edison. Jag är ny...

Barn skärm Timer med Arduino

Denna enhet ger en förälder verkligen robust metod för att kontrollera skärmen-tid (TV / DVD / console) sina barn ha varje dag. Det fungerar genom att ha ett intelligent tid-switch som styr HDMI-signalen passerar mellan en enhet och TV-skärmen. Jag h...

Ansluta Arduino Uno till Android via Bluetooth

I detta projekt används en seriell Bluetooth-modul för att skapa en anslutning mellan Arduino Uno och en Android app som jag skapat med MIT App Inventor.Arduino lyssnar efter kommandon att tända några lysdioder eller visa sin status. Dessutom en time...

Knappen e-post: Ansluter Arduino till IFTTT att skicka e-post, tweets, textmeddelanden och mer

vad om du kunde med en enda knapp, skicka ett e-postmeddelande, en tweet eller ett SMS?Denna tutorial ska show dig hur man ansluter en enkel knapp till dina favoritprogram på internet genom att ansluta den till IFTTT.IFTTTIFTTT.com (om detta sedan de...

Dubbla kaffe Timer: OLED & Arduino

Dra en perfekt kaffe kräver sträng kontroll av ett antal variabler. Kvarnen fördelar en fast dos av rätt grind till en Portafiltret korg. Portafiltret passar in i kaffemaskinen och maskinen körs. Om allt är väl bör det finnas ska en paus på fyra seku...

Ansluta arduino med ethernet

Arduino Ethernet Shield kan en Arduino styrelsen att ansluta till internet. Den är baserad på Wiznet W5100 ethernet chip (datablad).Wiznet W5100 ger en nätverk (IP) stack kan både TCP och UDP. Den stöder upp till fyra samtidiga socketanslutningar. An...

Ansluta Arduino Uno till Crystalfontz 16 x 2 OLED med bara 4 trådar!

Dessa moduler är ganska trevligt. De är i samma storlek som våra CFAH1602C serien 16 x 2 tecken LCD-moduler, och tunnare som en bonus. Den OLED kontrasten är fantastiska, och de har en skarp blick som är svårslagen. En annan trevlig sak är att de har...

Arduino tangentbord med Computer Interface

Detta är en introduktion om hur man gör ett tangentbord med några knappar, en multiplexer och en arduino som kan prata med en datorgränssnitt som kan spela toner genom datorer högtalare.Lista över:1 x Arduino1 x skärbräda8 x knappar1 x 8-port multipl...

Hur du ansluter Arduino till en dator via serieporten

att göra att jag har använt en dator med Ubuntu 12.04 och programmet språket C++, men om du använde Windows koden fungerar också, bara behöver ändra porten som används till konen med arduino, men detta är förklara i nästa steg.Detta program är endast...

Billigaste sättet att ansluta arduino till internet

Billigaste sättet att ansluta Arduino till internetSköldar här dyra! och detta stör mig mycket. Det är omöjligt att bygga din egen automation system utan sköldar.Jag hittade några artiklar på internet men för min otur icke av dem arbetat på min routr...

Hur du använder Watchdog Timer på Arduino

I detta Instructable tar vi en titt på Watchdog Timer på Arduino och tre olika sätt att konfigurera den. Vi visar ett enkelt exempel med Watchdog Timer och du kan hitta koden från exemplet på ForceTronics blogg http://forcetronic.blogspot.com/2016/02...

Gå av i soffan, med Arduino, 3d tryckta inhägnad och programmerade med Embrio

Den grundläggande idén är att skapa något som kan upptäcka när mina hundar får på soffan när inte jag är där och "uppmuntra dem att få bort". Detta sker med en passiv IR-sensor och gör oljud att hundar inte gillar.Jag såg ett annat liknande proj...

Arduino Mega GPS med LCD och SD loggning

Använd din Audino Mega som en GPS logger med tydlig LCD display och 5 funktionsknappar. En bi-färg LED används för att ange statusinformation.SDcard kan vara kvar i och läsa med en kort läsaren skiss, med utgång till den seriella Monitor.Detta instru...

Översikt Arduino skiss belastande upp processen och ISP

Du kan överföra programvaran till en Arduino med två metoder. Du får höra om de två metoderna brukar kallas ISP programmering och FTDI eller seriell upp. Jag rekommenderar att lära om och bli bekväm med att använda båda metoderna. När jag var att kom...

Skicka SMS från Arduino över Internet med ENC28J60 och Thingspeak

Detta Instructable förklarar hur du skickar ett SMS från en Arduino använder Internet. Det finns många sätt att närma sig detta och jag kommer att förklara ett av de olika metoder som används för att utföra denna uppgift.Några viktiga punkter som beh...

Programming AVR med Arduino som ISP utan bootloader och externa crystal

Hej, jag är riktronics , och detta är min första instructable. Här förklarade jag hur till bränna program i din AVR microcontroller med en Arduino. Av detta behöver du inte köpa dyra AVR programmerare om du redan har en Arduino. Och jag antar att du...

Bil till Arduino meddelande: CAN-Bus sniffning och sänder med Arduino

Från Wikipedia är Controller Area Network (CAN) bussen en "fordonet buss standard syftar till att mikrokontroller och enheter att kommunicera med varandra inom ett fordon utan värddator." Dessa enheter kan också betecknas som elektroniska styren...

Arduino växthusgaser kontroll - fuktighets- och

Detta projekt kommer att reglera fuktighet och temperatur av alla växthusgaser med hjälp av värmare och fläktar. Ytterligare tutorials kommer att läggas över tiden för automatisk vattning och belysning, bland annat.Allt sker med hjälp av Arduino.Du b...

Arduino felsökning - brytpunkter, Tracepoints och uttryck

denna handledning visar hur du kommer igång med Arduino debug verktyg från Visuella Micro. Debug verktyget är integrerat i utvecklingssystemet Microsoft Visual Studio Professional som också ger 100% kompatibel Arduino programmering, kompilera och lad...